feat: complete tOS project with HR, LEAN, Dashboard and Integrations modules

Full enterprise web operating system including:
- Next.js 14 frontend with App Router, i18n (DE/EN), shadcn/ui
- NestJS 10 backend with Prisma, JWT auth, Swagger docs
- Keycloak 24 SSO with role-based access control
- HR module (employees, time tracking, absences, org chart)
- LEAN module (3S planning, morning meeting SQCDM, skill matrix)
- Integrations module (PlentyONE, Zulip, Todoist, FreeScout, Nextcloud, ecoDMS, GembaDocs)
- Dashboard with customizable drag & drop widget grid
- Docker Compose infrastructure (PostgreSQL 16, Redis 7, Keycloak 24)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-06 19:37:55 +01:00
parent a2b6612e9e
commit fe305f6fc8
509 changed files with 81111 additions and 1 deletions

View File

@@ -0,0 +1,55 @@
'use client';
import { useEffect } from 'react';
import { useTranslations } from 'next-intl';
import { motion } from 'framer-motion';
import { RefreshCw, Home } from 'lucide-react';
import Link from 'next/link';
import { Button } from '@/components/ui/button';
interface ErrorPageProps {
error: Error & { digest?: string };
reset: () => void;
}
/**
* Error boundary page
* Displays when an unhandled error occurs
*/
export default function ErrorPage({ error, reset }: ErrorPageProps) {
const t = useTranslations('errors');
useEffect(() => {
// Log the error to an error reporting service
console.error('Application error:', error);
}, [error]);
return (
<div className="flex min-h-screen flex-col items-center justify-center bg-background p-4">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4 }}
className="text-center"
>
<h1 className="text-6xl font-bold text-destructive">!</h1>
<h2 className="mt-4 text-2xl font-semibold">{t('serverError')}</h2>
<p className="mt-2 text-muted-foreground">{t('serverErrorDescription')}</p>
<div className="mt-8 flex gap-4 justify-center">
<Button onClick={reset} variant="outline">
<RefreshCw className="mr-2 h-4 w-4" />
{t('tryAgain')}
</Button>
<Button asChild>
<Link href="/dashboard">
<Home className="mr-2 h-4 w-4" />
{t('goHome')}
</Link>
</Button>
</div>
</motion.div>
</div>
);
}