@fayz-ai/admin 0.30.1 → 0.30.3

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.
Files changed (37) hide show
  1. package/dist/ImportWizard-7UFB2PPF.js +3 -0
  2. package/dist/{ImportWizard-CISHGNQC.js.map → ImportWizard-7UFB2PPF.js.map} +1 -1
  3. package/dist/ScheduleEditor-YE42HL7P.js +7 -0
  4. package/dist/{ScheduleEditor-QC6OYBUE.js.map → ScheduleEditor-YE42HL7P.js.map} +1 -1
  5. package/dist/{chunk-UMRN6427.js → chunk-46UABOOC.js} +12 -37
  6. package/dist/chunk-46UABOOC.js.map +1 -0
  7. package/dist/{chunk-3SREEFHN.js → chunk-XDYY5PLH.js} +24 -3
  8. package/dist/chunk-XDYY5PLH.js.map +1 -0
  9. package/dist/components/plugins/PluginSettingsPanel.d.ts.map +1 -1
  10. package/dist/crud/ImportWizard.d.ts.map +1 -1
  11. package/dist/crud/archetype-lookup.d.ts +4 -0
  12. package/dist/crud/archetype-lookup.d.ts.map +1 -1
  13. package/dist/crud/archetypes/OrderDetailView.d.ts +1 -1
  14. package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
  15. package/dist/crud/archetypes/OrderFormView.d.ts +9 -2
  16. package/dist/crud/archetypes/OrderFormView.d.ts.map +1 -1
  17. package/dist/crud/archetypes/PersonDetailTabs.d.ts +10 -0
  18. package/dist/crud/archetypes/PersonDetailTabs.d.ts.map +1 -1
  19. package/dist/crud/useLookupCreate.d.ts +3 -0
  20. package/dist/crud/useLookupCreate.d.ts.map +1 -1
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +960 -710
  24. package/dist/index.js.map +1 -1
  25. package/dist/onboarding/index.d.ts +2 -0
  26. package/dist/onboarding/index.d.ts.map +1 -1
  27. package/dist/onboarding/usePluginOnboardingGate.d.ts +14 -0
  28. package/dist/onboarding/usePluginOnboardingGate.d.ts.map +1 -0
  29. package/dist/types/plugins.d.ts +2 -0
  30. package/dist/types/plugins.d.ts.map +1 -1
  31. package/dist/units/PersonAvailabilityTab.d.ts +13 -0
  32. package/dist/units/PersonAvailabilityTab.d.ts.map +1 -0
  33. package/package.json +4 -4
  34. package/dist/ImportWizard-CISHGNQC.js +0 -3
  35. package/dist/ScheduleEditor-QC6OYBUE.js +0 -7
  36. package/dist/chunk-3SREEFHN.js.map +0 -1
  37. package/dist/chunk-UMRN6427.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ export { ImportWizard } from './chunk-46UABOOC.js';
2
+ //# sourceMappingURL=ImportWizard-7UFB2PPF.js.map
3
+ //# sourceMappingURL=ImportWizard-7UFB2PPF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ImportWizard-CISHGNQC.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ImportWizard-7UFB2PPF.js"}
@@ -0,0 +1,7 @@
1
+ export { ScheduleEditor } from './chunk-XDYY5PLH.js';
2
+ import './chunk-ZUM3Y7VB.js';
3
+ import './chunk-KSUIF56I.js';
4
+ import './chunk-UQ2NTFQC.js';
5
+ import './chunk-W5IBKM3K.js';
6
+ //# sourceMappingURL=ScheduleEditor-YE42HL7P.js.map
7
+ //# sourceMappingURL=ScheduleEditor-YE42HL7P.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-QC6OYBUE.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ScheduleEditor-YE42HL7P.js"}
@@ -1,6 +1,6 @@
1
- import React, { useState, useMemo, useCallback, useRef } from 'react';
2
- import { Check, FileSpreadsheet, Download, ArrowRight, Upload, AlertCircle, ArrowLeft, ChevronDown, Loader2 } from 'lucide-react';
3
- import { Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, cn, Button } from '@fayz-ai/ui';
1
+ import { useState, useMemo, useCallback, useRef } from 'react';
2
+ import { FileSpreadsheet, Download, ArrowRight, Upload, AlertCircle, ArrowLeft, ChevronDown, Loader2, Check } from 'lucide-react';
3
+ import { Modal, ModalContent, ModalHeader, ModalTitle, WizardSteps, ModalBody, Button, cn } from '@fayz-ai/ui';
4
4
  import { useTranslation } from '@fayz-ai/core';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
