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)