-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdashboard_config.py
More file actions
139 lines (121 loc) · 6.9 KB
/
dashboard_config.py
File metadata and controls
139 lines (121 loc) · 6.9 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Configuración compartida para navegación de dashboards
# Este archivo define las constantes y funciones utilizadas en toda la aplicación
import streamlit as st
COMFENALCO_LABEL = "Comfenalco Antioquia"
COLOMBO_LABEL = "Centro Colombo Americano Medellín"
# Mapeo de categorías y subcategorías a páginas
DASHBOARD_CATEGORIES = {
COMFENALCO_LABEL: {
"subcategories": {
"Años 2016 al 2019": [
("1p-estudiantes_por_jornada_dia.py", "Estudiantes por Jornada y día", "📅"),
("2p-estudiantes_por_poblacion.py", "Estudiantes por Población", "👥"),
("3p-estudiantes_por_sede_nodal_etapa1_2.py", "Participación % por Sede nodal", "⚖️"),
("4p-estudiantes_por_sede_nodal_barras_etp1_2.py", "Estudiantes por Sede nodal", "📊"),
("5p-estudiantes_por_institucion.py", "Estudiantes Escuela Nueva", "🏫"),
],
"Años 2021 al 2025": [
("10p-estudiantes_por_jornada_dia_2021_2025.py", "Estudiantes por Jornada y día", "📅"),
("11p-estudiantes_por_poblacion_2021_2025.py", "Estudiantes por Población", "👥"),
("12p-estudiantes_por_sede_nodal_etapa1_2_2021_2025.py", "Participación % por Sede nodal", "⚖️"),
("13p-estudiantes_por_sede_nodal_barras_etp1_2_2021_2025.py", "Estudiantes por Sede nodal", "📊"),
("14p-grados_2021_2025.py", "Estudiantes por Grado y Etapa", "🎓"),
("15p-estudiantes_por_institucion_2021_2025.py", "Matriculados por Institución", "🏫"),
],
"Intensificación lingüística": [
("16p-estudiantes_por_jornada_intensificacion.py", "Estudiantes por Jornada", "📅"),
("17p-estudiantes_por_poblacion_intensificacion.py", "Estudiantes por Población", "👥"),
("18p-estudiantes_por_sede_nodal_intensificacion.py", "Estudiantes por Sede Nodal", "📊"),
("19p-grados_intensificacion.py", "Grados por Sede Nodal", "🎓"),
("20p-frances_intensificacion_jornada_dia.py", "Matriculados por Jornada (Francés)", "🕒"),
("21p-frances_intensificacion_grados.py", "Nivel MCER por Grado (Francés)", "📈"),
("22p-horas_frances_intensificacion.py", "Horas de Formación por Sede (Francés)", "🏫"),
("23p-grados_frances_intensificacion_jmg.py", "Matriculados por Grado y Sede (Francés)", "🎓"),
]
}
},
COLOMBO_LABEL: {
"subcategories": {
"Formación a estudiantes": [
("8p-colombo_por_institucion.py", "Estudiantes por Institución Educativa", "🏫"),
("9p-colombo_por_nivel.py", "Estudiantes por nivel MCER", "📈"),
],
"Formación a docentes": [
("6p-docentes_por_nivel.py", "Docentes por nivel MCER", "🎓"),
("7p-docentes_por_institucion.py", "Docentes por Institución Educativa", "🏫"),
]
}
}
}
def get_current_page_category(current_page_file):
"""
Determine the category of the current page based on its filename.
Returns the category label (COMFENALCO_LABEL, DOCENTES_LABEL, or COLOMBO_LABEL)
or None if not found.
"""
for category, config in DASHBOARD_CATEGORIES.items():
if "subcategories" in config:
for sub_pages in config["subcategories"].values():
for page_file, _, _ in sub_pages:
if current_page_file in page_file or page_file in current_page_file:
return category
return None
def update_filter_by_page(current_page_file):
"""
Initialize the filter based on current page only if not already set.
This allows the filter to be set when first visiting a page, but respects
user changes afterward.
"""
# This function is now a no-op - filter is managed by user selection
# and initial page context
pass
def create_nav_buttons(selected_pop):
# Inicializar estados de sesión si no existen
if 'comfenalco_subcategory' not in st.session_state:
st.session_state.comfenalco_subcategory = "Años 2016 al 2019"
if 'colombo_subcategory' not in st.session_state:
st.session_state.colombo_subcategory = "Formación a estudiantes"
# Botones de categoría principal
with st.container(border=False):
st.markdown('<div class="main-category-btns">', unsafe_allow_html=True)
pop_options = [COMFENALCO_LABEL, COLOMBO_LABEL]
cols_pop = st.columns(len(pop_options))
def set_population(pop_type):
st.session_state.population_filter = pop_type
for i, pop in enumerate(pop_options):
with cols_pop[i]:
st.button(pop, key=f"pop_btn_{pop}_nav", on_click=set_population, args=(pop,), width='stretch', type="primary" if selected_pop == pop else "secondary")
st.markdown('</div>', unsafe_allow_html=True)
st.markdown('<hr class="compact">', unsafe_allow_html=True)
# Botones de subcategoría y enlaces
if selected_pop in DASHBOARD_CATEGORIES:
category_config = DASHBOARD_CATEGORIES[selected_pop]
subcategories = list(category_config["subcategories"].keys())
# Determinar y gestionar la subcategoría activa
if selected_pop == COMFENALCO_LABEL:
active_subcategory = st.session_state.comfenalco_subcategory
def set_sub(sub):
st.session_state.comfenalco_subcategory = sub
else: # COLOMBO_LABEL
active_subcategory = st.session_state.colombo_subcategory
def set_sub(sub):
st.session_state.colombo_subcategory = sub
# Mostrar botones de subcategoría
with st.container(border=False):
st.markdown('<div class="subcategory-btns">', unsafe_allow_html=True)
cols_sub = st.columns(len(subcategories))
for i, sub in enumerate(subcategories):
with cols_sub[i]:
st.button(sub, key=f"sub_btn_{sub}_nav", on_click=set_sub, args=(sub,), width='stretch', type="primary" if active_subcategory == sub else "secondary")
st.markdown('</div>', unsafe_allow_html=True)
st.markdown('<hr class="compact">', unsafe_allow_html=True)
# Mostrar enlaces de la subcategoría activa
pages = category_config["subcategories"].get(active_subcategory, [])
all_buttons = [("app.py", "Inicio", "🏠")] + [(f"pages/{pf}", label, icon) for pf, label, icon in pages]
# Dividir botones en grupos de 2 para un layout más limpio
for i in range(0, len(all_buttons), 2):
row_buttons = all_buttons[i:i+2]
nav_cols = st.columns(2)
for j, (page_path, label, icon) in enumerate(row_buttons):
with nav_cols[j]:
st.page_link(page_path, label=label, icon=icon, width='stretch')