161 lines
5.8 KiB
Python
161 lines
5.8 KiB
Python
import streamlit as st
|
|
from components.connexion import connexion, bouton_deconnexion
|
|
import streamlit.components.v1 as components
|
|
from utils.translations import _
|
|
from utils.persistance import get_champ_statut, maj_champ_statut
|
|
|
|
def afficher_menu():
|
|
with st.sidebar:
|
|
st.markdown(f"""
|
|
<nav role="navigation" aria-label="{str(_('sidebar.menu'))}">
|
|
<div role="region" aria-label="{str(_('sidebar.navigation'))}" class="onglets-accessibles">
|
|
""", unsafe_allow_html=True)
|
|
|
|
# Définir la variable instructions_text une seule fois en haut de la fonction
|
|
instructions_text = str(_("navigation.instructions"))
|
|
navigation_onglet = get_champ_statut("navigation_onglet")
|
|
if navigation_onglet == "":
|
|
navigation_onglet = instructions_text
|
|
maj_champ_statut("navigation_onglet", navigation_onglet)
|
|
|
|
onglet_choisi = None
|
|
onglets = [
|
|
str(_("navigation.instructions")),
|
|
str(_("navigation.personnalisation")),
|
|
str(_("navigation.analyse")),
|
|
*([str(_("navigation.ia_nalyse"))] if not get_champ_statut("login") == "" else []),
|
|
*([str(_("navigation.plan_d_action"))]),
|
|
str(_("navigation.visualisations")),
|
|
str(_("navigation.fiches"))
|
|
]
|
|
|
|
for nom in onglets:
|
|
if navigation_onglet == nom:
|
|
st.markdown(f'<div class="bouton-fictif">{nom}</div>', unsafe_allow_html=True)
|
|
else:
|
|
if st.button(str(nom)):
|
|
onglet_choisi = nom
|
|
|
|
st.markdown("""
|
|
<hr />
|
|
</div>
|
|
</nav>""", unsafe_allow_html=True)
|
|
|
|
# === GESTION DU THÈME ===
|
|
#
|
|
# Le changement de thème induit un st.rerun qui vide les formula
|
|
# Pour éviter de perdre les informations dans les formulaires,
|
|
# le changement de thème n'est proposé que si l'utilisateur est sur l'onglet "Instructions"
|
|
#
|
|
#
|
|
theme_mode = get_champ_statut("theme_mode")
|
|
if theme_mode == "":
|
|
theme_mode = str(_("sidebar.theme_light"))
|
|
maj_champ_statut("theme_mode", theme_mode)
|
|
|
|
theme_title = str(_("sidebar.theme"))
|
|
st.markdown(f"""
|
|
<section role="region" aria-label="region-theme">
|
|
<div role="region" aria-labelledby="Theme">
|
|
<p id="Theme" class="decorative-heading">{theme_title}</p>
|
|
""", unsafe_allow_html=True)
|
|
|
|
theme_options = [
|
|
str(_("sidebar.theme_light")),
|
|
str(_("sidebar.theme_dark"))
|
|
]
|
|
theme = st.radio(
|
|
str(_("sidebar.theme")),
|
|
theme_options,
|
|
index=theme_options.index(theme_mode),
|
|
horizontal=True,
|
|
label_visibility="hidden"
|
|
)
|
|
maj_champ_statut("theme_mode", theme)
|
|
|
|
st.markdown("""
|
|
<hr />
|
|
</div>
|
|
</nav>""", unsafe_allow_html=True)
|
|
|
|
connexion()
|
|
|
|
if not get_champ_statut("login") == "":
|
|
bouton_deconnexion()
|
|
|
|
# === RERUN SI BESOIN ===
|
|
if (onglet_choisi and onglet_choisi != navigation_onglet) or (theme != theme_mode):
|
|
if onglet_choisi: # Ne met à jour que si on a cliqué
|
|
maj_champ_statut("navigation_onglet", onglet_choisi)
|
|
maj_champ_statut("theme_mode", theme)
|
|
st.rerun()
|
|
|
|
#
|
|
# Important :
|
|
# Avec Selinux, il faut donner les bons droits
|
|
#
|
|
# sudo chcon -Rt httpd_sys_content_t /chemin/d/acces/assets/
|
|
#
|
|
def afficher_impact(total_bytes):
|
|
impact_label = str(_("sidebar.impact"))
|
|
loading_text = str(_("sidebar.loading"))
|
|
|
|
with st.sidebar:
|
|
components.html(f"""
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Impact Environnemental</title>
|
|
<style>
|
|
body,
|
|
html {{
|
|
font-family:
|
|
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
|
|
sans-serif;
|
|
}}
|
|
/* Div réseau pour impact CO₂ */
|
|
#network-usage {{
|
|
display: block;
|
|
font-size: small;
|
|
margin-top: 1rem;
|
|
text-align: center;
|
|
}}
|
|
.decorative-heading {{
|
|
font-size: 1.25rem;
|
|
font-weight: bold;
|
|
margin-bottom: 0.5rem;
|
|
color: #145a1a;
|
|
text-align: center;
|
|
}}
|
|
span {{
|
|
text-align: center;
|
|
}}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<hr />
|
|
<div role="region" aria-label="{impact_label}" class="impact-environnement">
|
|
<p class="decorative-heading">{impact_label}</p>
|
|
<p><span id="network-usage">{loading_text}</span></p>
|
|
</div>
|
|
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", async function() {{
|
|
try {{
|
|
const module = await import("/assets/impact_co2.js");
|
|
module.calculerImpactCO2({total_bytes});
|
|
}} catch (error) {{
|
|
console.error("Erreur module impact_co2.js", error);
|
|
}}
|
|
}});
|
|
</script>
|
|
</body>
|
|
</html>
|
|
""")
|
|
st.markdown("""
|
|
<div style="text-align: center;">
|
|
<img src="https://app.greenweb.org/api/v3/greencheckimage/fabnum-dev.peccini.fr?nocache=true" alt="This website runs on green hosting - verified by thegreenwebfoundation.org" width="200px" height="95px">
|
|
</div>
|
|
""", unsafe_allow_html=True)
|