diff --git a/apps/web/src/app/(app)/admin/dispo-imports/page.tsx b/apps/web/src/app/(app)/admin/dispo-imports/page.tsx
index 81809b3..fd453eb 100644
--- a/apps/web/src/app/(app)/admin/dispo-imports/page.tsx
+++ b/apps/web/src/app/(app)/admin/dispo-imports/page.tsx
@@ -1,5 +1,5 @@
-import { DispoImportClient } from "~/components/admin/DispoImportClient.js";
+import { redirect } from "next/navigation";
-export default function DispoImportsPage() {
- return ;
+export default function DispoImportRedirect() {
+ redirect("/admin/imports?tab=dispo");
}
diff --git a/apps/web/src/app/(app)/admin/imports/page.tsx b/apps/web/src/app/(app)/admin/imports/page.tsx
new file mode 100644
index 0000000..21ed33c
--- /dev/null
+++ b/apps/web/src/app/(app)/admin/imports/page.tsx
@@ -0,0 +1,63 @@
+"use client";
+
+import { useState } from "react";
+import dynamic from "next/dynamic";
+import { useSearchParams } from "next/navigation";
+
+const DispoImportClient = dynamic(
+ () => import("~/components/admin/DispoImportClient.js").then((m) => m.DispoImportClient),
+ { loading: () =>
},
+);
+
+const BatchSkillImport = dynamic(
+ () => import("~/components/admin/BatchSkillImport.js").then((m) => m.BatchSkillImport),
+ { loading: () => },
+);
+
+type Tab = "dispo" | "skills";
+
+const TABS: { key: Tab; label: string; description: string }[] = [
+ { key: "dispo", label: "Dispo Import", description: "Import planning data from Dispo V2 workbooks" },
+ { key: "skills", label: "Skill Matrix", description: "Import skill matrices from XLSX files" },
+];
+
+export default function ImportsPage() {
+ const searchParams = useSearchParams();
+ const initialTab = (searchParams.get("tab") as Tab) ?? "dispo";
+ const [activeTab, setActiveTab] = useState(initialTab);
+
+ return (
+
+
+
+
Data Import
+
Import planning data and skill matrices
+
+
+
+ {/* Tab bar */}
+
+ {TABS.map((tab) => (
+
+ ))}
+
+
+ {/* Tab content */}
+
+ {activeTab === "dispo" && }
+ {activeTab === "skills" && }
+
+
+ );
+}
diff --git a/apps/web/src/app/(app)/admin/skill-import/page.tsx b/apps/web/src/app/(app)/admin/skill-import/page.tsx
index a3f2d05..f191481 100644
--- a/apps/web/src/app/(app)/admin/skill-import/page.tsx
+++ b/apps/web/src/app/(app)/admin/skill-import/page.tsx
@@ -1,5 +1,5 @@
-import { BatchSkillImport } from "~/components/admin/BatchSkillImport.js";
+import { redirect } from "next/navigation";
-export default function BatchSkillImportPage() {
- return ;
+export default function SkillImportRedirect() {
+ redirect("/admin/imports?tab=skills");
}
diff --git a/apps/web/src/components/layout/AppShell.tsx b/apps/web/src/components/layout/AppShell.tsx
index c874061..db8fb4a 100644
--- a/apps/web/src/components/layout/AppShell.tsx
+++ b/apps/web/src/components/layout/AppShell.tsx
@@ -182,8 +182,7 @@ const adminNavEntries: AdminEntry[] = [
{ href: "/admin/org-units", label: "Org Units", icon: },
{ href: "/admin/utilization-categories", label: "Util. Categories", icon: },
{ href: "/admin/management-levels", label: "Mgmt Levels", icon: },
- { href: "/admin/dispo-imports", label: "Dispo Import", icon: },
- { href: "/admin/skill-import", label: "Skill Import", icon: },
+ { href: "/admin/imports", label: "Data Import", icon: },
],
},
{ href: "/admin/calculation-rules", label: "Calc. Rules", icon: },