import streamlit as st from auth_runtime import require_login # from ui.sidebar import build_sidebar from pathlib import Path from tools.load_css import load_css from app_db.app_db import get_list, send_cmd from tools.numgen import get_num, update_num DASH_NAME = Path(__file__).stem load_css() st.set_page_config(page_title="Co-App Benutzer", page_icon=":material/person:", layout="wide", initial_sidebar_state="collapsed") authenticator = require_login() st.session_state["authenticator"] = authenticator def sidebar(): fullname = st.session_state.get("fullname") role_text = st.session_state.get("role_text") 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") roles() #------------------------------------------------------------------------------------- # Dialog Rollen anlegen #------------------------------------------------------------------------------------- @st.dialog("Rolle anlegen") def dialog_create_role(role_id): txt_role_id = st.text_input("RoleId", value=role_id, disabled=True) txt_role_text = st.text_input("Gruppenbezeichnung") txt_description = st.text_area("Beschreibung") txt_order_no = st.text_input("Reihenfolge") if st.button("Save"): if send_cmd(f"insert into roles (role_id, role_text, role_description, order_no) " \ "values (?, ?, ?, ?)",(txt_role_id, txt_role_text, txt_description, txt_order_no)): st.session_state.save_msg = f"✅ Rolle '{txt_role_text}' erfolgreich gespeichert" update_num(role_id,1,"numgen_role") else: st.session_state.save_msg = "❌ Fehler beim Speichern" st.rerun() #------------------------------------------------------------------------------------- # Dialog Rollen bearbeiten #------------------------------------------------------------------------------------- @st.dialog("Rolle bearbeiten") def dialog_edit_role(role_id): if role_id == None: st.write("keine Rolle ausgewählt") else: sql = """ select role_id, role_text, role_description, active, order_no from roles where role_id = ? order by order_no """ df = get_list(sql,(role_id,)) col1, col2 = st.columns([2,1],vertical_alignment="center") with col1: txt_role_text = st.text_input(label="Rollenbezeichnung", value=df.iloc[0]["role_text"]) with col2: is_active = st.checkbox(label="Aktiv", value=df.iloc[0]["active"]) txt_role_description = st.text_area(label="Beschreibung", value=df.iloc[0]["role_description"]) txt_oder_no = st.text_input(label="Reihenfolge", value=df.iloc[0]["order_no"]) if st.button("Save"): sql = """ update roles set role_text = ?, active = ?, role_description = ?, order_no = ? where role_id = ? """ params = (txt_role_text, is_active, txt_role_description, txt_oder_no, role_id) if send_cmd(sql, params): st.session_state.save_msg = f"✅ Rolle '{txt_role_text}' erfolgreich geändert" else: st.session_state.save_msg = "❌ Fehler beim Speichern" st.rerun() #------------------------------------------------------------------------------------- # Dialog Rollen löschen #------------------------------------------------------------------------------------- @st.dialog("Rolle löschen") def dialog_delete_role(role_id): if role_id == None: st.write("keine Rolle ausgewählt") else: df = get_list("select role_text from roles where role_id = ?",(role_id,)) role_text = df.iloc[0]["role_text"] st.write(f"Die Rolle {role_text} wird gelöscht! Sind Sie sicher?") if st.button("Löschen"): if send_cmd("delete from roles where role_id = ?",(role_id,)): st.session_state.delete_msg = f"✅ Rolle '{role_text}' erfolgreich gelöscht!" else: st.session_state.delete_msg = f"❌ Rolle '{role_text}' konnte nicht gelöscht werden!" st.rerun() def roles(): if "selected_role_id" not in st.session_state: st.session_state.selected_role_id = None #-------------------------------------------------------------------------------------------------- # Rollenverwaltung #-------------------------------------------------------------------------------------------------- df = get_list(""" select role_id, role_text, role_description, active, order_no from roles order by order_no """) col_find_role, col_create_role, col_edit_role, col_delete_role = st.columns([3,2,2,2], vertical_alignment="bottom") with col_find_role: txt_search = st.text_input(label="Suche", label_visibility="hidden", placeholder="Rolle", icon=":material/search:") with col_create_role: if st.button(label="Rolle anlegen", use_container_width=True, icon=":material/add:"): dialog_create_role(get_num("numgen_role")) if "save_msg" in st.session_state: st.toast(st.session_state.save_msg) del st.session_state.save_msg with col_edit_role: if st.button(label="Rolle bearbeiten", use_container_width=True, icon=":material/edit:"): if not st.session_state.selected_role_id is None: dialog_edit_role(st.session_state.selected_role_id) else: st.toast("❌ Bitte erst eine Zeile auswählen") if "save_msg" in st.session_state: st.toast(st.session_state.save_msg) del st.session_state.save_msg with col_delete_role: if st.button(label="Rolle löschen", use_container_width=True, icon=":material/delete:"): if not st.session_state.selected_role_id is None: dialog_delete_role(st.session_state.selected_role_id) else: st.toast("❌ Bitte erst eine Zeile auswählen") if "delete_msg" in st.session_state: st.toast(st.session_state.delete_msg) del st.session_state.delete_msg if txt_search.strip(): txt_search_norm = txt_search.strip().lower() mask = ( df["role_text"].fillna("").str.lower().str.contains(txt_search_norm) ) df_view = df.loc[mask].copy() else: df_view = df.copy() event = st.dataframe(df_view, key="role_data", on_select="rerun", selection_mode="single-row", height="auto") rows = event.selection.rows if rows: row_idx = rows[0] st.session_state.selected_role_id = int(df_view.iloc[row_idx]["role_id"]) else: st.session_state.selected_role_id = None if __name__ == "__main__": sidebar()