feat(web): Widget-Titel je Widget ausblenden, Seitenleiste gegliedert
Tessera CI/CD / Build & Publish Images (push) Successful in 2m56s
Tessera CI/CD / Lint & Type Check (push) Successful in 48s
Tessera CI/CD / Tests (push) Successful in 1m17s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 5m24s

Neuer Schalter im Bearbeitungsmodus (neben dem Griff) setzt hideTitle in
der Widget-Konfiguration (setWidgetConfig im Dashboard-Store, optimistisch
mit Ruecksetzen); in der Ansicht entfaellt die Titelzeile per
data-hide-title, Aktionen der Titelzeile bleiben oben rechts. Kategorien der
Seitenleiste 14 px, Moduleintraege 13 px / 32 px hoch. Version 1.5.2.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-28 23:21:26 +02:00
parent bdaa3c8db5
commit 12eea333ba
8 changed files with 163 additions and 4 deletions
@@ -26,6 +26,8 @@ interface DashboardState {
updateLayouts: (layouts: Record<string, unknown>) => void;
addWidget: (widgetType: WidgetType) => Promise<void>;
removeWidget: (id: string) => Promise<void>;
/** Teil-Konfiguration eines Widgets setzen — sofort sichtbar, bei Fehler zurueck. */
setWidgetConfig: (id: string, partial: Record<string, unknown>) => Promise<void>;
loadDashboard: () => Promise<void>;
saveLayout: () => Promise<void>;
selectDashboard: (id: string) => Promise<void>;
@@ -159,6 +161,22 @@ export const useDashboardStore = create<DashboardState>()((set, get) => ({
}
},
setWidgetConfig: async (id: string, partial: Record<string, unknown>) => {
const before = get().widgets.find((w) => w.id === id)?.config;
if (!before) return;
const patch = (config: Record<string, unknown>) =>
set((state) => ({
widgets: state.widgets.map((w) => (w.id === id ? { ...w, config } : w)),
}));
patch({ ...before, ...partial });
try {
await api.updateWidgetConfig(id, partial);
} catch (err) {
console.error('Failed to update widget config:', err);
patch(before);
}
},
loadDashboard: async () => {
set({ isLoading: true, error: null });
try {