From 2630224edd413bda6e4b07fbf99b722894260e3d Mon Sep 17 00:00:00 2001 From: Matthias Hochmeister Date: Sun, 1 Mar 2026 19:17:36 +0100 Subject: [PATCH] bug fix for atemschutz --- backend/src/app.ts | 4 ++++ backend/src/routes/atemschutz.routes.ts | 2 +- frontend/src/App.tsx | 27 ++++++++++++++++++++++ frontend/src/components/shared/Sidebar.tsx | 18 +++++++++++++++ frontend/src/pages/Atemschutz.tsx | 9 ++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/backend/src/app.ts b/backend/src/app.ts index 274adb0..c885cea 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -78,6 +78,8 @@ import incidentRoutes from './routes/incident.routes'; import equipmentRoutes from './routes/equipment.routes'; import nextcloudRoutes from './routes/nextcloud.routes'; import atemschutzRoutes from './routes/atemschutz.routes'; +import eventsRoutes from './routes/events.routes'; +import bookingRoutes from './routes/booking.routes'; app.use('/api/auth', authRoutes); app.use('/api/user', userRoutes); @@ -89,6 +91,8 @@ app.use('/api/incidents', incidentRoutes); app.use('/api/equipment', equipmentRoutes); app.use('/api/atemschutz', atemschutzRoutes); app.use('/api/nextcloud/talk', nextcloudRoutes); +app.use('/api/events', eventsRoutes); +app.use('/api/bookings', bookingRoutes); // 404 handler app.use(notFoundHandler); diff --git a/backend/src/routes/atemschutz.routes.ts b/backend/src/routes/atemschutz.routes.ts index 9c1ae9e..fbceeb7 100644 --- a/backend/src/routes/atemschutz.routes.ts +++ b/backend/src/routes/atemschutz.routes.ts @@ -4,7 +4,7 @@ import { authenticate } from '../middleware/auth.middleware'; import { requireGroups } from '../middleware/rbac.middleware'; const ADMIN_GROUPS = ['dashboard_admin']; -const WRITE_GROUPS = ['dashboard_admin', 'dashboard_kommandant']; +const WRITE_GROUPS = ['dashboard_admin', 'dashboard_atemschutz']; const router = Router(); diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 247f325..e9ac0c3 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -13,6 +13,7 @@ import EinsatzDetail from './pages/EinsatzDetail'; import Fahrzeuge from './pages/Fahrzeuge'; import FahrzeugDetail from './pages/FahrzeugDetail'; import FahrzeugForm from './pages/FahrzeugForm'; +import FahrzeugBuchungen from './pages/FahrzeugBuchungen'; import Ausruestung from './pages/Ausruestung'; import AusruestungForm from './pages/AusruestungForm'; import AusruestungDetail from './pages/AusruestungDetail'; @@ -21,6 +22,8 @@ import Mitglieder from './pages/Mitglieder'; import MitgliedDetail from './pages/MitgliedDetail'; import Kalender from './pages/Kalender'; import UebungDetail from './pages/UebungDetail'; +import Veranstaltungen from './pages/Veranstaltungen'; +import VeranstaltungKategorien from './pages/VeranstaltungKategorien'; import NotFound from './pages/NotFound'; function App() { @@ -176,6 +179,30 @@ function App() { } /> + + + + } + /> + + + + } + /> + + + + } + /> } /> diff --git a/frontend/src/components/shared/Sidebar.tsx b/frontend/src/components/shared/Sidebar.tsx index acafd69..3f2ffd0 100644 --- a/frontend/src/components/shared/Sidebar.tsx +++ b/frontend/src/components/shared/Sidebar.tsx @@ -14,6 +14,9 @@ import { Build, People, Air, + Event, + BookOnline, + CalendarMonth, } from '@mui/icons-material'; import { useNavigate, useLocation } from 'react-router-dom'; @@ -31,11 +34,26 @@ const navigationItems: NavigationItem[] = [ icon: , path: '/dashboard', }, + { + text: 'Kalender', + icon: , + path: '/kalender', + }, + { + text: 'Veranstaltungen', + icon: , + path: '/veranstaltungen', + }, { text: 'Fahrzeuge', icon: , path: '/fahrzeuge', }, + { + text: 'Fahrzeugbuchungen', + icon: , + path: '/fahrzeugbuchungen', + }, { text: 'Ausrüstung', icon: , diff --git a/frontend/src/pages/Atemschutz.tsx b/frontend/src/pages/Atemschutz.tsx index 02b5e1d..06e448c 100644 --- a/frontend/src/pages/Atemschutz.tsx +++ b/frontend/src/pages/Atemschutz.tsx @@ -44,6 +44,7 @@ import DashboardLayout from '../components/dashboard/DashboardLayout'; import { atemschutzApi } from '../services/atemschutz'; import { membersService } from '../services/members'; import { useNotification } from '../contexts/NotificationContext'; +import { useAuth } from '../contexts/AuthContext'; import type { AtemschutzUebersicht, AtemschutzStats, @@ -150,6 +151,8 @@ const StatCard: React.FC = ({ label, value, color, bgcolor }) => function Atemschutz() { const notification = useNotification(); + const { user } = useAuth(); + const canWrite = user?.groups?.some(g => ['dashboard_admin', 'dashboard_atemschutz'].includes(g)) ?? false; // Data state const [traeger, setTraeger] = useState([]); @@ -543,6 +546,7 @@ function Atemschutz() { /> + {canWrite && ( + )} + {canWrite && ( + )} ); @@ -572,6 +579,7 @@ function Atemschutz() { )} {/* FAB to create */} + {canWrite && ( + )} {/* ── Add / Edit Dialog ───────────────────────────────────────────── */}