fix: replace grid action column with link-column on primary data cell

Remove the dedicated "Edit"/"Open" action button column from all list
pages. Instead, wrap the primary data column (name, description, subject,
etc.) in a clickable <a> link via the new rowInteraction.linkColumn option.

Double-click, Enter-key, and click-to-focus row navigation preserved.
Pages with explicit actions config are unaffected. Address-book opts out
of auto-wrapping (linkColumn: false) and renders the link in its own
formatter to avoid nested <a> with avatar lightbox.

Also fixes pre-existing XSS in insertActionColumn (unescaped href/label)
and updates typography test for --text-page-title token change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 19:43:03 +01:00
parent af36583862
commit 1c5648c727
16 changed files with 87 additions and 85 deletions

View File

@@ -6,26 +6,40 @@ Row-Navigation discoverable und keyboard-freundlich machen.
## Standardverhalten
1. Sichtbare Action-Spalte rechts (`Open`/`Edit`) fuer Listen mit `rowDblClick`.
1. Konfigurierbares Link-Column: Die primaere Datenspalte (z.B. Name, Beschreibung) wird als klickbarer `<a>`-Link gerendert.
2. Enter auf fokussierter Row loest dieselbe Navigation aus.
3. Doppelklick bleibt als Fallback fuer Power-User.
4. Nur Rows mit Ziel-URL erhalten `data-row-open-url`.
4. Nur Rows mit Ziel-URL erhalten `data-row-open-url` und den Link im Link-Column.
5. Rows ohne URL (z.B. fehlende Berechtigung) zeigen den Inhalt als Plain-Text ohne Link.
## Contract
```js
rowInteraction: {
enabled: true,
showActionButton: true,
keepDblClick: true,
enableEnterOnRow: true,
actionColumnLabel: 'Actions',
resolveActionLabel: (url, rowData) => (url.includes('/edit/') ? 'Edit' : 'Open')
linkColumn: 0, // Index der sichtbaren Datenspalte, die als Link gerendert wird (default: 0)
keepDblClick: true, // Doppelklick-Navigation beibehalten (default: true)
enableEnterOnRow: true, // Enter-Key-Navigation auf fokussierter Row (default: true)
rowEnterHint: 'Press Enter to open row'
}
```
### linkColumn-Zuordnung
| Seite | linkColumn | Zielspalte |
|---|---|---|
| Users | 2 | First name (nach Avatar + hidden UUID) |
| Tenants | 1 | Description (nach Avatar) |
| Roles, Departments, Permissions | 0 | Description |
| Address book | 1 | Name (nach hidden UUID) |
| Mail log | 3 | Subject |
| Scheduled jobs | 0 | Job label |
| System audit, Import audit, User lifecycle audit | 2 | Event/Profile/Action |
| API audit | 3 | Path |
## Guardrails
1. Keine globale Tab-Stop-Flut auf allen Rows.
2. Fokusstil fuer Row und Action-Button sichtbar.
3. Explizite `actions.enabled: true` pro Seite darf Auto-Action uebersteuern.
2. Fokusstil fuer Row und Link-Element sichtbar.
3. Explizite `actions.enabled: true` pro Seite darf Link-Column uebersteuern (eigene Action-Spalte).
4. Link-Column darf keine Spalte mit verschachtelten `<a>`-Elementen umwickeln (z.B. Avatar mit Lightbox).