diff --git a/backend/app/api/v1/settings.py b/backend/app/api/v1/settings.py
index 8ae47e4..8f65748 100644
--- a/backend/app/api/v1/settings.py
+++ b/backend/app/api/v1/settings.py
@@ -10,6 +10,7 @@ from app.models.user import User
from app.core.settings_registry import (
THEME_KEYS,
MODULE_KEYS,
+ UI_KEYS,
SETTINGS_REGISTRY,
get_default_value,
)
@@ -82,6 +83,47 @@ def get_module_settings(
return result
+@router.get("/ui", response_model=dict[str, Any])
+def get_ui_settings(
+ *,
+ db: Session = Depends(get_db),
+ current_user: User = Depends(get_current_user)
+) -> Any:
+ """
+ Get UI settings (accessible to all authenticated users).
+
+ Returns UI/layout settings that apply to all users.
+ """
+ result = {}
+ for key in UI_KEYS:
+ setting = crud.settings.get_setting(db, key=key)
+ if setting:
+ result[key] = setting.get_value()
+ else:
+ result[key] = get_default_value(key)
+ return result
+
+
+@router.put("/ui", response_model=dict[str, Any])
+def update_ui_settings(
+ *,
+ db: Session = Depends(get_db),
+ ui_data: dict[str, Any],
+ current_user: User = Depends(get_current_superuser)
+) -> Any:
+ """
+ Update UI settings (admin only).
+
+ Updates multiple UI/layout settings at once.
+ """
+ result = {}
+ for key, value in ui_data.items():
+ if key in UI_KEYS:
+ setting = crud.settings.update_setting(db, key=key, value=value)
+ result[key] = setting.get_value()
+ return result
+
+
@router.put("/modules", response_model=dict[str, Any])
def update_module_settings(
*,
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index ac12450..6b7a290 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -46,7 +46,11 @@ import MainLayout from './components/MainLayout';
// ...
function AppRoutes() {
- const { user } = useAuth();
+ const { user, isLoading } = useAuth();
+
+ if (isLoading) {
+ return
Loading...
;
+ }
return (
@@ -72,9 +76,9 @@ function App() {
return (
-
-
-
+
+
+
@@ -82,9 +86,9 @@ function App() {
-
-
-
+
+
+
);
diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx
index 1129be0..7bc7611 100644
--- a/frontend/src/components/Sidebar.tsx
+++ b/frontend/src/components/Sidebar.tsx
@@ -14,7 +14,7 @@ import '../styles/Sidebar.css';
export default function Sidebar() {
const { t, language, setLanguage } = useTranslation();
const { config } = useSiteConfig();
- const { sidebarStyle, theme, toggleTheme, darkModeLocation, languageLocation, showDarkModeToggle, showLanguageToggle } = useTheme();
+ const { sidebarStyle, theme, toggleTheme, darkModeLocation, languageLocation, showDarkModeToggle, showLanguageToggle, hasInitializedSettings: themeInitialized } = useTheme();
const {
isCollapsed,
isMobileOpen,
@@ -235,7 +235,7 @@ export default function Sidebar() {
)}
- {showDarkModeToggle && darkModeLocation === 'sidebar' && (
+ {themeInitialized && showDarkModeToggle && darkModeLocation === 'sidebar' && (
)}
- {showLanguageToggle && languageLocation === 'sidebar' && (
+ {themeInitialized && showLanguageToggle && languageLocation === 'sidebar' && (