@@ -97,37 +97,6 @@ function coerceValue(value, field) {
97
97
  }
98
98
  }
99
99
  var STEPS = ["download", "upload", "mapping", "importing"];
100
- function StepIndicator({ current }) {
101
- const t = useTranslation();
102
- const labels = {
103
- download: t("crud.import.step.download"),
104
- upload: t("crud.import.step.upload"),
105
- mapping: t("crud.import.step.mapping"),
106
- importing: t("crud.import.step.importing"),
107
- done: ""
108
- };
109
- const currentIdx = STEPS.indexOf(current === "done" ? "importing" : current);
110
- return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children: STEPS.map((step, i) => {
111
- const isDone = i < currentIdx || current === "done";
112
- const isActive = step === current;
113
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
114
- i > 0 && /* @__PURE__ */ jsx("div", { className: cn("h-px w-6", isDone ? "bg-primary" : "bg-border") }),
115
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
116
- /* @__PURE__ */ jsx(
117
- "div",
118
- {
119
- className: cn(
120
- "flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium",
121
- isDone ? "bg-primary text-primary-foreground" : isActive ? "border-2 border-primary text-primary" : "border-2 border-muted-foreground/30 text-muted-foreground"
122
- ),
123
- children: isDone ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" }) : i + 1
124
- }
125
- ),
126
- /* @__PURE__ */ jsx("span", { className: cn("text-xs hidden sm:inline", isActive ? "text-foreground font-medium" : "text-muted-foreground"), children: labels[step] })
127
- ] })
128
- ] }, step);
129
- }) });
130
- }
131
100
  function DownloadStep({
132
101
  entityDef,
133
102
  fields,
@@ -459,12 +428,18 @@ function ImportWizard({ open, onClose, entityDef, onImport }) {
459
428
  }
460
429
  }, [csv, onImport]);
461
430
  const namePlural = entityDef.namePlural ?? entityDef.name + "s";
