File size: 4,323 Bytes
6739f59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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