Add theme selector
Some checks failed
Run Tests / run-tests (push) Failing after 39s

This commit is contained in:
2026-04-30 21:31:19 +02:00
parent 8ae8bc7a24
commit a88d1b4e79
11 changed files with 143 additions and 38 deletions

View File

@@ -1,17 +1,27 @@
import streamlit as st
from pandas.core.ops.docstrings import key
from pandas.io.formats.style import Styler
import queries.crud as crud
import themes as th
is_login_enabled = hasattr(st, 'user') and hasattr(st.user, 'is_logged_in')
is_logged_in = is_login_enabled and st.user.is_logged_in
st.title("Settings")
if hasattr(st.session_state, 'user_name'):
st.markdown(f"Currently logged in as **{st.session_state.user_name}**")
st.header("Theme")
themes = st.session_state.themes
with st.container(horizontal=True, width="stretch"):
for theme in ["light", "dark"]:
if st.button(label=themes[theme]["button_face_label"],
icon = themes[theme]["button_face_icon"],
disabled = (theme == st.session_state.current_theme),
width = "stretch"):
th.change_theme(theme)
st.rerun()
st.header("Colors")
with st.container(key="settings-color-selector"):
palettes = crud.get_color_palettes()

View File

@@ -87,7 +87,7 @@ def get_color_palettes():
return None
def get_color_palette():
def get_color_palette() -> int:
user_id = int(st.session_state.user_id)
try:
return int(connection().query('SELECT color_palette_id FROM users WHERE id = :id''', params={'id': user_id})['color_palette_id'][0])
@@ -123,3 +123,26 @@ def get_colors():
except Exception as e:
logger.error(e)
return None
def set_theme(theme:str):
user_id = int(st.session_state.user_id)
logger.info("Changing theme for user %d to %s", user_id, theme)
with connection().session as session:
try:
query = text('UPDATE users SET theme = :theme WHERE id = :user')
session.execute(query, {
'theme': theme,
'user': user_id
})
except Exception as e:
logger.error(e)
session.rollback()
def get_theme() -> str:
user_id = int(st.session_state.user_id)
try:
return connection().query('SELECT theme FROM users u WHERE u.id = :id', params={'id': user_id})['theme'][0]
except Exception as e:
logger.error(e)
return None

View File

@@ -43,25 +43,27 @@ def create_user(email, name, oidc_user_id):
def set_user_in_session(user: UserInfoProxy):
email = user.email
user_id = user.sub
if hasattr(user, 'name'):
name = user.name
else:
name = None
user_entity = find_user_by_oidc_id(user_id)
email = user.email if hasattr(user, "email") else None
user_id = user.sub if hasattr(user, "sub") else None
name = user.name if hasattr(user, "name") else None
user_entity = find_user_by_oidc_id(user_id) if user_id else st.dataframe()
if user_entity.empty:
user_entity = find_user_by_email(email)
user_entity = find_user_by_email(email) if email else st.dataframe()
if user_entity.empty:
user_entity = find_default_user()
if user_entity.empty:
if user_entity.empty and email and name and user_id:
user_entity = create_user(email, name, user_id)
else:
elif name:
update_default_user(email, name, user_id)
user_entity = find_user_by_oidc_id(user_id)
st.session_state.user_id = user_entity["id"][0]
st.session_state.user_name = user_entity["name"][0]
st.session_state.user_email = user_entity["email"][0]
st.session_state.user_external_id = user_entity["oidc_user_id"][0]
if not user_entity.empty:
st.session_state.user_id = user_entity["id"][0]
st.session_state.user_name = user_entity["name"][0]
st.session_state.user_email = user_entity["email"][0]
st.session_state.user_external_id = user_entity["oidc_user_id"][0]
st.session_state.current_theme = user_entity["theme"][0]
else:
logger.warn("No active user found!")

View File

@@ -5,10 +5,12 @@ import queries.user as user_queries
from logger import init_logger
from styles import init_styles
from user import init_user, is_login_enabled, is_logged_in
from themes import init_themes
init_logger()
init_user()
init_styles()
init_themes()
if is_login_enabled and not is_logged_in:
with st.container(width="stretch", height="stretch", horizontal_alignment="center"):

36
app/themes.py Normal file
View File

@@ -0,0 +1,36 @@
import streamlit as st
from queries import crud
def init_themes():
if 'themes' not in st.session_state:
st.session_state.themes = {
"dark": {
"theme.base": "dark",
"theme.backgroundColor": "black",
"theme.primaryColor": "#c98bdb",
"theme.secondaryBackgroundColor": "#5591f5",
"theme.textColor": "white",
"button_face_label": "Dark",
"button_face_icon": ":material/dark_mode:"
},
"light": {
"theme.base": "light",
"theme.backgroundColor": "white",
"theme.primaryColor": "#5591f5",
"theme.secondaryBackgroundColor": "#82E1D7",
"theme.textColor": "#0a1464",
"button_face_label": "Light",
"button_face_icon": ":material/light_mode:"
},
}
if 'current_theme' not in st.session_state:
st.session_state.current_theme = 'light'
change_theme('light')
def change_theme(theme):
crud.set_theme(theme)
for key, val in st.session_state.themes[theme].items():
if key.startswith("theme"):
st._config.set_option(key, val)

View File

@@ -5,7 +5,4 @@ is_login_enabled = hasattr(st, 'user') and hasattr(st.user, 'is_logged_in')
is_logged_in = is_login_enabled and st.user.is_logged_in
def init_user():
if is_logged_in:
user_queries.set_user_in_session(st.user)
else:
st.session_state.user_id = 1 # default user
user_queries.set_user_in_session(st.user)