Spaces:
Running
Running
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) |