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