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) | |