File size: 6,139 Bytes
7c10fc9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e48ff6a
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
115
116
117
118
119
120
121
122
from dash import html, dcc, Input, Output, callback, State
import dash_mantine_components as dmc
from dash_iconify import DashIconify

# Define navigation structure
nav_structure = {
    "analyses": {
        "label": "Analyses",
        "icon": "tabler:chart-bar",
        "links": [
            {"label": "Activités Principales", "href": "/main-activities-analysis", "description": "Analyse des activités principales et des compétences associées."},
            {"label": "Compétences Opérationnelles", "href": "/operational-skills-analysis", "description": "Visualisation des compétences opérationnelles requises."},
            {"label": "Compétences Comportementales", "href": "/behavioral-skills-analysis", "description": "Examen des compétences comportementales clés."},
            {"label": "Savoirs", "href": "/knowledge-analysis", "description": "Analyse des savoirs et connaissances nécessaires."},
            {"label": "Offres ODD 11", "href": "/analyse-odd-11", "description": "Analyse des offres de formation liées à l'Objectif de Développement Durable 11."},
            {"label": "Publications HAL Pédagogie", "href": "/hal-pedagogy-analysis", "description": "Analyse des publications HAL sur les sciences de l'éducation."},
            {"label": "Pub. HAL Gustave Eiffel Pédagogie", "href": "/hal-gustave-eiffel-pedagogy-analysis", "description": "Publications pédagogiques de l'Université Gustave Eiffel sur HAL."},
            {"label": "Pub. HAL Gustave Eiffel Clustering", "href": "/hal-gustave-eiffel-clustering-analysis", "description": "Analyse de clustering des publications HAL de l'Université Gustave Eiffel."},
            {"label": "Axes Recherche Mobilité", "href": "/research-areas-mobility-analysis", "description": "Analyse des axes de recherche sur la mobilité durable."},
            {"label": "Projets Recherche Mobilité", "href": "/research-projects-mobility-analysis", "description": "Analyse des projets de recherche sur la mobilité durable."},
        ]
    },
    "agents": {
        "label": "Agents IA",
        "icon": "simple-icons:robotframework",
        "links": [
            {"label": "Génération du RAC", "href": "/rac-generation-agent", "description": "Agent IA pour la génération de Référentiels d'Activités et de Compétences (RAC)."},
            {"label": "Génération du Référentiel de Formation", "href": "/training-framework-generation-agent", "description": "Agent IA pour la génération de référentiels de formation à partir d'un RAC."},
        ]
    }
}

def create_sidebar_children(is_collapsed, theme_checked=False):
    text_color = "black" if not theme_checked else "white"

    if not is_collapsed: # If not collapsed, it's opened
        return [
            dmc.NavLink(
                label="Accueil",
                href="/",
                leftSection=DashIconify(icon="material-symbols:home-outline"),
                style={
                    "marginTop": 20,
                },
                c=text_color
            ),
            dmc.Accordion(
                multiple=True,
                value=["analyses", "agents"],
                chevronPosition="right",
                bg="transparent",
                children=[
                    dmc.AccordionItem(
                        [
                            dmc.AccordionControl(
                                dmc.Text(item["label"], c=text_color), # Set color for accordion label
                                icon=DashIconify(icon=item["icon"])
                            ),
                            dmc.AccordionPanel(
                                [dmc.NavLink(label=link["label"], href=link["href"], c=text_color) for link in item["links"]]
                            ),
                        ],
                        value=key,
                        bg="transparent"
                    ) for key, item in nav_structure.items()
                ]
            )
        ]
    else:
        # Collapsed view
        return [
            dmc.Tooltip(
                label="Accueil",
                children=dcc.Link(
                    href="/",
                    children=dmc.ActionIcon(
                        children=DashIconify(icon="material-symbols:home-outline", width=25),
                        variant="transparent",
                        color=text_color,
                        size="xl",
                    ),
                ),
                position="right",
                withArrow=True,
            ),
        ] + [
            dmc.Popover(
                children=[
                    dmc.ActionIcon(
                        children=DashIconify(icon=item["icon"], width=25),
                        variant="transparent",
                        color=text_color,
                        size="xl",
                    ),
                    dmc.Stack(
                        [dmc.NavLink(label=link["label"], href=link["href"], c=text_color) for link in item["links"]],
                        gap=0,
                    )
                ],
                position="right",
                withArrow=True,
            ) for item in nav_structure.values() if item["links"]
        ]


def create_sidebar():
    return dmc.AppShellNavbar(
        id="sidebar",
        bg="transparent",
        children=create_sidebar_children(False, True)  # Initial state is NOT collapsed, and dark theme is active
    )

@callback(

    Output("sidebar", "children"),

    Input("app-shell", "navbar"), # Input from AppShell's navbar property

    State("theme-switch", "checked"), # Added input for theme switch

    prevent_initial_call=False # Allow initial call to render correctly

)
def update_sidebar_content(navbar_config, theme_checked):
    # Extract collapsed state from navbar_config
    is_collapsed = navbar_config.get("collapsed", {}).get("mobile", True) # Assuming mobile collapsed state dictates sidebar content
    return create_sidebar_children(is_collapsed, theme_checked)