Schnellerfassung im Alarmfall, sechs Zeitstempel mit Ausrueckzeit, Anfahrt und Hilfsfrist, Staerke nach FwDV 3, Personalvorschlag mit Qualifikationsstand, Einsatzbericht als PDF, Jahresexport fuer die Gemeinde, Statistik und Uebungen mit Anwesenheitsliste. Dazu das Einsatzportal fuer Fremdwehren: ein signierter Link ohne Anmeldung, zeitlich und mengenbegrenzt, der Stichwort, Ort, Zeiten und Lagemeldungen zeigt und Meldungen mit Foto annimmt. Es sind die ersten oeffentlich erreichbaren Endpunkte in FLORIAN. Acht neue Tabellen, alle mit organisationId und Row Level Security. Ein freigegebener Einsatzbericht ist unveraenderlich; ein Datenbanktrigger setzt das durch. Koordinaten liegen doppelt — als Dezimalgrad und als PostGIS-Punkt, zusammengehalten von einem Trigger. 57 neue Tests (32 Unit, 14 gegen eine echte Datenbank, 11 E2E). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
103 lines
3.0 KiB
JSON
103 lines
3.0 KiB
JSON
{
|
|
"name": "florian",
|
|
"version": "0.4.0",
|
|
"private": true,
|
|
"description": "FLORIAN — Feuerwehr-Verwaltungsplattform",
|
|
"engines": {
|
|
"node": ">=22"
|
|
},
|
|
"scripts": {
|
|
"dev": "next dev -p 3100",
|
|
"build": "next build",
|
|
"start": "next start -p 3100",
|
|
"worker": "tsx --conditions=react-server src/worker/index.ts",
|
|
"worker:dev": "tsx watch --conditions=react-server src/worker/index.ts",
|
|
"lint": "next lint",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:e2e": "playwright test",
|
|
"db:generate": "prisma generate",
|
|
"db:migrate": "prisma migrate deploy",
|
|
"db:migrate:dev": "prisma migrate dev",
|
|
"db:push": "prisma db push",
|
|
"db:seed": "tsx prisma/seed.ts",
|
|
"db:studio": "prisma studio",
|
|
"screenshots": "tsx scripts/screenshots.ts"
|
|
},
|
|
"dependencies": {
|
|
"@prisma/client": "^6.16.2",
|
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
"@radix-ui/react-checkbox": "^1.3.11",
|
|
"@radix-ui/react-dialog": "^1.1.23",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-label": "^2.1.7",
|
|
"@radix-ui/react-popover": "^1.1.23",
|
|
"@radix-ui/react-select": "^2.3.7",
|
|
"@radix-ui/react-separator": "^1.1.7",
|
|
"@radix-ui/react-slot": "^1.2.3",
|
|
"@radix-ui/react-tabs": "^1.1.21",
|
|
"@radix-ui/react-tooltip": "^1.2.16",
|
|
"@tanstack/react-query": "^5.90.2",
|
|
"@tanstack/react-table": "^9.2.4",
|
|
"@trpc/client": "^11.6.0",
|
|
"@trpc/react-query": "^11.6.0",
|
|
"@trpc/server": "^11.6.0",
|
|
"@zxing/browser": "^0.2.1",
|
|
"@zxing/library": "^0.23.0",
|
|
"bcryptjs": "^3.0.2",
|
|
"bullmq": "^5.61.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"date-fns": "^4.1.0",
|
|
"date-fns-tz": "^3.2.0",
|
|
"exceljs": "^4.4.0",
|
|
"ioredis": "^5.8.1",
|
|
"lucide-react": "^0.544.0",
|
|
"minio": "^8.0.6",
|
|
"next": "^15.5.4",
|
|
"next-auth": "^5.0.0-beta.29",
|
|
"next-themes": "^0.4.6",
|
|
"papaparse": "^5.7.0",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19.1.1",
|
|
"react-dom": "^19.1.1",
|
|
"server-only": "^0.0.1",
|
|
"superjson": "^2.2.6",
|
|
"tailwind-merge": "^3.3.1",
|
|
"zod": "^3.25.76"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.55.1",
|
|
"@tailwindcss/postcss": "^4.1.13",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.0",
|
|
"@types/node": "^22.18.6",
|
|
"@types/papaparse": "^5.5.2",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19.1.13",
|
|
"@types/react-dom": "^19.1.9",
|
|
"@vitejs/plugin-react": "^5.0.3",
|
|
"dotenv": "^17.4.2",
|
|
"esbuild": "^0.25.10",
|
|
"eslint": "^9.36.0",
|
|
"eslint-config-next": "^15.5.4",
|
|
"jsdom": "^27.0.0",
|
|
"prisma": "^6.16.2",
|
|
"tailwindcss": "^4.1.13",
|
|
"tsx": "^4.20.6",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.9.2",
|
|
"vite-tsconfig-paths": "^5.1.4",
|
|
"vitest": "^3.2.4"
|
|
},
|
|
"allowScripts": {
|
|
"prisma": true,
|
|
"@prisma/client": true,
|
|
"@prisma/engines": true,
|
|
"esbuild": true,
|
|
"unrs-resolver": true,
|
|
"msgpackr-extract": true
|
|
}
|
|
}
|