- ISMS-Routen, Actions, Server-/Lib-Code, Komponenten, Prisma-Modelle, Seeds, Importer, Skripte und ISMS-Tests entfernt (Fundament bleibt: Auth, Identity, MFA/WebAuthn, RBAC, Audit, Mail, Storage, Backup/DSGVO, Plattform-Admin) - Schema auf Fundament-Modelle reduziert; TenantSettings generisch (+phone/email) - TENANT_MODELS (db.ts, backup/topology.ts) und PII-Felder ausgedünnt - RBAC: Rollen tenant-admin/backoffice/team-lead/technician + Craftvia-Permissions - Modul-Katalog (customers, sites, teams, work_orders, imports, field, reports, emergency, documents, notifications, lotse) + Navigation aus src/lib/nav.ts - Modul-Routen mit requireModule-Layout und Platzhalterseite - Message-Katalog je Namespace (messages/<locale>/<namespace>.json), fs-Loader - check-module-guards: Modul-Key aus src/server/actions/<moduleKey>/ - Provisionierung, Admin-Konsole, Einstellungen, Files-Route, Mail entkoppelt - Seed minimal (demo/demo2, Nutzer je Rolle); Fundament-Tests auf Role/ NotificationPreference-Fixtures umgestellt Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
26 lines
1.1 KiB
TypeScript
26 lines
1.1 KiB
TypeScript
import { Construction } from "lucide-react";
|
|
import { getTranslations } from "next-intl/server";
|
|
import { PageHead } from "@/components/mockup-ui";
|
|
import { MODULES, type ModuleKey } from "@/lib/modules";
|
|
|
|
/**
|
|
* Platzhalter-Seite eines noch nicht umgesetzten Moduls. Die jeweilige Modul-Lane
|
|
* ersetzt die `page.tsx` ihres Routenordners; `layout.tsx` (requireModule) bleibt.
|
|
*/
|
|
export async function ModulePlaceholder({ moduleKey }: { moduleKey: ModuleKey }) {
|
|
const t = await getTranslations("modules");
|
|
const mod = MODULES.find((m) => m.key === moduleKey)!;
|
|
return (
|
|
<main className="flex-1 p-6">
|
|
<PageHead crumb={t("placeholder.crumb")} title={t(mod.nav)} />
|
|
<div className="shadow-card mt-4 flex items-start gap-3 rounded-xl border bg-card p-5">
|
|
<Construction className="mt-0.5 size-5 shrink-0 text-[var(--ui-accent)]" aria-hidden />
|
|
<div>
|
|
<p className="font-heading text-sm font-semibold">{t("placeholder.status")}</p>
|
|
<p className="mt-1 text-[13px] text-muted-foreground">{t("placeholder.hint")}</p>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
);
|
|
}
|