import streamlit as st import base64 import os from datetime import datetime import pytz import logging from utils.admin import supabase # Pour load_theme_preference et save_theme_preference from utils.logging_utils import log_to_file # Fonction pour charger la préférence de thème depuis la base de données def load_theme_preference(): """Charge la préférence de thème depuis la base de données""" if 'user' in st.session_state and st.session_state['user']: user_id = st.session_state['user'].get('id') if user_id: try: response = supabase.table("notification_preferences").select("theme").eq("user_id", user_id).execute() if response.data: theme = response.data[0]['theme'] log_to_file(f"Thème '{theme}' chargé pour l'utilisateur {user_id}") return theme except Exception as e: log_to_file(f"Erreur lors du chargement du thème : {str(e)}", logging.ERROR) return 'Clair' # Thème par défaut # Fonction pour sauvegarder la préférence de thème dans la base de données def save_theme_preference(theme): """Sauvegarde la préférence de thème dans la base de données""" if 'user' in st.session_state and st.session_state['user']: user_id = st.session_state['user'].get('id') if user_id: try: # Vérifier si une préférence existe déjà existing_preference = supabase.table("notification_preferences").select("*").eq("user_id", user_id).execute() if existing_preference.data: # Mettre à jour la ligne existante supabase.table("notification_preferences").update({"theme": theme}).eq("user_id", user_id).execute() else: # Insérer une nouvelle ligne supabase.table("notification_preferences").insert({"user_id": user_id, "theme": theme}).execute() st.session_state.user_theme = theme log_to_file(f"Thème '{theme}' sauvegardé pour l'utilisateur {user_id}") except Exception as e: log_to_file(f"Erreur lors de la sauvegarde du thème : {str(e)}", logging.ERROR) def apply_theme(theme): # Définition des couleurs communes selon le thème choisi (sombre ou clair) # Texte principal : Gris clair (#E0E0E0) pour le thème sombre, Gris foncé (#4a4a4a) pour le thème clair text_color = "#E0E0E0" if theme == "Sombre" else "#4a4a4a" # Couleur de fond de la page : Gris très foncé (#1E1E1E) pour le thème sombre, blanc cassé (#f7f9fc) pour le thème clair bg_color = "#1E1E1E" if theme == "Sombre" else "#f7f9fc" # Couleur de fond des zones de saisie (inputs) : Gris foncé (#333333) pour le thème sombre, gris très clair avec une légère teinte bleue (#eef3f7) pour le thème clair input_bg_color= "#333333" if theme == "Sombre" else "#eef3f7" # Couleur de fond des zones de saisie (inputs) : Gris foncé (#333333) pour le thème sombre, rouge saumon clair (#ffcccb pour le thème clair input_text_area_inactive = "#333333" if theme == "Sombre" else "#ffcccb" # Couleur de fond des zones de saisie active (inputs) : Gris foncé (#999999) pour le thème sombre, Blanc pur (#ffffff) pour le thème clair input_text_area_active = "#666666" if theme == "Sombre" else "#ffffff" # Définir la couleur du curseur (caret) selon le thème caret_color = "white" if theme == "Sombre" else "black" # Blanc pour le thème sombre, noir pour le thème clair # Couleur de fond de la barre latérale : Gris très foncé (#2D2D2D) pour le thème sombre, gris bleu très clair ( #e3e9f1) pour le thème clair sidebar_bg_color = "#2D2D2D" if theme == "Sombre" else " #e3e9f1" # Couleurs spécifiques pour les messages utilisateur et assistant : # Messages de l'utilisateur : Bleu foncé (#0E4C92) pour le thème sombre, Bleu clair désaturé (#d1e7ff) pour le thème clair user_msg_bg = "#0E4C92" if theme == "Sombre" else "#d1e7ff" # Messages de l'assistant : Vert foncé (#1A472A) pour le thème sombre, Gris perle (#f0f0f0) pour le thème clair assistant_msg_bg = "#1A472A" if theme == "Sombre" else "#f0f0f0" # Couleurs pour les boutons et éléments interactifs : # Fond des boutons : Bleu acier (#4682B4) pour le thème sombre, Or (#FFD700) pour le thème clair button_bg = "#4682B4" if theme == "Sombre" else "#FFD700" # Texte des boutons : Blanc (#FFFFFF) pour le thème sombre, Vert mer (#8FBC8F) pour le thème clair button_text = "white" if theme == "Sombre" else "#8FBC8F" # Fond du selectbox : Bleu foncé (#0E4C92) pour le thème sombre, gris très clair avec une légère teinte bleue (#eef3f7) pour le thème clair select_bg = "#ff5e4d" if theme == "Sombre" else "#eef3f7" # Fond du selectbox : Bleu foncé (#0E4C92) pour le thème sombre, Gris clair (#e6f7ff) pour le thème clair select_option_bg = "#1c39bb" if theme == "Sombre" else "#e6f7ff" select_text_color = "black" if theme == "Sombre" else "#333333" # Couleur du texte du selectbox # Génération des styles CSS pour Streamlit st.markdown(f""" """, unsafe_allow_html=True) # ajout de logo sur l'en -tête de l'application (cette focntion est appelé dans inject_custom_css(theme)) def get_base64_encoded_image(image_file): with open(image_file, "rb") as img_file: return base64.b64encode(img_file.read()).decode('utf-8') # ajout de logo sur l'en -tête de l'application et animation du logo def inject_custom_css(theme): # Définition des paramètres visuels en fonction du thème is_dark_theme = theme == "Sombre" # Sélection du logo et des couleurs selon le thème logo_file = "assets/logo2.svg" if is_dark_theme else "assets/logo.svg" background_color = "#333333" if is_dark_theme else "#eef3f7" text_color = "#E0E0E0" if is_dark_theme else "#333333" # Encodage du logo en base64 logo_base64 = get_base64_encoded_image(logo_file) st.markdown( f""" """, unsafe_allow_html=True,) # ajout de logo sur la sidebar avec un texte simulant un en-tête def add_sidebar_logo(theme): # Définition des couleurs en fonction du thème text_color = "#E0E0E0" if theme == "Sombre" else "#333333" # #E0E0E0 : Gris très clair, presque blanc (pour le thème sombre) # #333333 : Gris très foncé, presque noir (pour le thème clair) # Utilisation d'un contexte 'with' pour la barre latérale with st.sidebar: # Ajout du logo (identique pour les deux thèmes) st.image("assets/logo.png", width=150) # Ajout du titre avec la couleur appropriée st.markdown( f"""
Thème sombre', unsafe_allow_html=True) new_theme = "Sombre" if is_dark else "Clair" if new_theme != current_theme: st.session_state.user_theme = new_theme save_theme_preference(new_theme) apply_theme(new_theme) apply_chat_styles(new_theme) st.rerun() # Cette fonction supprimera certains styles par défaut de Streamlit qui pourraient interférer avec vos styles personnalisés. def remove_streamlit_style(): st.markdown(""" """, unsafe_allow_html=True) # Appelez cette fonction au début de votre improved_ui def force_streamlit_style_update(): st.markdown(""" """, unsafe_allow_html=True ) # Fonction pour cacher les pages de navigation spécifiques (voir dossier pages) def hide_pages(): hide_pages_style = """ """ st.markdown(hide_pages_style, unsafe_allow_html=True) # styles pour le dashboard administrateur (tooltip et bouttons) def apply_tooltip_and_button_styles(theme): # Définition des couleurs en fonction du thème text_color = "#E0E0E0" if theme == "Sombre" else "#333333" background_color = "#333333" if theme == "Sombre" else "#fff" border_color = "#ccc" if theme == "Sombre" else "#333" button_background_color = "#4682B4" if theme == "Sombre" else "#FFD700" button_text_color = "white" if theme == "Sombre" else "#8FBC8F" # Injection des styles CSS pour les tooltips et le bouton de soumission du formulaire st.markdown( f""" """, unsafe_allow_html=True )