diff --git a/app/.streamlit/config.toml b/app/.streamlit/config.toml index 658c3f9..4e85340 100644 --- a/app/.streamlit/config.toml +++ b/app/.streamlit/config.toml @@ -1,3 +1,10 @@ [client] showSidebarNavigation = false toolbarMode = "minimal" +# toolbarMode = "auto" + +[theme] +# primaryColor = "blue" +# backgroundColor = "black" +# secondaryBackgroundColor = "blue" +# borderColor = "blue" diff --git a/app/app_db/app.db b/app/app_db/app.db index 6dec818..6d16786 100644 Binary files a/app/app_db/app.db and b/app/app_db/app.db differ diff --git a/app/auth.py b/app/auth.py index bb2ec7f..6b7d1c1 100644 --- a/app/auth.py +++ b/app/auth.py @@ -97,14 +97,17 @@ def get_sidebar(role_text: str, username: str): d.dash_id, d.dash_text, d.page_file, - d.dash_type + d.dash_type, + d.order_no as dash_order, + g.order_no as group_order from groups g left join dashboards d on g.group_id = d.group_id where g.active = 1 - and d.active = 1 + and d.active = 1 + order by g.order_no, d.order_no """ else: sql = """ @@ -114,7 +117,9 @@ def get_sidebar(role_text: str, username: str): p.dash_id, d.dash_text, d.page_file, - d.dash_type + d.dash_type, + d.order_no as dash_order, + g.order_no as group_order FROM users u left join permissions p @@ -129,13 +134,10 @@ def get_sidebar(role_text: str, username: str): and d.active = 1 and p.active = 1 and u.username = ? - order by - g.order_no, - d.order_no + order by g.order_no, d.order_no """ params = (username,) if "?" in sql else None df = get_list(sql, params) - return df # --------------------------------------------------------------------------- diff --git a/app/pages/roles.py b/app/pages/roles.py new file mode 100644 index 0000000..e69de29 diff --git a/app/pages/user.py b/app/pages/user.py index 675dc90..b7fd78a 100644 --- a/app/pages/user.py +++ b/app/pages/user.py @@ -350,86 +350,86 @@ def user(): if "selected_user_id" not in st.session_state: st.session_state.selected_user_id = None - tab_user, tab_role, tab_permission = st.tabs(["Benutzer", "Rollen", "Berechtigungen"]) + # tab_user, tab_role, tab_permission = st.tabs(["Benutzer", "Rollen", "Berechtigungen"]) #-------------------------------------------------------------------------------------------------- # Benutzerverwaltung #-------------------------------------------------------------------------------------------------- - with tab_user: + # with tab_user: - df = get_list(""" - select - u.id, - u.username, - u.firstname, - u.lastname, - u.role_id || ' | ' || r.role_text as role, - u.new_pwd, - u.active - from - users u - left join roles r - on u.role_id = r.role_id - """) + df = get_list(""" + select + u.id, + u.username, + u.firstname, + u.lastname, + u.role_id || ' | ' || r.role_text as role, + u.new_pwd, + u.active + from + users u + left join roles r + on u.role_id = r.role_id + """) - col_find_user, col_create_user, col_modify_user, col_delete_user = st.columns([3,2,2,2], vertical_alignment="bottom") + col_find_user, col_create_user, col_modify_user, col_delete_user = st.columns([3,2,2,2], vertical_alignment="bottom") - with col_find_user: - txt_search = st.text_input(label="Suche", label_visibility="hidden", placeholder="Benutzer, Vorname, ...", icon=":material/search:") - - with col_create_user: - if st.button(label="Benutzer anlegen", use_container_width=True, icon=":material/person_add:"): - dialog_create_user() - if "save_msg" in st.session_state: - st.toast(st.session_state.save_msg) - del st.session_state.save_msg - - with col_modify_user: - if st.button(label="Benutzer bearbeiten", use_container_width=True, icon=":material/person:"): - if not st.session_state.selected_user_id is None: - dialog_modify_user(st.session_state.selected_user_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_find_user: + txt_search = st.text_input(label="Suche", label_visibility="hidden", placeholder="Benutzer, Vorname, ...", icon=":material/search:") + + with col_create_user: + if st.button(label="Benutzer anlegen", use_container_width=True, icon=":material/person_add:"): + dialog_create_user() + if "save_msg" in st.session_state: + st.toast(st.session_state.save_msg) + del st.session_state.save_msg + + with col_modify_user: + if st.button(label="Benutzer bearbeiten", use_container_width=True, icon=":material/person:"): + if not st.session_state.selected_user_id is None: + dialog_modify_user(st.session_state.selected_user_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_user: - if st.button(label="Benutzer löschen", use_container_width=True, icon=":material/person_remove:"): - if not st.session_state.selected_user_id is None: - dialog_delete_user(st.session_state.selected_user_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 + with col_delete_user: + if st.button(label="Benutzer löschen", use_container_width=True, icon=":material/person_remove:"): + if not st.session_state.selected_user_id is None: + dialog_delete_user(st.session_state.selected_user_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["username"].fillna("").str.lower().str.contains(txt_search_norm) - | df["firstname"].fillna("").str.lower().str.contains(txt_search_norm) - | df["lastname"].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="data", on_select="rerun", selection_mode="single-row") - rows = event.selection.rows - if rows: - row_idx = rows[0] - st.session_state.selected_user_id = int(df_view.iloc[row_idx]["id"]) - else: - st.session_state.selected_user_id = None + if txt_search.strip(): + txt_search_norm = txt_search.strip().lower() + mask = ( + df["username"].fillna("").str.lower().str.contains(txt_search_norm) + | df["firstname"].fillna("").str.lower().str.contains(txt_search_norm) + | df["lastname"].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="data", on_select="rerun", selection_mode="single-row") + rows = event.selection.rows + if rows: + row_idx = rows[0] + st.session_state.selected_user_id = int(df_view.iloc[row_idx]["id"]) + else: + st.session_state.selected_user_id = None diff --git a/app/ui/sidebar.py b/app/ui/sidebar.py index abee2cb..c841314 100644 --- a/app/ui/sidebar.py +++ b/app/ui/sidebar.py @@ -51,10 +51,10 @@ def build_sidebar(): if df_view.empty: st.info("Keine Einträge zum Suchbegriff gefunden.") return - # --- Gruppiert durchlaufen --- - for group_text, df_group in df_view.groupby("group_text"): + # 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(