diff --git a/apps/web/src/components/settings/picture-frame-config-form.test.tsx b/apps/web/src/components/settings/picture-frame-config-form.test.tsx index 508a12b..ae9a2c8 100644 --- a/apps/web/src/components/settings/picture-frame-config-form.test.tsx +++ b/apps/web/src/components/settings/picture-frame-config-form.test.tsx @@ -66,6 +66,8 @@ describe('PictureFrameConfigForm (quick-260921-pi9)', () => { expect(Array.from(interval.options).map((o) => o.textContent)).toContain('5 Sekunden'); expect(Array.from(interval.options).map((o) => o.textContent)).toContain('30 Minuten'); expect(Array.from(interval.options).map((o) => o.textContent)).toContain('1 Minute'); + expect(Array.from(interval.options).map((o) => o.textContent)).toContain('1 Stunde'); + expect(Array.from(interval.options).map((o) => o.textContent)).not.toContain('60 Minuten'); fireEvent.change(fit, { target: { value: 'cover' } }); expect(onChange).toHaveBeenLastCalledWith({ fit: 'cover' }); diff --git a/apps/web/src/components/settings/picture-frame-config-form.tsx b/apps/web/src/components/settings/picture-frame-config-form.tsx index 0462815..160dd6a 100644 --- a/apps/web/src/components/settings/picture-frame-config-form.tsx +++ b/apps/web/src/components/settings/picture-frame-config-form.tsx @@ -128,6 +128,8 @@ export function PictureFrameConfigForm({ config, onChange }: PictureFrameConfigF function intervalLabel(seconds: number): string { if (seconds === 0) return t('pictureFrame.intervalOff'); if (seconds < 60) return t('pictureFrame.intervalSeconds', { n: seconds }); + // 3600 s heisst wie beim XFrame „1 Stunde“, nicht „60 Minuten“. + if (seconds >= 3600) return t('pictureFrame.intervalHours', { n: seconds / 3600 }); return t('pictureFrame.intervalMinutes', { n: seconds / 60 }); } diff --git a/apps/web/src/components/settings/widget-settings-panel.test.tsx b/apps/web/src/components/settings/widget-settings-panel.test.tsx index b4a867d..c9b2f6c 100644 --- a/apps/web/src/components/settings/widget-settings-panel.test.tsx +++ b/apps/web/src/components/settings/widget-settings-panel.test.tsx @@ -263,3 +263,25 @@ describe('WidgetSettingsPanel — XFrame (quick-260921-qd3)', () => { expect(updateWidgetConfig).toHaveBeenCalledWith('x1', { url: 'https://b.de/' }); }); }); + +describe('WidgetSettingsPanel — Bilderrahmen-Kopfzeile (Kosmetik nach quick-260921-pi9)', () => { + it('Test P1: Kopfzeile zeigt "— 1 Bild" bzw. "— 3 Bilder", ohne Bilder keinen Zusatz', () => { + const one = { id: 'p1', widgetType: 'picture-frame', config: { images: [{ kind: 'url', url: 'https://a.de/x.png' }] } }; + const three = { + id: 'p2', + widgetType: 'picture-frame', + config: { + images: [ + { kind: 'url', url: 'https://a.de/1.png' }, + { kind: 'upload', imageId: 'b' }, + { kind: 'url', url: 'https://a.de/3.png' }, + ], + }, + }; + const none = { id: 'p3', widgetType: 'picture-frame', config: {} }; + render(); + expect(screen.getByRole('button', { name: /Bilderrahmen #1/ })).toHaveTextContent('— 1 Bild'); + expect(screen.getByRole('button', { name: /Bilderrahmen #2/ })).toHaveTextContent('— 3 Bilder'); + expect(screen.getByRole('button', { name: /Bilderrahmen #3/ })).not.toHaveTextContent('—'); + }); +}); diff --git a/apps/web/src/components/settings/widget-settings-panel.tsx b/apps/web/src/components/settings/widget-settings-panel.tsx index c3e4310..bc9146a 100644 --- a/apps/web/src/components/settings/widget-settings-panel.tsx +++ b/apps/web/src/components/settings/widget-settings-panel.tsx @@ -18,6 +18,7 @@ import { CALENDAR_MAX_EVENTS_LIMIT, resolveCalendarConfig, } from '@/components/dashboard/widgets/calendar-month'; +import { resolvePictureFrameConfig } from '@/components/dashboard/widgets/picture-frame-config'; /** * IANA timezones offered for clock configuration (D-12). @@ -128,6 +129,18 @@ export function WidgetSettingsPanel({ — {widget.config.title.trim()} )} + {/* Bilderrahmen hat keinen Titel — die Kopfzeile nennt die Bildanzahl */} + {widget.widgetType === 'picture-frame' && + resolvePictureFrameConfig(widget.config).images.length > 0 && ( + + —{' '} + {resolvePictureFrameConfig(widget.config).images.length === 1 + ? t('pictureFrame.imageCountOne') + : t('pictureFrame.imageCountMany', { + n: resolvePictureFrameConfig(widget.config).images.length, + })} + + )}