clea up code and layout
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
[client]
|
[client]
|
||||||
showSidebarNavigation = false
|
showSidebarNavigation = false
|
||||||
|
toolbarMode = "minimal"
|
||||||
|
|||||||
21
app/.streamlit/style.css
Normal file
21
app/.streamlit/style.css
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/* Footer entfernen */
|
||||||
|
footer {visibility: hidden !important;}
|
||||||
|
div[data-testid="stStatusWidget"] {display: none !important;}
|
||||||
|
|
||||||
|
/* Sidebar-Spacing kompakter */
|
||||||
|
section[data-testid="stSidebar"] > div {
|
||||||
|
padding-top: 0.5rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Haupt-Container kompakter */
|
||||||
|
.block-container {
|
||||||
|
padding-top: 0.6rem !important;
|
||||||
|
padding-bottom: 0.6rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Widgets enger */
|
||||||
|
.stButton, .stTextInput, .stSelectbox {
|
||||||
|
margin-bottom: 0.3rem !important;
|
||||||
|
}
|
||||||
@@ -3,8 +3,30 @@ import yaml
|
|||||||
from yaml.loader import SafeLoader
|
from yaml.loader import SafeLoader
|
||||||
import streamlit_authenticator as stauth
|
import streamlit_authenticator as stauth
|
||||||
from streamlit_authenticator.utilities.exceptions import LoginError
|
from streamlit_authenticator.utilities.exceptions import LoginError
|
||||||
|
from auth import (
|
||||||
|
load_credentials_from_db,
|
||||||
|
needs_password_change,
|
||||||
|
update_password,
|
||||||
|
get_role_for_user,
|
||||||
|
get_fullname_for_user,
|
||||||
|
get_sidebar
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
st.markdown("""
|
||||||
|
<style>
|
||||||
|
/* Streamlit Hamburger-Menü ausblenden */
|
||||||
|
div[data-testid="stToolbar"] {
|
||||||
|
visibility: hidden !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optional: ganz entfernen statt nur unsichtbar machen */
|
||||||
|
div[data-testid="stDecoration"] {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
""", unsafe_allow_html=True)
|
||||||
|
|
||||||
from auth import load_credentials_from_db, needs_password_change, update_password
|
|
||||||
|
|
||||||
def get_authenticator():
|
def get_authenticator():
|
||||||
with open("config/auth.yaml", "r", encoding="utf-8") as f:
|
with open("config/auth.yaml", "r", encoding="utf-8") as f:
|
||||||
@@ -41,8 +63,23 @@ def require_login():
|
|||||||
st.warning("Bitte Benutzername und Passwort eingeben.")
|
st.warning("Bitte Benutzername und Passwort eingeben.")
|
||||||
st.stop()
|
st.stop()
|
||||||
|
|
||||||
# Passwortwechsel erzwingen
|
#--------------------------------------------------------------------------------------
|
||||||
|
# Ab hier bin ich eingeloggt
|
||||||
|
#--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
username = st.session_state.get("username")
|
username = st.session_state.get("username")
|
||||||
|
|
||||||
|
if "df_sidebar" not in st.session_state:
|
||||||
|
role_text = get_role_for_user(username)
|
||||||
|
fullname = get_fullname_for_user(username)
|
||||||
|
sidebar = get_sidebar(role_text, username)
|
||||||
|
|
||||||
|
st.session_state["role_text"] = role_text
|
||||||
|
st.session_state["fullname"] = fullname
|
||||||
|
st.session_state["df_sidebar"] = sidebar
|
||||||
|
|
||||||
|
# Passwortwechsel erzwingen
|
||||||
|
|
||||||
if needs_password_change(username):
|
if needs_password_change(username):
|
||||||
st.warning("Du musst dein Passwort ändern, bevor du die Anwendung nutzen kannst.")
|
st.warning("Du musst dein Passwort ändern, bevor du die Anwendung nutzen kannst.")
|
||||||
|
|
||||||
|
|||||||
@@ -7,17 +7,24 @@ from auth_runtime import require_login
|
|||||||
from ui.sidebar import build_sidebar
|
from ui.sidebar import build_sidebar
|
||||||
import os
|
import os
|
||||||
from app_db.app_db import get_list
|
from app_db.app_db import get_list
|
||||||
|
from pathlib import Path
|
||||||
|
from tools.load_css import load_css
|
||||||
|
|
||||||
|
|
||||||
APP_ENV = os.environ.get("APP_ENV", "dev")
|
APP_ENV = os.environ.get("APP_ENV", "dev")
|
||||||
|
|
||||||
logger = setup_logging(APP_ENV)
|
logger = setup_logging(APP_ENV)
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
load_css()
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
st.set_page_config(
|
st.set_page_config(
|
||||||
page_title=f"Co-App Home - V{__version__}",
|
page_title=f"Co-App Home - V{__version__}",
|
||||||
page_icon="🔒",
|
page_icon="🔒",
|
||||||
layout="centered",
|
layout="centered",
|
||||||
|
menu_items=None,
|
||||||
)
|
)
|
||||||
|
|
||||||
authenticator = require_login()
|
authenticator = require_login()
|
||||||
@@ -32,7 +39,6 @@ def main():
|
|||||||
st.session_state["authenticator"] = authenticator
|
st.session_state["authenticator"] = authenticator
|
||||||
# ... dann ist der name des users in der sesstion_state verfügbar!
|
# ... dann ist der name des users in der sesstion_state verfügbar!
|
||||||
|
|
||||||
|
|
||||||
# Ich suche mir erst mal alles zusammen, was ich dann in session_state speichern will ...
|
# Ich suche mir erst mal alles zusammen, was ich dann in session_state speichern will ...
|
||||||
username = st.session_state.get("name") # wird duch authenticator gesetzt
|
username = st.session_state.get("name") # wird duch authenticator gesetzt
|
||||||
role_text = get_role_for_user(username)
|
role_text = get_role_for_user(username)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from auth_runtime import require_login
|
|||||||
from ui.sidebar import build_sidebar, hide_sidebar_if_logged_out
|
from ui.sidebar import build_sidebar, hide_sidebar_if_logged_out
|
||||||
from auth import get_fullname_for_user
|
from auth import get_fullname_for_user
|
||||||
|
|
||||||
hide_sidebar_if_logged_out()
|
# hide_sidebar_if_logged_out()
|
||||||
|
|
||||||
st.set_page_config(page_title="Co-App Home", page_icon="🏠")
|
st.set_page_config(page_title="Co-App Home", page_icon="🏠")
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,31 @@
|
|||||||
import streamlit as st
|
import streamlit as st
|
||||||
from auth_runtime import require_login
|
from auth_runtime import require_login
|
||||||
from ui.sidebar import build_sidebar, hide_sidebar_if_logged_out
|
from ui.sidebar import build_sidebar
|
||||||
from auth import get_fullname_for_user
|
from auth import get_fullname_for_user
|
||||||
|
import pandas as pd
|
||||||
|
from numpy.random import default_rng as rng
|
||||||
|
from tools.load_css import load_css
|
||||||
|
|
||||||
hide_sidebar_if_logged_out()
|
load_css()
|
||||||
|
|
||||||
st.set_page_config(page_title="Co-App Home", page_icon="🏠")
|
st.set_page_config(page_title="Co-App Home", page_icon="🏠")
|
||||||
|
|
||||||
authenticator = require_login()
|
authenticator = require_login()
|
||||||
st.session_state["authenticator"] = authenticator
|
st.session_state["authenticator"] = authenticator
|
||||||
|
build_sidebar()
|
||||||
|
|
||||||
#build_sidebar()
|
|
||||||
|
|
||||||
username = st.session_state.get("username")
|
def home():
|
||||||
|
username = st.session_state.get("name")
|
||||||
st.header("Controlling-Portal")
|
st.header("Controlling-Portal")
|
||||||
st.info(f"Willkommen, {get_fullname_for_user(username)}!")
|
st.info(f"Willkommen, {get_fullname_for_user(username)}!")
|
||||||
st.markdown("**Hier könnte eine Hinweistext für den Benutzer stehen**")
|
st.markdown("**Hier könnte eine Hinweistext für den Benutzer stehen**")
|
||||||
|
|
||||||
|
df = pd.DataFrame(rng(0).standard_normal((20, 3)), columns=["a", "b", "c"])
|
||||||
|
st.area_chart(df)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
home()
|
||||||
@@ -1,52 +1,115 @@
|
|||||||
import streamlit as st
|
import streamlit as st
|
||||||
from auth_runtime import require_login
|
from auth_runtime import require_login
|
||||||
from ui.sidebar import hide_sidebar_if_logged_out
|
from ui.sidebar import build_sidebar
|
||||||
from auth import create_user
|
from auth import create_user
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from tools.check_permission import check
|
from tools.load_css import load_css
|
||||||
|
|
||||||
DASH_NAME = Path(__file__).stem # Hier muss die dash_id aus der DB stehen -> wird gegen die session_state geprüft (User-Berechtigung)
|
DASH_NAME = Path(__file__).stem # Hier muss die dash_id aus der DB stehen -> wird gegen die session_state geprüft (User-Berechtigung)
|
||||||
|
|
||||||
|
load_css()
|
||||||
|
|
||||||
hide_sidebar_if_logged_out()
|
|
||||||
|
|
||||||
st.set_page_config(page_title="Co-App Benutzer", page_icon="🏠")
|
st.set_page_config(page_title="Co-App Benutzer", page_icon="🏠")
|
||||||
|
|
||||||
authenticator = require_login()
|
authenticator = require_login()
|
||||||
username = st.session_state.get("username")
|
st.session_state["authenticator"] = authenticator
|
||||||
df = st.session_state.get("df_sidebar")
|
|
||||||
|
|
||||||
if check(df,DASH_NAME) == False:
|
def sidebar():
|
||||||
st.markdown("**FEHLER**")
|
|
||||||
st.error("Die Seite kann nicht angezeigt werden - keine Berechtigung!")
|
|
||||||
st.stop()
|
|
||||||
|
|
||||||
st.title("Benutzerverwaltung")
|
fullname = st.session_state.get("fullname")
|
||||||
|
role_text = st.session_state.get("role_text")
|
||||||
|
|
||||||
with st.expander("Neuen Nutzer anlegen"):
|
with st.sidebar:
|
||||||
new_u = st.text_input("Neuer Username", key="new_u")
|
st.logo("app/images/GMN_Logo_neu_rgb.png", size="small")
|
||||||
new_fname = st.text_input("Vorname", key="new_fname")
|
st.markdown(f"**{fullname}** ({role_text})")
|
||||||
new_lname = st.text_input("Nachname", key="new_lname")
|
col1, col2, col3 = st.columns([2,2,1])
|
||||||
new_email = st.text_input("E-Mail", key="new_email")
|
# with col1:
|
||||||
new_p = st.text_input("Neues Passwort", type="password", key="new_p")
|
|
||||||
new_role = st.selectbox("Rolle", ["user", "admin"], key="new_role")
|
|
||||||
|
|
||||||
if st.button("Anlegen"):
|
# if st.button("Logout", use_container_width=True):
|
||||||
if new_u and new_p:
|
# st.rerun()
|
||||||
ok = create_user(
|
with col1:
|
||||||
new_u.strip(),
|
|
||||||
new_p,
|
|
||||||
new_role,
|
|
||||||
new_email.strip() or None,
|
|
||||||
new_fname.strip() or None,
|
|
||||||
new_lname.strip() or None,
|
|
||||||
)
|
|
||||||
st.success("Nutzer angelegt.") if ok else st.error(
|
|
||||||
"Username bereits vorhanden oder Fehler."
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
st.warning("Bitte Username und Passwort eingeben.")
|
|
||||||
|
|
||||||
st.subheader("Dein Bereich")
|
authenticator.logout("Logout")
|
||||||
st.write(f"Personalisierter Content für **{username}**.")
|
# st.rerun()
|
||||||
|
# if st.button("Home", use_container_width=True):
|
||||||
|
# st.switch_page("pages/home.py")
|
||||||
|
|
||||||
|
with col2:
|
||||||
|
if st.button("🏠 Home", use_container_width=True):
|
||||||
|
st.switch_page("pages/home.py")
|
||||||
|
|
||||||
|
user()
|
||||||
|
|
||||||
|
def user():
|
||||||
|
|
||||||
|
st.header("Benutzerverwaltung")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sidebar()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# username = st.session_state.get("username")
|
||||||
|
# df = st.session_state.get("df_sidebar")
|
||||||
|
|
||||||
|
|
||||||
|
# if check(df,DASH_NAME) == False:
|
||||||
|
# st.markdown("**FEHLER**")
|
||||||
|
# st.error("Die Seite kann nicht angezeigt werden - keine Berechtigung!")
|
||||||
|
# st.stop()
|
||||||
|
|
||||||
|
# df = st.session_state.get("df_sidebar")
|
||||||
|
# st.text(DASH_NAME)
|
||||||
|
# st.text(st.session_state.get(username))
|
||||||
|
|
||||||
|
# print(df)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# st.title("Benutzerverwaltung")
|
||||||
|
|
||||||
|
# with st.expander("Neuen Nutzer anlegen"):
|
||||||
|
# new_u = st.text_input("Neuer Username", key="new_u")
|
||||||
|
# new_fname = st.text_input("Vorname", key="new_fname")
|
||||||
|
# new_lname = st.text_input("Nachname", key="new_lname")
|
||||||
|
# new_email = st.text_input("E-Mail", key="new_email")
|
||||||
|
# new_p = st.text_input("Neues Passwort", type="password", key="new_p")
|
||||||
|
# new_role = st.selectbox("Rolle", ["user", "admin"], key="new_role")
|
||||||
|
|
||||||
|
# if st.button("Anlegen"):
|
||||||
|
# if new_u and new_p:
|
||||||
|
# ok = create_user(
|
||||||
|
# new_u.strip(),
|
||||||
|
# new_p,
|
||||||
|
# new_role,
|
||||||
|
# new_email.strip() or None,
|
||||||
|
# new_fname.strip() or None,
|
||||||
|
# new_lname.strip() or None,
|
||||||
|
# )
|
||||||
|
# st.success("Nutzer angelegt.") if ok else st.error(
|
||||||
|
# "Username bereits vorhanden oder Fehler."
|
||||||
|
# )
|
||||||
|
# else:
|
||||||
|
# st.warning("Bitte Username und Passwort eingeben.")
|
||||||
|
|
||||||
|
# st.subheader("Dein Bereich")
|
||||||
|
# st.write(f"Personalisierter Content für **{username}**.")
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
import streamlit as st
|
|
||||||
from auth_runtime import require_login
|
|
||||||
from auth import get_sidebar, get_fullname_for_user, get_role_for_user
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def check(df, page_name):
|
|
||||||
if "df_sidebar" not in st.session_state:
|
|
||||||
# authenticator = require_login()
|
|
||||||
username = st.session_state.get("username")
|
|
||||||
role_text = get_role_for_user(username)
|
|
||||||
fullname = get_fullname_for_user(username)
|
|
||||||
df = get_sidebar(role_text, username)
|
|
||||||
|
|
||||||
st.session_state["role_text"] = role_text
|
|
||||||
st.session_state["fullname"] = fullname
|
|
||||||
st.session_state["df_sidebar"] = df
|
|
||||||
|
|
||||||
if df is None or df.empty:
|
|
||||||
return False # oder True – je nach gewünschtem Verhalten
|
|
||||||
|
|
||||||
allowed = not df[
|
|
||||||
(df["dash_type"] == "page") &
|
|
||||||
(df["page_file"] == page_name)
|
|
||||||
].empty
|
|
||||||
|
|
||||||
return True
|
|
||||||
8
app/tools/load_css.py
Normal file
8
app/tools/load_css.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import streamlit as st
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def load_css():
|
||||||
|
css_path = Path(__file__).parent.parent / ".streamlit" / "style.css"
|
||||||
|
if css_path.exists():
|
||||||
|
st.markdown(f"<style>{css_path.read_text()}</style>", unsafe_allow_html=True)
|
||||||
@@ -7,8 +7,8 @@ from app_db.app_db import get_conn, get_list
|
|||||||
|
|
||||||
def build_sidebar():
|
def build_sidebar():
|
||||||
|
|
||||||
if st.session_state.get("authentication_status") != True:
|
# if st.session_state.get("authentication_status") != True:
|
||||||
return
|
# return
|
||||||
|
|
||||||
authenticator = st.session_state.get("authenticator")
|
authenticator = st.session_state.get("authenticator")
|
||||||
username = st.session_state.get("name")
|
username = st.session_state.get("name")
|
||||||
@@ -21,19 +21,18 @@ def build_sidebar():
|
|||||||
df = st.session_state.get("df_sidebar")
|
df = st.session_state.get("df_sidebar")
|
||||||
|
|
||||||
with st.sidebar:
|
with st.sidebar:
|
||||||
|
|
||||||
st.logo("app/images/GMN_Logo_neu_rgb.png", size="small")
|
st.logo("app/images/GMN_Logo_neu_rgb.png", size="small")
|
||||||
st.markdown(f"**{fullname}** ({role_text})")
|
st.markdown(f"**{fullname}** ({role_text})")
|
||||||
|
col1, col2, col3 = st.columns([2,2,1])
|
||||||
|
|
||||||
col1, col2 = st.columns(2)
|
|
||||||
with col1:
|
with col1:
|
||||||
if st.button("Logout", use_container_width=True):
|
|
||||||
authenticator.logout("Logout", "unrendered")
|
authenticator.logout("Logout")
|
||||||
st.rerun()
|
|
||||||
with col2:
|
with col2:
|
||||||
if st.button("Home", use_container_width=True):
|
if st.button("Home", use_container_width=True):
|
||||||
st.switch_page("pages/home.py")
|
st.switch_page("pages/home.py")
|
||||||
st.divider()
|
|
||||||
st.markdown("## Menü")
|
|
||||||
|
|
||||||
# --- Suchfeld ---
|
# --- Suchfeld ---
|
||||||
query = st.text_input("Menü-Suche", "", placeholder="z.B. Umsatz, Kosten, User ...")
|
query = st.text_input("Menü-Suche", "", placeholder="z.B. Umsatz, Kosten, User ...")
|
||||||
@@ -42,6 +41,9 @@ def build_sidebar():
|
|||||||
# Aktive Seite ermitteln (für Expander-Status / Highlight)
|
# Aktive Seite ermitteln (für Expander-Status / Highlight)
|
||||||
current_page = st.session_state.get("_page_path")
|
current_page = st.session_state.get("_page_path")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# --- DF filtern, falls Suchbegriff gesetzt ---
|
# --- DF filtern, falls Suchbegriff gesetzt ---
|
||||||
if query:
|
if query:
|
||||||
mask = (
|
mask = (
|
||||||
@@ -56,6 +58,7 @@ def build_sidebar():
|
|||||||
st.info("Keine Einträge zum Suchbegriff gefunden.")
|
st.info("Keine Einträge zum Suchbegriff gefunden.")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# --- Gruppiert durchlaufen ---
|
# --- Gruppiert durchlaufen ---
|
||||||
for group_text, df_group in df_view.groupby("group_text"):
|
for group_text, df_group in df_view.groupby("group_text"):
|
||||||
# Expander offen, wenn:
|
# Expander offen, wenn:
|
||||||
|
|||||||
Reference in New Issue
Block a user