Skip to content

feat(design): DS-X-09 table v2 - #1692

Merged
mergify[bot] merged 2 commits into
mainfrom
claude/ds-x-09
Oct 17, 2026
Merged

mergify[bot] merged 2 commits into
mainfrom
claude/ds-x-09

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

Die Tabelle im Designsystem kann jetzt nach Spalten sortiert werden (Klick, Enter oder Leertaste), optional Zeilen auswählen und sagt die Anzahl der Auswahl an. Die Kopfzeile bleibt beim Scrollen stehen, und für „leer“ und „lädt“ zeigt die Tabelle den ehrlichen Platzhalter. Bestehende Tabellen bleiben unverändert, noch keine Ansicht nutzt die neuen Funktionen.

Report

Plan-ID: DS-X-09

Was geändert (Tier B, 208 Zeilen inkl. Tests, Teil Stufe-B-Rahmen: kein Seam)

  • src/design/data/Table.tsx: Column.sortValue macht den Kopf zu einem Button mit aria-sort (none → ascending → descending → none, eine Spalte zugleich; Enter/Space werden am Button behandelt, damit nur einmal geschaltet wird). selection={{selected, onChange, rowLabel?}} fügt Checkbox-Spalte (Kopf-Feld „teils“), aria-selected je Zeile und eine role="status"/aria-live="polite"-Zeile mit der Anzahl hinzu. loading ersetzt die Tabelle durch HonestState; ein empty-Text (String) wird als HonestState gezeichnet, ein Knoten bleibt wie bisher.
  • data.css: sticky th (deckender Untergrund --g-ground unter dem durchscheinenden Inhaltston), Sortier-Pfeile als Form (nicht nur Farbe), Auswahlspalte, Zeilenton.
  • src/i18n/de.ts (table.*), src/design/registry.ts (Eintrag Table), docs/PLAN.md (eine Zeile DS-X-09).
  • Abweichung vom Auftrag: Der Testname cycles aria-sort none, ascending, descending by keyboard hat Kommas; der Hook commit-msg lehnt Kommas in Test-First:-Zeilen ab. Umbenannt in cycles aria-sort from none to ascending to descending by keyboard.
  • Sticky wirkt, wenn der Container der Tabelle in der Höhe begrenzt ist (.g-tw { max-height: 100% }); ohne Begrenzung scrollt die Seite wie bisher.

Rot → grün: Commit e919b84 (nur Prop-Typen, Tests kompilieren) war rot: 6 Tests rot, no checkboxes … without a selection prop war an der Merge-Base schon grün und trägt keinen Trailer. Am Kopf grün.

Belege

  • npx vitest run src/design src/i18n Exit 0 (45 Dateien, 234 Tests)
  • npm run typecheck Exit 0
  • node scripts/contrast-check.mjs Exit 0
  • node scripts/plan-check.mjs --offline Exit 0
  • bash scripts/ci/red-first.sh Exit 0
  • bash scripts/ci/gates.sh lane prepush Exit 0 (HEAD 586879a, 310 s)
  • Bildschirmfotos (Vite mit Beispieltabelle, sortierte Spalte „Läufe“ absteigend, zwei gewählte Zeilen, Kopf-Feld „teils“, Kopf nach Scrollen noch an derselben Position, gemessen top=49): /home/pa/pa-orch/reports/ds-x-09-light.png und ds-x-09-dark.png, angesehen. shot.mjs kann nicht klicken/scrollen; es wurde ein eigenes Playwright-Skript mit Vite-API genutzt (nicht eingecheckt).

NICHT ABGEDECKT

  • Die #[cfg(windows)]-Tests und die Windows-Arme von clippy (Windows-Bahn läuft in der Merge-Queue); Rust wurde nicht angefasst.
  • Kein echtes Browser-Tastaturverhalten in Tests: jsdom macht aus Enter/Space keinen Klick, getestet ist der Handler; Doppelauslösung (keydown + click) in echten Browsern ist per preventDefault auf keydown und Space-keyup vermieden, aber nicht im Browser gemessen.
  • Kein Screenreader-Test der Live-Region; keine Verbraucher migriert (KR-07*, 10e); keine Virtualisierung, kein Spaltenresize.
  • Das Hintergrund-Zusammenspiel von sticky Kopf in .g-glass/.g-chrome nur per CSS-Test, nicht per Foto.

Review: ausstehend (Stufe B, Root beauftragt)

🤖 Generated with Claude Code on the ProjectA server worker

Root review disposition and acceptance (head 586879a)

