Commit Graph

134 Commits

Author SHA1 Message Date
Matthias Hochmeister
243da302c7 update backend stuck/stall 2026-03-13 08:30:05 +01:00
Matthias Hochmeister
60488309ca higher the update rate of the chat 2026-03-13 08:16:00 +01:00
Matthias Hochmeister
f309096497 mark chat as read 2026-03-13 08:01:55 +01:00
Matthias Hochmeister
34f246af24 resolve issues with new features 2026-03-12 18:36:22 +01:00
Matthias Hochmeister
d1fed74f3b resolve issues with new features 2026-03-12 18:09:59 +01:00
Matthias Hochmeister
dc33d388a9 resolve issues with new features 2026-03-12 17:54:19 +01:00
Matthias Hochmeister
67b7d5ccd2 resolve issues with new features 2026-03-12 17:51:57 +01:00
Matthias Hochmeister
34ca007f9b resolve issues with new features 2026-03-12 17:20:32 +01:00
Matthias Hochmeister
68586b01dc resolve issues with new features 2026-03-12 16:42:21 +01:00
Matthias Hochmeister
5aa309b97a resolve issues with new features 2026-03-12 16:05:01 +01:00
Matthias Hochmeister
a5cd78f01f feat: bug fixes, layout improvements, and new features
Bug fixes:
- Remove non-existent `role` column from admin users SQL query (A1)
- Fix Nextcloud Talk chat API path v4 → v1 for messages/send/read (A2)
- Fix ServiceModeTab sync: useState → useEffect to reflect DB state (A3)
- Guard BookStack book_slug with book_id fallback to avoid broken URLs (A4)

Layout & UI:
- Chat panel: sticky full-height positioning, main content scrolls independently (B1)
- Vehicle booking datetime inputs: explicit text color for dark mode (B2)
- AnnouncementBanner moved into grid with full-width span (B3)

Features:
- Per-user widget visibility preferences stored in users.preferences JSONB (C1)
- Link collections: grouped external links in admin UI and dashboard widget (C2)
- Admin ping history: migration 026, checked_at timestamps, expandable history rows (C4)
- Service mode end date picker with scheduled deactivation display (C5)
- Vikunja startup config logging and configured:false warnings (C7)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 14:57:54 +01:00
Matthias Hochmeister
81174c2498 layout issues 2026-03-12 14:23:57 +01:00
Matthias Hochmeister
21b7be22db feat: service mode (maintenance mode)
Admins can toggle maintenance mode from the admin dashboard (new
"Wartung" tab). When active, all non-admin users see a full-page
maintenance screen instead of the app.

- Backend: GET /api/config/service-mode endpoint (authenticated)
- Backend: stores state in app_settings key 'service_mode'
- Frontend: ServiceModeGuard wraps all ProtectedRoutes
- Frontend: ServiceModePage full-screen maintenance UI
- Frontend: ServiceModeTab in admin dashboard with toggle + message
- Admins (dashboard_admin group) always bypass the guard

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 13:21:49 +01:00
Matthias Hochmeister
6c1cbb0ef3 fix: remove volatile NOW() from banner index predicate
PostgreSQL forbids volatile functions in partial index predicates.
Replace with two plain indexes on starts_at and ends_at instead —
the active-banner filtering is handled in the query WHERE clause.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 13:08:26 +01:00
Matthias Hochmeister
36c222d32a fix: remove Apple npm registry from lock files and .npmrc
Replace all artifacts.apple.com and npm.apple.com resolved URLs in
package-lock.json with registry.npmjs.org so `npm install` works on
any server without Apple VPN/proxy access.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 12:21:40 +01:00
Matthias Hochmeister
cf490cc9ad fix: install missing packages and fix TS errors
- Install @mui/x-data-grid in frontend (fixes AuditLog)
- Install jose in backend (fixes authentik service)
- Update .npmrc to use npm.apple.com proxy
- Fix AuditLog localeText to use MUI DataGrid v7 API keys
- Fix banner controller: cast req.params.id to string
- Remove unused logger import in banner.service.ts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 12:04:54 +01:00
Matthias Hochmeister
cd68bd3795 annoucement banners, calendar pdf export, vehicle booking quck-add, even quick-add 2026-03-12 11:47:08 +01:00
Matthias Hochmeister
71a04aee89 resolve issues with new features 2026-03-12 11:37:25 +01:00
Matthias Hochmeister
d5be68ca63 resolve issues with new features 2026-03-12 10:21:26 +01:00
Matthias Hochmeister
31f1414e06 adding chat features, admin features and bug fixes 2026-03-12 08:16:34 +01:00
Matthias Hochmeister
7b14e3d5ba fix bookstack search 2026-03-11 14:02:25 +01:00
root
34f577bf06 fix backend npm 2026-03-11 13:53:44 +01:00
Matthias Hochmeister
3c9b7d3446 apply security audit 2026-03-11 13:51:01 +01:00
Matthias Hochmeister
93a87a7ae9 apply security audit 2026-03-11 13:18:10 +01:00
Matthias Hochmeister
e9463c1c66 add vikunja integration 2026-03-05 18:07:18 +01:00
Matthias Hochmeister
fb5acd3d52 calendar download, date input validate, nc talk notification 2026-03-04 15:01:26 +01:00
Matthias Hochmeister
d27d2931a5 calendar download, date input validate, nc talk notification 2026-03-04 14:39:39 +01:00
Matthias Hochmeister
179bbabd58 change widget name in GUI 2026-03-04 08:08:00 +01:00
Matthias Hochmeister
029a721c43 add env vars for bookstack setup to docker 2026-03-04 08:00:10 +01:00
Matthias Hochmeister
11335748c2 fix bookstack display error 2026-03-04 07:52:11 +01:00
Matthias Hochmeister
32473f8329 new features, bookstack 2026-03-03 22:07:42 +01:00
Matthias Hochmeister
926f79b576 new features, bookstack 2026-03-03 21:45:47 +01:00
Matthias Hochmeister
d3561c1109 new features, bookstack 2026-03-03 21:30:38 +01:00
Matthias Hochmeister
817329db70 add features 2026-03-03 17:03:27 +01:00
Matthias Hochmeister
5a6fc85a75 add features 2026-03-03 17:01:53 +01:00
Matthias Hochmeister
92b05726d4 permission changes 2026-03-03 15:38:17 +01:00
Matthias Hochmeister
c431c1af83 userId bug 2026-03-03 15:00:53 +01:00
Matthias Hochmeister
b3a2fd9ff9 feat: responsive widgets, atemschutz permission UX, event hard-delete
- fix dashboard grid: use auto-fill instead of auto-fit for equal-width widgets
- atemschutz: skip stats/members API calls for non-privileged users, hide
  empty Aktionen column, add personal status subtitle
