Spaces:
Runtime error
Runtime error
| 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() | |
| 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): | |
| 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) | |