Initial commit with Email Import Wizard and Task Processor updates

This commit is contained in:
2026-05-04 08:02:11 +02:00
commit effdc5d59f
170 changed files with 67739 additions and 0 deletions
+145
View File
@@ -0,0 +1,145 @@
import { BrowserRouter, Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom';
import { ConfigProvider, theme, App as AntdApp } from 'antd';
import deDE from 'antd/locale/de_DE';
import { AuthProvider, useAuth } from './auth/AuthContext';
import { saveReturnUrl } from './auth/sessionRedirect';
import { ThemeProvider, useTheme } from './theme/ThemeContext';
import AuthCallback from './auth/AuthCallback';
import AppLayout from './layouts/AppLayout';
import InboxPage from './pages/InboxPage';
import InboxDetailPage from './pages/InboxDetailPage';
import PosteingangPage from './pages/PosteingangPage';
import ManuellBearbeitenPage from './pages/ManuellBearbeitenPage';
import MailpostfachPage from './pages/MailpostfachPage';
import MailDetailPage from './pages/MailDetailPage';
import SettingsPage from './pages/SettingsPage';
import LoginPage from './pages/LoginPage';
import DashboardPage from './pages/DashboardPage';
import { Spin, Result, Button } from 'antd';
import type { ReactNode } from 'react';
import { Permission } from './auth/permissions';
function UnauthorizedPage() {
const navigate = useNavigate();
return (
<Result
status="403"
title="403"
subTitle="Entschuldigung, Sie haben keine Berechtigung, auf diese Seite zuzugreifen."
extra={<Button type="primary" onClick={() => navigate('/')}>Zurück zur Startseite</Button>}
/>
);
}
function ProtectedRoute({ children }: { children: ReactNode }) {
const { isAuthenticated, isLoading } = useAuth();
const location = useLocation();
if (isLoading) {
return (
<div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh' }}>
<Spin size="large" />
</div>
);
}
if (!isAuthenticated) {
saveReturnUrl(location.pathname + location.search);
return <Navigate to="/login" replace />;
}
return <>{children}</>;
}
function PermissionRoute({ permission, children }: { permission: Permission; children: ReactNode }) {
const { hasPermission } = useAuth();
if (!hasPermission(permission)) {
return <UnauthorizedPage />;
}
return <>{children}</>;
}
function ThemedApp() {
const { isDark } = useTheme();
return (
<ConfigProvider
locale={deDE}
theme={{
algorithm: isDark ? theme.darkAlgorithm : theme.defaultAlgorithm,
token: {
colorPrimary: '#1677ff',
borderRadius: 6,
...(isDark
? {}
: {
// Extra-helles Light Theme — minimale Spiegelungsbelastung
colorBgContainer: '#ffffff',
colorBgElevated: '#ffffff',
colorBgLayout: '#f8f9fc',
colorBgBase: '#ffffff',
colorText: '#1a1a2e',
colorTextSecondary: '#4a4a6a',
colorBorder: '#e2e4ea',
colorBorderSecondary: '#ebedf2',
}),
},
components: isDark
? {}
: {
Layout: {
siderBg: '#f0f2f7',
headerBg: '#ffffff',
bodyBg: '#f8f9fc',
triggerBg: '#e2e4ea',
},
Menu: {
itemBg: 'transparent',
itemColor: '#4a4a6a',
itemSelectedBg: '#e6f0ff',
itemSelectedColor: '#1677ff',
itemHoverBg: '#eef1f8',
itemHoverColor: '#1a1a2e',
},
},
}}
>
<AuthProvider>
<AntdApp>
<BrowserRouter>
<Routes>
<Route path="/login" element={<LoginPage />} />
<Route path="/auth/callback" element={<AuthCallback />} />
<Route
element={
<ProtectedRoute>
<AppLayout />
</ProtectedRoute>
}
>
<Route index element={<DashboardPage />} />
<Route path="/dashboard" element={<DashboardPage />} />
<Route path="/inbox" element={<PermissionRoute permission={Permission.VIEW_SCANNER}><InboxPage /></PermissionRoute>} />
<Route path="/inbox/:id" element={<PermissionRoute permission={Permission.VIEW_SCANNER}><InboxDetailPage /></PermissionRoute>} />
<Route path="/posteingang" element={<PermissionRoute permission={Permission.VIEW_INBOX}><PosteingangPage /></PermissionRoute>} />
<Route path="/manuell" element={<PermissionRoute permission={Permission.PROCESS_MANUALLY}><ManuellBearbeitenPage /></PermissionRoute>} />
<Route path="/mailpostfach" element={<PermissionRoute permission={Permission.VIEW_MAIL}><MailpostfachPage /></PermissionRoute>} />
<Route path="/mailpostfach/:id" element={<PermissionRoute permission={Permission.VIEW_MAIL}><MailDetailPage /></PermissionRoute>} />
<Route path="/settings" element={<PermissionRoute permission={Permission.MANAGE_SETTINGS}><SettingsPage /></PermissionRoute>} />
</Route>
</Routes>
</BrowserRouter>
</AntdApp>
</AuthProvider>
</ConfigProvider>
);
}
export default function App() {
return (
<ThemeProvider>
<ThemedApp />
</ThemeProvider>
);
}