Elie Brosset
Add app
6739f59
import dash_bootstrap_components as dbc
from dash import Input, Output, State, callback, html, page_registry
@callback(
Output("navbar-menu", "children"),
Output("loaded", "style"),
Input("loaded", "children"),
)
def generate_menu(navbar):
menu_elements = {}
for _, page in page_registry.items():
path_url = page.get("path")
path_url_split = path_url.split("/")
if len(path_url_split) >= 3:
menu_elements.setdefault(
path_url_split[1],
{
"name": path_url_split[1],
"children": [],
"multi": True,
"label": path_url_split[1],
},
).get("children").append(
dbc.DropdownMenuItem(
html.Div(page.get("name")),
href=page.get("path"),
)
)
else:
menu_elements[path_url_split[1]] = {
"name": path_url_split[1],
"children": dbc.NavItem(
dbc.NavLink(
html.Span(
[
html.I(
className=page.get(
"class_icon", "ti ti-circle"
)
),
html.Span(page.get("name"), className="ms-1"),
],
className="d-flex align-items-center",
),
href=page.get("path"),
class_name="ms-3",
)
),
"multi": False,
}
navbar = dbc.Navbar(
dbc.Container(
[
html.A(
# Use row and col to control vertical alignment of logo / brand
dbc.Row(
[
dbc.Col(
dbc.NavbarBrand(
html.Img(
src=r"assets/logo.svg",
alt="Humanitics.ai Logo",
width="150px",
),
className="ms-2",
)
),
],
align="center",
className="g-0",
),
href="https://plotly.com",
style={"textDecoration": "none"},
),
dbc.NavbarToggler(id="navbar-toggler", n_clicks=0),
dbc.Collapse(
[
dbc.Nav(
[
dbc.DropdownMenu(
nav=True,
in_navbar=True,
label=v.get("label").capitalize(),
children=v.get("children"),
class_name="text-primary ms-3",
)
if v.get("multi")
else v.get("children")
for k, v in menu_elements.items()
],
class_name="mt-1",
navbar=True,
),
],
id="navbar-collapse",
is_open=False,
navbar=True,
),
]
),
color="light",
sticky=True,
)
return navbar, {"display": "none"}
@callback(
Output("navbar-collapse", "is_open"),
[Input("navbar-toggler", "n_clicks")],
[State("navbar-collapse", "is_open")],
)
def toggle_navbar_collapse(n, is_open):
if n:
return not is_open
return is_open
@callback(
Output("url", "pathname"),
[Input("logout-button", "n_clicks")],
[State("url", "pathname")],
)
def logout(n_clicks, href):
if n_clicks:
return "logout"
return None