From 656491a4c9f7750f49af8e8cab25ffc63e724a73 Mon Sep 17 00:00:00 2001 From: nadijagraca Date: Fri, 27 Oct 2023 17:14:39 +0200 Subject: [PATCH] fixing different configuration option for navigation --- .../src/vizro/models/_navigation/_navigation_utils.py | 11 +++++++---- vizro-core/src/vizro/models/_navigation/nav_bar.py | 4 ++++ vizro-core/src/vizro/models/_navigation/nav_item.py | 6 ++---- vizro-core/src/vizro/models/_navigation/navigation.py | 4 ++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/vizro-core/src/vizro/models/_navigation/_navigation_utils.py b/vizro-core/src/vizro/models/_navigation/_navigation_utils.py index 6f60979d8..967be4771 100644 --- a/vizro-core/src/vizro/models/_navigation/_navigation_utils.py +++ b/vizro-core/src/vizro/models/_navigation/_navigation_utils.py @@ -8,14 +8,17 @@ def _validate_pages(pages): from vizro.models import Page pages_as_list = list(itertools.chain(*pages.values())) if isinstance(pages, dict) else pages - - if not pages_as_list: - raise ValueError("Ensure this value has at least 1 item.") - # Ideally we would use dash.page_registry or maybe dashboard.pages here, but we only register pages in # dashboard.pre_build and model manager cannot find a Dashboard at validation time. # page[0] gives the page model ID. registered_pages = [page[0] for page in model_manager._items_with_type(Page)] + + if pages is None: + return registered_pages + + if not pages_as_list: + raise ValueError("Ensure this value has at least 1 item.") + if unknown_pages := [page for page in pages_as_list if page not in registered_pages]: raise ValueError(f"Unknown page ID {unknown_pages} provided to argument 'pages'.") return pages diff --git a/vizro-core/src/vizro/models/_navigation/nav_bar.py b/vizro-core/src/vizro/models/_navigation/nav_bar.py index 879bc3861..671130f0f 100644 --- a/vizro-core/src/vizro/models/_navigation/nav_bar.py +++ b/vizro-core/src/vizro/models/_navigation/nav_bar.py @@ -8,6 +8,7 @@ from vizro.models import VizroBaseModel from vizro.models._models_utils import _log_call +from vizro.models._navigation._navigation_utils import _validate_pages from vizro.models._navigation.nav_item import NavItem from vizro.models.types import NavPagesType @@ -24,6 +25,9 @@ class NavBar(VizroBaseModel): pages: Optional[NavPagesType] = None items: List[NavItem] = [] + # validators + _validate_pages = validator("pages", allow_reuse=True, pre=True, always=True)(_validate_pages) + @validator("items", always=True) def validate_items(cls, items, values): if not items: diff --git a/vizro-core/src/vizro/models/_navigation/nav_item.py b/vizro-core/src/vizro/models/_navigation/nav_item.py index d81bdfe0c..c82a85e73 100644 --- a/vizro-core/src/vizro/models/_navigation/nav_item.py +++ b/vizro-core/src/vizro/models/_navigation/nav_item.py @@ -48,7 +48,7 @@ def pre_build(self): if self.tooltip is None: if self.text and len(self.text) > self.max_text_length: self.tooltip = self.text - self.text = self.text[:self.max_text_length] + self.text = self.text[: self.max_text_length] @validator("text", always=True) def set_text(cls, text, values): @@ -69,9 +69,7 @@ def build(self, active_page_id): list(itertools.chain(*self.pages.values()))[0] if isinstance(self.pages, dict) else self.pages[0] ) icon_div = ( - html.Span(self.icon, className="material-symbols-outlined") - if self.icon - else html.Div(className="hidden") + html.Span(self.icon, className="material-symbols-outlined") if self.icon else html.Div(className="hidden") ) text_div = html.Div(children=[self.text], className="icon-text") if self.text else html.Div(className="hidden") diff --git a/vizro-core/src/vizro/models/_navigation/navigation.py b/vizro-core/src/vizro/models/_navigation/navigation.py index 082bf2116..4af9c4264 100644 --- a/vizro-core/src/vizro/models/_navigation/navigation.py +++ b/vizro-core/src/vizro/models/_navigation/navigation.py @@ -27,9 +27,9 @@ class Navigation(VizroBaseModel): selector: Optional[NavSelectorType] = None # validators - _validate_pages = validator("pages", allow_reuse=True)(_validate_pages) + _validate_pages = validator("pages", allow_reuse=True, pre=True, always=True)(_validate_pages) - @validator("selector", pre=True, always=True) + @validator("selector", always=True) def set_selector(cls, selector, values): if selector is None: return Accordion(pages=values.get("pages"))