- kalender: add permanent delete option for events with confirmation dialog

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 14:59:08 +01:00
Matthias Hochmeister
5dfaf7db54 bug fixes 2026-03-03 14:45:46 +01:00
Matthias Hochmeister
004b141cab bug fixes 2026-03-03 13:27:27 +01:00
Matthias Hochmeister
02cf5138cf fix: dashboard layout, widget caching, and backend stability
Layout:
- Remove Container maxWidth cap so widgets scale fluidly on wide screens
- Fix ActivityFeed Card missing height:100% and overflow:hidden that caused
  the timeline connector pseudo-element to bleed outside the card boundary

Performance (frontend):
- Migrate VehicleDashboardCard, EquipmentDashboardCard, AtemschutzDashboardCard,
  UpcomingEventsWidget, and PersonalWarningsBanner from useEffect+useState to
  TanStack Query — cached for 5 min, so navigating back to the dashboard no
  longer re-fires all 9 API requests
- Add gcTime:10min and refetchOnWindowFocus:false to QueryClient defaults to
  prevent spurious refetches on tab-switch

Backend stability:
- Raise default RATE_LIMIT_MAX from 100 to 300 req/15min — the previous limit
  was easily exceeded by a single active user during normal dashboard navigation
- Increase DB connectionTimeoutMillis from 2s to 5s to handle burst-load
  scenarios where multiple requests compete for pool slots simultaneously

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 12:55:16 +01:00
Matthias Hochmeister
d91f757f34 bug fixes 2026-03-03 11:45:08 +01:00
Matthias Hochmeister
3101f1a9c5 fix: five dashboard improvements across booking, vehicles, profile, and UI
- 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>
2026-03-03 11:04:57 +01:00
Matthias Hochmeister
2306741c4d feat: dashboard widgets, auth fix, profile names, dynamic groups
- 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>
2026-03-03 10:28:31 +01:00
Matthias Hochmeister
831927ae90 featuer change for calendar 2026-03-03 09:56:35 +01:00
Matthias Hochmeister
232d8aa872 featuer change for calendar 2026-03-03 09:55:18 +01:00
Matthias Hochmeister
64b23bae5c featuer change for calendar 2026-03-03 09:53:23 +01:00
Matthias Hochmeister
d9af34b744 featuer change for calendar 2026-03-03 09:52:10 +01:00
Matthias Hochmeister
146f79cf00 featuer change for calendar 2026-03-03 08:57:32 +01:00
Matthias Hochmeister
ad069fde10 calendar: add category-group links, fix iCal share URL, remove legend
- 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>
2026-03-03 08:10:33 +01:00