- fix(auth): guard extractNames() against Authentik sending full name in
given_name field (e.g. "Matthias Hochmeister" + family_name "Hochmeister");
detect by checking given_name ends with family_name suffix, fall through
to name-splitting so Vorname/Nachname display correctly in Profile
- fix(db): add migration 018 to repair broken BEFORE UPDATE triggers on
veranstaltungen and veranstaltung_kategorien; old triggers called
update_updated_at_column() which references NEW.updated_at, but both
tables use aktualisiert_am, causing every category/event edit to fail
- feat(booking): open vehicle booking creation to all authenticated users;
only dashboard_admin / dashboard_moderator can change the Buchungsart
(type select disabled for regular members); edit and cancel still
restricted to WRITE_GROUPS
- feat(vehicles): VehicleDashboardCard now fetches equipment warnings via
equipmentApi.getVehicleWarnings() in parallel and shows an alert when
any vehicle equipment is not einsatzbereit
- fix(ui): add MuiTextField defaultProps (InputLabelProps.shrink=true) and
MuiOutlinedInput notch legend font-size override to theme to eliminate
floating-label / border conflict on click
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add VehicleDashboardCard: self-contained widget modelled after
AtemschutzDashboardCard, shows einsatzbereit ratio and inspection
warnings inline; replaces StatsCard + InspectionAlerts in Dashboard
- Add EquipmentDashboardCard: consolidated equipment status widget
showing only aggregated counts (no per-item listing); replaces
EquipmentAlerts component in Dashboard
- Fix auth race condition: add authInitialized flag to api.ts so 401
responses during initial token validation no longer trigger a
spurious redirect to /login; save intended destination before login
redirect and restore it after successful auth callback
- Fix profile firstname/lastname: add extractNames() helper to
auth.controller.ts that falls back to splitting userinfo.name when
Authentik does not provide separate given_name/family_name fields;
applied on both create and update paths
- Dynamic groups endpoint: replace hardcoded KNOWN_GROUPS array in
events.controller.ts with a DB query (SELECT DISTINCT unnest
(authentik_groups) FROM users); known slugs get German labels via
lookup map, unknown slugs are humanized automatically
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Link categories to user groups via new zielgruppen column on
veranstaltung_kategorien (migration 017), editable in the category
management UI with group checkboxes and chip display
- Fix broken iCal share link by adding ICAL_BASE_URL to docker-compose
and falling back to CORS_ORIGIN when ICAL_BASE_URL is unset
- Remove the colored-dot legend footer from the month calendar view
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build is blocked by Apple npm proxy stripping devDependencies inside
Docker. Removing the service keeps the rest of the stack functional.
The sync/ directory and migration remain in place for when the build
issue is resolved.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The server has an Apple npm proxy that silently drops devDependencies.
Copying the same .npmrc fix used by the frontend (registry=registry.npmjs.org)
resolves the issue.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The cached npm ci layer predates the ENV PATH instruction, so tsc was
never on PATH when the build ran. Moving ENV PATH earlier changes the
cache key and forces a fresh install.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
node:20-slim picks up the Apple npm proxy which blocks installs.
node:20-alpine does not. Also add PATH for node_modules/.bin so tsc
is found, and remove committed dist/ since the build now works properly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Server npm proxy silently drops devDependencies, making TypeScript
unavailable in Docker. Solution: compile locally and commit dist/.
Dockerfile now only needs prod deps + Playwright, both of which
install cleanly via the public registry.
Also fix TS2688/TS2304 errors: add DOM to tsconfig lib and cast
querySelectorAll results to Element inside $$eval callbacks.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
--ignore-scripts prevented @types/* packages from being installed,
causing tsc to fail on missing type definitions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Install tsc globally so it's available on PATH regardless of
devDependency resolution issues. Use --ignore-scripts and explicit
registry to work around Apple npm proxy interference.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The server's npm proxy intercepts and silently fails devDependency
installs inside Docker. Bundle node_modules directly from the local
checkout where they are known-good.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
npm.apple.com causes silent install failures for devDependencies inside
the Docker build context. Explicitly use registry.npmjs.org for the
builder stage.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
node:20-slim defaults NODE_ENV=production which causes npm to skip dev
deps (typescript, ts-node), preventing tsc from being found.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Avoids stale Docker layer cache issue where tsc was not found because
an old npm ci layer (without dev deps) was cached on the build host.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>