File size: 3,175 Bytes
8086e8b
 
 
 
8027e90
00c3a04
 
497d980
00c3a04
8086e8b
68cc99d
 
00c3a04
 
 
 
 
 
8086e8b
00c3a04
 
8027e90
 
00c3a04
 
8086e8b
00c3a04
 
 
 
 
8027e90
 
00c3a04
8086e8b
00c3a04
 
 
 
 
 
 
 
 
8086e8b
00c3a04
 
 
8027e90
 
 
 
00c3a04
 
 
 
 
 
8027e90
 
 
 
00c3a04
 
 
8086e8b
 
 
 
00c3a04
 
 
 
 
 
 
 
8086e8b
00c3a04
 
 
 
 
 
 
 
 
8086e8b
00c3a04
 
 
 
8027e90
 
00c3a04
 
8027e90
00c3a04
 
497d980
8027e90
 
fff6ecc
f27ce21
8086e8b
8027e90
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
import base64
from dash.dependencies import Input, Output
from dash import dcc, html
import dash_bootstrap_components as dbc
from app import app  # Import du Dash app (ne pas écraser cette variable après)
from pages import page_list
from pages.Home import page as home_page
from asgiref.wsgi import WsgiToAsgi
from functools import lru_cache

from dotenv import load_dotenv
load_dotenv()
class DashAppUI:
    STYLES = {
        "content": {"margin-left": "2rem", "margin-right": "2rem", "padding": "2rem 1rem"},
        "topbar": {"padding": "1rem 1rem"},
        "app": {"backgroundColor": "#f8f9fa"},
    }

    def __init__(self, app, pages, home):
        self.app = app
        self.page_list = pages
        self.home = home
        self.setup_layout()
        self.setup_callbacks()

    @property
    @lru_cache(maxsize=1)
    def logo(self):
        with open("assets/logo.png", "rb") as f:
            return html.Img(
                src=f"data:image/jpg;base64,{base64.b64encode(f.read()).decode()}",
                height="40px",
            )

    def create_branding(self):
        return dbc.Row(
            [
                dbc.Col(self.logo),
                dbc.Col(dbc.NavbarBrand("MooreFRCollection", className="ms-2")),
            ],
            align="center",
            className="g-0",
        )

    def create_nav_links(self):
        return [
            dbc.NavLink(
                page["meta"].name,
                href=page["meta"].path,
                id=f"navlink_{page['meta'].id_}",
                active="exact",
            )
            for page in self.page_list
        ]

    def create_navbar(self):
        branding = html.A(
            self.create_branding(),
            href=self.home["meta"].path,
            id=self.home["meta"].id_,
            style={"textDecoration": "none"},
        )
        nav = dbc.Nav(
            self.create_nav_links(),
            navbar=True,
            className="ml-auto",
            style={"font-size": "18px"},
            pills=True,
        )
        return dbc.Navbar(
            [branding, nav],
            color="#000080",
            dark=True,
            sticky="top",
            style=self.STYLES["topbar"],
        )

    def setup_layout(self):
        self.app.layout = html.Div(
            [
                dcc.Location(id="url"),
                self.create_navbar(),
                html.Div(id="page-content", style=self.STYLES["content"]),
            ],
            style=self.STYLES["app"],
        )

    def setup_callbacks(self):
        @self.app.callback(Output("page-content", "children"), [Input("url", "pathname")])
        def display_page(pathname):
            matched_page = next(
                (page for page in self.page_list if pathname == page["meta"].path),
                None,
            )
            return matched_page["layout"] if matched_page else self.home["layout"]

    def run(self, debug, port):
        self.app.run_server(debug=debug, use_reloader=False, port=port)


dash_app = DashAppUI(app, page_list, home_page)
server = WsgiToAsgi(app.server)

if __name__ == "__main__":
    dash_app.run(debug=True, port=7860)