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
@@ -1,4 +1,4 @@
import { render, screen } from '@testing-library/react';
import { fireEvent, render, screen } from '@testing-library/react';
import { describe, expect, it, vi } from 'vitest';
// quick-260916-iex: Link-Widget entfernt — unbekannte Widget-Typen (z. B.
@@ -14,6 +14,12 @@ vi.mock('next-intl', () => ({
: key,
}));
const setWidgetConfig = vi.fn();
vi.mock('@/lib/stores/dashboard-store', () => ({
useDashboardStore: (selector: (state: { setWidgetConfig: typeof setWidgetConfig }) => unknown) =>
selector({ setWidgetConfig }),
}));
import { WidgetWrapper } from './widget-wrapper';
describe('WidgetWrapper', () => {
@@ -54,4 +60,53 @@ describe('WidgetWrapper', () => {
),
).toBeNull();
});
// quick-260928-wtt: Titel je Widget ein-/ausblenden
it('Bearbeitungsmodus: Schalter blendet den Titel aus und speichert hideTitle', () => {
setWidgetConfig.mockClear();
render(
<WidgetWrapper
widget={{ id: 'w-uhr', widgetType: 'clock', config: {} }}
isEditMode={true}
onRemove={vi.fn()}
/>,
);
fireEvent.click(screen.getByRole('button', { name: 'hideTitle' }));
expect(setWidgetConfig).toHaveBeenCalledWith('w-uhr', { hideTitle: true });
// im Bearbeitungsmodus bleibt der Titel sichtbar
expect(screen.getByRole('article')).not.toHaveAttribute('data-hide-title');
});
it('ausgeblendeter Titel: Schalter blendet wieder ein, Ansicht markiert die Karte', () => {
setWidgetConfig.mockClear();
const { rerender } = render(
<WidgetWrapper
widget={{ id: 'w-uhr', widgetType: 'clock', config: { hideTitle: true } }}
isEditMode={true}
onRemove={vi.fn()}
/>,
);
fireEvent.click(screen.getByRole('button', { name: 'showTitle' }));
expect(setWidgetConfig).toHaveBeenCalledWith('w-uhr', { hideTitle: false });
rerender(
<WidgetWrapper
widget={{ id: 'w-uhr', widgetType: 'clock', config: { hideTitle: true } }}
isEditMode={false}
onRemove={vi.fn()}
/>,
);
expect(screen.getByRole('article')).toHaveAttribute('data-hide-title');
});
it('Widgets ohne Titelzeile (Suche) bekommen keinen Schalter', () => {
render(
<WidgetWrapper
widget={{ id: 'w-suche', widgetType: 'search', config: {} }}
isEditMode={true}
onRemove={vi.fn()}
/>,
);
expect(screen.queryByRole('button', { name: 'hideTitle' })).toBeNull();
});
});