db_query / panel_app /panel_portal.py
DavMelchi's picture
Update portal title from "OML DB - Panel Portal" to "OML DB - Portal" for simplified branding
55d1d4c
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()