431
+ const wizardSteps = [
432
+ { id: "download", label: t("crud.import.step.download") },
433
+ { id: "upload", label: t("crud.import.step.upload") },
434
+ { id: "mapping", label: t("crud.import.step.mapping") },
435
+ { id: "importing", label: t("crud.import.step.importing") }
436
+ ];
462
437
  return /* @__PURE__ */ jsx(Modal, { open, onOpenChange: (o) => {
463
438
  if (!o) handleClose();
464
439
  }, children: /* @__PURE__ */ jsxs(ModalContent, { size: "xl", children: [
465
440
  /* @__PURE__ */ jsxs(ModalHeader, { children: [
466
441
  /* @__PURE__ */ jsx(ModalTitle, { children: t("crud.import.title", { entity: namePlural }) }),
467
- /* @__PURE__ */ jsx("div", { className: "pt-2", children: /* @__PURE__ */ jsx(StepIndicator, { current: step }) })
442
+ /* @__PURE__ */ jsx("div", { className: "pt-2", children: /* @__PURE__ */ jsx(WizardSteps, { steps: wizardSteps, current: STEPS.indexOf(step === "done" ? "importing" : step) }) })
468
443
  ] }),
469
444
  /* @__PURE__ */ jsxs(ModalBody, { children: [
470
445
  step === "download" && /* @__PURE__ */ jsx(
@@ -506,5 +481,5 @@ function ImportWizard({ open, onClose, entityDef, onImport }) {
506
481
  }
507
482
 
508
483
  export { ImportWizard };
509
- //# sourceMappingURL=chunk-UMRN6427.js.map
510
- //# sourceMappingURL=chunk-UMRN6427.js.map
484
+ //# sourceMappingURL=chunk-46UABOOC.js.map
485
+ //# sourceMappingURL=chunk-46UABOOC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crud/ImportWizard.tsx"],"names":[],"mappings":"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","file":"chunk-46UABOOC.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, WizardSteps,\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\nconst STEPS: ImportStep[] = ['download', 'upload', 'mapping', 'importing']\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 const wizardSteps = [\n { id: 'download', label: t('crud.import.step.download') },\n { id: 'upload', label: t('crud.import.step.upload') },\n { id: 'mapping', label: t('crud.import.step.mapping') },\n { id: 'importing', label: t('crud.import.step.importing') },\n ]\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 <WizardSteps steps={wizardSteps} current={STEPS.indexOf(step === 'done' ? 'importing' : 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"]}
@@ -2,7 +2,7 @@ import { getFayzSupabaseClient } from './chunk-ZUM3Y7VB.js';
2
2
  import { useOrganizationStore } from './chunk-W5IBKM3K.js';
3
3
  import React4, { useState, useCallback, useEffect, useSyncExternalStore, useRef } from 'react';
4
4
  import { toast, Skeleton, Button, TooltipProvider, Badge, DatePicker, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Input, Modal, ModalContent, ModalHeader, ModalTitle, ModalDescription, ModalBody, ModalFooter, Tabs, TabsList, TabsTrigger, TimePicker, Tooltip, TooltipTrigger, TooltipContent, Card, CardContent, TabsContent, Switch } from '@fayz-ai/ui';
5
- import { getSupabaseClientOptional, stableKey, globalCache, useTranslation, todayLocal, localDateKey } from '@fayz-ai/core';
5
+ import { getSupabaseClientOptional, globalCache, stableKey, useTranslation, todayLocal, localDateKey } from '@fayz-ai/core';
6
6
  import { Plus, Copy, Users, CalendarOff, Trash2, Check, CalendarPlus, Clock, Save, Settings, CalendarCheck, X, ChevronDown } from 'lucide-react';
7
7
  import { createPortal } from 'react-dom';
8
8
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -487,6 +487,27 @@ function createArchetypeLookup(config) {
487
487
  if (error) throw new Error(error.message);
488
488
  return toResult(data, display, config.kindLabels, kinds);
489
489
  },
490
+ async load(id) {
491
+ const supabase = getSupabaseClientOptional();
492
+ if (!supabase) return null;
493
+ const { data } = await supabase.from(display.table).select("*").eq("id", id).maybeSingle();
494
+ return data ?? null;
495
+ },
496
+ // Only the form's own fields are written: the row carries columns (tenant,
497
+ // flags, timestamps) the form never showed and must not overwrite.
498
+ async update(id, patch) {
499
+ const supabase = getSupabaseClientOptional();
500
+ if (!supabase) throw new Error("No database connection");
501
+ const editable = new Set((entityDef?.fields ?? []).map((f) => f.key));
502
+ const row = Object.fromEntries(
503
+ Object.entries(patch).filter(([k]) => editable.has(k)).map(([k, v]) => [k, v === "" ? null : v])
504
+ );
505
+ if (patch.name !== void 0 && !(display.labelField in row)) row[display.labelField] = patch.name;
506
+ const { data, error } = await supabase.from(display.table).update(row).eq("id", id).select("*").single();
507
+ if (error) throw new Error(error.message);
508
+ globalCache.invalidate(`lookup:list:${display.table}`);
509
+ return toResult(data, display, config.kindLabels, kinds);
510
+ },
490
511
  async getById(id) {
491
512
  const supabase = getSupabaseClientOptional();
492
513
  if (!supabase) return null;
@@ -1681,5 +1702,5 @@ function ScheduleEditor({ assigneeId, onSaved, hideBookable }) {
1681
1702
  }
1682
1703
 
1683
1704
  export { ScheduleDateExceptions, ScheduleEditor, ScheduleGridPanel, createArchetypeLookup, deleteSchedule, getPersonBookable, getPersonLookup, getScheduleBlockConfig, getSchedules, mergeBlockSettings, parseBlockSettings, registerPersonLookup, replaceWeeklySchedules, saveSchedule, setPersonBookable, setScheduleBlockConfig, subscribeScheduleBlockConfig };
1684
- //# sourceMappingURL=chunk-3SREEFHN.js.map
1685
- //# sourceMappingURL=chunk-3SREEFHN.js.map
1705
+ //# sourceMappingURL=chunk-XDYY5PLH.js.map
1706
+ //# sourceMappingURL=chunk-XDYY5PLH.js.map