feat: Dispo V2 import — API router + admin UI

API Router (packages/api/src/router/dispo.ts):
- 12 adminProcedure endpoints wired to existing application layer
- stageImportBatch, validateImportBatch, commitImportBatch
- listImportBatches, getImportBatch, cancelImportBatch
- listStagedResources/Projects/Assignments/Vacations/Unresolved
- resolveStagedRecord (APPROVE/REJECT/SKIP actions)

Admin UI:
- /admin/dispo-imports — batch list with status filter, new import modal
- /admin/dispo-imports/[batchId] — detail with 6 tabs:
  Summary, Resources, Projects, Assignments, Vacations, Unresolved
- Unresolved review queue with approve/skip per-record actions
- Commit workflow with pre-validation and progress indicator
- Sidebar nav link under Admin

Also fixes: timeline filter dropdown z-index (toolbar relative z-20)

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-03-22 19:07:20 +01:00
parent 7a57b5e649
commit 7e4b21afe9
7 changed files with 1877 additions and 0 deletions
@@ -0,0 +1,10 @@
import { DispoImportDetailClient } from "~/components/admin/DispoImportDetailClient.js";
export default async function DispoImportDetailPage({
params,
}: {
params: Promise<{ batchId: string }>;
}) {
const { batchId } = await params;
return <DispoImportDetailClient batchId={batchId} />;
}
@@ -0,0 +1,5 @@
import { DispoImportClient } from "~/components/admin/DispoImportClient.js";
export default function DispoImportsPage() {
return <DispoImportClient />;
}