diff --git a/app/.streamlit/config.toml b/app/.streamlit/config.toml index 4e85340..5a726d7 100644 --- a/app/.streamlit/config.toml +++ b/app/.streamlit/config.toml @@ -1,7 +1,8 @@ [client] showSidebarNavigation = false -toolbarMode = "minimal" +# toolbarMode = "minimal" # toolbarMode = "auto" +toolbarMode = "viewer" [theme] # primaryColor = "blue" diff --git a/app/app_db/app.db b/app/app_db/app.db index 4a6825a..7dbddc0 100644 Binary files a/app/app_db/app.db and b/app/app_db/app.db differ diff --git a/app/pages/groups.py b/app/pages/groups.py index fbfc192..9bbe0d6 100644 --- a/app/pages/groups.py +++ b/app/pages/groups.py @@ -59,7 +59,7 @@ def dialog_create_group(group_id): # Dialog Gruppe bearbeiten #------------------------------------------------------------------------------------- -@st.dialog("Benutzer bearbeiten") +@st.dialog("Gruppe bearbeiten") def dialog_edit_group(group_id): if group_id == None: st.write("keine Gruppe ausgewählt") diff --git a/app/pages/roles.py b/app/pages/roles.py index e69de29..66f8084 100644 --- a/app/pages/roles.py +++ b/app/pages/roles.py @@ -0,0 +1,210 @@ +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()