minor improvements. Darstellung, Handlung, Popups #32

Merged
Lars merged 5 commits from develop into main 2026-05-13 22:02:43 +02:00
Showing only changes of commit d50bed428b - Show all commits

View File

@ -1,8 +1,7 @@
import React from 'react' import React from 'react'
import { import {
BrowserRouter as Router, RouterProvider,
Routes, createBrowserRouter,
Route,
Navigate, Navigate,
NavLink, NavLink,
useLocation, useLocation,
@ -163,115 +162,115 @@ function PublicRoute({ children }) {
return !isAuthenticated ? children : <Navigate to="/" replace /> return !isAuthenticated ? children : <Navigate to="/" replace />
} }
function AppRoutes() { /**
return ( * Data Router erforderlich für `useBlocker` (ungespeicherte Änderungen).
<Routes> * Klassisches `BrowserRouter` stellt keinen DataRouterContext bereit; ohne Migration
<Route path="/verify" element={<VerifyPage />} /> * werfen Seiten mit `useUnsavedChangesBlocker` beim Rendern eine Invariante.
*/
<Route const appRouter = createBrowserRouter([
path="/login" { path: '/verify', element: <VerifyPage /> },
element={ {
path: '/login',
element: (
<PublicRoute> <PublicRoute>
<LoginPage /> <LoginPage />
</PublicRoute> </PublicRoute>
} ),
/> },
{ path: '/impressum', element: <LegalPage type="impressum" /> },
{/* P-01: Öffentliche Rechtstextseiten — kein Auth erforderlich */} { path: '/datenschutz', element: <LegalPage type="datenschutz" /> },
<Route path="/impressum" element={<LegalPage type="impressum" />} /> { path: '/nutzungsbedingungen', element: <LegalPage type="nutzungsbedingungen" /> },
<Route path="/datenschutz" element={<LegalPage type="datenschutz" />} /> { path: '/medienrichtlinie', element: <LegalPage type="medienrichtlinie" /> },
<Route path="/nutzungsbedingungen" element={<LegalPage type="nutzungsbedingungen" />} /> {
<Route path="/medienrichtlinie" element={<LegalPage type="medienrichtlinie" />} /> element: <ProtectedLayout />,
children: [
<Route element={<ProtectedLayout />}> { index: true, element: <Dashboard /> },
<Route index element={<Dashboard />} /> { path: 'profile', element: <Navigate to="/settings" replace /> },
<Route path="profile" element={<Navigate to="/settings" replace />} /> { path: 'settings', element: <AccountSettingsPage /> },
<Route path="settings" element={<AccountSettingsPage />} /> { path: 'settings/system', element: <SettingsSystemInfoPage /> },
<Route path="settings/system" element={<SettingsSystemInfoPage />} /> { path: 'settings/legal', element: <SettingsLegalPage /> },
<Route path="settings/legal" element={<SettingsLegalPage />} /> { path: 'media', element: <MediaLibraryPage /> },
<Route path="media" element={<MediaLibraryPage />} /> {
<Route path="exercises"> path: 'exercises',
<Route index element={<ExercisesListPage />} /> children: [
<Route path="new" element={<ExerciseFormPage />} /> { index: true, element: <ExercisesListPage /> },
<Route path=":id/edit" element={<ExerciseFormPage />} /> { path: 'new', element: <ExerciseFormPage /> },
<Route path=":id" element={<ExerciseDetailPage />} /> { path: ':id/edit', element: <ExerciseFormPage /> },
</Route> { path: ':id', element: <ExerciseDetailPage /> },
<Route path="clubs" element={<ClubsPage />} /> ],
<Route path="inbox" element={<InboxPage />} /> },
<Route path="skills" element={<SkillsPage />} /> { path: 'clubs', element: <ClubsPage /> },
<Route path="planning/framework-programs/new" element={<TrainingFrameworkProgramEditPage />} /> { path: 'inbox', element: <InboxPage /> },
<Route path="planning/framework-programs/:id" element={<TrainingFrameworkProgramEditPage />} /> { path: 'skills', element: <SkillsPage /> },
<Route path="planning/framework-programs" element={<TrainingFrameworkProgramsListPage />} /> { path: 'planning/framework-programs/new', element: <TrainingFrameworkProgramEditPage /> },
<Route path="planning/training-modules/new" element={<TrainingModuleEditPage />} /> { path: 'planning/framework-programs/:id', element: <TrainingFrameworkProgramEditPage /> },
<Route path="planning/training-modules/:id" element={<TrainingModuleEditPage />} /> { path: 'planning/framework-programs', element: <TrainingFrameworkProgramsListPage /> },
<Route path="planning/training-modules" element={<TrainingModulesListPage />} /> { path: 'planning/training-modules/new', element: <TrainingModuleEditPage /> },
<Route path="planning/run/:unitId/coach" element={<TrainingCoachPage />} /> { path: 'planning/training-modules/:id', element: <TrainingModuleEditPage /> },
<Route path="planning/run/:unitId" element={<TrainingUnitRunPage />} /> { path: 'planning/training-modules', element: <TrainingModulesListPage /> },
<Route path="planning" element={<TrainingPlanningPage />} /> { path: 'planning/run/:unitId/coach', element: <TrainingCoachPage /> },
<Route path="admin" element={<AdminHomeRedirect />} /> { path: 'planning/run/:unitId', element: <TrainingUnitRunPage /> },
<Route { path: 'planning', element: <TrainingPlanningPage /> },
path="admin/users" { path: 'admin', element: <AdminHomeRedirect /> },
element={ {
path: 'admin/users',
element: (
<PlatformAdminRoute> <PlatformAdminRoute>
<AdminUsersPage /> <AdminUsersPage />
</PlatformAdminRoute> </PlatformAdminRoute>
} ),
/> },
<Route {
path="admin/hierarchy" path: 'admin/hierarchy',
element={ element: (
<PlatformAdminRoute> <PlatformAdminRoute>
<AdminHierarchyPage /> <AdminHierarchyPage />
</PlatformAdminRoute> </PlatformAdminRoute>
} ),
/> },
<Route {
path="admin/maturity-models" path: 'admin/maturity-models',
element={ element: (
<PlatformAdminRoute> <PlatformAdminRoute>
<AdminMaturityModelsPage /> <AdminMaturityModelsPage />
</PlatformAdminRoute> </PlatformAdminRoute>
} ),
/> },
<Route {
path="admin/catalogs" path: 'admin/catalogs',
element={ element: (
<PlatformAdminRoute> <PlatformAdminRoute>
<AdminCatalogsPage /> <AdminCatalogsPage />
</PlatformAdminRoute> </PlatformAdminRoute>
} ),
/> },
<Route {
path="admin/mediawiki-import" path: 'admin/mediawiki-import',
element={ element: (
<PlatformAdminRoute> <PlatformAdminRoute>
<MediaWikiImportPage /> <MediaWikiImportPage />
</PlatformAdminRoute> </PlatformAdminRoute>
} ),
/> },
<Route {
path="admin/legal-documents" path: 'admin/legal-documents',
element={ element: (
<PlatformAdminRoute> <PlatformAdminRoute>
<AdminLegalDocumentsPage /> <AdminLegalDocumentsPage />
</PlatformAdminRoute> </PlatformAdminRoute>
} ),
/> },
<Route path="trainer-contexts" element={<TrainerContextsPage />} /> { path: 'trainer-contexts', element: <TrainerContextsPage /> },
</Route> ],
},
<Route path="*" element={<Navigate to="/" replace />} /> { path: '*', element: <Navigate to="/" replace /> },
</Routes> ])
)
}
function App() { function App() {
return ( return (
<AuthProvider> <AuthProvider>
<ToastProvider> <ToastProvider>
<Router> <RouterProvider router={appRouter} />
<AppRoutes />
</Router>
</ToastProvider> </ToastProvider>
</AuthProvider> </AuthProvider>
) )