from contextlib import closing import streamlit as st from auth import get_fullname_for_user, get_role_for_user from app_db.app_db import get_conn, get_list # import sqlite3 def build_sidebar(): authenticator = st.session_state.get("authenticator") username = st.session_state.get("name") role_text = st.session_state.get("role_text") fullname = st.session_state.get("fullname") if not authenticator or not username: return df = st.session_state.get("df_sidebar") with st.sidebar: st.logo("app/images/GMN_Logo_neu_rgb.png", size="small") st.markdown(f"**{fullname}** ({role_text})") col1, col2 = st.columns([2,2]) with col1: authenticator.logout("Logout") with col2: if st.button("Home", use_container_width=True, icon=":material/home:"): st.switch_page("pages/home.py") # --- Suchfeld --- query = st.text_input("Menü-Suche", "", placeholder="z.B. Umsatz, Kosten, User ...") query = query.strip() # Aktive Seite ermitteln (für Expander-Status / Highlight) current_page = st.session_state.get("_page_path") # --- DF filtern, falls Suchbegriff gesetzt --- if query: mask = ( df["dash_text"].str.contains(query, case=False, na=False) | df["group_text"].str.contains(query, case=False, na=False) ) df_view = df[mask].copy() else: df_view = df if df_view.empty: st.info("Keine Einträge zum Suchbegriff gefunden.") return # --- Gruppiert durchlaufen --- # df_view = df_view.sort_values(["group_order", "dash_order"]) # vorher noch sortieren for group_text, df_group in df_view.groupby("group_text", sort=False): # und beim gruppieren nicht nach der Gruppe sortieren! # Expander offen, wenn: # - aktuelle Seite in dieser Gruppe liegt group_open = any( (row["page_file"] == current_page) for _, row in df_group.iterrows() ) with st.expander(group_text, expanded=(group_open or bool(query))): for _, row in df_group.iterrows(): dash_type = row.get("dash_type") page_file = row.get("page_file") label = row.get("dash_text", "") # Streamlit-Page if dash_type == "page" and isinstance(page_file, str) and page_file.strip(): st.page_link(f"pages/{page_file}.py", label=label, help="Das ist die Hilfe") # Externer Link elif dash_type == "url" and isinstance(page_file, str) and page_file.strip(): st.markdown(f"[{label}]({page_file})") # Platzhalter / Sonstiges else: st.write(f"▫️ {label}") # Damit die leere Sidebar komplett verschwindet nach dem Logout def hide_sidebar_if_logged_out(): if st.session_state.get("authentication_status") != True: st.markdown(""" """, unsafe_allow_html=True)