@fayz-ai/admin 0.30.1 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,6 +25,8 @@ export { useBusinessProfileStore, buildBusinessProfile, businessProfileBlock, cu
25
25
  export { runWelcome, orientationTour, type WelcomeInput } from './welcome';
26
26
  export { onboardingChecklist, mergeOnboardingSteps, dueDateFor, type OnboardingTaskSeed, type MergeContext, } from './checklist';
27
27
  export { seedOnboardingTasks, listOnboardingTasks, completeOnboardingTask, cancelOnboardingTask } from './tasks';
28
+ export { usePluginOnboardingGate, PluginOnboardingGateSkeleton } from './usePluginOnboardingGate';
29
+ export type { PluginOnboardingStatus } from './usePluginOnboardingGate';
28
30
  export { toQuestionSpecs, coerceAnswers, type QuestionSpec, type QuestionType } from './questions';
29
31
  export { WORKSPACE_SETUP_FLOW_ID, WORKSPACE_SETUP_FLOW_VERSION, type QuestionPack, type SetupAnswers, type SetupContext, type SetupSource, } from './types';
30
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/onboarding/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ export type PluginOnboardingStatus = 'checking' | 'needed' | 'complete';
3
+ /**
4
+ * Resolves a plugin's welcome state without ever rendering "not configured"
5
+ * while the server is still answering. Existing data is remembered so route
6
+ * changes do not repeat the check or flash the welcome screen.
7
+ */
8
+ export declare function usePluginOnboardingGate(storageKey: string, checkExistingData: () => Promise<boolean>): {
9
+ status: PluginOnboardingStatus;
10
+ complete: () => void;
11
+ };
12
+ /** Neutral content-shaped placeholder used only while the setup check settles. */
13
+ export declare function PluginOnboardingGateSkeleton(): React.JSX.Element;
14
+ //# sourceMappingURL=usePluginOnboardingGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePluginOnboardingGate.d.ts","sourceRoot":"","sources":["../../src/onboarding/usePluginOnboardingGate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAA;AAUvE;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GACxC;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;CAAE,CA4B1D;AAED,kFAAkF;AAClF,wBAAgB,4BAA4B,sBAe3C"}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Where a person record is available operationally.
4
+ *
5
+ * This is deliberately different from PersonUnitsTab: that tab grants a login
6
+ * access to units, while this one distributes a business record that may never
7
+ * sign in (supplier, customer, contact). No grants means organization-wide;
8
+ * one or more grants narrows the record to exactly those units.
9
+ */
10
+ export declare function PersonAvailabilityTab({ item }: {
11
+ item: unknown;
12
+ }): React.JSX.Element;
13
+ //# sourceMappingURL=PersonAvailabilityTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonAvailabilityTab.d.ts","sourceRoot":"","sources":["../../src/units/PersonAvailabilityTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,qBA4IhE"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.30.1",
6
+ "version": "0.30.2",
7
7
  "description": "Fayz SDK admin layer — the admin shell, CRUD engine, multi-tenancy, billing, permissions and org management",
8
8
  "type": "module",
9
9
  "sideEffects": [
@@ -61,10 +61,10 @@
61
61
  "cmdk": "^1.0.0",
62
62
  "@fayz-ai/auth": "^0.30.0",
63
63
  "@fayz-ai/core": "^0.30.1",
64
- "@fayz-ai/db": "^0.18.1",
64
+ "@fayz-ai/db": "^0.18.2",
65
65
  "@fayz-ai/plugin-auth": "^0.12.10",
66
66
  "@fayz-ai/sdk": "^0.30.1",
67
- "@fayz-ai/ui": "^0.30.0"
67
+ "@fayz-ai/ui": "^0.30.2"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@supabase/supabase-js": "^2.45.0",
@@ -1,3 +0,0 @@
1
- export { ImportWizard } from './chunk-UMRN6427.js';
2
- //# sourceMappingURL=ImportWizard-CISHGNQC.js.map
3
- //# sourceMappingURL=ImportWizard-CISHGNQC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/crud/ImportWizard.tsx"],"names":[],"mappings":"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","file":"chunk-UMRN6427.js","sourcesContent":["import React, { useState, useRef, useMemo, useCallback } from 'react'\nimport {\n Download, Upload, ArrowRight, ArrowLeft, Check, AlertCircle,\n Loader2, FileSpreadsheet, X, ChevronDown,\n} from 'lucide-react'\nimport {\n Modal, ModalContent, ModalHeader, ModalBody,\n ModalTitle,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FieldDef, EntityDef } from '@fayz-ai/core'\n\ntype ImportStep = 'download' | 'upload' | 'mapping' | 'importing' | 'done'\n\ninterface ImportWizardProps {\n open: boolean\n onClose: () => void\n entityDef: EntityDef\n onImport: (\n rows: Record<string, any>[],\n onProgress: (processed: number, total: number) => void,\n ) => Promise<{ success: number; errors: ImportRowError[] }>\n}\n\nexport interface ImportRowError {\n row: number\n message: string\n}\n\ninterface ParsedCSV {\n headers: string[]\n rows: string[][]\n}\n\n// ---------------------------------------------------------------------------\n// CSV utilities\n// ---------------------------------------------------------------------------\n\nfunction getImportableFields(entityDef: EntityDef): FieldDef[] {\n return entityDef.fields.filter(\n (f) => f.showInForm !== false && f.key !== 'id' && f.type !== 'image',\n )\n}\n\nfunction generateSampleCSV(fields: FieldDef[]): string {\n const headers = fields.map((f) => f.label)\n const sampleRow = fields.map((f) => {\n switch (f.type) {\n case 'email': return 'example@email.com'\n case 'phone': return '+5511999999999'\n case 'number': return '0'\n case 'currency': return '0.00'\n case 'date': return '2025-01-01'\n case 'datetime': return '2025-01-01T09:00'\n case 'time': return '09:00'\n case 'boolean': return 'true'\n case 'select': {\n const opts = f.options ?? []\n const first = typeof opts[0] === 'string' ? opts[0] : opts[0]?.value\n return first ?? ''\n }\n default: return ''\n }\n })\n return [headers.join(','), sampleRow.join(',')].join('\\n')\n}\n\nfunction downloadCSV(content: string, filename: string) {\n const bom = '\\uFEFF'\n const blob = new Blob([bom + content], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nfunction parseCSV(text: string): ParsedCSV {\n const lines = text.split(/\\r?\\n/).filter((l) => l.trim().length > 0)\n if (lines.length === 0) return { headers: [], rows: [] }\n\n const parse = (line: string): string[] => {\n const result: string[] = []\n let current = ''\n let inQuotes = false\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]\n if (ch === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"'\n i++\n } else {\n inQuotes = !inQuotes\n }\n } else if (ch === ',' && !inQuotes) {\n result.push(current.trim())\n current = ''\n } else {\n current += ch\n }\n }\n result.push(current.trim())\n return result\n }\n\n const headers = parse(lines[0])\n const rows = lines.slice(1).map(parse)\n return { headers, rows }\n}\n\nfunction coerceValue(value: string, field: FieldDef): any {\n const trimmed = value.trim()\n if (trimmed === '') return null\n switch (field.type) {\n case 'number':\n case 'currency': {\n const num = Number(trimmed.replace(',', '.'))\n return isNaN(num) ? null : num\n }\n case 'boolean':\n return ['true', '1', 'yes', 'sim', 'verdadeiro'].includes(trimmed.toLowerCase())\n default:\n return trimmed\n }\n}\n\n// ---------------------------------------------------------------------------\n// Step indicator\n// ---------------------------------------------------------------------------\n\nconst STEPS: ImportStep[] = ['download', 'upload', 'mapping', 'importing']\n\nfunction StepIndicator({ current }: { current: ImportStep }) {\n const t = useTranslation()\n const labels: Record<ImportStep, string> = {\n download: t('crud.import.step.download'),\n upload: t('crud.import.step.upload'),\n mapping: t('crud.import.step.mapping'),\n importing: t('crud.import.step.importing'),\n done: '',\n }\n const currentIdx = STEPS.indexOf(current === 'done' ? 'importing' : current)\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {STEPS.map((step, i) => {\n const isDone = i < currentIdx || current === 'done'\n const isActive = step === current\n return (\n <React.Fragment key={step}>\n {i > 0 && <div className={cn('h-px w-6', isDone ? 'bg-primary' : 'bg-border')} />}\n <div className=\"flex items-center gap-1.5\">\n <div\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium',\n isDone\n ? 'bg-primary text-primary-foreground'\n : isActive\n ? 'border-2 border-primary text-primary'\n : 'border-2 border-muted-foreground/30 text-muted-foreground',\n )}\n >\n {isDone ? <Check className=\"h-3 w-3\" /> : i + 1}\n </div>\n <span className={cn('text-xs hidden sm:inline', isActive ? 'text-foreground font-medium' : 'text-muted-foreground')}>\n {labels[step]}\n </span>\n </div>\n </React.Fragment>\n )\n })}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 1: Download sample\n// ---------------------------------------------------------------------------\n\nfunction DownloadStep({\n entityDef,\n fields,\n onNext,\n}: {\n entityDef: EntityDef\n fields: FieldDef[]\n onNext: () => void\n}) {\n const t = useTranslation()\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n\n const handleDownload = () => {\n const csv = generateSampleCSV(fields)\n downloadCSV(csv, `${namePlural.toLowerCase().replace(/\\s+/g, '-')}-template.csv`)\n }\n\n return (\n <div className=\"flex flex-col items-center text-center gap-6 py-4\">\n <div className=\"h-16 w-16 rounded-2xl bg-primary/10 flex items-center justify-center\">\n <FileSpreadsheet className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"space-y-2 max-w-sm\">\n <h3 className=\"text-base font-semibold\">{t('crud.import.downloadTitle')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('crud.import.downloadDescription', { entity: namePlural.toLowerCase() })}\n </p>\n </div>\n <div className=\"flex flex-col gap-3 w-full max-w-xs\">\n <Button variant=\"outline\" onClick={handleDownload} className=\"w-full\">\n <Download className=\"h-4 w-4 mr-2\" />\n {t('crud.import.downloadTemplate')}\n </Button>\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.import.downloadHint', { count: String(fields.length) })}\n </p>\n </div>\n <Button onClick={onNext} className=\"mt-2\">\n {t('crud.import.alreadyHaveFile')}\n <ArrowRight className=\"h-4 w-4 ml-2\" />\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 2: Upload file\n// ---------------------------------------------------------------------------\n\nfunction UploadStep({\n onParsed,\n onBack,\n}: {\n onParsed: (csv: ParsedCSV, fileName: string) => void\n onBack: () => void\n}) {\n const t = useTranslation()\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const processFile = (file: File) => {\n setError(null)\n if (!file.name.endsWith('.csv')) {\n setError(t('crud.import.invalidFile'))\n return\n }\n const reader = new FileReader()\n reader.onload = (e) => {\n const text = e.target?.result as string\n const parsed = parseCSV(text)\n if (parsed.headers.length === 0) {\n setError(t('crud.import.emptyFile'))\n return\n }\n if (parsed.rows.length === 0) {\n setError(t('crud.import.noRows'))\n return\n }\n onParsed(parsed, file.name)\n }\n reader.readAsText(file)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setDragOver(false)\n const file = e.dataTransfer.files[0]\n if (file) processFile(file)\n }\n\n return (\n <div className=\"flex flex-col items-center gap-6 py-4\">\n <div\n onDragOver={(e) => { e.preventDefault(); setDragOver(true) }}\n onDragLeave={() => setDragOver(false)}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n className={cn(\n 'flex flex-col items-center justify-center gap-3 w-full max-w-sm rounded-xl border-2 border-dashed p-8 cursor-pointer transition-colors',\n dragOver ? 'border-primary bg-primary/5' : 'border-muted-foreground/25 hover:border-muted-foreground/50',\n )}\n >\n <Upload className=\"h-8 w-8 text-muted-foreground\" />\n <div className=\"text-center\">\n <p className=\"text-sm font-medium\">{t('crud.import.uploadTitle')}</p>\n <p className=\"text-xs text-muted-foreground mt-1\">{t('crud.import.uploadHint')}</p>\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\".csv\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) processFile(file)\n }}\n />\n </div>\n {error && (\n <div className=\"flex items-center gap-2 text-sm text-destructive\">\n <AlertCircle className=\"h-4 w-4 shrink-0\" />\n {error}\n </div>\n )}\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n {t('common.back')}\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 3: Column mapping\n// ---------------------------------------------------------------------------\n\nfunction MappingStep({\n csv,\n fileName,\n fields,\n onConfirm,\n onBack,\n}: {\n csv: ParsedCSV\n fileName: string\n fields: FieldDef[]\n onConfirm: (mapping: Map<number, FieldDef>) => void\n onBack: () => void\n}) {\n const t = useTranslation()\n\n // Auto-map by label match (case-insensitive)\n const initialMapping = useMemo(() => {\n const map = new Map<number, FieldDef | null>()\n for (let i = 0; i < csv.headers.length; i++) {\n const header = csv.headers[i].toLowerCase().trim()\n const match = fields.find(\n (f) => f.label.toLowerCase() === header || f.key.toLowerCase() === header,\n )\n map.set(i, match ?? null)\n }\n return map\n }, [csv.headers, fields])\n\n const [mapping, setMapping] = useState(initialMapping)\n\n const mappedCount = Array.from(mapping.values()).filter(Boolean).length\n const previewRows = csv.rows.slice(0, 3)\n\n const handleSelect = (colIdx: number, fieldKey: string) => {\n setMapping((prev) => {\n const next = new Map(prev)\n if (fieldKey === '__ignore__') {\n next.set(colIdx, null)\n } else {\n const field = fields.find((f) => f.key === fieldKey) ?? null\n // Remove this field from any other column\n for (const [idx, f] of next) {\n if (f?.key === fieldKey) next.set(idx, null)\n }\n next.set(colIdx, field)\n }\n return next\n })\n }\n\n const handleConfirm = () => {\n const validMapping = new Map<number, FieldDef>()\n for (const [idx, field] of mapping) {\n if (field) validMapping.set(idx, field)\n }\n onConfirm(validMapping)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium\">{t('crud.import.mappingTitle')}</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {t('crud.import.mappingDescription', {\n file: fileName,\n columns: String(csv.headers.length),\n rows: String(csv.rows.length),\n })}\n </p>\n </div>\n <span className=\"text-xs text-muted-foreground tabular-nums\">\n {t('crud.import.mappedCount', { count: String(mappedCount), total: String(csv.headers.length) })}\n </span>\n </div>\n\n <div className=\"overflow-x-auto border rounded-lg\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]\">\n {t('crud.import.csvColumn')}\n </th>\n <th className=\"text-center w-[10%] px-2\">\n <ArrowRight className=\"h-3.5 w-3.5 mx-auto text-muted-foreground\" />\n </th>\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[35%]\">\n {t('crud.import.mapsTo')}\n </th>\n <th className=\"text-left font-medium text-muted-foreground py-2.5 px-3 w-[20%]\">\n {t('crud.import.preview')}\n </th>\n </tr>\n </thead>\n <tbody>\n {csv.headers.map((header, idx) => {\n const mapped = mapping.get(idx)\n return (\n <tr key={idx} className=\"border-b last:border-0\">\n <td className=\"py-2 px-3\">\n <span className=\"font-mono text-xs bg-muted px-1.5 py-0.5 rounded\">{header}</span>\n </td>\n <td className=\"text-center px-2\">\n <ArrowRight className=\"h-3 w-3 mx-auto text-muted-foreground/50\" />\n </td>\n <td className=\"py-2 px-3\">\n <div className=\"relative\">\n <select\n value={mapped?.key ?? '__ignore__'}\n onChange={(e) => handleSelect(idx, e.target.value)}\n className={cn(\n 'w-full appearance-none rounded-md border bg-background px-2.5 py-1.5 pr-8 text-sm',\n 'focus:outline-none focus:ring-2 focus:ring-ring',\n mapped ? 'text-foreground' : 'text-muted-foreground',\n )}\n >\n <option value=\"__ignore__\">{t('crud.import.skip')}</option>\n {fields.map((f) => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" />\n </div>\n </td>\n <td className=\"py-2 px-3\">\n <span className=\"text-xs text-muted-foreground truncate block max-w-[140px]\">\n {previewRows[0]?.[idx] ?? '—'}\n </span>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n\n <div className=\"flex items-center justify-between pt-2\">\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"h-4 w-4 mr-2\" />\n {t('common.back')}\n </Button>\n <Button onClick={handleConfirm} disabled={mappedCount === 0}>\n {t('crud.import.startImport')}\n <ArrowRight className=\"h-4 w-4 ml-2\" />\n </Button>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Step 4: Importing + Done\n// ---------------------------------------------------------------------------\n\nfunction ImportingStep({\n result,\n progress,\n totalRows,\n onClose,\n}: {\n result: { success: number; errors: ImportRowError[] } | null\n progress: { processed: number; total: number } | null\n totalRows: number\n onClose: () => void\n}) {\n const t = useTranslation()\n\n if (!result) {\n const processed = progress?.processed ?? 0\n const total = progress?.total ?? totalRows\n const percent = total > 0 ? Math.round((processed / total) * 100) : 0\n\n return (\n <div className=\"flex flex-col items-center gap-6 py-8\">\n <div className=\"relative h-16 w-16 flex items-center justify-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-primary\" />\n </div>\n\n <div className=\"text-center space-y-1\">\n <p className=\"text-sm font-medium\">{t('crud.import.importing')}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('crud.import.progressCount', { processed: String(processed), total: String(total) })}\n </p>\n </div>\n\n {/* Progress bar */}\n <div className=\"w-full max-w-xs space-y-2\">\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all duration-500 ease-out\"\n style={{ width: `${percent}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-center tabular-nums\">\n {percent}%\n </p>\n </div>\n </div>\n )\n }\n\n const hasErrors = result.errors.length > 0\n\n return (\n <div className=\"flex flex-col items-center gap-5 py-4\">\n <div className={cn(\n 'h-16 w-16 rounded-2xl flex items-center justify-center',\n hasErrors ? 'bg-warning/10' : 'bg-success/10',\n )}>\n {hasErrors ? (\n <AlertCircle className=\"h-8 w-8 text-warning\" />\n ) : (\n <Check className=\"h-8 w-8 text-success\" />\n )}\n </div>\n\n <div className=\"text-center space-y-1\">\n <h3 className=\"text-base font-semibold\">\n {hasErrors ? t('crud.import.doneWithErrors') : t('crud.import.doneSuccess')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('crud.import.doneCount', {\n success: String(result.success),\n total: String(totalRows),\n })}\n </p>\n </div>\n\n {/* Completed progress bar */}\n <div className=\"w-full max-w-xs\">\n <div className=\"h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n hasErrors ? 'bg-warning' : 'bg-success',\n )}\n style={{ width: '100%' }}\n />\n </div>\n </div>\n\n {hasErrors && (\n <div className=\"w-full max-w-sm max-h-40 overflow-y-auto rounded-lg border\">\n <div className=\"divide-y\">\n {result.errors.slice(0, 20).map((err, i) => (\n <div key={i} className=\"flex items-start gap-2 px-3 py-2 text-xs\">\n <span className=\"text-muted-foreground shrink-0 tabular-nums\">\n {t('crud.import.rowNumber', { row: String(err.row) })}\n </span>\n <span className=\"text-destructive\">{err.message}</span>\n </div>\n ))}\n {result.errors.length > 20 && (\n <div className=\"px-3 py-2 text-xs text-muted-foreground text-center\">\n +{result.errors.length - 20} more\n </div>\n )}\n </div>\n </div>\n )}\n\n <Button onClick={onClose}>{t('common.done')}</Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main wizard\n// ---------------------------------------------------------------------------\n\nexport function ImportWizard({ open, onClose, entityDef, onImport }: ImportWizardProps) {\n const t = useTranslation()\n const [step, setStep] = useState<ImportStep>('download')\n const [csv, setCsv] = useState<ParsedCSV | null>(null)\n const [fileName, setFileName] = useState('')\n const [result, setResult] = useState<{ success: number; errors: ImportRowError[] } | null>(null)\n const [progress, setProgress] = useState<{ processed: number; total: number } | null>(null)\n\n const fields = useMemo(() => getImportableFields(entityDef), [entityDef])\n\n const handleClose = () => {\n setStep('download')\n setCsv(null)\n setFileName('')\n setResult(null)\n setProgress(null)\n onClose()\n }\n\n const handleParsed = (parsed: ParsedCSV, name: string) => {\n setCsv(parsed)\n setFileName(name)\n setStep('mapping')\n }\n\n const handleConfirmMapping = useCallback(async (mapping: Map<number, FieldDef>) => {\n if (!csv) return\n setStep('importing')\n setResult(null)\n setProgress(null)\n\n // Transform CSV rows → record objects using mapping\n const rows: Record<string, any>[] = csv.rows.map((row) => {\n const record: Record<string, any> = {}\n for (const [colIdx, field] of mapping) {\n const rawValue = row[colIdx] ?? ''\n record[field.key] = coerceValue(rawValue, field)\n }\n return record\n })\n\n try {\n const res = await onImport(rows, (processed, total) => {\n setProgress({ processed, total })\n })\n setResult(res)\n setStep('done')\n } catch (err: any) {\n setResult({ success: 0, errors: [{ row: 0, message: err?.message ?? 'Import failed' }] })\n setStep('done')\n }\n }, [csv, onImport])\n\n const namePlural = entityDef.namePlural ?? entityDef.name + 's'\n\n return (\n <Modal open={open} onOpenChange={(o) => { if (!o) handleClose() }}>\n <ModalContent size=\"xl\">\n <ModalHeader>\n <ModalTitle>{t('crud.import.title', { entity: namePlural })}</ModalTitle>\n <div className=\"pt-2\">\n <StepIndicator current={step} />\n </div>\n </ModalHeader>\n\n <ModalBody>\n {step === 'download' && (\n <DownloadStep\n entityDef={entityDef}\n fields={fields}\n onNext={() => setStep('upload')}\n />\n )}\n {step === 'upload' && (\n <UploadStep\n onParsed={handleParsed}\n onBack={() => setStep('download')}\n />\n )}\n {step === 'mapping' && csv && (\n <MappingStep\n csv={csv}\n fileName={fileName}\n fields={fields}\n onConfirm={handleConfirmMapping}\n onBack={() => setStep('upload')}\n />\n )}\n {(step === 'importing' || step === 'done') && (\n <ImportingStep\n result={result}\n progress={progress}\n totalRows={csv?.rows.length ?? 0}\n onClose={handleClose}\n />\n )}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n"]}