Workers P3-Endprüfung W8: wiederkehrende Bedienelemente im Pult mit eindeutigem Namen

"Details", "Anzeige öffnen", das Entwurfsfeld und die Aktionsgruppe tragen den Titel der Zeile im
zugänglichen Namen ("Details zu <Titel>"), das sichtbare Wort steht vorn (WCAG 2.5.3); ohne
Titel gilt der schlichte Name. Der Prüfstand sucht die Knöpfe unter den neuen Namen und prüft
zusätzlich die Eindeutigkeit der Namen (W8) und die Abschlusszeile im Reiter Erledigt (W5).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-18 10:46:20 +00:00
1 parent 4ec3022df4
commit 17fb02150e
3 files changed
+70 -10

No files matched your search

+12 -4
View File
@@ -34,6 +34,14 @@ function copyNote(result, hasUrl) {
return { kind: 'err', text: 'Kopieren und Öffnen haben nicht geklappt.' }
}
// Zugänglicher Name für ein Bedienelement, das in jeder Zeile wiederkehrt: das sichtbare Wort steht vorn (WCAG 2.5.3 „Beschriftung im
// Namen“), dahinter der Titel der Zeile, damit eine Liste aller „Details“-Knöpfe im Screenreader unterscheidbar ist. Ohne Titel
// (leer oder fehlend) gilt der schlichte Name, nie „… zu undefined“.
function rowName(label, title, joiner = ': ') {
const t = typeof title === 'string' ? title.trim() : ''
return t === '' ? label : `${label}${joiner}${t}`
}
// Eine Zeile des Pults. Die Zeile hält nur, was ihr gehört (läuft gerade etwas, Rückfrage, Meldung); der bearbeitete Text liegt in der
// Liste, damit er einen Wechsel des Filters und das Neuladen überlebt. api.pultAction führt aus, der Dienst entscheidet über Rechte und
// Reihenfolge (409 mit deutschem Satz); danach wird die Liste neu geholt.
@@ -135,10 +143,10 @@ function PultRow({ api, item, row, text, onText, refresh, onFinished, onDetails
{row.doneLine ? <span>{row.doneLine}</span> : row.ageLabel && <span>{row.ageLabel}</span>}
{info && <span>{info}</span>}
{row.sourceHref && (
<a className="link" href={row.sourceHref} target="_blank" rel="noopener noreferrer">Anzeige öffnen</a>
<a className="link" href={row.sourceHref} target="_blank" rel="noopener noreferrer" aria-label={rowName('Anzeige öffnen', row.title)}>Anzeige öffnen</a>
)}
{prospect && (
<button type="button" className="link" onClick={() => onDetails(prospect.$id)}>Details</button>
<button type="button" className="link" onClick={() => onDetails(prospect.$id)} aria-label={rowName('Details', row.title, ' zu ')}>Details</button>
)}
</div>
@@ -154,7 +162,7 @@ function PultRow({ api, item, row, text, onText, refresh, onFinished, onDetails
className="textarea wk-pult-draft"
value={text}
onChange={(e) => onText(row.id, e.target.value)}
aria-label="Entwurf der Antwort"
aria-label={rowName('Entwurf der Antwort', row.title)}
/>
) : (
item.draft && (
@@ -166,7 +174,7 @@ function PultRow({ api, item, row, text, onText, refresh, onFinished, onDetails
)}
{(row.canSend || row.canClaim || row.canDone || row.canDiscard) && (
<div className="row-actions wk-pult-actions">
<div className="row-actions wk-pult-actions" role="group" aria-label={rowName('Aktionen', row.title)}>
{row.canSend && row.kind === 'mail_antwort' && (
mail
? <a className="btn btn-primary" href={mail}>E-Mail schreiben</a>