Salif SAWADOGO
🔥 resolve end of page musmath
68cc99d
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)