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)