File size: 3,087 Bytes
a8899bd 24f8e9d a8899bd 55d1d4c a8899bd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
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()
|