From b406a9c5f7f0cedd866e64bfa722eaad7704641e Mon Sep 17 00:00:00 2001 From: Schalli Date: Mon, 21 Sep 2026 14:54:06 +0200 Subject: [PATCH] fix(quick-260921-jt4): drei Statussymbole in calendar-settings-panel tragen role="img" (D-03) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die drei mit aria-label ("Sync error"/"Connection OK"/ "Connection error") hatten die Rolle generic, die keine ARIA-Merkmale traegt — die Beschriftung wurde stillschweigend verworfen. role="img" ergaenzt (geprueft sauber, keine useSemanticElements-Neuausloesung). Die Beschriftung ist hier der einzige Text des Symbols (svg bereits aria-hidden) — Ursache behoben, nicht das Attribut gestrichen. Erfolgsfall nutzt den vorhandenen Schluessel calendar.connectionSuccess woertlich; fuer die beiden Fehlerfaelle neue kurze Schluessel syncErrorLabel/connectionFailedLabel (der vorhandene connectionError ist ein ganzer Hinweissatz, als Symbolbeschriftung zu lang). Die drei fest verdrahteten englischen Texte damit aus der deutschen Oberflaeche. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01TPPB4ApQxzSU1rwV2Ffj9J --- .../settings/calendar-settings-panel.test.tsx | 15 +++++++++++++ .../settings/calendar-settings-panel.tsx | 21 +++++++++++++++---- apps/web/src/messages/de.json | 2 ++ apps/web/src/messages/en.json | 2 ++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/settings/calendar-settings-panel.test.tsx b/apps/web/src/components/settings/calendar-settings-panel.test.tsx index 8ca7c8a..cbaa822 100644 --- a/apps/web/src/components/settings/calendar-settings-panel.test.tsx +++ b/apps/web/src/components/settings/calendar-settings-panel.test.tsx @@ -13,6 +13,9 @@ vi.mock('next-intl', () => ({ 'calendar.deleteDialogLabel': 'Löschen bestätigen', 'calendar.saveError': 'Fehler beim Speichern', 'calendar.saveSuccess': 'Gespeichert', + 'calendar.connectionSuccess': 'Verbindung erfolgreich', + 'calendar.syncErrorLabel': 'Synchronisierungsfehler', + 'calendar.connectionFailedLabel': 'Verbindung fehlgeschlagen', }, settings: { sourceDeleteCta: 'Quelle löschen', @@ -129,3 +132,15 @@ describe('CalendarSettingsPanel — delete confirmation dialog (D-01, T-JT4-04)' expect(screen.getByRole('alertdialog')).toBeInTheDocument(); }); }); + +describe('CalendarSettingsPanel — Statussymbole tragen role="img" (D-03)', () => { + it('der Sync-Fehler-Indikator ist per Rolle+Name ansprechbar, statt sein aria-label an einem rollenlosen zu verschwenden', async () => { + vi.mocked(fetchSources).mockResolvedValue([ + { ...baseSource, lastSyncError: 'Verbindung abgelehnt' }, + ]); + render(); + await screen.findByText('Firmenkalender'); + + expect(screen.getByRole('img', { name: 'Synchronisierungsfehler' })).toBeInTheDocument(); + }); +}); diff --git a/apps/web/src/components/settings/calendar-settings-panel.tsx b/apps/web/src/components/settings/calendar-settings-panel.tsx index 42d0e98..1b7daff 100644 --- a/apps/web/src/components/settings/calendar-settings-panel.tsx +++ b/apps/web/src/components/settings/calendar-settings-panel.tsx @@ -154,12 +154,17 @@ export function CalendarSettingsPanel() { {TYPE_LABELS[source.type] || source.type} - {/* Connection status indicator */} + {/* Connection status indicator. role="img" (D-03): die + Beschriftung ist der EINZIGE Text dieser Symbole (das + darin ist bereits aria-hidden) — ohne Rolle ist ein + "generic" und die Vorlesehilfe verwirft + aria-label stillschweigend. */} {source.lastSyncError ? ( ) : testResults[source.id] === 'success' ? ( - + ) : testResults[source.id] === 'error' ? ( - +