Tier B (TS/CSS in src/design/data/, no seam). Author family: Anthropic (Claude Sonnet 5.5, server job log). Reviewer: Cohere north-mini-code:free via kilo (scripts/review/run-local.sh 1692 --via kilo), reviewed head 586879a. Verdict REJECT, based on findings F1–F4. Root checked each one against the head files and none holds (table below). One non-author-family reviewer is the AGENTS.md rule 5 minimum for tier B. Root is Anthropic and does not count as independent.

ID Source Severity Finding Disposition
R1692-F1 Cohere high "none" is sorted as descending rejected: "none" is sort === null. Table.tsx:53 cycles ascending → descending → null, and :55 sorts only when sort is set; aria-sort="none" comes from :65. The keyboard cycle test is green.
R1692-F2 Cohere medium mutating a ReadonlySet rejected: Table.tsx:59 copies into a new Set before changing it; typecheck exit 0
R1692-F3 Cohere medium loading uses the "empty" kind follow-up: HonestState has only the kinds empty, offline and locked (HonestState.tsx:30). The loading text sits in role="status", and a real loading look is DS-X-29 (Spinner/Skeleton/Progress).
R1692-F4 Cohere low the header checkbox in "mixed" only selects all or none no change: native behaviour (mixed → checked selects all), as in common data-table patterns
R1692-F5 Cohere info local fill/compare helpers no change

Root screenshot check: ds-x-09-{light,dark}.png (server reports folder) were looked at. "Läufe" is sorted descending with a shape arrow, two rows are selected, the header checkbox shows "mixed", the header stays put after scrolling, and "2 ausgewählt" is announced. Observation: in light mode selected rows have no row tint, only the checkbox. That is acceptable because the state is shown by shape. Evidence from the job: red-first exit 0; vitest run src/design src/i18n (234 tests), typecheck, contrast-check, plan-check offline and bash scripts/ci/gates.sh lane prepush (HEAD 586879a) all exit 0.

Accepted by Root on 2026-10-17 for head 586879a. review-ok is bound to this head.

Cuarroc and others added 2 commits October 17, 2026 06:35
Prop types only, no behaviour yet, so the failing tests compile.

Test-First: src/design/data/table.sort.test.tsx::cycles aria-sort from none to ascending to descending by keyboard
Test-First: src/design/data/table.sort.test.tsx::sorts one column at a time and compares numbers numerically
Test-First: src/design/data/table.sort.test.tsx::renders the empty slot text through HonestState and the loading slot instead of the table
Test-First: src/design/data/table.sort.test.tsx::keeps the header sticky inside the scroll region
Test-First: src/design/data/table.selection.test.tsx::selection announces count
Test-First: src/design/data/table.selection.test.tsx::marks selected rows with aria-selected

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Sortable headers (aria-sort cycle none, ascending, descending by click,
Enter and Space), optional row selection with the design Checkbox and a
polite count, sticky header, empty text and loading through HonestState.

No-Test: plan text only (docs/PLAN.md row); the behaviour is covered by the red tests of the previous commit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@Cuarroc
Cuarroc marked this pull request as ready for review October 17, 2026 04:58
@Cuarroc Cuarroc added the review-ok Pipeline: review disposition complete, no open high finding label Oct 17, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-17T04:58:06.110305Z 586879a Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@Cuarroc

Cuarroc commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

Root auto-queue: head 586879a unchanged since review-ok, all checks green. @Mergifyio queue

@Cuarroc

Cuarroc commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

@Mergifyio queue

@mergify

mergify Bot commented Oct 17, 2026

Copy link
Copy Markdown
Contributor

queue

☑️ This pull request is already queued

@mergify mergify Bot added the queued label Oct 17, 2026
@mergify
mergify Bot merged commit faa4f8a into main Oct 17, 2026
25 checks passed
@mergify

mergify Bot commented Oct 17, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

This pull request spent 13 minutes 46 seconds in the queue, including 13 minutes 18 seconds running CI.

Required conditions to merge
  • check-success = gates (linux)
  • check-success = gates (windows)
  • check-success = red-first
  • github-review-approved [🛡 GitHub repository ruleset rule main-pr-required-checks]
  • label != do-not-merge
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/gates (linux)
    • check-neutral = @github-actions/gates (linux)
    • check-skipped = @github-actions/gates (linux)
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/gates (windows)
    • check-neutral = @github-actions/gates (windows)
    • check-skipped = @github-actions/gates (windows)
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/red-first
    • check-neutral = @github-actions/red-first
    • check-skipped = @github-actions/red-first
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-neutral = @mergify/Mergify Merge Protections
    • check-skipped = @mergify/Mergify Merge Protections
    • check-success = @mergify/Mergify Merge Protections

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review-ok Pipeline: review disposition complete, no open high finding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant