Skip to content

Commit 9ec3896

Browse files
committed
layout loading split into separate functions
1 parent 024ed16 commit 9ec3896

File tree

2 files changed

+44
-29
lines changed

2 files changed

+44
-29
lines changed

dash_entrypoints/multi_page/entrypoint.py

+36-29
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,26 @@
1818
DEFAULT_VIEWS_MODULE = "dash_entrypoints.views"
1919

2020

21-
def _do_register_module_as_page(app_name=None, layout_file=None, views_imported=None):
21+
def import_layout_function(layout_file=None, views_imported=None):
2222
layout_name = layout_file.name.replace(".py", "")
2323
layout_path = layout_name.replace("__", "/")
2424
page = importlib.import_module(f"{views_imported.__package__}.{layout_name}")
2525
if hasattr(page, "layout"):
26+
return page.layout, layout_name, layout_path
27+
else:
28+
return None, None, None
29+
30+
31+
def _do_register_module_as_page(app_name=None, layout_file=None, views_imported=None):
32+
page_layout, layout_name, layout_path = import_layout_function(
33+
layout_file=layout_file, views_imported=views_imported
34+
)
35+
if page_layout is not None:
2636
dash.register_page(
2737
module=layout_name,
2838
title=f"{app_name}: " + layout_path,
2939
name=layout_name,
30-
layout=page.layout,
40+
layout=page_layout,
3141
path="/" + layout_path,
3242
top_nav=True,
3343
)
@@ -49,21 +59,24 @@ def register_page_layouts(
4959
layout_paths = sorted(Path(views_imported.__path__[0]).rglob("*.py"))
5060
layout_files = [lay for lay in layout_paths if not lay.name.startswith("__")]
5161

52-
if register_blank_frontpage:
53-
dash.register_page(
54-
module="",
55-
title=app_name,
56-
name="",
57-
layout=lambda layout: html.Div(),
58-
path="/",
59-
top_nav=True,
60-
)
61-
else:
62-
# Try to find front page in modules __init__
63-
frontpage_file = [lay for lay in layout_paths if lay.name.startswith("__")][0]
64-
_do_register_module_as_page(
65-
app_name=app_name, layout_file=frontpage_file, views_imported=views_imported
66-
)
62+
def empty_layout():
63+
return html.Div()
64+
65+
frontpage_file = [lay for lay in layout_paths if lay.name.startswith("__")][0]
66+
front_page_layout, layout_name, layout_path = import_layout_function(
67+
layout_file=frontpage_file, views_imported=views_imported
68+
)
69+
front_page_layout = (
70+
front_page_layout if front_page_layout is not None else empty_layout
71+
)
72+
dash.register_page(
73+
module="",
74+
title=app_name,
75+
name="",
76+
layout=empty_layout if register_blank_frontpage else front_page_layout,
77+
path="/",
78+
top_nav=True,
79+
)
6780

6881
# Register other views
6982
for layout_file in layout_files:
@@ -94,7 +107,7 @@ def get_app(
94107

95108

96109
def add_base_layout(app=None, app_name=None, **kwargs):
97-
"""
110+
"""Add base layout including navigation bar with page links.
98111
99112
:param app:
100113
:param app_name:
@@ -110,7 +123,7 @@ def add_base_layout(app=None, app_name=None, **kwargs):
110123
# Use row and col to control vertical alignment of logo / brand
111124
dbc.Row(
112125
[
113-
# dbc.Col(html.Img(src=PLOTLY_LOGO, height="30px")),
126+
# dbc.Col(html.Img(src=PLOTLY_LOGO, height="30px")), # TODO: add app_name as image
114127
dbc.Col(dbc.NavbarBrand(app_name, className="ms-2")),
115128
],
116129
align="center",
@@ -119,21 +132,15 @@ def add_base_layout(app=None, app_name=None, **kwargs):
119132
href=f"http://{kwargs.get('ip_address')}:{kwargs.get('port')}",
120133
style={"textDecoration": "none"},
121134
),
122-
# dbc.DropdownMenu(
123-
# [
124-
# dbc.DropdownMenuItem(page["name"], href=page["path"])
125-
# for page in dash.page_registry.values()
126-
# if page["module"] != "pages.not_found_404"
127-
# ],
128-
# nav=True,
129-
# label="main dropdown",
130-
# ),
131135
dbc.NavbarToggler(id="navbar-toggler", n_clicks=0),
132136
dbc.Collapse(
133137
dbc.Nav(
134138
[
135139
dbc.NavLink(
136-
str(page["name"]).capitalize().replace("__", "/"),
140+
str(page["name"])
141+
.capitalize()
142+
.replace("__", "🠖")
143+
.replace("_", " "),
137144
href=page["path"],
138145
)
139146
for page in dash.page_registry.values()

dash_entrypoints/views/__init__.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from dash import html
2+
3+
4+
def layout():
5+
"""Front page"""
6+
return html.Div(
7+
"Empty front page. Choose one of the linked pages in the navbar above."
8+
)

0 commit comments

Comments
 (0)