import os import sys import panel as pn ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if ROOT_DIR not in sys.path: sys.path.insert(0, ROOT_DIR) pn.extension("plotly", "tabulator") # Import pages (kept as modules, not nested templates) from panel_app import kpi_health_check_panel, trafic_analysis_panel PAGES = { "📊 Global Traffic Analysis": { "get_components": trafic_analysis_panel.get_page_components, "description": "Analyse trafic multi-RAT + cartes + exports.", }, "📈 KPI Health Check": { "get_components": kpi_health_check_panel.get_page_components, "description": "Détection KPI dégradés/persistants/résolus + drill-down + export.", }, } HOME_PAGE = "🏠 Gallery" page_sidebar_container = pn.Column(sizing_mode="stretch_width") page_main_container = pn.Column(sizing_mode="stretch_both") page_title = pn.pane.Markdown("", sizing_mode="stretch_width") back_button = pn.widgets.Button( name="← Back to gallery", button_type="primary", width=180, ) home_button = pn.widgets.Button( name=HOME_PAGE, button_type="default", width_policy="max", ) def _load_page(page_name: str) -> None: if page_name == HOME_PAGE: page_title.object = "## Applications" tiles = [] for title, meta in PAGES.items(): btn = pn.widgets.Button(name="Open", button_type="primary", width=120) btn.on_click(lambda e, t=title: _load_page(t)) tile = pn.Column( pn.pane.Markdown(f"### {title}\n\n{meta.get('description', '')}"), btn, sizing_mode="stretch_width", margin=(10, 10, 10, 10), ) tiles.append(tile) gallery = pn.GridBox(*tiles, ncols=2, sizing_mode="stretch_width") page_sidebar_container.objects = [ pn.pane.Markdown( """### Bienvenue\n\nChoisis une application dans la gallery.""" ) ] page_main_container.objects = [page_title, gallery] return meta = PAGES.get(page_name) if meta is None: page_sidebar_container.objects = [ pn.pane.Alert("Unknown page", alert_type="danger") ] page_main_container.objects = [] return sidebar, main = meta["get_components"]() page_title.object = f"## {page_name}" page_sidebar_container.objects = [sidebar] page_main_container.objects = [ pn.Row(back_button, pn.Spacer(), sizing_mode="stretch_width"), page_title, main, ] template = pn.template.MaterialTemplate(title="OML DB - Portal") def _go_home(event=None) -> None: _load_page(HOME_PAGE) back_button.on_click(_go_home) home_button.on_click(_go_home) _load_page(HOME_PAGE) template.sidebar.append( pn.Column( pn.pane.Markdown("## Navigation"), home_button, pn.layout.Divider(), page_sidebar_container, sizing_mode="stretch_width", ) ) template.main.append(page_main_container) template.servable()