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)