Files
co_app/app/pages/groups.py
2025-12-19 11:01:21 +01:00

211 lines
7.4 KiB
Python

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")
groups()
#-------------------------------------------------------------------------------------
# Dialog Gruppe anlegen
#-------------------------------------------------------------------------------------
@st.dialog("Gruppe anlegen")
def dialog_create_group(group_id):
txt_group_id = st.text_input("GrpId", value=group_id, disabled=True)
txt_group_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 groups (group_id, group_text, group_description, order_no) " \
"values (?, ?, ?, ?)",(txt_group_id, txt_group_text, txt_description, txt_order_no)):
st.session_state.save_msg = f"✅ Gruppe '{txt_group_text}' erfolgreich gespeichert"
update_num(group_id,1,"numgen_group")
else:
st.session_state.save_msg = "❌ Fehler beim Speichern"
st.rerun()
#-------------------------------------------------------------------------------------
# Dialog Gruppe bearbeiten
#-------------------------------------------------------------------------------------
@st.dialog("Benutzer bearbeiten")
def dialog_edit_group(group_id):
if group_id == None:
st.write("keine Gruppe ausgewählt")
else:
sql = """
select
group_id,
group_text,
group_description,
active,
order_no
from
groups
where
group_id = ?
order by
order_no
"""
df = get_list(sql,(group_id,))
col1, col2 = st.columns([2,1],vertical_alignment="center")
with col1:
txt_group_text = st.text_input(label="Gruppenbezeichnung", value=df.iloc[0]["group_text"])
with col2:
is_active = st.checkbox(label="Aktiv", value=df.iloc[0]["active"])
txt_group_description = st.text_area(label="Beschreibung", value=df.iloc[0]["group_description"])
txt_oder_no = st.text_input(label="Reihenfolge", value=df.iloc[0]["order_no"])
if st.button("Save"):
sql = """
update groups set
group_text = ?,
active = ?,
group_description = ?,
order_no = ?
where group_id = ?
"""
params = (txt_group_text, is_active, txt_group_description, txt_oder_no, group_id)
if send_cmd(sql, params):
st.session_state.save_msg = f"✅ Gruppe '{txt_group_text}' erfolgreich geändert"
else:
st.session_state.save_msg = "❌ Fehler beim Speichern"
st.rerun()
#-------------------------------------------------------------------------------------
# Dialog Gruppe löschen
#-------------------------------------------------------------------------------------
@st.dialog("Gruppe löschen")
def dialog_delete_group(group_id):
if id == None:
st.write("keine Gruppe ausgewählt")
else:
df = get_list("select group_text from groups where group_id = ?",(group_id,))
group_text = df.iloc[0]["group_text"]
st.write(f"Die Gruppe {group_text} wird gelöscht! Sind Sie sicher?")
if st.button("Löschen"):
if send_cmd("delete from groups where group_id = ?",(group_id,)):
st.session_state.delete_msg = f"✅ Gruppe '{group_text}' erfolgreich gelöscht!"
else:
st.session_state.delete_msg = f"❌ Gruppe '{group_text}' konnte nicht gelöscht werden!"
st.rerun()
def groups():
if "selected_group_id" not in st.session_state:
st.session_state.selected_group_id = None
#--------------------------------------------------------------------------------------------------
# Rollenverwaltung
#--------------------------------------------------------------------------------------------------
df = get_list("""
select
group_id,
group_text,
group_description,
active,
order_no
from
groups
order by
order_no
""")
col_find_group, col_create_group, col_edit_group, col_delete_group = st.columns([3,2,2,2], vertical_alignment="bottom")
with col_find_group:
txt_search = st.text_input(label="Suche", label_visibility="hidden", placeholder="Gruppe", icon=":material/search:")
with col_create_group:
if st.button(label="Gruppe anlegen", use_container_width=True, icon=":material/add:"):
dialog_create_group(get_num("numgen_group"))
if "save_msg" in st.session_state:
st.toast(st.session_state.save_msg)
del st.session_state.save_msg
with col_edit_group:
if st.button(label="Gruppe bearbeiten", use_container_width=True, icon=":material/edit:"):
if not st.session_state.selected_group_id is None:
dialog_edit_group(st.session_state.selected_group_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_group:
if st.button(label="Gruppe löschen", use_container_width=True, icon=":material/delete:"):
if not st.session_state.selected_group_id is None:
dialog_delete_group(st.session_state.selected_group_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["group_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="group_data", on_select="rerun", selection_mode="single-row", height="auto")
rows = event.selection.rows
if rows:
row_idx = rows[0]
st.session_state.selected_group_id = int(df_view.iloc[row_idx]["group_id"])
else:
st.session_state.selected_group_id = None
if __name__ == "__main__":
sidebar()