feat: user invite flow, deactivate/delete, favicon, dashboard loading fix, admin full-width

- Invite flow: admin can invite users by email with role selection; accept-invite page
  sets password and creates the account; 72-hour token expiry; E2E tests
- User deactivate/reactivate/delete: new tRPC procedures + UI buttons; deactivation
  revokes all active sessions immediately; delete cascades vacation/broadcast records;
  isActive field added via migration 20260402000000_user_isactive
- Auth: block login for inactive users with audit entry
- Favicon: SVG favicon + ICO/PNG fallbacks (16, 32, 180, 192, 512px); manifest updated
- Dashboard: GridLayout dynamic-import loading skeleton prevents blank dark area
  on first login before react-grid-layout chunk is cached
- Admin users: remove max-w-5xl constraint so table uses full page width
- Dev: docker container restart workflow documented in LEARNINGS.md; Prisma generate
  must run inside the container after schema changes (named node_modules volume)

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-04-02 20:19:26 +02:00
parent dc5bbdc47d
commit 41eb722369
33 changed files with 6755 additions and 169 deletions
+3
View File
@@ -11,6 +11,7 @@
"test": "node ./scripts/run-from-workspace-root.mjs turbo run test:unit --concurrency=2",
"test:unit": "node ./scripts/run-from-workspace-root.mjs turbo test:unit --concurrency=2",
"test:e2e": "node ./scripts/run-from-workspace-root.mjs turbo test:e2e",
"test:e2e:email": "pnpm --filter @capakraken/web test:e2e:email",
"test:scripts": "node --test scripts/*.test.mjs",
"check:architecture": "node ./scripts/check-architecture-guardrails.mjs",
"check:exports": "node ./scripts/check-workspace-exports.mjs",
@@ -24,6 +25,8 @@
"db:generate": "node ./scripts/prisma-with-env.mjs generate",
"db:validate": "node ./scripts/prisma-with-env.mjs validate",
"db:seed": "node ./scripts/with-env.mjs pnpm --filter @capakraken/db db:seed",
"db:seed:export": "node ./scripts/export-dev-seed.mjs",
"db:seed:import": "node ./scripts/import-dev-seed.mjs",
"db:studio": "node ./scripts/with-env.mjs pnpm --filter @capakraken/db db:studio",
"db:reset:dispo": "pnpm --filter @capakraken/db db:reset:dispo",
"db:import:dispo": "pnpm --filter @capakraken/db db:import:dispo",