Files
breakpilot-compliance/admin-compliance
Benjamin Admin f4c9cea770 feat(iace/mitigations): group measure rows by title, collapse 21x→1 row
The "Maßnahmen" page in the Bremsscheibe project showed a flat list with
heavy redundancy — e.g. "Sicherheitszeichen nach ISO 7010" appeared on 21
separate rows, one per linked hazard. Same for "Gefahrenpiktogramme",
"Flucht- und Rettungswege" etc. The signal got lost in the noise.

This is a presentation-only regrouping. Each Hazard×Mitigation pair stays
a separate DB row with its own status, notes and edit history (option B
from the discussion: instances remain independently editable). The page
now collapses rows that share the same `m.title` into one group row.

Group row shows:
  - title + ISO 12100 sub-category (if encoded in description)
  - count of linked hazards on the right
  - compact status distribution "P · I · V" (Planned/Implemented/Verified)
  - shared checkbox that selects all instances in the group
Click expands the group and reveals the individual hazard×measure rows,
each with its own StatusBadge and detail-expand for MitigationHints.

State additions:
  - expandedGroup: Set<string> with keys `${type}:${title}` so the same
    title across different reduction stages stays independently togglable
  - groupByTitle() helper trims the title, falls back to "(ohne Titel)"
  - statusCounts() helper for the P·I·V breakdown

Pagination semantics swapped from 50 instances/page to 50 groups/page —
makes the list far easier to scan at the ~80-instance scale this project
exhibits.

LOC: 267 → 346 (well under the 500 hard cap).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 13:50:45 +02:00
..

admin-compliance

Next.js 15 dashboard for BreakPilot Compliance — SDK module UI, company profile, DSR, DSFA, VVT, TOM, consent, AI Act, training, audit, change requests, etc. Also hosts 96+ API routes that proxy/orchestrate backend services.

Port: 3007 (container: bp-compliance-admin) Stack: Next.js 15 App Router, React 18, TailwindCSS, TypeScript strict.

Architecture (Phase 3 — in progress)

app/
├── <route>/
│   ├── page.tsx              # Server Component (≤200 LOC)
│   ├── _components/          # Colocated UI, each ≤300 LOC
│   ├── _hooks/               # Client hooks
│   └── _server/              # Server actions
├── api/<domain>/route.ts     # Thin handlers → lib/server/<domain>/
lib/
├── <domain>/                 # Pure helpers, zod schemas
└── server/<domain>/          # "server-only" logic
components/                   # App-wide shared UI

See ../AGENTS.typescript.md.

Run locally

cd admin-compliance
npm install
npm run dev          # http://localhost:3007

Tests

npm test                      # Vitest unit + component tests
npx playwright test           # E2E
npx tsc --noEmit              # Type-check
npx next lint

Known debt

  • lib/sdk/types.ts has been split: it is now a barrel re-export to lib/sdk/types/ (12 domain files: enums, company-profile, sdk-steps, and others).
  • lib/sdk/tom-generator/controls/loader.ts has been split: it is now a barrel re-export to categories/ (8 category files).
  • Phase 3 refactoring is ongoing — several large page files remain and are being addressed incrementally.
  • 0 test files for the page layer. Adding Playwright smoke + Vitest unit coverage is ongoing Phase 3 work.

Don't touch

  • Backend API paths without updating backend-compliance/ in the same change.
  • lib/sdk/types/ barrel re-exports — add new types to the appropriate domain file, not back into the root.