diff --git a/apps/web/src/components/admin/DispoImportClient.tsx b/apps/web/src/components/admin/DispoImportClient.tsx index 1e78c74..25da6c3 100644 --- a/apps/web/src/components/admin/DispoImportClient.tsx +++ b/apps/web/src/components/admin/DispoImportClient.tsx @@ -65,32 +65,72 @@ const WORKBOOK_LABELS: { key: string; label: string; placeholder: string }[] = [ { key: "roles", label: "Roles Workbook", placeholder: "/data/dispo/roles.xlsx" }, ]; +const EMPTY_VALIDATE_INPUT = { + referenceWorkbookPath: "", + planningWorkbookPath: "", + chargeabilityWorkbookPath: "", +} as const; + +type ReadinessIssue = { + code: string; + count: number; + message: string; + resolution: string; + severity: "blocker" | "warning"; +}; + type ReadinessReport = { assignmentCount: number; availabilityRuleCount: number; canCommitWithFallbacks: boolean; canCommitWithStrictSourceData: boolean; fallbackAssumptions: string[]; - issues: { - code: string; - count: number; - message: string; - resolution: string; - severity: "blocker" | "warning"; - }[]; + issues: ReadinessIssue[]; projectCount: number; resourceCount: number; unresolvedCount: number; vacationCount: number; }; +const ISSUE_STYLES = { + blocker: { + container: "rounded bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 px-3 py-2", + title: "text-xs font-medium text-red-700 dark:text-red-400", + resolution: "text-xs text-red-600/80 dark:text-red-300/70 mt-0.5", + }, + warning: { + container: "rounded bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 px-3 py-2", + title: "text-xs font-medium text-amber-700 dark:text-amber-400", + resolution: "text-xs text-amber-600/80 dark:text-amber-300/70 mt-0.5", + }, +} as const; + +function IssueList({ issues }: { issues: ReadinessIssue[] }) { + if (issues.length === 0) return null; + return ( +
+ {issue.message} + {issue.count > 1 && ({issue.count})} +
+{issue.resolution}
+Ready to stage — no blockers found. @@ -105,7 +145,6 @@ function ReadinessReportPanel({ report }: { report: ReadinessReport }) {
)} - {/* Counts */}- {issue.message} - {issue.count > 1 && ( - ({issue.count}) - )} -
-- {issue.resolution} -
-- {issue.message} - {issue.count > 1 && ( - ({issue.count}) - )} -
-- {issue.resolution} -
-
@@ -206,7 +203,7 @@ function NewImportModal({
const [validateInput, setValidateInput] = useState
Validating…
)} {!validateQuery.isFetching && validateQuery.data && ( -