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