@fayz-ai/plugin-forms 0.15.13 → 0.15.15
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.
- package/dist/CustomFormsSettingsTab-EI4WKOYR.js +314 -0
- package/dist/CustomFormsSettingsTab-EI4WKOYR.js.map +1 -0
- package/dist/{FormBuilder-Q2Q42HAT.js → FormBuilder-7UXCXUOF.js} +7 -3
- package/dist/FormBuilder-7UXCXUOF.js.map +1 -0
- package/dist/PersonAnswerAlerts-MDBBY63K.js +98 -0
- package/dist/PersonAnswerAlerts-MDBBY63K.js.map +1 -0
- package/dist/PersonDocumentsWidget-RGN4UHS3.js +977 -0
- package/dist/PersonDocumentsWidget-RGN4UHS3.js.map +1 -0
- package/dist/chunk-5WW6FTNG.js +113 -0
- package/dist/chunk-5WW6FTNG.js.map +1 -0
- package/dist/chunk-66C3L4RE.js +17 -0
- package/dist/chunk-66C3L4RE.js.map +1 -0
- package/dist/chunk-BFXJLPKA.js +55 -0
- package/dist/chunk-BFXJLPKA.js.map +1 -0
- package/dist/chunk-RB7UYZLA.js +824 -0
- package/dist/chunk-RB7UYZLA.js.map +1 -0
- package/dist/chunk-X6CU44B4.js +223 -0
- package/dist/chunk-X6CU44B4.js.map +1 -0
- package/dist/chunk-YOFFKQD4.js +584 -0
- package/dist/chunk-YOFFKQD4.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -1507
- package/dist/index.js.map +1 -1
- package/dist/views/CustomFormsSettingsTab.d.ts.map +1 -1
- package/package.json +5 -5
- package/dist/FormBuilder-Q2Q42HAT.js.map +0 -1
- package/dist/chunk-JRR7A5HN.js +0 -1678
- package/dist/chunk-JRR7A5HN.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/components/FormFillDialog.tsx","../src/components/PersonFormsAlert.tsx","../src/components/formsZoneWidgets.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/views/TemplateListView.tsx","../src/views/CustomFormsSettingsTab.tsx","../src/components/DocumentPreview.tsx","../src/lib/categories.ts","../src/components/DocumentList.tsx","../src/components/DocumentSkeleton.tsx","../src/components/DocumentFormDialog.tsx","../src/components/FormViewer.tsx","../src/lib/document-types.ts","../src/components/AddDocumentDropdown.tsx","../src/components/PersonDocumentsWidget.tsx","../src/components/PersonAnswerAlerts.tsx","../src/lib/timeline-source.ts","../src/lib/tab-counts.ts","../src/analytics/cards.ts","../src/lib/contract-render.ts","../src/lib/attendance-contracts.ts","../src/components/ContractSignPane.tsx","../src/settings/v1-settings.ts","../src/index.ts"],"names":["React","jsxs","jsx","Button","createSafeFormsProvider","tenantId","categoryLabel","Fragment","useState","useCallback","useEffect","useTranslation","ClipboardList","FileText","tl","useMemo","Archive","ArrowLeft","Badge","Pencil","useRef","Plus","Search","Input","useLimitGuard","invalidateLimit","ImageIcon","Paperclip","ChevronDown","db","getSupabaseClientOptional","getActiveTenantId","error","Camera","describeError","Printer","FileTextIcon","createFormsStore","PersonDocumentsWidget"],"mappings":"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","file":"index.js","sourcesContent":["import type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\n\nexport interface CustomFormsPluginOptions {\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: FormsDataProvider\n navSection?: 'main' | 'secondary' | 'settings'\n navPosition?: number\n labels?: Partial<CustomFormsLabels>\n /** App-owned registries shown inside Forms & Documents settings. */\n settingsRegistries?: PluginRegistryDef[]\n /**\n * Pass `false` to leave form submissions out of /analytics. Contributed by\n * default — a filled form has no other place in the product where it can be\n * read in bulk.\n */\n analyticsCards?: false\n}\n\nexport interface CustomFormsLabels {\n pageTitle: string\n settingsLabel: string\n settingsSubtitle: string\n templates: string\n documents: string\n newTemplate: string\n addDocument: string\n}\n\nexport interface CustomFormsConfig {\n labels: CustomFormsLabels\n}\n\n// A function, not a constant: `tl` reads the locale at call time.\nconst defaultLabels = (): CustomFormsLabels => ({\n pageTitle: tl('Forms', 'Formulários'),\n settingsLabel: tl('Forms', 'Formulários'),\n settingsSubtitle: tl('Create and manage custom forms for your business', 'Crie e organize os formulários da sua empresa'),\n templates: tl('Templates', 'Modelos'),\n documents: tl('Documents', 'Documentos'),\n newTemplate: tl('New Template', 'Novo modelo'),\n addDocument: tl('Add Document', 'Adicionar documento'),\n})\n\nexport function resolveConfig(options?: CustomFormsPluginOptions): CustomFormsConfig {\n return {\n labels: { ...defaultLabels(), ...options?.labels },\n }\n}\n","import React from 'react'\nimport { Button, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from '@fayz-ai/ui'\nimport { describeError } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormTemplate, RecommendationLine } from '@fayz-ai/forms/domain/template'\nimport { createFormsStore, createSafeFormsProvider } from '@fayz-ai/forms/store'\nimport type { FormFillResult, FormFillSlotProps } from '@fayz-ai/forms/views/zones'\nimport { CustomFormsProvider } from '../context'\nimport { resolveConfig } from '../config'\nimport { FormRenderer, isFieldEmpty } from './FormRenderer'\n\nexport type { FormFillResult }\n\nexport interface FormFillDialogProps extends FormFillSlotProps {\n /** Defaults to Supabase, else the in-memory mock; the plugin passes its own. */\n provider?: FormsDataProvider\n}\n\n/** All `recommendation` lines in an answer, one line per service (quantities of repeats add up). */\nexport function recommendationsOf(template: FormTemplate, data: Record<string, unknown>): RecommendationLine[] {\n const by = new Map<string, RecommendationLine>()\n for (const f of template.schema.fields) {\n if (f.type !== 'recommendation' || !Array.isArray(data[f.id])) continue\n for (const l of data[f.id] as RecommendationLine[]) {\n const cur = by.get(l.serviceId)\n by.set(l.serviceId, cur ? { ...cur, quantity: cur.quantity + l.quantity } : { ...l })\n }\n }\n return [...by.values()]\n}\n\n/** Fills one form for a person outside the forms page, with its own store. */\nexport function FormFillDialog({\n templateId, personId, personName, onSaved, onClose, frame = 'modal',\n subject, productId, professionalId, recommendationShortcuts, provider: given,\n}: FormFillDialogProps) {\n const provider = React.useMemo(() => given ?? createSafeFormsProvider(), [given])\n const store = React.useMemo(() => createFormsStore(provider), [provider])\n const config = React.useMemo(() => resolveConfig(), [])\n const [template, setTemplate] = React.useState<FormTemplate | null>(null)\n const [erro, setErro] = React.useState<string | null>(null)\n const [data, setData] = React.useState<Record<string, unknown>>({})\n const [salvando, setSalvando] = React.useState(false)\n const [missing, setMissing] = React.useState<Set<string>>(new Set())\n\n // A field leaves the outline as soon as it gets a value.\n React.useEffect(() => {\n if (!template || missing.size === 0) return\n const still = new Set([...missing].filter((id) => {\n const f = template.schema.fields.find((x) => x.id === id)\n return f ? isFieldEmpty(f, data[id]) : false\n }))\n if (still.size !== missing.size) setMissing(still)\n if (still.size === 0) setErro(null)\n }, [data, template, missing])\n\n async function salvar() {\n if (!template) return\n const faltando = template.schema.fields.filter((f) => f.required && isFieldEmpty(f, data[f.id]))\n if (faltando.length) {\n setMissing(new Set(faltando.map((f) => f.id)))\n const primeiro = [...faltando].sort((a, b) => a.row - b.row || a.col - b.col)[0]\n // After the error banner renders: scrolling first and then growing the form above lands short.\n requestAnimationFrame(() => document.getElementById(`ff-field-${primeiro.id}`)?.scrollIntoView({ block: 'center' }))\n setErro(faltando.length === 1\n ? `Preencha o campo obrigatório destacado: ${faltando[0].label}`\n : `Preencha os ${faltando.length} campos obrigatórios destacados.`)\n return\n }\n setErro(null)\n setSalvando(true)\n try {\n const doc = await store.getState().createDocument({\n templateId: template.id,\n personId,\n title: personName ? `${template.name} — ${personName}` : template.name,\n data,\n status: 'completed',\n subjectType: subject?.type,\n subjectId: subject?.id,\n productId: productId ?? undefined,\n professionalId: professionalId ?? undefined,\n })\n await onSaved?.({ documentId: doc.id, template, data, recommendations: recommendationsOf(template, data) })\n onClose()\n } catch (e) {\n setErro(describeError(e, 'Não foi possível salvar o formulário.'))\n } finally { setSalvando(false) }\n }\n\n React.useEffect(() => {\n let vivo = true\n ;(async () => {\n try {\n const t = await store.getState().fetchTemplateById(templateId)\n if (vivo) setTemplate(t)\n } catch (e) {\n if (vivo) setErro(describeError(e, 'Não foi possível abrir o formulário.'))\n }\n })()\n return () => { vivo = false }\n }, [templateId, store])\n\n const corpo = (\n <>\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {erro && (\n <p role=\"alert\" className=\"mb-3 rounded-lg bg-destructive/10 px-3 py-2 text-xs text-destructive\">{erro}</p>\n )}\n {!template ? (erro ? null : (\n /* Esqueleto com a FORMA do formulário: três campos e um rótulo. */\n <div className=\"space-y-4\" aria-busy=\"true\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3 w-24 animate-pulse rounded bg-muted/70\" />\n <div className=\"h-9 w-full animate-pulse rounded-lg bg-muted\" />\n </div>\n ))}\n </div>\n )) : (\n <CustomFormsProvider value={{ config, provider, store }}>\n <FormRenderer schema={template.schema} data={data} onChange={setData} missing={missing}\n recommendationShortcuts={recommendationShortcuts} />\n </CustomFormsProvider>\n )}\n </div>\n\n <div className=\"border-t fayz-glass-divider px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onClose}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={salvar}\n disabled={!template || salvando}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\"\n >\n {salvando ? 'Salvando…' : 'Concluir'}\n </Button>\n </div>\n </div>\n </>\n )\n\n if (frame === 'inline') return corpo\n\n return (\n <Modal open onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"2xl\" noPadding className=\"gap-0\">\n <ModalHeader className=\"border-b px-5 py-3.5\">\n <ModalTitle className=\"truncate text-base\">\n {template?.name ?? 'Formulário'}\n </ModalTitle>\n </ModalHeader>\n <ModalBody className=\"p-0\">\n {corpo}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n","import React from 'react'\nimport { ClipboardList, Clock, CheckCircle2, Circle, QrCode } from 'lucide-react'\nimport { Button, Skeleton, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\nimport { useActiveTenantId } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport { isOutstanding, shownInChecklist, type PersonFormRequirement } from '@fayz-ai/forms/domain/requirement'\nimport { createSafeFormsProvider } from '@fayz-ai/forms/store'\nimport type { PersonChecklistItem, PersonChecklistSlotProps } from '@fayz-ai/forms/views/zones'\n\nexport type { PersonChecklistItem }\n\nconst DATE = (iso: string) => new Date(iso + 'T00:00:00').toLocaleDateString('pt-BR')\n\nexport interface PersonFormsAlertProps extends PersonChecklistSlotProps {\n /** Defaults to Supabase, else the in-memory mock; the plugin passes its own. */\n provider?: FormsDataProvider\n}\n\nfunction Linha({ item }: { item: PersonChecklistItem }) {\n const Icone = item.state === 'done' ? CheckCircle2 : item.state === 'late' ? Clock : Circle\n const cor = item.state === 'done' ? 'text-success' : item.state === 'late' ? 'text-warning' : 'text-muted-foreground'\n return (\n <li className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 px-3 py-1.5 text-xs\">\n <Icone className={`h-3.5 w-3.5 shrink-0 ${cor}`} aria-hidden />\n <span className={item.state === 'done' ? 'text-foreground' : 'font-medium text-foreground'}>{item.label}</span>\n {item.detail && <span className=\"text-muted-foreground\">— {item.detail}</span>}\n {item.action && (\n // O VERBO NÃO PODE PARECER DESLIGADO. Em `text-primary` sobre o âmbar\n // da faixa ele saía lavado e, quando quebrava a linha, parecia um\n // rótulo cinza no canto — a recepção lia \"pendente\" e não via que\n // havia o que clicar.\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={item.action.onClick}\n className=\"ml-auto shrink-0 rounded-button bg-foreground px-2 py-0.5 text-[11px] font-semibold text-background hover:opacity-90\"\n >\n {item.action.label}\n </Button>\n )}\n </li>\n )\n}\n\nexport function PersonFormsAlert({ personId, onFill, version = 0, extras, onPending, sendLink, className, provider: given }: PersonFormsAlertProps) {\n const provider = React.useMemo(() => given ?? createSafeFormsProvider(), [given])\n const tenantId = useActiveTenantId()\n const [rows, setRows] = React.useState<PersonFormRequirement[] | null>(null)\n\n React.useEffect(() => {\n if (!personId || !tenantId) { setRows([]); return }\n let cancelled = false\n setRows(null)\n provider.getPersonRequirements(personId)\n .then((r) => { if (!cancelled) setRows(r) })\n // Falhar em silêncio: um aviso que não carregou não vira um erro em cima\n // de quem só queria marcar um horário.\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [personId, tenantId, version, provider])\n\n // A CHECAGEM DO PACIENTE, numa lista só.\n //\n // Eram duas faixas diferentes — verde quando tudo em dia, âmbar quando\n // faltava —, e elas não somavam: com dois formulários, um em dia e um\n // vencido, só o vencido aparecia. Como CHECKLIST as duas coisas convivem, e\n // a lista abre espaço para o que vier depois (tarefas, avisos a dar ao\n // paciente) sem inventar uma terceira faixa.\n const itens: PersonChecklistItem[] = React.useMemo(() => [\n ...(rows ?? []).filter(shownInChecklist).map((r): PersonChecklistItem => {\n const pendente = isOutstanding(r)\n return {\n id: r.templateId,\n label: r.templateName,\n state: !pendente ? 'done' : r.state === 'expired' ? 'late' : 'todo',\n detail: !pendente\n ? (r.validUntil ? `em dia, válido até ${DATE(r.validUntil)}` : 'em dia')\n : r.state === 'expired' && r.validUntil ? `venceu em ${DATE(r.validUntil)}` : 'nunca preenchido',\n action: pendente && onFill\n ? { label: 'Preencher agora', onClick: () => onFill(r.templateId) }\n : undefined,\n }\n }),\n ...(extras ?? []),\n ], [rows, extras, onFill])\n\n // O QUE FALTA VEM PRIMEIRO. A lista existe para ser resolvida de cima para\n // baixo; o que já está em dia é confirmação, não tarefa.\n const peso = (i: PersonChecklistItem) => (i.state === 'late' ? 0 : i.state === 'todo' ? 1 : 2)\n itens.sort((a, b) => peso(a) - peso(b))\n\n const pendentes = itens.filter((i) => i.state !== 'done')\n const faltando = pendentes.length\n const chave = pendentes.map((i) => i.label).join('|')\n\n // TODO HOOK ANTES DE QUALQUER RETURN. Este efeito estava depois dos returns\n // de carregando/vazio: na primeira pintura a lista ainda não existia, o\n // componente saía antes, e o React contava menos hooks do que na pintura\n // seguinte — a tela inteira do check-in caía com \"algo deu errado\".\n React.useEffect(() => {\n onPending?.(chave ? chave.split('|') : [])\n }, [chave])\n\n if (rows === null) return <Skeleton className={`h-12 w-full ${className ?? ''}`} />\n if (itens.length === 0) return null\n\n return (\n <div className={`overflow-hidden rounded-lg border ${faltando ? 'border-warning/40 bg-warning/5' : 'border-success/30 bg-success/5'} ${className ?? ''}`}>\n <div className=\"flex items-center gap-2 border-b border-inherit px-3 py-1.5 text-[11px] font-medium text-foreground\">\n <ClipboardList className={`h-3.5 w-3.5 ${faltando ? 'text-warning' : 'text-success'}`} aria-hidden />\n {faltando === 0\n ? 'Checagem do paciente — tudo em dia'\n : faltando === 1 ? '1 item pendente com o paciente' : `${faltando} itens pendentes com o paciente`}\n {sendLink && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n {/* aria-disabled, not disabled: a disabled button gets no hover, so the \"em breve\" would never show. */}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Enviar link ao paciente pelo WhatsApp\"\n aria-disabled={sendLink === 'soon'}\n onClick={sendLink === 'soon' ? undefined : sendLink}\n className={`font-normal ${`ml-auto inline-flex h-6 w-6 items-center justify-center rounded-md transition-colors ${\n sendLink === 'soon' ? 'cursor-not-allowed text-muted-foreground/60' : 'text-foreground hover:bg-muted'\n }`}`}\n >\n <QrCode className=\"h-3.5 w-3.5\" aria-hidden />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"left\">\n {sendLink === 'soon' ? 'Enviar pelo WhatsApp (QR Code) — em breve' : 'Enviar pelo WhatsApp (QR Code)'}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n <ul className=\"divide-y divide-border/60\">\n {itens.map((i) => <Linha key={i.id} item={i} />)}\n </ul>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginWidgetDefinition } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport { FORMS_ZONES, type FormFillSlotProps, type PersonChecklistSlotProps } from '@fayz-ai/forms/views/zones'\nimport { FormFillDialog } from './FormFillDialog'\nimport { PersonFormsAlert } from './PersonFormsAlert'\n\n/** The forms screens other plugins open in place, bound to this plugin's provider. */\nexport function formsZoneWidgets(provider: FormsDataProvider): PluginWidgetDefinition[] {\n const PersonChecklist = (props: PersonChecklistSlotProps) => React.createElement(PersonFormsAlert, { ...props, provider })\n const FormFill = (props: FormFillSlotProps) => React.createElement(FormFillDialog, { ...props, provider })\n return [\n {\n id: 'forms-person-checklist',\n zone: FORMS_ZONES.personChecklist,\n component: PersonChecklist as React.ComponentType<unknown>,\n },\n {\n id: 'forms-form-fill',\n zone: FORMS_ZONES.formFill,\n component: FormFill as React.ComponentType<unknown>,\n },\n ]\n}\n","export const en: Record<string, string> = {\n // Settings\n 'customForms.settingsTitle': 'Forms & Documents',\n 'customForms.settingsSubtitle': 'Create and manage custom forms for your business',\n\n // Templates\n 'customForms.templates': 'Templates',\n 'customForms.newWithAIHint': 'Describe the form and I build the fields.',\n 'customForms.newByHand': 'Create by hand',\n 'customForms.newByHandHint': 'Build it field by field in the builder.',\n 'customForms.askPlaceholder': 'Describe the form…',\n 'customForms.askPersona': 'Form builder',\n 'customForms.askPitch': 'Tell me the form you need.',\n 'customForms.askDescription': 'Describe what it is for and I propose the fields, their types and options in one go. You check and adjust before saving.',\n 'customForms.askSuggestion.0': 'A full intake form',\n 'customForms.askSuggestion.1': 'Consent form for an aesthetic procedure',\n 'customForms.askSuggestion.2': 'Session progress note',\n 'customForms.newTemplate': 'New Template',\n 'customForms.editTemplate': 'Edit Template',\n 'customForms.templateName': 'Form name',\n 'customForms.templateDescription': 'Description',\n 'customForms.templateCategory': 'Category',\n 'customForms.templateSpecialty': 'Specialty',\n 'customForms.noTemplates': 'No form templates yet',\n 'customForms.noTemplatesDescription': 'Create your first custom form to start collecting structured data.',\n 'customForms.deleteTemplateConfirm': 'Delete this form template? Existing documents will be preserved.',\n 'customForms.archiveTemplateConfirm': 'Archive this form template? It leaves the list and the document picker, but is kept and existing documents are preserved.',\n\n // Categories\n 'customForms.category.anamnesis': 'Anamnesis',\n 'customForms.category.evaluation': 'Evaluation',\n 'customForms.category.photos': 'Photos',\n 'customForms.category.evolution': 'Evolution Note',\n 'customForms.category.report': 'Report',\n 'customForms.category.contract': 'Contract',\n 'customForms.category.general': 'General',\n\n // Builder\n 'customForms.builder.fields': 'Fields',\n 'customForms.builder.fieldCount': '{{count}} fields',\n 'customForms.builder.settings': 'Settings',\n 'customForms.builder.save': 'Save',\n 'customForms.builder.saving': 'Saving...',\n 'customForms.builder.saved': 'Form saved',\n 'customForms.builder.emptyCanvas': 'Drag fields from the left panel to start building your form',\n 'customForms.builder.fieldLabel': 'Field label',\n 'customForms.builder.fieldPlaceholder': 'Placeholder',\n 'customForms.builder.fieldRequired': 'Required',\n 'customForms.builder.fieldOptions': 'Options',\n 'customForms.builder.addOption': 'Add option',\n 'customForms.builder.colSpan': 'Column span',\n 'customForms.builder.deleteField': 'Remove field',\n 'customForms.builder.mapToPerson': 'Auto-fill from record',\n 'customForms.builder.mapNone': \"Don't auto-fill\",\n 'customForms.builder.mapHint': \"When creating the document from a person's profile, this field is pre-filled with the chosen value (still editable).\",\n 'customForms.preview.editor': 'Editor',\n 'customForms.preview.print': 'Print',\n\n // Person field mappings (auto-fill)\n 'customForms.personField.name': 'Name',\n 'customForms.personField.documentNumber': 'ID / Document',\n 'customForms.personField.email': 'Email',\n 'customForms.personField.phone': 'Phone',\n 'customForms.personField.dateOfBirth': 'Date of Birth',\n 'customForms.personField.guardianName': 'Guardian',\n 'customForms.personField.address': 'Address',\n 'customForms.personField.city': 'City',\n 'customForms.personField.state': 'State',\n\n // Field types\n 'customForms.fieldType.title': 'Title',\n 'customForms.fieldType.text': 'Simple Text',\n 'customForms.fieldType.memo': 'Memo',\n 'customForms.fieldType.richtext': 'Rich Text',\n 'customForms.fieldType.date': 'Date',\n 'customForms.fieldType.select': 'Select',\n 'customForms.fieldType.radio': 'Radio',\n 'customForms.fieldType.tags': 'Tags',\n 'customForms.fieldType.checkbox': 'Checkbox',\n 'customForms.fieldType.image': 'Image / Drawing',\n 'customForms.fieldType.gallery': 'Gallery',\n 'customForms.fieldType.budget': 'Budget',\n 'customForms.fieldType.yes_no': 'Yes or No',\n 'customForms.fieldType.yes_no_text': 'Yes or No + Text',\n 'customForms.fieldType.stencil_photo': 'Photo with stencil',\n 'customForms.fieldType.recommendation': 'Recommendations',\n 'customForms.fieldType.signature': 'Signature (drawn on screen)',\n\n // Documents\n 'customForms.documents': 'Documents',\n 'customForms.addDocument': 'Add Document',\n 'customForms.selectTemplate': 'Select a form',\n 'customForms.searchDocumentTypes': 'Search forms or files...',\n 'customForms.noResults': 'No results',\n 'customForms.noDocuments': 'No documents yet',\n 'customForms.noDocumentsDescription': 'Add a document to start recording information.',\n 'customForms.bucket.all': 'All',\n 'customForms.bucket.file': 'Files',\n 'customForms.noDocumentsInFilter': 'Nothing of this kind on this record.',\n 'customForms.documentFallbackTitle': 'Document',\n 'customForms.recordsTitle': 'Records',\n 'customForms.filesTitle': 'Files',\n 'customForms.addRecord': 'New',\n 'customForms.addFile': 'Upload',\n 'customForms.view': 'View',\n 'customForms.showContent': 'Show content',\n 'customForms.hideContent': 'Hide content',\n 'customForms.previewEmpty': 'This record has no filled field.',\n 'customForms.previewMore': 'See the other {{count}} fields',\n 'customForms.loadMore': 'Load {{count}} more',\n 'customForms.loadingMore': 'Loading…',\n 'customForms.noRecords': 'No records yet',\n 'customForms.noRecordsDescription': 'Anamnesis, evolution, report or contract — start with \"New\".',\n 'customForms.noFiles': 'No files yet',\n 'customForms.noFilesDescription': 'Keep photos, exams and scanned documents here.',\n 'customForms.dragFilesHere': 'Drag files here',\n 'customForms.dropFilesHere': 'Drop the files here',\n 'customForms.documentTitle': 'Document title',\n 'customForms.saveAsDraft': 'Save as Draft',\n 'customForms.saveAndComplete': 'Save & Complete',\n 'customForms.deleteDocumentConfirm': 'Delete this document?',\n 'customForms.archive': 'Archive',\n 'customForms.archiveTitle': 'Archive record',\n 'customForms.archiveDescription': '{{name}} leaves this record\\'s list but stays stored — archiving does not delete.',\n 'customForms.archiveDocumentConfirm': 'Archive this document? It leaves the active list but is kept on file.',\n 'customForms.printPdf': 'Print / PDF',\n 'customForms.usageCount': '{{count}} filled in',\n 'customForms.usageLast': 'last on {{date}}',\n\n // Template list columns\n 'customForms.template': 'Template',\n 'customForms.categoryColumn': 'Category',\n 'customForms.usageColumn': 'Usage',\n\n // Registry\n 'registry.form-categories': 'Categories',\n 'registry.form-categories.description': 'Categories for organizing form templates',\n\n // Status\n 'customForms.status.draft': 'Draft',\n 'customForms.status.completed': 'Completed',\n 'customForms.status.signed': 'Signed',\n 'customForms.status.archived': 'Archived',\n}\n","export const ptBR: Record<string, string> = {\n // Settings\n 'customForms.settingsTitle': 'Formulários e Documentos',\n 'customForms.settingsSubtitle': 'Crie e gerencie formulários personalizados para o seu negócio',\n\n // Templates\n 'customForms.templates': 'Modelos',\n 'customForms.newWithAIHint': 'Descreva o formulário e eu monto os campos.',\n 'customForms.newByHand': 'Criar manualmente',\n 'customForms.newByHandHint': 'Montar campo a campo no construtor.',\n 'customForms.askPlaceholder': 'Descreva o formulário…',\n 'customForms.askPersona': 'Montador de formulários',\n 'customForms.askPitch': 'Diga o formulário que você precisa.',\n 'customForms.askDescription': 'Descreva para que serve e eu proponho os campos, os tipos e as opções de uma vez. Você confere e ajusta antes de salvar.',\n 'customForms.askSuggestion.0': 'Uma ficha de anamnese completa',\n 'customForms.askSuggestion.1': 'Termo de consentimento para procedimento estético',\n 'customForms.askSuggestion.2': 'Ficha de evolução de atendimento',\n 'customForms.newTemplate': 'Novo Modelo',\n 'customForms.editTemplate': 'Editar Modelo',\n 'customForms.templateName': 'Nome do formulário',\n 'customForms.templateDescription': 'Descrição',\n 'customForms.templateCategory': 'Categoria',\n 'customForms.templateSpecialty': 'Especialidade',\n 'customForms.noTemplates': 'Nenhum modelo criado',\n 'customForms.noTemplatesDescription': 'Crie seu primeiro formulário personalizado para começar a coletar dados estruturados.',\n 'customForms.deleteTemplateConfirm': 'Excluir este modelo de formulário? Documentos existentes serão preservados.',\n 'customForms.archiveTemplateConfirm': 'Arquivar este modelo? Ele sai da lista e do seletor de documentos, mas fica guardado e os documentos existentes são preservados.',\n\n // Categories\n 'customForms.category.anamnesis': 'Anamnese',\n 'customForms.category.evaluation': 'Avaliação',\n 'customForms.category.photos': 'Fotos',\n 'customForms.category.evolution': 'Evolução',\n 'customForms.category.report': 'Laudo',\n 'customForms.category.contract': 'Contrato',\n 'customForms.category.general': 'Geral',\n\n // Builder\n 'customForms.builder.fields': 'Campos',\n 'customForms.builder.fieldCount': '{{count}} campos',\n 'customForms.builder.settings': 'Configurações',\n 'customForms.builder.save': 'Salvar',\n 'customForms.builder.saving': 'Salvando...',\n 'customForms.builder.saved': 'Formulário salvo',\n 'customForms.builder.emptyCanvas': 'Arraste os campos do painel esquerdo para começar a montar seu formulário',\n 'customForms.builder.fieldLabel': 'Rótulo do campo',\n 'customForms.builder.fieldPlaceholder': 'Placeholder',\n 'customForms.builder.fieldRequired': 'Obrigatório',\n 'customForms.builder.fieldOptions': 'Opções',\n 'customForms.builder.addOption': 'Adicionar opção',\n 'customForms.builder.colSpan': 'Largura em colunas',\n 'customForms.builder.deleteField': 'Remover campo',\n 'customForms.builder.mapToPerson': 'Preencher com dado da ficha',\n 'customForms.builder.mapNone': 'Não preencher',\n 'customForms.builder.mapHint': 'Ao criar o documento na ficha da pessoa, este campo já vem preenchido com o dado escolhido (editável).',\n 'customForms.preview.editor': 'Editor',\n 'customForms.preview.print': 'Impressão',\n\n // Person field mappings (auto-fill)\n 'customForms.personField.name': 'Nome',\n 'customForms.personField.documentNumber': 'CPF / Documento',\n 'customForms.personField.email': 'E-mail',\n 'customForms.personField.phone': 'Telefone',\n 'customForms.personField.dateOfBirth': 'Data de Nascimento',\n 'customForms.personField.guardianName': 'Responsável',\n 'customForms.personField.address': 'Endereço',\n 'customForms.personField.city': 'Cidade',\n 'customForms.personField.state': 'Estado',\n\n // Field types\n 'customForms.fieldType.title': 'Título',\n 'customForms.fieldType.text': 'Texto Simples',\n 'customForms.fieldType.memo': 'Memorando',\n 'customForms.fieldType.richtext': 'Texto Rico',\n 'customForms.fieldType.date': 'Data',\n 'customForms.fieldType.select': 'Seleção',\n 'customForms.fieldType.radio': 'Radio',\n 'customForms.fieldType.tags': 'Tags',\n 'customForms.fieldType.checkbox': 'Checkbox',\n 'customForms.fieldType.image': 'Imagem / Desenho',\n 'customForms.fieldType.gallery': 'Galeria',\n 'customForms.fieldType.budget': 'Orçamento',\n 'customForms.fieldType.yes_no': 'Sim ou Não',\n 'customForms.fieldType.yes_no_text': 'Sim ou Não + Texto',\n 'customForms.fieldType.stencil_photo': 'Foto com Gabarito',\n 'customForms.fieldType.recommendation': 'Indicações',\n 'customForms.fieldType.signature': 'Assinatura (escrita em tela)',\n\n // Documents\n 'customForms.documents': 'Documentos',\n 'customForms.addDocument': 'Novo Documento',\n 'customForms.selectTemplate': 'Selecione um formulário',\n 'customForms.searchDocumentTypes': 'Buscar formulário ou arquivo...',\n 'customForms.noResults': 'Nenhum resultado',\n 'customForms.noDocuments': 'Nenhum documento',\n 'customForms.noDocumentsDescription': 'Adicione um documento para começar a registrar informações.',\n // Pastilhas do prontuário — o balde \"file\" é o que não tem modelo (foto, anexo).\n 'customForms.bucket.all': 'Tudo',\n 'customForms.bucket.file': 'Arquivos',\n 'customForms.noDocumentsInFilter': 'Nada deste tipo nesta ficha.',\n 'customForms.documentFallbackTitle': 'Documento',\n // Prontuário × Arquivos — as duas superfícies do mesmo widget.\n 'customForms.recordsTitle': 'Registros',\n 'customForms.filesTitle': 'Arquivos',\n 'customForms.addRecord': 'Novo',\n 'customForms.addFile': 'Enviar',\n 'customForms.view': 'Ver',\n // Olhinho, prévia e paginação da linha do tempo de registros.\n 'customForms.showContent': 'Mostrar conteúdo',\n 'customForms.hideContent': 'Ocultar conteúdo',\n 'customForms.previewEmpty': 'Registro sem nenhum campo preenchido.',\n 'customForms.previewMore': 'Ver os outros {{count}} campos',\n 'customForms.loadMore': 'Carregar mais {{count}}',\n 'customForms.loadingMore': 'Carregando…',\n 'customForms.noRecords': 'Nenhum registro',\n 'customForms.noRecordsDescription': 'Anamnese, evolução, laudo ou contrato — comece em \"Novo\".',\n 'customForms.noFiles': 'Nenhum arquivo',\n 'customForms.noFilesDescription': 'Guarde aqui foto, exame, documento digitalizado.',\n 'customForms.dragFilesHere': 'Arraste arquivos para cá',\n 'customForms.dropFilesHere': 'Solte os arquivos aqui',\n 'customForms.documentTitle': 'Título do documento',\n 'customForms.saveAsDraft': 'Salvar Rascunho',\n 'customForms.saveAndComplete': 'Salvar e Finalizar',\n 'customForms.deleteDocumentConfirm': 'Excluir este documento?',\n 'customForms.archive': 'Arquivar',\n 'customForms.archiveDocumentConfirm': 'Arquivar este documento? Ele sai da lista ativa mas fica guardado.',\n // O diálogo diz DE QUAL registro se trata: \"Tem certeza?\" sozinho é a\n // pergunta que ninguém consegue responder.\n 'customForms.archiveTitle': 'Arquivar registro',\n 'customForms.archiveDescription': '{{name}} sai da lista desta ficha, mas continua guardado — arquivar não apaga.',\n 'customForms.printPdf': 'Imprimir / PDF',\n 'customForms.usageCount': '{{count}} preenchidos',\n 'customForms.usageLast': 'último em {{date}}',\n\n // Colunas da lista de modelos\n 'customForms.template': 'Modelo',\n 'customForms.categoryColumn': 'Categoria',\n 'customForms.usageColumn': 'Uso',\n\n // Registry\n 'registry.form-categories': 'Categorias',\n 'registry.form-categories.description': 'Categorias para organizar modelos de formulários',\n\n // Status\n 'customForms.status.draft': 'Rascunho',\n 'customForms.status.completed': 'Finalizado',\n 'customForms.status.signed': 'Assinado',\n 'customForms.status.archived': 'Arquivado',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const customFormsLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import React, { useEffect, useState, useCallback, useMemo } from 'react'\nimport { getActiveTenantId, useDataVersion } from '@fayz-ai/core'\nimport { FORM_TEMPLATE_EVENT } from '@fayz-ai/forms/store'\nimport { Plus, Pencil, Archive, FileText, Search, WandSparkles } from 'lucide-react'\nimport { Button, Card, Input, Badge, DataTable, PageHeaderActions, RowActions, type DataTableProps, Switch } from '@fayz-ai/ui'\nimport { PageActions, askAI, type PageAction } from '@fayz-ai/admin'\nimport { PermissionGate } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormsStore } from '@fayz-ai/forms/store'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormTemplate, TemplateCategory } from '@fayz-ai/forms/domain/template'\n\ninterface TemplateListViewProps {\n store: FormsStore\n config: CustomFormsConfig\n onEdit: (template: FormTemplate) => void\n onNew: () => void\n}\n\nconst CATEGORY_COLORS: Record<TemplateCategory, string> = {\n anamnesis: 'bg-info-soft text-info-soft-foreground',\n evaluation: 'bg-info-soft text-info-soft-foreground',\n photos: 'bg-muted text-muted-foreground',\n evolution: 'bg-success-soft text-success-soft-foreground',\n report: 'bg-magic-soft text-magic-soft-foreground',\n contract: 'bg-warning-soft text-warning-soft-foreground',\n general: 'bg-muted text-muted-foreground',\n}\n\nexport function TemplateListView({ store, config, onEdit, onNew }: TemplateListViewProps) {\n const t = useTranslation()\n const [search, setSearch] = useState('')\n\n // Subscribe to zustand store reactively\n const templates = store((s) => s.templates)\n const loading = store((s) => s.templatesLoading)\n const usage = store((s) => s.templateUsage)\n\n const orgId = getActiveTenantId()\n\n // Declared, not drawn: the shell renders this as the button in the header bar\n // on a desktop and as the round \"+\" in the thumb's corner on a phone, and it\n // resolves the create permission that used to be a gate wrapped around here.\n const createActions = useMemo<PageAction[]>(() => {\n const permission = { feature: 'custom_forms', action: 'create' as const }\n return [\n {\n id: 'new',\n label: t('customForms.newTemplate'),\n description: t('customForms.newByHandHint'),\n icon: Plus,\n intent: 'primary' as const,\n creates: true,\n onSelect: onNew,\n permission,\n },\n {\n id: 'ai',\n label: t('assistant.askAI'),\n description: t('customForms.newWithAIHint'),\n icon: WandSparkles,\n ai: true,\n intent: 'secondary' as const,\n creates: true,\n onSelect: () => askAI({\n hint: t('customForms.askPlaceholder'),\n intro: {\n role: 'setup',\n persona: t('customForms.askPersona'),\n pitch: t('customForms.askPitch'),\n description: t('customForms.askDescription'),\n suggestions: [0, 1, 2].map((i) => ({ label: t(`customForms.askSuggestion.${i}`) })),\n },\n }),\n permission,\n },\n ]\n }, [t, onNew])\n\n // Um modelo criado em outro lugar — pelo assistente, por outra aba, pelo\n // construtor — não passa por este store, e a lista ficava mostrando o mundo\n // de antes até alguém recarregar a página.\n const version = useDataVersion(`${FORM_TEMPLATE_EVENT}*`)\n\n // Fetch when org is ready or search changes — debounce to avoid Strict Mode double-fire\n useEffect(() => {\n if (!orgId) return\n const timer = setTimeout(() => {\n store.getState().fetchTemplates({ search: search || undefined })\n }, 50)\n return () => clearTimeout(timer)\n }, [orgId, search, version])\n\n // O uso não depende da busca — é o mesmo mapa para todos os modelos do tenant,\n // e reagregá-lo a cada tecla digitada seria uma consulta por letra.\n useEffect(() => {\n if (!orgId) return\n void store.getState().fetchTemplateUsage()\n }, [orgId])\n\n // Archive, not delete: deactivate the template so it drops out of the list\n // and the \"add document\" picker, without destroying it or its documents.\n const handleArchive = useCallback(async (template: FormTemplate) => {\n if (!window.confirm(t('customForms.archiveTemplateConfirm'))) return\n await store.getState().updateTemplate(template.id, { isActive: false })\n }, [store, t])\n\n // Archived (isActive=false) templates stay in the store but leave the view.\n const visibleTemplates = templates.filter((tpl) => tpl.isActive !== false)\n\n const categoryLabel = (cat: TemplateCategory) => t(`customForms.category.${cat}`)\n\n const columns = useMemo<DataTableProps<FormTemplate, unknown>['columns']>(() => [\n {\n id: 'name',\n header: t('customForms.template'),\n cell: ({ row }) => (\n <div className=\"min-w-0\">\n <span className=\"font-medium\">{row.original.name}</span>\n {row.original.description && (\n <p className=\"truncate text-xs text-muted-foreground\">{row.original.description}</p>\n )}\n </div>\n ),\n },\n {\n id: 'category',\n header: t('customForms.categoryColumn'),\n cell: ({ row }) => (\n <Badge variant=\"secondary\" className={`text-[10px] ${CATEGORY_COLORS[row.original.category]}`}>\n {categoryLabel(row.original.category)}\n </Badge>\n ),\n },\n {\n id: 'fields',\n header: t('customForms.builder.fields'),\n cell: ({ row }) => (\n <span className=\"tabular-nums text-muted-foreground\">\n {row.original.schema.fields.length}\n {row.original.version > 1 && <span className=\"ml-2\">v{row.original.version}</span>}\n </span>\n ),\n },\n {\n id: 'required',\n header: 'Exigido',\n // A PORTA da migration 001. Sem ela as duas colunas novas ficam no banco\n // e o aviso de formulário pendente nunca acende para ninguém — código\n // pronto sem consumidor é o mesmo que código ausente.\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2\">\n <Switch\n size=\"sm\"\n checked={row.original.requiredOnAttendance}\n onCheckedChange={(on) => {\n void store.getState().updateTemplate(row.original.id, {\n requiredOnAttendance: on,\n // Seis meses é o que o V1 usa na anamnese, e é o padrão que faz\n // a validade existir sem pedir mais uma decisão na hora de\n // ligar. Zero validade é o mesmo que \"vale para sempre\", que\n // deixa uma anamnese de 2019 contando como preenchida.\n validityDays: on ? (row.original.validityDays ?? 180) : null,\n })\n }}\n aria-label={`Exigir ${row.original.name} de todo cliente`}\n />\n {row.original.requiredOnAttendance && (\n <span className=\"text-[11px] text-muted-foreground\">\n vale {row.original.validityDays ?? '∞'} dias\n </span>\n )}\n </div>\n ),\n },\n {\n id: 'alert',\n header: 'Alerta',\n // A SEGUNDA PERGUNTA DO V1, e ela é outra pergunta mesmo: exigir põe a\n // bola no checklist do atendimento — trabalho a fazer com a pessoa na\n // cadeira; alertar leva a falta para a FRENTE, na faixa âmbar do\n // agendamento e da ficha. Uma casa exige anamnese e não quer a faixa\n // toda vez que marca horário, e o V1 respeita isso desligado.\n cell: ({ row }) => (\n <Switch\n size=\"sm\"\n disabled={!row.original.requiredOnAttendance}\n checked={row.original.requiredOnAttendance && row.original.alertWhenMissing}\n onCheckedChange={(on) => {\n void store.getState().updateTemplate(row.original.id, { alertWhenMissing: on })\n }}\n aria-label={`Alertar quando ${row.original.name} estiver faltando`}\n />\n ),\n },\n {\n id: 'usage',\n header: t('customForms.usageColumn'),\n // \"0 preenchimentos\" é informação, não ausência dela: é o que separa um\n // formulário que o salão usa todo dia de um que sobrou de uma importação.\n cell: ({ row }) => {\n const u = usage[row.original.id]\n return (\n <span className=\"text-xs text-muted-foreground\">\n {t('customForms.usageCount', { count: String(u?.documentCount ?? 0) })}\n {u?.lastDocumentAt && (\n <>\n <span className=\"px-1\">·</span>\n {t('customForms.usageLast', { date: new Date(u.lastDocumentAt).toLocaleDateString() })}\n </>\n )}\n </span>\n )\n },\n },\n {\n id: 'actions',\n header: '',\n // RowActions is the one renderer for what can be done to a single row —\n // it owns the sizing, the accessible name and the rule that keeps a\n // destructive action off the row itself.\n cell: ({ row }) => (\n <RowActions\n actions={[\n {\n id: 'edit',\n label: t('common.edit'),\n icon: Pencil,\n onSelect: () => onEdit(row.original),\n },\n {\n id: 'archive',\n label: t('customForms.archive'),\n icon: Archive,\n intent: 'danger' as const,\n onSelect: () => { void handleArchive(row.original) },\n },\n ]}\n />\n ),\n },\n ], [t, usage, onEdit, handleArchive])\n\n const emptyState = (\n <div className=\"flex flex-col items-center justify-center py-6 text-center\">\n <div className=\"mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted\">\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium text-foreground\">{t('customForms.noTemplates')}</p>\n <p className=\"mt-1 max-w-sm text-sm text-muted-foreground\">\n {t('customForms.noTemplatesDescription')}\n </p>\n <PermissionGate feature=\"custom_forms\" action=\"create\">\n <Button onClick={onNew} size=\"sm\" className=\"mt-4\">\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n {t('customForms.newTemplate')}\n </Button>\n </PermissionGate>\n </div>\n )\n\n return (\n <div className=\"space-y-4\">\n {/* O \"Novo modelo\" vai para a barra da shell, onde mora a ação principal\n de toda lista do produto — desenhá-lo aqui gastava uma fileira do corpo\n para pôr o botão num canto diferente do de todas as outras telas. */}\n <PageHeaderActions>\n {/* Duas portas para o mesmo modelo, e a de IA vem junto: montar uma\n anamnese campo a campo é meia hora de cliques, e descrevê-la é uma\n frase. A ferramenta atrás dela é `createOrUpdateForm`, que é\n server-plane e já existia — aqui só se abre a porta. */}\n <PageActions actions={createActions} />\n </PageHeaderActions>\n\n {/* Busca e tabela são UMA superfície, como em qualquer lista de CRUD: elas\n agem sobre as mesmas linhas. */}\n <Card className=\"overflow-hidden\">\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2\">\n <div className=\"relative min-w-[10rem] flex-1\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('common.search')}\n className=\"h-auto rounded-none border-0 bg-transparent py-1.5 pl-8 pr-3 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n </div>\n <DataTable\n variant=\"bare\"\n columns={columns}\n data={loading ? [] : visibleTemplates}\n loading={loading}\n skeletonRows={3}\n emptyMessage={emptyState}\n onRowClick={(row) => onEdit(row)}\n />\n </Card>\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { TemplateListView } from './TemplateListView'\nimport { CustomFormsProvider } from '../context'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormsStore } from '@fayz-ai/forms/store'\nimport type { FormTemplate } from '@fayz-ai/forms/domain/template'\n\ninterface CustomFormsSettingsTabProps {\n config: CustomFormsConfig\n provider: FormsDataProvider\n store: FormsStore\n}\n\nconst ROUTE_BASE = '/settings/custom_forms'\n\n/** Read the currently-open template id from the URL hash (the source of truth,\n * so deep links and browser back/forward work like any CRUD detail page). */\nfunction readBuilderIdFromHash(): string | null {\n const hash = window.location.hash.slice(1) || '/'\n const m = hash.match(/\\/settings\\/custom_forms\\/templates\\/([^/]+)/)\n if (!m) return null\n return m[1] === 'new' ? '__new__' : m[1]\n}\n\nexport function CustomFormsSettingsTab({ config, provider, store }: CustomFormsSettingsTabProps) {\n // URL is the source of truth — opening/closing a template updates the hash,\n // so the record id shows in the URL just like opening a CRUD record.\n const [builderTemplateId, setBuilderTemplateId] = useState<string | null>(readBuilderIdFromHash)\n\n const handleNew = useCallback(() => {\n window.location.hash = `#${ROUTE_BASE}/templates/new`\n }, [])\n\n const handleEdit = useCallback((template: FormTemplate) => {\n window.location.hash = `#${ROUTE_BASE}/templates/${template.id}`\n }, [])\n\n const handleBackFromBuilder = useCallback(() => {\n // Return to the list route and re-fetch templates to reflect any saves.\n window.location.hash = `#${ROUTE_BASE}/forms`\n store.getState().fetchTemplates()\n }, [store])\n\n // Keep local state in sync with the URL (deep links, back/forward, and our\n // own hash writes above all flow through here).\n React.useEffect(() => {\n const sync = () => setBuilderTemplateId(readBuilderIdFromHash())\n window.addEventListener('hashchange', sync)\n return () => window.removeEventListener('hashchange', sync)\n }, [])\n\n return builderTemplateId ? (\n <BuilderWrapper\n templateId={builderTemplateId === '__new__' ? undefined : builderTemplateId}\n store={store}\n provider={provider}\n config={config}\n onBack={handleBackFromBuilder}\n />\n ) : (\n <TemplateListView\n store={store}\n config={config}\n onEdit={handleEdit}\n onNew={handleNew}\n />\n )\n}\n\n/** Lazy-loads the FormBuilder to avoid pulling @dnd-kit into the initial bundle */\nfunction BuilderWrapper({\n templateId,\n store,\n provider,\n config,\n onBack,\n}: {\n templateId?: string\n store: FormsStore\n provider: FormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}) {\n const FormBuilderLazy = React.lazy(() =>\n import('../components/FormBuilder').then((m) => ({ default: m.FormBuilder })),\n )\n\n // Field previews and property panels upload and sign media through the context.\n return (\n <CustomFormsProvider value={{ config, provider, store }}>\n <React.Suspense\n fallback={\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"h-6 w-6 border-2 border-primary border-t-transparent animate-spin rounded-full\" />\n </div>\n }\n >\n <FormBuilderLazy\n templateId={templateId}\n store={store}\n provider={provider}\n config={config}\n onBack={onBack}\n />\n </React.Suspense>\n </CustomFormsProvider>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button } from '@fayz-ai/ui'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormDocument } from '@fayz-ai/forms/domain/document'\nimport type { FormFieldDef, FormTemplate, MediaValue, RecommendationLine } from '@fayz-ai/forms/domain/template'\nimport { htmlToPlainText } from '../lib/plain-text'\nimport { isMedia } from './fields/media'\nimport { yesNoAnswer } from './fields/fields'\n\n// ---------------------------------------------------------------------------\n// O CONTEÚDO DO REGISTRO, DENTRO DA LINHA DO TEMPO.\n//\n// Uma evolução tem três linhas. Abrir uma tela inteira, ler três linhas e\n// voltar é a viagem que o olhinho existe para não cobrar — e numa consulta de\n// retorno o profissional lê as últimas três evoluções em sequência, o que pelo\n// caminho antigo eram seis navegações.\n//\n// PREVIEW, e não o formulário: só o que foi RESPONDIDO aparece, em pares\n// rótulo/valor. Campo em branco não entra — num molde de quarenta campos com\n// seis preenchidos, mostrar os trinta e quatro vazios esconde os seis.\n// ---------------------------------------------------------------------------\n\n/** Quantos pares cabem antes de a \"prévia\" virar a tela inteira. */\nconst MAX_FIELDS = 8\n/** Um texto longo vira resumo: o corpo inteiro no cartão empurra o próximo\n * registro para fora da tela, que é o oposto de ler em sequência. */\nconst MAX_CHARS = 280\n\nfunction isEmpty(value: unknown): boolean {\n if (value == null) return true\n if (typeof value === 'string') return value.trim() === ''\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\n/** O valor como texto. Marcação vinda de molde importado é decodificada pelo\n * mesmo caminho do placeholder (ver lib/plain-text). */\nfunction asText(value: unknown): string {\n if (Array.isArray(value)) return value.map((v) => String(v)).join(', ')\n if (typeof value === 'boolean') return value ? 'Sim' : 'Não'\n return htmlToPlainText(String(value)) ?? String(value)\n}\n\n/** Photos and signatures are paths in a private bucket: sign them with the provider we were given. */\nfunction PreviewMedia({ items, provider }: { items: MediaValue[]; provider: FormsDataProvider }) {\n const [urls, setUrls] = useState<Array<string | null>>([])\n useEffect(() => {\n let alive = true\n Promise.all(items.map((m) => Promise.resolve(provider.mediaUrl?.(m.path) ?? null).catch(() => null)))\n .then((u) => { if (alive) setUrls(u) })\n return () => { alive = false }\n // Keyed on the paths: `items` is rebuilt every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items.map((m) => m.path).join('|'), provider])\n return (\n <div className=\"flex flex-wrap gap-2 pt-1\">\n {items.map((m, i) => (urls[i]\n ? m.type === 'video'\n ? <video key={m.path} src={urls[i]!} className=\"h-20 w-20 rounded-md border object-cover\" preload=\"metadata\" />\n : <img key={m.path} src={urls[i]!} alt=\"\" className={`h-20 rounded-md border object-cover ${m.type === 'signature' ? 'bg-white' : 'w-16'}`} />\n : <div key={m.path} className=\"h-20 w-16 animate-pulse rounded-md bg-muted\" />))}\n </div>\n )\n}\n\nfunction mediaOf(field: FormFieldDef, value: unknown): MediaValue[] | null {\n if (field.type === 'stencil_photo' || field.type === 'signature') return isMedia(value) ? [value] : null\n if (field.type === 'gallery') return Array.isArray(value) ? (value as MediaValue[]).filter(isMedia) : null\n return null\n}\n\nfunction fieldText(field: FormFieldDef, value: unknown): string {\n if (field.type === 'yes_no' || field.type === 'yes_no_text') {\n const a = yesNoAnswer(value)\n const extra = value && typeof value === 'object' ? (value as { text?: string }).text?.trim() : ''\n return `${a === 'sim' ? 'Sim' : a === 'nao' ? 'Não' : ''}${extra ? ` — ${extra}` : ''}`\n }\n if (field.type === 'recommendation' && Array.isArray(value)) {\n return (value as RecommendationLine[]).map((l) => `${l.quantity > 1 ? `${l.quantity}× ` : ''}${l.name}`).join(' · ')\n }\n return asText(value)\n}\n\nfunction truncate(text: string): string {\n return text.length > MAX_CHARS ? `${text.slice(0, MAX_CHARS).trimEnd()}…` : text\n}\n\nexport function DocumentPreview({\n document: doc,\n provider,\n onOpen,\n}: {\n document: FormDocument\n provider: FormsDataProvider\n /** \"Ver tudo\" quando a prévia cortou. */\n onOpen: () => void\n}) {\n const t = useTranslation()\n const [template, setTemplate] = useState<FormTemplate | null>(null)\n const [loading, setLoading] = useState(true)\n\n // O molde diz o RÓTULO e a ORDEM. Sem ele o `data` é um objeto de ids\n // (`{f_3: \"sim\"}`) — dado, não leitura.\n useEffect(() => {\n let alive = true\n if (!doc.templateId) { setLoading(false); return }\n void provider.getTemplateById(doc.templateId)\n .then((found) => { if (alive) { setTemplate(found); setLoading(false) } })\n .catch(() => { if (alive) setLoading(false) })\n return () => { alive = false }\n }, [doc.templateId, provider])\n\n // Arquivo não tem corpo de formulário: a imagem É o conteúdo.\n if (doc.kind === 'image' && doc.fileUrl) {\n return (\n <img\n src={doc.fileUrl}\n alt={doc.fileName ?? ''}\n className=\"max-h-64 rounded-lg object-contain\"\n />\n )\n }\n if (doc.kind === 'attachment') {\n return (\n <p className=\"text-xs text-muted-foreground\">\n {doc.fileName ?? t('customForms.documentFallbackTitle')}\n {doc.fileSize ? ` · ${(doc.fileSize / 1024).toFixed(1)} KB` : ''}\n </p>\n )\n }\n\n if (loading) {\n return (\n <div className=\"space-y-2\">\n <div className=\"h-3 w-1/3 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-2/3 animate-pulse rounded bg-muted\" />\n </div>\n )\n }\n\n const fields = template?.schema?.fields ?? []\n const answered = fields\n .filter((f) => f.type !== 'title' && !isEmpty(doc.data?.[f.id]))\n .sort((a, b) => a.row - b.row || a.col - b.col)\n\n if (answered.length === 0) {\n return <p className=\"text-xs text-muted-foreground\">{t('customForms.previewEmpty')}</p>\n }\n\n const shown = answered.slice(0, MAX_FIELDS)\n const hidden = answered.length - shown.length\n\n return (\n <div className=\"space-y-2\">\n <dl className=\"grid gap-x-6 gap-y-2 sm:grid-cols-2\">\n {shown.map((field) => {\n const media = mediaOf(field, doc.data[field.id])\n const text = media ? '' : truncate(fieldText(field, doc.data[field.id]))\n // Uma evolução é um parágrafo, e meia largura a quebrava a cada seis\n // palavras — coluna de jornal onde devia haver prosa. Campo de texto\n // longo ocupa a linha inteira; o que é curto (data, sim/não, peso)\n // continua lado a lado, que é o que faz a grade valer a pena.\n const wide = field.type === 'memo' || field.type === 'richtext' || field.type === 'gallery' || text.length > 60\n return (\n <div key={field.id} className={`min-w-0 ${wide ? 'sm:col-span-2' : ''}`}>\n <dt className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n {htmlToPlainText(field.label) ?? field.label}\n </dt>\n <dd className=\"whitespace-pre-wrap text-sm leading-6 text-foreground\">\n {media ? <PreviewMedia items={media} provider={provider} /> : text}\n </dd>\n </div>\n )\n })}\n </dl>\n {/* O que ficou de fora é dito, não escondido: uma prévia que corta em\n silêncio faz o leitor achar que leu o registro inteiro. */}\n {hidden > 0 && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onOpen}\n className=\"text-xs font-medium text-primary hover:underline\"\n >\n {t('customForms.previewMore', { count: String(hidden) })}\n </Button>\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport { tl } from '@fayz-ai/core'\nimport {\n ClipboardList, Activity, FileCheck2, FileSignature, FileText, Stethoscope, Camera,\n} from 'lucide-react'\nimport type { TemplateCategory } from '@fayz-ai/forms/domain/template'\n\n// ---------------------------------------------------------------------------\n// A CATEGORIA É A COSTURA ENTRE OFÍCIOS.\n//\n// `plg_forms_templates.category` já existe desde a baseline (coluna NOT NULL,\n// índice por tenant, validada na RPC de upsert) e já é escolhida no\n// FormBuilder — mas a ficha da pessoa a ignorava, e o resultado era uma lista\n// só, chamada \"Documentos\", onde anamnese, evolução, laudo, contrato, foto e\n// anexo disputavam a mesma rolagem.\n//\n// Psicologia usa anamnese + evolução + contrato; nutrição troca contrato por\n// laudo; medicina usa as quatro. Nenhum desses consultórios precisa de código\n// próprio: o ofício semeia OS MODELOS com a categoria certa, e a tela se\n// organiza sozinha. Abas fixas por vertical seriam um release por consultório.\n// ---------------------------------------------------------------------------\n\n/** Ordem de leitura, não alfabética: é a ordem em que o prontuário acontece. */\nexport const CATEGORY_ORDER: TemplateCategory[] = [\n 'anamnesis', 'evaluation', 'photos', 'evolution', 'report', 'contract', 'general',\n]\n\n/** `groupOrder` do `Novo ▾`. Arquivos ficam em 90, depois de todo formulário. */\nexport const CATEGORY_GROUP_ORDER: Record<TemplateCategory, number> = {\n anamnesis: 10,\n evaluation: 12,\n photos: 14,\n evolution: 20,\n report: 30,\n contract: 40,\n general: 50,\n}\n\nexport const CATEGORY_ICONS: Record<TemplateCategory, React.ElementType> = {\n anamnesis: ClipboardList,\n evaluation: Stethoscope,\n photos: Camera,\n evolution: Activity,\n report: FileCheck2,\n contract: FileSignature,\n general: FileText,\n}\n\n/**\n * O rótulo FORA de React.\n *\n * `getTypes()` do registro de tipos de documento não é um componente, então não\n * pode usar `useTranslation`. `tl` lê o locale corrente e é o mesmo caminho que\n * o resto do SDK usa para texto fora de hook.\n */\nexport function categoryLabel(category: TemplateCategory): string {\n switch (category) {\n case 'anamnesis': return tl('Anamnesis', 'Anamnese')\n case 'evaluation': return tl('Evaluation', 'Avaliação')\n case 'photos': return tl('Photos', 'Fotos')\n case 'evolution': return tl('Evolution', 'Evolução')\n case 'report': return tl('Report', 'Laudo')\n case 'contract': return tl('Contract', 'Contrato')\n default: return tl('General', 'Geral')\n }\n}\n\n/** Categoria conhecida, ou `general`. Uma linha antiga com categoria vazia não\n * pode sumir da tela por não caber no enum. */\nexport function normalizeCategory(value: unknown): TemplateCategory {\n return CATEGORY_ORDER.includes(value as TemplateCategory)\n ? (value as TemplateCategory)\n : 'general'\n}\n\n/**\n * O ícone e a cor da bolha na linha do tempo.\n *\n * Nome de ícone (string) e não componente: é o que o `TimelineItem` do admin\n * pede, porque ele resolve contra o lucide inteiro — o mesmo caminho que aba\n * de ficha, linha de rail e widget de dashboard já usam.\n *\n * Os tons contam a leitura clínica: a anamnese é o começo (primária), a\n * evolução é o que anda (info), o laudo conclui (sucesso), o contrato\n * compromete (aviso).\n */\nexport const CATEGORY_TIMELINE_ICON: Record<TemplateCategory, string> = {\n anamnesis: 'ClipboardList',\n evaluation: 'Stethoscope',\n photos: 'Camera',\n evolution: 'Activity',\n report: 'FileCheck2',\n contract: 'FileSignature',\n general: 'FileText',\n}\n\nexport const CATEGORY_TONE: Record<TemplateCategory, 'primary' | 'info' | 'success' | 'warning' | 'neutral'> = {\n anamnesis: 'primary',\n evaluation: 'primary',\n photos: 'info',\n evolution: 'info',\n report: 'success',\n contract: 'warning',\n general: 'neutral',\n}\n\n/** A pastilha de um filtro do prontuário: a categoria de um formulário, ou\n * `file` para o que não tem modelo (foto, anexo). */\nexport type DocumentBucket = TemplateCategory | 'file'\n\n/** Um documento sem modelo não tem categoria — é foto ou anexo, e cai no balde\n * próprio em vez de fingir ser \"Geral\". */\nexport function bucketOf(doc: { kind?: string; templateCategory?: unknown }): DocumentBucket {\n if (doc.kind === 'image' || doc.kind === 'attachment') return 'file'\n return normalizeCategory(doc.templateCategory)\n}\n\n/**\n * O que o `title` do documento ACRESCENTA ao nome do modelo.\n *\n * A importação do V1 gravou títulos que são o registro inteiro em texto —\n * \"Evolução semanal_Principal (IMPORTADO) — JUNIA FERREIRA SIMÃO — 17/07/2026\"\n * — e o cartão passava a dizer três vezes a mesma coisa: o modelo já é o\n * título, a pessoa é a ficha aberta, e a data está à direita.\n *\n * Um título que COMEÇA pelo nome do modelo é etiqueta gerada, não informação:\n * não desce para a descrição. O que não começa por ele é coisa que alguém\n * escreveu (\"Retorno 12/09\") e vale a linha.\n */\nfunction subtitleFor(doc: { title?: string; templateName?: string }): string | undefined {\n const title = doc.title?.trim()\n if (!title) return undefined\n const model = doc.templateName?.trim()\n if (!model) return title\n if (title === model) return undefined\n return title.toLowerCase().startsWith(model.toLowerCase()) ? undefined : title\n}\n\n/**\n * De documento para item da linha do tempo — a MESMA `TimelineItem` que a aba\n * Atividade monta, para as duas abas desenharem igual.\n *\n * O TÍTULO é o modelo (\"Anamnese\", \"Evolução\"), não o título que o upload deu\n * ao arquivo: numa ficha clínica é o modelo que se procura. O `title` do\n * documento só desce para a descrição quando ACRESCENTA algo — senão a linha\n * diria a mesma coisa duas vezes.\n *\n * Pura de propósito: é o que dá para testar sem montar React nem banco.\n */\nexport function documentToTimelineItem(\n doc: {\n id: string; kind?: string; title?: string; templateName?: string\n templateCategory?: unknown; createdAt: string\n },\n fallbackTitle: string,\n) {\n const b = bucketOf(doc)\n const secondary = subtitleFor(doc)\n return {\n id: doc.id,\n sourceId: b,\n occurredAt: doc.createdAt,\n title: doc.templateName ?? doc.title ?? fallbackTitle,\n description: secondary,\n badge: b === 'file' ? undefined : categoryLabel(b),\n icon: b === 'file'\n ? (doc.kind === 'image' ? 'Image' : 'Paperclip')\n : CATEGORY_TIMELINE_ICON[b],\n tone: b === 'file' ? ('neutral' as const) : CATEGORY_TONE[b],\n }\n}\n","import React, { useEffect, useState, useCallback, useRef, useMemo } from 'react'\nimport { Archive, Eye, EyeOff, Upload, Paperclip, ClipboardList } from 'lucide-react'\nimport { Button, ConfirmDialog } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormsStore } from '@fayz-ai/forms/store'\nimport { TimelineList, invalidateTabCounts } from '@fayz-ai/admin'\nimport type { TimelineItem } from '@fayz-ai/admin'\nimport type { FormDocument, DocumentCounts, DocumentStatus } from '@fayz-ai/forms/domain/document'\nimport type { TemplateCategory } from '@fayz-ai/forms/domain/template'\nimport { DocumentPreview } from './DocumentPreview'\nimport {\n CATEGORY_ORDER, categoryLabel, bucketOf, documentToTimelineItem,\n type DocumentBucket as Bucket,\n} from '../lib/categories'\n\ninterface DocumentListProps {\n personId: string\n provider: FormsDataProvider\n store: FormsStore\n onView: (doc: FormDocument) => void\n onFileDrop?: (files: File[]) => void\n /** Restringe a lista a estes tipos de `public.documents`. Ausente = tudo.\n * É o que separa o Prontuário (só `form`) dos Arquivos (imagem e anexo). */\n kinds?: string[]\n}\n\n/** O que a ficha mostra. `archived` fica de fora — arquivar é tirar da aba, não\n * apagar (ver `handleArchive`). */\nconst ACTIVE_STATUSES: DocumentStatus[] = ['draft', 'completed', 'signed']\n\nconst EXPAND_KEY = 'fayz.forms.documents.expandAll'\n\nexport function DocumentList({ personId, provider, store, onView, onFileDrop, kinds }: DocumentListProps) {\n // Arrastar arquivo é da aba de ARQUIVOS. No prontuário a moldura tracejada\n // convidava para um gesto cujo resultado ia parar na outra aba — e a\n // separação existe justamente para isso não acontecer.\n const acceptsFiles = Boolean(onFileDrop) && (!kinds || kinds.includes('attachment'))\n const t = useTranslation()\n const [documents, setDocuments] = useState<FormDocument[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(1)\n const [loading, setLoading] = useState(true)\n const [loadingMore, setLoadingMore] = useState(false)\n const [counts, setCounts] = useState<DocumentCounts>({})\n const [bucket, setBucket] = useState<Bucket | undefined>(undefined)\n const [isDragOver, setIsDragOver] = useState(false)\n /**\n * O OLHINHO: ler sem clicar.\n *\n * Ligado, todo cartão abre o conteúdo do registro no lugar — é como se lê uma\n * evolução, que tem três linhas e não paga a viagem de ida e volta a uma tela\n * inteira. Desligado é a lista densa, para procurar.\n *\n * Preferência de quem está lendo, guardada na máquina dele: o psicólogo que\n * lê sempre não quer religar isso em cada paciente. Em aba anônima, onde o\n * acesso estoura, a lista simplesmente abre densa.\n */\n const [expandAll, setExpandAll] = useState(() => {\n try { return localStorage.getItem(EXPAND_KEY) === '1' } catch { return false }\n })\n const toggleExpandAll = useCallback(() => {\n setExpandAll((prev) => {\n try { localStorage.setItem(EXPAND_KEY, prev ? '0' : '1') } catch { /* sem storage, vale só esta sessão */ }\n return !prev\n })\n }, [])\n /** Abertos à mão, por cima do olhinho geral. */\n const [openIds, setOpenIds] = useState<Set<string>>(new Set())\n const dragCounter = useRef(0)\n\n /**\n * Quanto cabe numa leitura antes de \"Carregar mais\".\n *\n * Vinte e não os cinquenta que o provider assume por padrão: o cartão do\n * prontuário é alto (título, data, e o conteúdo quando aberto), e cinquenta\n * deles são cinco telas de rolagem antes do primeiro respiro.\n */\n const PAGE_SIZE = 20\n\n // O filtro vai para a CONSULTA, não para o resultado. Filtrar o que voltou\n // fazia a aba de arquivos de quem tem 110 registros e 3 fotos trazer 50\n // linhas de formulário e mostrar zero foto.\n const queryFor = useCallback((nextPage: number) => ({\n personId,\n kinds,\n templateCategory: bucket && bucket !== 'file' ? bucket : undefined,\n ...(bucket === 'file' ? { kinds: ['image', 'attachment'] } : {}),\n status: ACTIVE_STATUSES,\n page: nextPage,\n pageSize: PAGE_SIZE,\n }), [personId, kinds, bucket])\n\n const fetchDocs = useCallback(async () => {\n setLoading(true)\n try {\n const result = await provider.getDocuments(queryFor(1))\n setDocuments(result.data)\n setTotal(result.total)\n setPage(1)\n } finally {\n setLoading(false)\n }\n }, [provider, queryFor])\n\n /** Os totais REAIS, que a página não sabe: 110 registros com 20 carregados. */\n const fetchCounts = useCallback(async () => {\n try {\n setCounts(await provider.getDocumentCounts({ personId, kinds }))\n } catch {\n setCounts({})\n }\n }, [provider, personId, kinds])\n\n const loadMore = useCallback(async () => {\n setLoadingMore(true)\n try {\n const next = page + 1\n const result = await provider.getDocuments(queryFor(next))\n // Concatena por id: uma gravação entre duas páginas desloca a janela e\n // devolveria a mesma linha duas vezes.\n setDocuments((prev) => {\n const seen = new Set(prev.map((d) => d.id))\n return [...prev, ...result.data.filter((d) => !seen.has(d.id))]\n })\n setTotal(result.total)\n setPage(next)\n } finally {\n setLoadingMore(false)\n }\n }, [provider, queryFor, page])\n\n useEffect(() => {\n const timer = setTimeout(() => fetchDocs(), 50)\n return () => clearTimeout(timer)\n }, [fetchDocs])\n\n useEffect(() => { void fetchCounts() }, [fetchCounts])\n\n useEffect(() => {\n const unsub = store.subscribe(() => { void fetchDocs(); void fetchCounts() })\n return unsub\n }, [store, fetchDocs, fetchCounts])\n\n // Archive, not delete: a filled document is a record of what was signed —\n // it is moved out of the active list, never destroyed.\n //\n // A confirmação é um ConfirmDialog e não `window.confirm`: o nativo bloqueia a\n // aba inteira, ignora o tema e não cabe o NOME do registro — e \"Tem certeza?\"\n // sem dizer de qual anamnese se fala é a pergunta que ninguém consegue\n // responder.\n const [archiving, setArchiving] = useState<FormDocument | null>(null)\n\n const handleArchive = useCallback(async () => {\n const doc = archiving\n setArchiving(null)\n if (!doc) return\n await provider.updateDocument(doc.id, { status: 'archived' })\n setDocuments((prev) => prev.filter((d) => d.id !== doc.id))\n setTotal((n) => Math.max(0, n - 1))\n void fetchCounts()\n // O badge da aba vive fora deste componente.\n invalidateTabCounts()\n }, [provider, archiving, fetchCounts])\n\n // Drag and drop handlers\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n dragCounter.current++\n setIsDragOver(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n dragCounter.current--\n if (dragCounter.current === 0) setIsDragOver(false)\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n }, [])\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n dragCounter.current = 0\n setIsDragOver(false)\n const files = Array.from(e.dataTransfer.files)\n if (files.length > 0 && onFileDrop) {\n onFileDrop(files)\n }\n }, [onFileDrop])\n\n /**\n * As pastilhas saem do que EXISTE, nunca do enum — e do SERVIDOR, nunca da\n * página.\n *\n * Um consultório de psicologia que nunca emitiu laudo veria \"Laudo\" vazio\n * para sempre, e uma aba que oferece um filtro sem resultado ensina que a\n * tela mente. Contar a página dizia outra mentira: \"Tudo 50\" numa ficha com\n * 110 registros, porque o provider pagina em 50.\n */\n const buckets = useMemo(() => {\n const order: Bucket[] = [...CATEGORY_ORDER, 'file']\n return order\n .filter((b) => (counts[b] ?? 0) > 0)\n .map((b) => ({\n id: b,\n label: b === 'file' ? t('customForms.bucket.file') : categoryLabel(b),\n count: counts[b] ?? 0,\n }))\n }, [counts, t])\n\n const totalAll = useMemo(\n () => Object.values(counts).reduce((sum, n) => sum + n, 0),\n [counts],\n )\n\n // Uma pastilha que some (o último laudo foi arquivado) não pode deixar a\n // lista presa num filtro que não existe mais.\n useEffect(() => {\n if (bucket && !buckets.some((b) => b.id === bucket)) setBucket(undefined)\n }, [buckets, bucket])\n\n // A consulta já filtrou; aqui é só o nome do que está na tela.\n const visible = documents\n\n const items = useMemo(\n () => visible.map((doc) => documentToTimelineItem(doc, t('customForms.documentFallbackTitle'))),\n [visible, t],\n )\n\n const byId = useMemo(() => new Map(visible.map((d) => [d.id, d])), [visible])\n\n /**\n * Quem está aberto: o olhinho geral manda em todos, e `openIds` é a exceção\n * de quem foi clicado à mão.\n *\n * Com o geral LIGADO, `openIds` guarda quem foi FECHADO — senão ligar o\n * olhinho reabriria à força o item que a pessoa acabou de fechar.\n */\n const expandedIds = useMemo(() => {\n if (!expandAll) return openIds\n const open = new Set(visible.map((d) => d.id))\n for (const id of openIds) open.delete(id)\n return open\n }, [expandAll, openIds, visible])\n\n const toggleOne = useCallback((id: string) => {\n setOpenIds((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }, [])\n\n // Trocar o sentido do olhinho geral zera as exceções: elas eram exceções ao\n // estado anterior, e mantê-las deixaria a lista em xadrez.\n useEffect(() => { setOpenIds(new Set()) }, [expandAll])\n\n if (loading) {\n return (\n <div className=\"space-y-4 py-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <div className=\"h-9 w-9 rounded-lg bg-muted animate-pulse shrink-0\" />\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-3.5 w-2/3 bg-muted animate-pulse rounded\" />\n <div className=\"h-2.5 w-1/3 bg-muted animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n // Mesmo desenho das pastilhas da PersonTimeline, de propósito: as duas abas\n // ficam a um clique uma da outra na MESMA ficha, e dois filtros diferentes\n // para a mesma pergunta (\"mostre só isto\") custariam duas leituras.\n // Mesmo desenho das pastilhas da PersonTimeline, de propósito: as duas abas\n // ficam a um clique uma da outra na MESMA ficha, e dois filtros diferentes\n // para a mesma pergunta (\"mostre só isto\") custariam duas leituras.\n const filters = (buckets.length > 1 || totalAll > 0) && (\n <div className=\"mb-3 flex flex-wrap items-center gap-1.5\">\n {buckets.length > 1 && [{ id: undefined as Bucket | undefined, label: t('customForms.bucket.all'), count: totalAll }, ...buckets].map((chip) => {\n const active = chip.id === bucket\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={chip.id ?? '__all__'}\n type=\"button\"\n onClick={() => setBucket(chip.id)}\n className={`gap-0 font-normal rounded-full border px-2.5 py-1 text-xs transition-colors ${\n active\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {chip.label}\n {/* A contagem é a pergunta do balcão: \"quantas evoluções ela já\n tem\". Vem do servidor, não da página carregada. */}\n <span className=\"ml-1.5 tabular-nums opacity-60\">{chip.count}</span>\n </Button>\n )\n })}\n {/* O olhinho, encostado à direita: ler sem clicar. */}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={toggleExpandAll}\n aria-pressed={expandAll}\n title={t(expandAll ? 'customForms.hideContent' : 'customForms.showContent')}\n className={`font-normal ml-auto flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs transition-colors ${\n expandAll\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-border text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {expandAll ? <EyeOff className=\"h-3.5 w-3.5\" /> : <Eye className=\"h-3.5 w-3.5\" />}\n {t(expandAll ? 'customForms.hideContent' : 'customForms.showContent')}\n </Button>\n </div>\n )\n\n return (\n <div>\n {filters}\n <div\n className={`relative min-h-[200px] rounded-xl border-2 transition-colors ${\n isDragOver\n ? 'border-dashed border-primary bg-primary/5'\n : documents.length === 0 && acceptsFiles\n ? 'border-dashed border-border'\n : 'border-transparent'\n }`}\n {...(acceptsFiles ? {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n } : {})}\n >\n {/* Drag overlay */}\n {isDragOver && (\n <div className=\"absolute inset-0 z-10 flex flex-col items-center justify-center rounded-xl bg-primary/5\">\n <Upload className=\"h-8 w-8 text-primary/50 mb-2\" />\n <p className=\"text-sm font-medium text-primary/70\">{t('customForms.dropFilesHere')}</p>\n </div>\n )}\n\n {/* Filtrou e não sobrou nada ≠ não há nada. A segunda frase manda\n cadastrar; a primeira mandaria apagar um filtro que o leitor ligou. */}\n {documents.length > 0 && visible.length === 0 && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">{t('customForms.noDocumentsInFilter')}</p>\n </div>\n )}\n\n {/* Empty state */}\n {documents.length === 0 && !isDragOver && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n {acceptsFiles\n ? <Paperclip className=\"h-5 w-5 text-muted-foreground\" />\n : <ClipboardList className=\"h-5 w-5 text-muted-foreground\" />}\n </div>\n <p className=\"text-sm font-medium\">\n {t(acceptsFiles ? 'customForms.noFiles' : 'customForms.noRecords')}\n </p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">\n {t(acceptsFiles ? 'customForms.noFilesDescription' : 'customForms.noRecordsDescription')}\n </p>\n {acceptsFiles && (\n <p className=\"text-[10px] text-muted-foreground mt-3 flex items-center gap-1\">\n <Upload className=\"h-3 w-3\" />\n {t('customForms.dragFilesHere')}\n </p>\n )}\n </div>\n )}\n\n {/* A MESMA linha do tempo da aba Atividade — `TimelineList` do\n @fayz-ai/admin. Esta lista tinha trilho próprio, cabeçalho de data\n próprio e cartão próprio para responder a mesma pergunta (\"o que\n aconteceu com esta pessoa, em ordem\") que a aba vizinha já respondia\n com outro desenho. Duas formas para uma pergunta é o leitor\n reaprendendo a ler a cada aba. */}\n {visible.length > 0 && (\n <TimelineList\n items={items}\n expandedIds={expandedIds}\n renderPreview={(it: TimelineItem) => {\n const doc = byId.get(it.id)\n return doc ? <DocumentPreview document={doc} provider={provider} onOpen={() => onView(doc)} /> : null\n }}\n // O cartão faz UMA coisa, e a seta à direita diz qual: abre o\n // registro. Fechar a prévia é o olhinho — dois gestos, dois\n // controles, nenhum deles adivinhado.\n onSelect={(it: TimelineItem) => {\n const doc = byId.get(it.id)\n if (doc) onView(doc)\n }}\n renderActions={(it: TimelineItem) => {\n const doc = byId.get(it.id)\n if (!doc) return null\n return (\n <>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); toggleOne(doc.id) }}\n className=\"rounded-md p-1.5 hover:bg-muted\"\n aria-label={t(expandedIds.has(doc.id) ? 'customForms.hideContent' : 'customForms.showContent')}\n aria-expanded={expandedIds.has(doc.id)}\n >\n {expandedIds.has(doc.id)\n ? <EyeOff className=\"h-3.5 w-3.5 text-muted-foreground\" />\n : <Eye className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setArchiving(doc) }}\n className=\"rounded-md p-1.5 hover:bg-muted\"\n aria-label={t('customForms.archive')}\n title={t('customForms.archive')}\n >\n <Archive className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </Button>\n </>\n )\n }}\n />\n )}\n\n {/* Carregar mais, e não rolagem infinita: a ficha tem rodapé (a\n procedência do registro) e um carregamento automático o empurraria\n para sempre. O número diz quanto falta, para a decisão ser informada. */}\n {visible.length < total && (\n <div className=\"flex justify-center pt-4\">\n <Button variant=\"outline\" size=\"sm\" disabled={loadingMore} onClick={() => void loadMore()}>\n {loadingMore\n ? t('customForms.loadingMore')\n : t('customForms.loadMore', { count: String(total - visible.length) })}\n </Button>\n </div>\n )}\n </div>\n\n <ConfirmDialog\n open={archiving !== null}\n title={t('customForms.archiveTitle')}\n description={t('customForms.archiveDescription', {\n name: archiving?.templateName ?? archiving?.title ?? t('customForms.documentFallbackTitle'),\n })}\n confirmLabel={t('customForms.archive')}\n cancelLabel={t('common.cancel')}\n onConfirm={() => void handleArchive()}\n onCancel={() => setArchiving(null)}\n />\n </div>\n )\n}\n","import React from 'react'\n\n/**\n * O corpo do documento enquanto o modelo não chegou.\n *\n * Um spinner centralizado diz \"espere\" e nada mais: a área inteira colapsa numa\n * bolinha e, quando o modelo chega, a tela salta de 40px para uma página de\n * formulário. O esqueleto ocupa desde já a forma que vai ser preenchida — moldura,\n * rótulo, campo — então a chegada do conteúdo troca cinza por texto no lugar onde\n * o texto já estava.\n *\n * `rows` é uma aproximação e não tem como não ser: quantos campos o modelo tem é\n * justamente o que ainda está sendo carregado. Cinco é a altura de formulário\n * curto — erra para baixo de propósito, porque crescer ao carregar incomoda\n * menos do que encolher.\n */\nexport function DocumentBodySkeleton({ rows = 5 }: { rows?: number }) {\n return (\n <div className=\"space-y-4 rounded-xl border p-4\" aria-hidden>\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3 w-28 animate-pulse rounded bg-muted\" />\n <div className=\"h-9 w-full animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n </div>\n )\n}\n\n/** O cabeçalho, para quando nem o título do documento se sabe ainda. */\nexport function DocumentHeaderSkeleton() {\n return (\n <div className=\"flex items-center gap-3\" aria-hidden>\n <div className=\"h-3.5 w-3.5 shrink-0 animate-pulse rounded bg-muted\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <div className=\"h-4 w-48 max-w-full animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-24 animate-pulse rounded bg-muted\" />\n </div>\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ArrowLeft } from 'lucide-react'\nimport { Button, useSaveBar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit } from '@fayz-ai/admin'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormsStore } from '@fayz-ai/forms/store'\nimport type { FormDocument } from '@fayz-ai/forms/domain/document'\nimport type { FormTemplate } from '@fayz-ai/forms/domain/template'\nimport { FormRenderer } from './FormRenderer'\nimport { DocumentBodySkeleton, DocumentHeaderSkeleton } from './DocumentSkeleton'\nimport { prefillFromPerson } from '../lib/person-fields'\n\nfunction generateTitle(templateName: string, personName?: string): string {\n const date = new Date().toLocaleDateString()\n return personName\n ? `${templateName} — ${personName} — ${date}`\n : `${templateName} — ${date}`\n}\n\ninterface DocumentFormDialogProps {\n template: FormTemplate | null\n existingDocument?: FormDocument\n personId: string\n personName?: string\n /** Full person record — mapped fields are pre-filled from it on new documents. */\n person?: Record<string, unknown>\n provider: FormsDataProvider\n store: FormsStore\n onSaved: () => void\n onBack: () => void\n}\n\nexport function DocumentFormDialog({\n template: initialTemplate,\n existingDocument,\n personId,\n personName,\n person,\n provider,\n store,\n onSaved,\n onBack,\n}: DocumentFormDialogProps) {\n const t = useTranslation()\n const guardDocuments = useLimitGuard('documents_month')\n const [template, setTemplate] = useState<FormTemplate | null>(initialTemplate)\n const [data, setData] = useState<Record<string, unknown>>(() =>\n existingDocument\n ? existingDocument.data\n : prefillFromPerson(initialTemplate?.schema, person),\n )\n const [saving, setSaving] = useState(false)\n\n useEffect(() => {\n if (existingDocument && !template) {\n provider.getTemplateById(existingDocument.templateId).then(setTemplate)\n }\n }, [existingDocument, template, provider])\n\n // When creating from a template that arrives asynchronously, apply prefill\n // once the schema is known (guarded so it never clobbers user edits).\n const prefilled = React.useRef(!!initialTemplate || !!existingDocument)\n useEffect(() => {\n if (prefilled.current || !template || existingDocument) return\n prefilled.current = true\n setData((prev) => prefillFromPerson(template.schema, person, prev))\n }, [template, existingDocument, person])\n\n const handleSave = useCallback(\n async (status: 'draft' | 'completed') => {\n if (!template) return\n // Plan monthly-quota guard (client-side, before the provider call) — only\n // on create. Opens the global UpgradeModal and aborts when the cap is hit.\n if (!existingDocument && (await guardDocuments()) === 'blocked') return\n setSaving(true)\n try {\n const autoTitle = generateTitle(template.name, personName)\n if (existingDocument) {\n await store.getState().updateDocument(existingDocument.id, { data, status })\n } else {\n await store.getState().createDocument({\n templateId: template.id,\n personId,\n title: autoTitle,\n data,\n status,\n })\n invalidateLimit('documents_month')\n }\n onSaved()\n } finally {\n setSaving(false)\n }\n },\n [template, existingDocument, data, personId, personName, store, onSaved, guardDocuments],\n )\n\n // Dirty detection drives the floating SaveBar. The baseline is the document's\n // ORIGINAL saved data (empty for a brand-new document), so a new document that\n // arrives pre-filled from the person's record counts as dirty immediately and\n // the floating \"unsaved changes\" bar shows right away.\n const snapshot = React.useRef<string | null>(null)\n useEffect(() => {\n if (template && snapshot.current === null) {\n snapshot.current = JSON.stringify(existingDocument?.data ?? {})\n }\n }, [template, existingDocument])\n const dirty = snapshot.current !== null && JSON.stringify(data) !== snapshot.current\n\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave('completed') },\n onDiscard: () => onBack(),\n saveLabel: t('customForms.saveAndComplete'),\n })\n\n if (!template) {\n // Editar um documento existente busca o modelo pelo id: o título já é\n // conhecido (está no documento) e só o corpo espera. Criar um novo a partir\n // de um modelo que ainda está vindo não conhece nem o título — aí o\n // cabeçalho também é esqueleto.\n return (\n <div className=\"space-y-4\">\n {existingDocument?.title ? (\n <div className=\"flex items-center gap-3\">\n <Button variant=\"bare\" size=\"bare\"\n onClick={onBack}\n className=\"flex items-center gap-1 text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-semibold\">{existingDocument.title}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(existingDocument.createdAt).toLocaleDateString()}\n </p>\n </div>\n </div>\n ) : (\n <DocumentHeaderSkeleton />\n )}\n <DocumentBodySkeleton\n rows={Math.min(Math.max(Object.keys(existingDocument?.data ?? {}).length, 3), 8)}\n />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <Button variant=\"bare\" size=\"bare\"\n onClick={onBack}\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm\">{template.name}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {personName && <span>{personName} · </span>}\n {new Date().toLocaleDateString()}\n </p>\n </div>\n </div>\n\n {/* Form fields — saving is driven entirely by the floating SaveBar\n (unsaved-changes bar), matching the rest of the CRUD detail UX. */}\n <div className=\"rounded-xl border p-4\">\n <FormRenderer\n schema={template.schema}\n data={data}\n onChange={setData}\n />\n </div>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { ArrowLeft, Pencil, Printer } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormDocument } from '@fayz-ai/forms/domain/document'\nimport type { FormTemplate } from '@fayz-ai/forms/domain/template'\nimport { FormRenderer } from './FormRenderer'\nimport { DocumentBodySkeleton } from './DocumentSkeleton'\nimport { printDocument } from '../lib/print'\n\ninterface FormViewerProps {\n document: FormDocument\n provider: FormsDataProvider\n onBack: () => void\n onEdit?: (doc: FormDocument) => void\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n draft: 'bg-warning-soft text-warning-soft-foreground',\n completed: 'bg-success-soft text-success-soft-foreground',\n signed: 'bg-info-soft text-info-soft-foreground',\n archived: 'bg-muted text-muted-foreground',\n}\n\nexport function FormViewer({ document: doc, provider, onBack, onEdit }: FormViewerProps) {\n const t = useTranslation()\n const [template, setTemplate] = useState<FormTemplate | null>(null)\n\n useEffect(() => {\n if (!doc.templateId) return\n const timer = setTimeout(() => {\n provider.getTemplateById(doc.templateId).then(setTemplate)\n }, 50)\n return () => clearTimeout(timer)\n }, [doc.templateId, provider])\n\n // O cabeçalho NÃO espera o modelo. Título, data e situação vêm do próprio\n // documento, que já está na mão desde o clique na lista — só o corpo depende\n // do schema. Segurar a tela inteira por ele fazia o cabeçalho já conhecido\n // aparecer depois de uma ida ao banco que não era sobre ele.\n return (\n <div className=\"space-y-4\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <Button variant=\"bare\" size=\"bare\"\n onClick={onBack}\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm truncate\">\n {doc.title ?? template?.name ?? ''}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(doc.createdAt).toLocaleDateString()}\n </p>\n </div>\n <Badge variant=\"secondary\" className={`text-[10px] ${STATUS_COLORS[doc.status] ?? ''}`}>\n {t(`customForms.status.${doc.status}`)}\n </Badge>\n {/* Desabilitado, não escondido: imprimir precisa do modelo, e um botão\n que aparece depois faz os vizinhos pularem de lugar. */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8\"\n disabled={!template}\n onClick={() => template && printDocument(template, doc)}\n >\n <Printer className=\"h-3 w-3 mr-1\" />\n {t('customForms.printPdf')}\n </Button>\n {onEdit && doc.status === 'draft' && (\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\" onClick={() => onEdit(doc)}>\n <Pencil className=\"h-3 w-3 mr-1\" />\n {t('common.edit')}\n </Button>\n )}\n </div>\n\n {/* Form content (read-only) */}\n {template ? (\n <div className=\"rounded-xl border p-4\">\n <FormRenderer\n schema={template.schema}\n data={doc.data}\n onChange={() => {}}\n readOnly\n />\n </div>\n ) : (\n // O documento já diz quantos campos tem: o esqueleto sai da altura certa\n // em vez de chutar, e a chegada do conteúdo não mexe no scroll.\n <DocumentBodySkeleton rows={Math.min(Math.max(Object.keys(doc.data ?? {}).length, 3), 8)} />\n )}\n </div>\n )\n}\n","import type React from 'react'\n\n// ============================================================\n// Document Type Registry — extensible pattern for plugins\n// to contribute document types to the \"Add Document\" dropdown\n// ============================================================\n\nexport interface DocumentTypeOption {\n /** Unique id, e.g. 'custom_forms:template:abc123' or 'core:image' */\n id: string\n label: string\n icon: React.ElementType\n /** Group label for dropdown sections (e.g. 'Formulários', 'Arquivos') */\n group: string\n /** Group sort order — lower groups appear first */\n groupOrder?: number\n /** Sort order within group */\n order?: number\n /** Description shown below label */\n description?: string\n}\n\nexport interface DocumentTypeProvider {\n /** Unique provider id, e.g. 'custom_forms', 'core_files' */\n id: string\n /** Returns available document types for a given person */\n getTypes(personId: string): DocumentTypeOption[] | Promise<DocumentTypeOption[]>\n}\n\n// ── Global registry ────────────────────────────────────────\n\nconst providers: DocumentTypeProvider[] = []\n\nexport function registerDocumentTypeProvider(provider: DocumentTypeProvider) {\n if (providers.find((p) => p.id === provider.id)) return\n providers.push(provider)\n}\n\nexport function getDocumentTypeProviders(): DocumentTypeProvider[] {\n return providers\n}\n\nexport async function getAllDocumentTypes(personId: string): Promise<DocumentTypeOption[]> {\n const results = await Promise.all(\n providers.map((p) => Promise.resolve(p.getTypes(personId))),\n )\n const all = results.flat()\n // Sort by groupOrder then order within group\n all.sort((a, b) => (a.groupOrder ?? 50) - (b.groupOrder ?? 50) || (a.order ?? 0) - (b.order ?? 0))\n return all\n}\n","import React, { useState, useCallback, useRef, useMemo, useEffect } from 'react'\nimport { Plus, ChevronDown, Search } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownLabel,\n DropdownSeparator,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getAllDocumentTypes, type DocumentTypeOption } from '../lib/document-types'\n\ninterface AddDocumentDropdownProps {\n personId: string\n onSelect: (option: DocumentTypeOption) => void\n /**\n * Restringe o que este botão oferece.\n *\n * Sem isto, o Prontuário e os Arquivos — duas abas da mesma ficha —\n * ofereceriam o mesmo menu inteiro, e o leitor teria de saber que\n * \"Anexo\" no Prontuário grava no OUTRO lugar. Cada superfície oferece só\n * o que ela mesma lista.\n */\n optionFilter?: (option: DocumentTypeOption) => boolean\n /** Rótulo do botão. Padrão: \"Adicionar\". */\n label?: string\n}\n\n/** Below this many options the search box is noise, not help. */\nconst SEARCH_THRESHOLD = 8\n\nconst normalize = (s: string) =>\n s.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase()\n\nexport function AddDocumentDropdown({ personId, onSelect, optionFilter, label }: AddDocumentDropdownProps) {\n const t = useTranslation()\n const [open, setOpen] = useState(false)\n const [options, setOptions] = useState<DocumentTypeOption[]>([])\n const [loaded, setLoaded] = useState(false)\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const loadingRef = useRef(false)\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLDivElement>(null)\n\n const handleOpenChange = useCallback((next: boolean) => {\n setOpen(next)\n if (!next) return\n setQuery('')\n setActiveIndex(0)\n if (loaded || loadingRef.current) return\n loadingRef.current = true\n getAllDocumentTypes(personId).then((opts) => {\n setOptions(optionFilter ? opts.filter(optionFilter) : opts)\n setLoaded(true)\n loadingRef.current = false\n })\n }, [personId, loaded, optionFilter])\n\n const filtered = useMemo(() => {\n const q = normalize(query.trim())\n if (!q) return options\n return options.filter(\n (o) =>\n normalize(o.label).includes(q) ||\n (o.description ? normalize(o.description).includes(q) : false)\n )\n }, [options, query])\n\n // Group the filtered list, keeping the source order of groups\n const groups = useMemo(() => {\n const acc: Array<{ label: string; items: DocumentTypeOption[] }> = []\n for (const opt of filtered) {\n let group = acc.find((g) => g.label === opt.group)\n if (!group) {\n group = { label: opt.group, items: [] }\n acc.push(group)\n }\n group.items.push(opt)\n }\n return acc\n }, [filtered])\n\n const showSearch = loaded && options.length > SEARCH_THRESHOLD\n\n // Radix focuses the content on open; take the focus to the search box instead\n useEffect(() => {\n if (!open || !showSearch) return\n const id = requestAnimationFrame(() => inputRef.current?.focus())\n return () => cancelAnimationFrame(id)\n }, [open, showSearch])\n\n // Keep the keyboard-highlighted row visible while arrowing through a long list\n useEffect(() => {\n listRef.current\n ?.querySelector(`[data-index=\"${activeIndex}\"]`)\n ?.scrollIntoView({ block: 'nearest' })\n }, [activeIndex])\n\n const choose = useCallback((opt: DocumentTypeOption) => {\n setOpen(false)\n onSelect(opt)\n }, [onSelect])\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') return // let the menu close\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((i) => Math.min(filtered.length - 1, i + 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((i) => Math.max(0, i - 1))\n } else if (e.key === 'Enter') {\n e.preventDefault()\n const opt = filtered[activeIndex]\n if (opt) choose(opt)\n }\n // Radix's menu typeahead would otherwise swallow characters typed here\n e.stopPropagation()\n }\n\n // Flat index across groups, so arrow keys walk the whole list\n let flatIndex = -1\n\n return (\n <Dropdown open={open} onOpenChange={handleOpenChange}>\n <DropdownTrigger asChild>\n <Button size=\"sm\" className=\"h-8\">\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n {label ?? t('customForms.addDocument')}\n <ChevronDown className=\"h-3 w-3 ml-1 opacity-50\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-72 p-0\">\n {showSearch && (\n <div className=\"flex items-center gap-2 border-b px-2.5 py-2\">\n <Search className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n <Input\n ref={inputRef}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n setActiveIndex(0)\n }}\n onKeyDown={handleInputKeyDown}\n placeholder={t('customForms.searchDocumentTypes')}\n className=\"h-auto rounded-none border-0 bg-transparent p-0 shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n )}\n\n <div ref={listRef} className=\"max-h-[min(60vh,20rem)] overflow-y-auto overscroll-contain p-1\">\n {groups.map((group, gi) => (\n <React.Fragment key={group.label}>\n {gi > 0 && <DropdownSeparator />}\n <DropdownLabel className=\"text-[10px] uppercase tracking-wider\">\n {group.label}\n </DropdownLabel>\n {group.items.map((opt) => {\n const Icon = opt.icon\n flatIndex += 1\n const index = flatIndex\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={opt.id}\n type=\"button\"\n data-index={index}\n onClick={() => choose(opt)}\n onMouseEnter={() => setActiveIndex(index)}\n className={`font-normal justify-start relative flex w-full cursor-default select-none items-center gap-2 rounded-button px-2 py-1.5 text-left text-sm outline-none transition-colors ${\n index === activeIndex ? 'bg-muted' : ''\n }`}\n >\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm truncate\">{opt.label}</p>\n {opt.description && (\n <p className=\"text-[10px] text-muted-foreground truncate\">\n {opt.description}\n </p>\n )}\n </div>\n </Button>\n )\n })}\n </React.Fragment>\n ))}\n\n {!loaded && (\n <div className=\"flex items-center justify-center py-3\">\n <div className=\"h-4 w-4 border-2 border-primary border-t-transparent animate-spin rounded-full\" />\n </div>\n )}\n {loaded && options.length === 0 && (\n <div className=\"px-2 py-3 text-center text-xs text-muted-foreground\">\n {t('customForms.noTemplates')}\n </div>\n )}\n {loaded && options.length > 0 && filtered.length === 0 && (\n <div className=\"px-2 py-3 text-center text-xs text-muted-foreground\">\n {t('customForms.noResults')}\n </div>\n )}\n </div>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import React, { useState, useCallback, useRef } from 'react'\nimport { ArrowLeft, Image as ImageIcon, Paperclip } from 'lucide-react'\nimport { Button, Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit } from '@fayz-ai/admin'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormsStore } from '@fayz-ai/forms/store'\nimport type { FormDocument } from '@fayz-ai/forms/domain/document'\nimport type { FormTemplate } from '@fayz-ai/forms/domain/template'\nimport type { DocumentTypeOption } from '../lib/document-types'\nimport { DocumentList } from './DocumentList'\nimport { DocumentFormDialog } from './DocumentFormDialog'\nimport { FormViewer } from './FormViewer'\nimport { AddDocumentDropdown } from './AddDocumentDropdown'\n\n/**\n * Qual das duas abas da ficha este widget está desenhando.\n *\n * `records` é o PRONTUÁRIO: só resposta de formulário, agrupada por categoria\n * (anamnese, evolução, laudo, contrato). `files` é o armário: foto e anexo.\n *\n * Eram a mesma lista, e o resultado era uma anamnese disputando rolagem com a\n * foto do RG. O V1 nunca os misturou — lá são abas distintas desde sempre.\n */\nexport type DocumentSurface = 'records' | 'files'\n\nconst SURFACE_KINDS: Record<DocumentSurface, string[]> = {\n records: ['form'],\n files: ['image', 'attachment'],\n}\n\ninterface PersonDocumentsWidgetProps {\n item: { id: string; name?: string; [key: string]: any }\n config: CustomFormsConfig\n provider: FormsDataProvider\n store: FormsStore\n /** Padrão `records`: quem não declara superfície pediu o prontuário. */\n surface?: DocumentSurface\n}\n\ntype WidgetView =\n | { type: 'list' }\n | { type: 'fill'; template: FormTemplate }\n | { type: 'view'; document: FormDocument }\n | { type: 'edit'; document: FormDocument }\n\nexport function PersonDocumentsWidget({ item, config, provider, store, surface = 'records' }: PersonDocumentsWidgetProps) {\n const t = useTranslation()\n const kinds = SURFACE_KINDS[surface]\n // Cada aba oferece só o que ela própria lista — ver `optionFilter`.\n const optionFilter = useCallback(\n (o: DocumentTypeOption) => surface === 'records'\n ? o.id.startsWith('template:')\n : o.id === 'core:image' || o.id === 'core:attachment',\n [surface],\n )\n const guardDocuments = useLimitGuard('documents_month')\n const [view, setView] = useState<WidgetView>({ type: 'list' })\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [pendingFileAccept, setPendingFileAccept] = useState<string>('*/*')\n\n const handleDocTypeSelect = useCallback(async (option: DocumentTypeOption) => {\n // Form template\n if (option.id.startsWith('template:')) {\n const templateId = option.id.replace('template:', '')\n const template = await provider.getTemplateById(templateId)\n if (template) {\n setView({ type: 'fill', template })\n }\n return\n }\n\n // Image — open file picker for images\n if (option.id === 'core:image') {\n setPendingFileAccept('image/*')\n setTimeout(() => fileInputRef.current?.click(), 0)\n return\n }\n\n // Attachment — open file picker for any file\n if (option.id === 'core:attachment') {\n setPendingFileAccept('*/*')\n setTimeout(() => fileInputRef.current?.click(), 0)\n return\n }\n }, [provider])\n\n const handleFiles = useCallback(async (files: File[]) => {\n // Plan monthly-quota guard (client-side, before the provider call) — count\n // the whole batch. Opens the global UpgradeModal and aborts when the cap\n // would be exceeded.\n if ((await guardDocuments(files.length)) === 'blocked') return\n for (const file of files) {\n const isImage = file.type.startsWith('image/')\n await store.getState().createDocument({\n kind: isImage ? 'image' : 'attachment',\n personId: item.id,\n title: file.name,\n fileName: file.name,\n fileSize: file.size,\n mimeType: file.type,\n status: 'completed',\n })\n }\n invalidateLimit('documents_month')\n }, [store, item.id, guardDocuments])\n\n const handleFileInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? [])\n if (files.length > 0) handleFiles(files)\n e.target.value = ''\n }, [handleFiles])\n\n const handleViewDoc = useCallback((doc: FormDocument) => {\n setView({ type: 'view', document: doc })\n }, [])\n\n const handleEditDoc = useCallback((doc: FormDocument) => {\n setView({ type: 'edit', document: doc })\n }, [])\n\n const handleBack = useCallback(() => {\n setView({ type: 'list' })\n }, [])\n\n const handleSaved = useCallback(() => {\n setView({ type: 'list' })\n }, [])\n\n // Fill form\n if (view.type === 'fill') {\n return (\n <DocumentFormDialog\n template={view.template}\n personId={item.id}\n personName={item.name}\n person={item}\n provider={provider}\n store={store}\n onSaved={handleSaved}\n onBack={handleBack}\n />\n )\n }\n\n // View document — route by kind\n if (view.type === 'view') {\n const doc = view.document\n const isForm = doc.kind === 'form' || (!doc.kind && doc.templateId)\n\n if (!isForm) {\n // File document (image/attachment) — simple preview\n return (\n <FileDocumentViewer document={doc} onBack={handleBack} />\n )\n }\n\n return (\n <FormViewer\n document={doc}\n provider={provider}\n onBack={handleBack}\n onEdit={handleEditDoc}\n />\n )\n }\n\n // Edit document — only for form docs\n if (view.type === 'edit') {\n return (\n <DocumentFormDialog\n template={null}\n existingDocument={view.document}\n personId={item.id}\n personName={item.name}\n person={item}\n provider={provider}\n store={store}\n onSaved={handleSaved}\n onBack={handleBack}\n />\n )\n }\n\n // Default: list with dropdown + drag zone\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">\n {t(surface === 'files' ? 'customForms.filesTitle' : 'customForms.recordsTitle')}\n </h3>\n <AddDocumentDropdown\n personId={item.id}\n onSelect={handleDocTypeSelect}\n optionFilter={optionFilter}\n label={t(surface === 'files' ? 'customForms.addFile' : 'customForms.addRecord')}\n />\n </div>\n <DocumentList\n personId={item.id}\n provider={provider}\n store={store}\n kinds={kinds}\n onView={handleViewDoc}\n onFileDrop={handleFiles}\n />\n {/* Hidden file input for image/attachment upload */}\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n accept={pendingFileAccept}\n multiple\n onChange={handleFileInputChange}\n />\n </div>\n )\n}\n\nfunction FileDocumentViewer({ document: doc, onBack }: { document: FormDocument; onBack: () => void }) {\n const isImage = doc.kind === 'image' || doc.mimeType?.startsWith('image/')\n const Icon = isImage ? ImageIcon : Paperclip\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"bare\" size=\"bare\"\n onClick={onBack}\n className=\"flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-sm truncate\">{doc.title ?? doc.fileName ?? 'Document'}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(doc.createdAt).toLocaleDateString()}\n </p>\n </div>\n <Badge variant=\"secondary\" className=\"text-[10px] bg-success/15 text-success\">\n {doc.status === 'completed' ? 'Finalizado' : doc.status}\n </Badge>\n </div>\n\n <div className=\"rounded-xl border p-6 flex flex-col items-center gap-4\">\n {isImage && doc.fileUrl ? (\n <img src={doc.fileUrl} alt={doc.fileName ?? ''} className=\"max-w-full max-h-[500px] rounded-lg object-contain\" />\n ) : (\n <div className=\"flex flex-col items-center gap-3 py-8\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-full bg-muted\">\n <Icon className=\"h-7 w-7 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{doc.fileName ?? doc.title ?? 'Arquivo'}</p>\n {doc.fileSize && (\n <p className=\"text-xs text-muted-foreground\">\n {(doc.fileSize / 1024).toFixed(1)} KB\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { Button } from '@fayz-ai/ui'\nimport React from 'react'\nimport { AlertTriangle, ChevronDown, ChevronUp } from 'lucide-react'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { AnswerAlertConfig } from '@fayz-ai/forms/domain/template'\nimport { alertOf, answerAlerts, yesNoAnswer } from './fields/fields'\n\ninterface AlertItem {\n key: string\n label: string\n severity: NonNullable<AnswerAlertConfig['severity']>\n answer: 'sim' | 'nao'\n templateName: string\n}\n\nconst RANK = { danger: 3, warning: 2, info: 1 } as const\nconst TONE = {\n danger: { wrap: 'border-destructive/40 bg-destructive/5', chip: 'bg-destructive text-destructive-foreground', dot: 'bg-destructive' },\n warning: { wrap: 'border-warning/50 bg-warning-soft', chip: 'bg-warning text-warning-foreground', dot: 'bg-warning' },\n info: { wrap: 'border-info/40 bg-info-soft', chip: 'bg-info text-white', dot: 'bg-info' },\n} as const\n\n/**\n * V1 ClientAnamnesisAlerts: answers the clinic flagged (pregnant, anticoagulants, keloids…) stay\n * on the client's record from the latest answer of each form. Starts collapsed — the header is\n * the signal; the open list pushed the record off-screen in V1.\n */\nexport function PersonAnswerAlerts({ personId, provider }: { personId?: string; provider: FormsDataProvider }) {\n const [alerts, setAlerts] = React.useState<AlertItem[]>([])\n const [open, setOpen] = React.useState(false)\n\n React.useEffect(() => {\n if (!personId || !provider.getLatestAnswers) return\n let alive = true\n ;(async () => {\n try {\n const { data: templates } = await provider.getTemplates({ pageSize: 200 })\n const withAlerts = templates.filter((t) => t.isActive && t.schema.fields.some((f) => alertOf(f)))\n if (!withAlerts.length) return\n const answers = await provider.getLatestAnswers!(personId, withAlerts.map((t) => t.id))\n const out: AlertItem[] = []\n for (const a of answers) {\n const t = withAlerts.find((x) => x.id === a.templateId)\n if (!t) continue\n for (const f of t.schema.fields) {\n const hit = answerAlerts(f, a.data[f.id])\n if (!hit) continue\n out.push({\n key: `${t.id}:${f.id}`, label: hit.message || f.label, severity: hit.severity ?? 'danger',\n answer: yesNoAnswer(a.data[f.id]) as 'sim' | 'nao', templateName: t.name,\n })\n }\n }\n out.sort((x, y) => RANK[y.severity] - RANK[x.severity])\n if (alive) setAlerts(out)\n } catch { /* the record opens without the banner rather than not opening */ }\n })()\n return () => { alive = false }\n }, [personId, provider])\n\n if (!alerts.length) return null\n const tone = TONE[alerts[0].severity]\n return (\n <div className={`overflow-hidden rounded-lg border-2 ${tone.wrap}`}>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={() => setOpen((o) => !o)} aria-expanded={open}\n className=\"font-normal whitespace-normal justify-start flex w-full items-center gap-2 px-3 py-2 text-left\">\n <span className={`flex h-7 w-7 shrink-0 items-center justify-center rounded-full ${tone.chip}`}>\n <AlertTriangle className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-semibold leading-tight\">\n {alerts.length} alerta{alerts.length > 1 ? 's' : ''} no histórico do cliente\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {alerts.slice(0, 3).map((a) => a.label).join(' · ')}{alerts.length > 3 ? '…' : ''}\n </span>\n </span>\n {open ? <ChevronUp className=\"h-4 w-4 text-muted-foreground\" /> : <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />}\n </Button>\n {open && (\n <ul className=\"divide-y divide-border/40 border-t px-3\">\n {alerts.map((a) => (\n <li key={a.key} className=\"flex items-start gap-2 py-2\">\n <span className={`mt-1.5 h-2 w-2 shrink-0 rounded-full ${TONE[a.severity].dot}`} />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium leading-tight\">{a.label}</p>\n <p className=\"mt-0.5 text-[11px] leading-tight text-muted-foreground\">\n Respondeu <strong className=\"uppercase\">{a.answer === 'sim' ? 'Sim' : 'Não'}</strong> · {a.templateName}\n </p>\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { registerTimelineSource, type TimelineItem } from '@fayz-ai/admin'\n\n/**\n * Documentos criados na linha do tempo da pessoa.\n *\n * Registrado pela fábrica do plugin, não importado pelo core: num pool sem o\n * plugin de formulários, `public.documents` não existe, e a fonte simplesmente\n * não está lá. É o que dispensa a linha do tempo de saber quais plugins um\n * tenant instalou.\n */\nexport function registerFormsTimelineSource(): void {\n registerTimelineSource({\n id: 'documents',\n label: 'Documentos',\n icon: 'FileText',\n tone: 'primary',\n async fetch(args): Promise<TimelineItem[]> {\n const db = getSupabaseClientOptional() as any\n if (!db) return []\n\n let query = db\n .from('v_documents')\n .select('id, title, kind, status, template_name, created_at')\n .eq('tenant_id', args.tenantId)\n .eq('person_id', args.personId)\n .eq('is_active', true)\n .order('created_at', { ascending: false })\n .limit(args.limit)\n\n if (args.before) query = query.lt('created_at', args.before)\n\n const { data, error } = await query\n if (error) return []\n\n return (data ?? []).map((row: any) => ({\n id: `document:${row.id}`,\n sourceId: 'documents',\n occurredAt: row.created_at,\n title: row.title ?? row.template_name ?? 'Documento',\n // O modelo só entra como descrição quando o título não veio dele —\n // senão a linha diria a mesma coisa duas vezes.\n description: row.template_name && row.template_name !== row.title ? row.template_name : undefined,\n badge: row.status ?? undefined,\n icon: row.kind === 'image' ? 'Image' : row.kind === 'attachment' ? 'Paperclip' : 'FileText',\n targetTab: 'documents',\n }))\n },\n })\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { registerTabCountProvider } from '@fayz-ai/admin'\n\n/**\n * Quantos registros e quantos arquivos esta pessoa tem.\n *\n * UMA consulta para as duas abas: as duas saem de `public.documents`, e pedir\n * dois `count` seria pagar o mesmo `where` duas vezes. Só a coluna `kind` vem —\n * o corpo do documento não interessa para contar.\n *\n * `is_active` e o status arquivado seguem a mesma regra da lista: o que não\n * aparece na aba não pode ser contado na aba.\n */\nexport function registerFormsTabCounts(): void {\n registerTabCountProvider({\n id: 'custom_forms:documents',\n async fetch({ tenantId, personId }): Promise<Record<string, number>> {\n const db = getSupabaseClientOptional() as any\n if (!db) return {}\n const { data, error } = await db\n .from('documents')\n .select('kind')\n .eq('tenant_id', tenantId)\n .eq('person_id', personId)\n .eq('is_active', true)\n .neq('status', 'archived')\n if (error) return {}\n\n let records = 0\n let files = 0\n for (const row of data ?? []) {\n if (row.kind === 'image' || row.kind === 'attachment') files += 1\n else records += 1\n }\n return { documents: records, files }\n },\n })\n}\n","import type { AnalyticsCardDef } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// The forms analytics pack.\n//\n// A submission lives on the person who made it, one document at a time, so the\n// product could show you a form and never a LIST of forms. These cards are the\n// missing surface: how many came in, which template they answered, and the\n// table of them — which is also, through the report viewer, the export.\n//\n// Read model: migration 006. Everything goes through the generic analytics_run\n// engine, so no card here carries SQL.\n// ---------------------------------------------------------------------------\n\nconst SUBMISSIONS = 'plg_forms_rep_submissions'\n\nconst CAT = tl('Forms', 'Formulários')\n\n/** Os códigos de `documents.status` → a palavra que alguém lê. */\nconst STATUS_LABELS: Record<string, string> = {\n draft: tl('Draft', 'Rascunho'),\n completed: tl('Completed', 'Concluído'),\n signed: tl('Signed', 'Assinado'),\n archived: tl('Archived', 'Arquivado'),\n}\n\nexport function buildFormsAnalyticsCards(): AnalyticsCardDef[] {\n const base = { domain: 'custom_forms', compare: true, canonicalOwner: 'public.documents' }\n\n return [\n {\n ...base,\n id: 'forms.submissions',\n name: tl('Form submissions', 'Formulários preenchidos'),\n description: tl(\n 'Forms filled in during the period, whoever filled them.',\n 'Formulários preenchidos no período, por quem quer que seja.',\n ),\n icon: 'FileText',\n category: CAT,\n grain: 'submission',\n query: {\n source: { kind: 'view', name: SUBMISSIONS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'submissions', label: tl('Submissions', 'Preenchimentos'), agg: 'count', format: 'number' }],\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 30 },\n },\n {\n ...base,\n id: 'forms.by-template',\n name: tl('Submissions by form', 'Preenchimentos por formulário'),\n description: tl(\n 'Which templates are actually being used — and which one nobody answers.',\n 'Quais modelos estão realmente em uso — e qual ninguém responde.',\n ),\n icon: 'ClipboardList',\n category: CAT,\n grain: 'submission',\n query: {\n source: { kind: 'view', name: SUBMISSIONS },\n dimensions: [{ key: 'template_name', label: tl('Form', 'Formulário') }],\n measures: [{ key: 'submissions', label: tl('Submissions', 'Preenchimentos'), agg: 'count', format: 'number' }],\n defaultSort: 'submissions',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', limit: 8 },\n },\n {\n // The list the product never had: one row per filled form, with the\n // person behind it. No measures, so it is a plain select — the rows ARE\n // the report, and the viewer's export button turns them into a file.\n ...base,\n id: 'forms.submissions-list',\n name: tl('Submission list', 'Lista de preenchimentos'),\n description: tl(\n 'Every form filled in the period, with who filled it — ready to export.',\n 'Todo formulário preenchido no período, com quem preencheu — pronto para exportar.',\n ),\n icon: 'Table',\n category: CAT,\n grain: 'submission',\n query: {\n source: { kind: 'view', name: SUBMISSIONS },\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n columns: [\n { key: 'created_at', label: tl('Filled', 'Preenchido em'), type: 'date', sortable: true },\n { key: 'template_name', label: tl('Form', 'Formulário'), type: 'text' },\n { key: 'person_name', label: tl('Person', 'Pessoa'), type: 'person', idKey: 'person_id' },\n { key: 'person_email', label: tl('E-mail', 'E-mail'), type: 'email' },\n { key: 'person_phone', label: tl('Phone', 'Telefone'), type: 'text' },\n { key: 'status', label: tl('Status', 'Situação'), type: 'text', valueMap: STATUS_LABELS },\n { key: 'template_category', label: tl('Category', 'Categoria'), type: 'text', visible: false },\n { key: 'signed_at', label: tl('Signed at', 'Assinado em'), type: 'date', visible: false },\n ],\n viz: { type: 'table' },\n },\n ]\n}\n","import { formatCurrency } from '@fayz-ai/core'\n// The V1 contract tags ({{Cliente.Nome}}, {{Indicacoes.Itens}}…), so templates brought from V1 render as written.\n\nexport interface ContractLine {\n description: string\n quantity: number\n unitPrice: number\n discount?: number\n total: number\n}\n\nexport interface ContractContext {\n client?: {\n name?: string; socialName?: string; cpf?: string; rg?: string; birthDate?: string; email?: string\n street?: string; number?: string; complement?: string; district?: string; city?: string; state?: string\n postalCode?: string; phone?: string; mobile?: string\n }\n unit?: {\n tradeName?: string; legalName?: string; cnpj?: string; street?: string; number?: string; complement?: string\n district?: string; city?: string; state?: string; postalCode?: string; phone?: string; mobile?: string; email?: string\n }\n professional?: { name?: string }\n services?: Array<{ name: string; price: number; contractText?: string }>\n paymentMethods?: string[]\n /** \"Serviços Contratados\" — what the client closed. */\n approvedItems?: ContractLine[]\n /** \"Serviços Propostos\" — what the professional indicated. Independent of what was closed. */\n recommendedItems?: ContractLine[]\n now?: Date\n}\n\nconst MONTHS = ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro']\n\nconst brl = (n: number) => formatCurrency(n)\nconst pad = (n: number) => String(n).padStart(2, '0')\nconst esc = (s: string) => s.replace(/[&<>\"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[c]!))\n\nfunction dateBR(value?: string): string {\n if (!value) return ''\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value)\n return m ? `${m[3]}/${m[2]}/${m[1]}` : value\n}\n\nfunction itemsTable(items: ContractLine[] | undefined, withDiscount: boolean): string {\n if (!items?.length) return ''\n const head = ['Item', 'Qtd', 'Valor Unit.', ...(withDiscount ? ['Desconto'] : []), 'Total']\n const rows = items.map((i) => [\n esc(i.description), String(i.quantity), brl(i.unitPrice), ...(withDiscount ? [brl(i.discount ?? 0)] : []), brl(i.total),\n ])\n return `<table><thead><tr>${head.map((h) => `<th>${h}</th>`).join('')}</tr></thead><tbody>${\n rows.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('')\n }</tbody></table>`\n}\n\nexport function renderContractTags(templateHtml: string, ctx: ContractContext): string {\n const now = ctx.now ?? new Date()\n const c = ctx.client ?? {}\n const u = ctx.unit ?? {}\n const services = ctx.services ?? []\n const names = services.map((s) => esc(s.name)).join(', ')\n const map: Record<string, string> = {\n 'Cliente.Nome': c.name ?? '', 'Cliente.NomeSocial': c.socialName ?? '', 'Cliente.CPF': c.cpf ?? '',\n 'Cliente.RG': c.rg ?? '', 'Cliente.Nascimento': dateBR(c.birthDate), 'Cliente.Email': c.email ?? '',\n 'Cliente.Endereco': c.street ?? '', 'Cliente.Numero': c.number ?? '', 'Cliente.Complemento': c.complement ?? '',\n 'Cliente.Bairro': c.district ?? '', 'Cliente.Cidade': c.city ?? '', 'Cliente.Estado': c.state ?? '',\n 'Cliente.Cep': c.postalCode ?? '', 'Cliente.Telefone': c.phone ?? '', 'Cliente.Celular': c.mobile ?? '',\n 'Unidade.NomeFantasia': u.tradeName ?? '', 'Unidade.RazaoSocial': u.legalName ?? '', 'Unidade.CNPJ': u.cnpj ?? '',\n 'Unidade.Endereco': u.street ?? '', 'Unidade.Numero': u.number ?? '', 'Unidade.Complemento': u.complement ?? '',\n 'Unidade.Bairro': u.district ?? '', 'Unidade.Cidade': u.city ?? '', 'Unidade.Estado': u.state ?? '',\n 'Unidade.Cep': u.postalCode ?? '', 'Unidade.Telefone': u.phone ?? '', 'Unidade.Celular': u.mobile ?? '',\n 'Unidade.Email': u.email ?? '',\n 'Profissional.Nome': ctx.professional?.name ?? '',\n 'Servicos.Lista': names, 'Servicos.Nome': names,\n 'Servicos.PrecoTotal': brl(services.reduce((s, x) => s + x.price, 0)),\n 'Servicos.TextoContrato': services.filter((s) => s.contractText).map((s) => s.contractText).join('<br/><br/>'),\n 'FormasPagto.Lista': (ctx.paymentMethods ?? []).map(esc).join(', '),\n 'Orcamento.Itens': itemsTable(ctx.approvedItems, true),\n 'Orcamento.ItensAprovados': itemsTable(ctx.approvedItems, true),\n 'Indicacoes.Itens': itemsTable(ctx.recommendedItems, false),\n 'Indicacoes.Lista': (ctx.recommendedItems ?? []).map((i) => esc(i.description)).join(', '),\n 'Sistema.Data': `${pad(now.getDate())}/${pad(now.getMonth() + 1)}/${now.getFullYear()}`,\n 'Sistema.DataExtenso': `${pad(now.getDate())} de ${MONTHS[now.getMonth()]} de ${now.getFullYear()}`,\n 'Sistema.Hora': `${pad(now.getHours())}:${pad(now.getMinutes())}`,\n }\n // These are built here (tables) or escaped above; every other value is plain text and escaped now.\n // The whole result is sanitized again on display.\n const built = new Set(['Orcamento.Itens', 'Orcamento.ItensAprovados', 'Indicacoes.Itens', 'Servicos.TextoContrato',\n 'Servicos.Lista', 'Servicos.Nome', 'Indicacoes.Lista', 'FormasPagto.Lista'])\n return templateHtml.replace(/\\{\\{\\s*([A-Za-z]+\\.[A-Za-z]+)\\s*\\}\\}/g, (whole, key: string) => {\n if (!(key in map)) return whole\n return built.has(key) ? map[key] : esc(map[key])\n })\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { renderContractTags, type ContractContext, type ContractLine } from './contract-render'\n\n/**\n * A contract generated for an attendance: a `documents` row (kind `contract`) hanging on the\n * appointment, with the rendered text frozen at generation — what was signed must not change when\n * the template does. V1: `generated_contracts`.\n */\nexport interface AttendanceContract {\n id: string\n templateId: string\n templateName: string\n status: 'pending' | 'signed'\n html: string\n serviceIds: string[]\n /** The session term (signed before executing), as opposed to the service contract. */\n isSessionTerm: boolean\n requireSignature: boolean\n requireSelfie: boolean\n /** \"Obrigar Assinatura para Execução\": the attendance does not finish without it. */\n blocksFinish: boolean\n signedByName: string | null\n signedAt: string | null\n signaturePath: string | null\n selfiePath: string | null\n}\n\nexport interface ContractService {\n serviceId: string\n name: string\n quantity: number\n unitPrice: number\n discount?: number\n}\n\nexport interface EnsureContractsInput {\n bookingId: string\n personId: string\n unitId: string | null\n professionalId: string | null\n /** What the client closed in this attendance. */\n contracted: ContractService[]\n /** What the professional indicated (may differ from what was closed). */\n indicated: ContractService[]\n /** The services of this session — the session term lists them. */\n sessionServices: ContractService[]\n}\n\ninterface TemplateRow {\n id: string; name: string; content: string | null; is_active: boolean; group_services: boolean\n require_screen_signature: boolean; require_selfie: boolean; require_signature_for_execution: boolean\n generate_on_execution: boolean; generate_on_quote_approval: boolean; execution_scope: string | null\n metadata: { service_ids?: string[] } | null\n}\n\nconst db = () => {\n const c = getSupabaseClientOptional() as any\n if (!c) throw new Error('Supabase not initialized')\n return c\n}\nconst tenantId = () => getActiveTenantId() ?? getActiveTenantId() ?? ''\nconst BUCKET = 'attachments'\n\nfunction toLine(s: ContractService): ContractLine {\n const total = s.unitPrice * s.quantity - (s.discount ?? 0)\n return { description: s.name, quantity: s.quantity, unitPrice: s.unitPrice, discount: s.discount ?? 0, total }\n}\n\nfunction mapContract(row: any, templates: Map<string, TemplateRow>, sessionTermId: string | null): AttendanceContract {\n const m = row.metadata?.contract ?? {}\n const t = templates.get(m.templateId)\n return {\n id: row.id,\n templateId: m.templateId,\n templateName: t?.name ?? row.title ?? 'Contrato',\n status: row.status === 'signed' ? 'signed' : 'pending',\n html: m.html ?? '',\n serviceIds: m.serviceIds ?? [],\n isSessionTerm: !!sessionTermId && m.templateId === sessionTermId,\n requireSignature: t?.require_screen_signature ?? true,\n requireSelfie: t?.require_selfie ?? false,\n blocksFinish: t?.require_signature_for_execution ?? false,\n signedByName: m.signedByName ?? null,\n signedAt: m.signedAt ?? null,\n signaturePath: m.signaturePath ?? null,\n selfiePath: m.selfiePath ?? null,\n }\n}\n\nasync function loadTemplates(): Promise<Map<string, TemplateRow>> {\n const { data, error } = await db().from('plg_forms_contract_templates').select('*').eq('tenant_id', tenantId())\n if (error) throw new Error(error.message)\n return new Map(((data ?? []) as TemplateRow[]).map((t) => [t.id, t]))\n}\n\nasync function sessionTermTemplateId(): Promise<string | null> {\n const { data } = await db().from('tenants').select('settings').eq('id', tenantId()).maybeSingle()\n return data?.settings?.attendance_flow?.session_term_template_id ?? null\n}\n\nasync function loadContext(input: EnsureContractsInput): Promise<ContractContext> {\n const c = db()\n const [person, address, unit, pro] = await Promise.all([\n c.from('people').select('name, document_number, date_of_birth, email, phone, address, city, state, postal_code')\n .eq('id', input.personId).maybeSingle(),\n c.from('addresses').select('street, number, complement, district, city, state, postal_code, is_default')\n .eq('owner_type', 'person').eq('owner_id', input.personId).order('is_default', { ascending: false }).limit(1).maybeSingle(),\n input.unitId\n ? c.from('v_units').select('name, legal_name, cnpj, address_street, address_number, address_complement, address_district, city, state, postal_code, phone, mobile_1, email')\n .eq('id', input.unitId).maybeSingle()\n : Promise.resolve({ data: null }),\n input.professionalId\n ? c.from('people').select('name').eq('id', input.professionalId).maybeSingle()\n : Promise.resolve({ data: null }),\n ])\n const p = person.data ?? {}\n const a = address.data ?? {}\n const u = unit.data ?? {}\n return {\n client: {\n name: p.name, cpf: p.document_number, birthDate: p.date_of_birth, email: p.email, phone: p.phone, mobile: p.phone,\n street: a.street ?? p.address, number: a.number, complement: a.complement, district: a.district,\n city: a.city ?? p.city, state: a.state ?? p.state, postalCode: a.postal_code ?? p.postal_code,\n },\n unit: {\n tradeName: u.name, legalName: u.legal_name ?? u.name, cnpj: u.cnpj, street: u.address_street, number: u.address_number,\n complement: u.address_complement, district: u.address_district, city: u.city, state: u.state, postalCode: u.postal_code,\n phone: u.phone, mobile: u.mobile_1, email: u.email,\n },\n professional: { name: pro.data?.name },\n }\n}\n\nasync function serviceTexts(ids: string[]): Promise<Map<string, string>> {\n if (!ids.length) return new Map()\n const { data } = await db().from('products').select('id, metadata').in('id', ids)\n return new Map(((data ?? []) as any[]).map((r) => [r.id, r.metadata?.beauty?.contract_text ?? '']))\n}\n\nexport async function listAttendanceContracts(bookingId: string): Promise<AttendanceContract[]> {\n const [templates, termId, rows] = await Promise.all([\n loadTemplates(),\n sessionTermTemplateId(),\n db().from('documents').select('id, title, status, metadata, created_at')\n .eq('tenant_id', tenantId()).eq('kind', 'contract').eq('subject_type', 'appointment').eq('subject_id', bookingId)\n .eq('is_active', true).order('created_at'),\n ])\n if (rows.error) throw new Error(rows.error.message)\n return ((rows.data ?? []) as any[]).map((r) => mapContract(r, templates, termId))\n}\n\nconst sameSet = (a: string[], b: string[]) => a.length === b.length && a.every((x) => b.includes(x))\n\n/**\n * Generates what this attendance must sign, idempotently (V1 contractGenerator + ensureSessionTerm):\n * - templates generated at contracting (`generate_on_quote_approval`, or all billed services on\n * execution): one contract with every contracted service, or one per service when not grouped;\n * - templates bound to specific services (`metadata.service_ids`): for the contracted ones;\n * - the session term (`attendance_flow.session_term_template_id`): one per attendance, listing the\n * session's services.\n * A pending contract whose services changed is re-rendered; a signed one is never touched — a new\n * service after signing gets a new contract.\n */\nexport function ensureAttendanceContracts(input: EnsureContractsInput): Promise<AttendanceContract[]> {\n // One generation per attendance at a time (V1 appointmentGenerationQueue): two ruler opens at once\n // each saw \"no term yet\" and each inserted one.\n const prev = queue.get(input.bookingId) ?? Promise.resolve([])\n const next = prev.catch(() => []).then(() => generate(input))\n queue.set(input.bookingId, next)\n next.finally(() => { if (queue.get(input.bookingId) === next) queue.delete(input.bookingId) }).catch(() => {})\n return next\n}\n\nconst queue = new Map<string, Promise<AttendanceContract[]>>()\n\nasync function generate(input: EnsureContractsInput): Promise<AttendanceContract[]> {\n const [templates, termId, existing] = await Promise.all([\n loadTemplates(), sessionTermTemplateId(), listAttendanceContracts(input.bookingId),\n ])\n const active = [...templates.values()].filter((t) => t.is_active)\n const wanted: Array<{ template: TemplateRow; services: ContractService[] }> = []\n\n if (input.contracted.length) {\n for (const t of active) {\n if (t.id === termId) continue\n const allBilled = t.generate_on_quote_approval || (t.generate_on_execution && t.execution_scope === 'all_billed_services')\n const linked = t.generate_on_execution && (t.execution_scope ?? 'linked_services') === 'linked_services'\n ? input.contracted.filter((s) => t.metadata?.service_ids?.includes(s.serviceId)) : []\n const services = allBilled ? input.contracted : linked\n if (!services.length) continue\n if (t.group_services || allBilled) wanted.push({ template: t, services })\n else for (const s of services) wanted.push({ template: t, services: [s] })\n }\n }\n const term = termId ? templates.get(termId) : undefined\n if (term?.is_active && input.sessionServices.length) wanted.push({ template: term, services: input.sessionServices })\n\n if (!wanted.length) return existing\n\n const ctx = await loadContext(input)\n const texts = await serviceTexts([...new Set(wanted.flatMap((w) => w.services.map((s) => s.serviceId)))])\n const c = db()\n for (const w of wanted) {\n const ids = [...new Set(w.services.map((s) => s.serviceId))].sort()\n const mine = existing.filter((e) => e.templateId === w.template.id)\n // One contract per template here, unless the template splits per service.\n const perService = !w.template.group_services && w.template.id !== termId && !w.template.generate_on_quote_approval\n const scope = perService ? mine.filter((e) => sameSet(e.serviceIds, ids)) : mine\n if (scope.some((e) => e.status === 'signed' && ids.every((id) => e.serviceIds.includes(id)))) continue\n const html = renderContractTags(w.template.content ?? '', {\n ...ctx,\n services: w.services.map((s) => ({ name: s.name, price: s.unitPrice * s.quantity, contractText: texts.get(s.serviceId) || undefined })),\n approvedItems: input.contracted.map(toLine),\n recommendedItems: input.indicated.map(toLine),\n })\n const meta = { contract: { templateId: w.template.id, html, serviceIds: ids } }\n const pending = scope.find((e) => e.status === 'pending')\n if (pending) {\n if (sameSet(pending.serviceIds, ids)) continue\n const { error } = await c.from('documents').update({ metadata: meta, updated_at: new Date().toISOString() })\n .eq('id', pending.id).eq('status', 'pending')\n if (error) throw new Error(error.message)\n continue\n }\n const { error } = await c.from('documents').insert({\n tenant_id: tenantId(), kind: 'contract', person_id: input.personId, unit_id: input.unitId,\n title: w.template.name, status: 'pending', subject_type: 'appointment', subject_id: input.bookingId, metadata: meta,\n })\n if (error) throw new Error(error.message)\n }\n return listAttendanceContracts(input.bookingId)\n}\n\nexport async function signAttendanceContract(contract: AttendanceContract, input: {\n signerName: string\n signature: Blob | null\n selfie: Blob | null\n}): Promise<void> {\n const c = db()\n const up = async (blob: Blob, name: string) => {\n const path = `${tenantId()}/contracts/${contract.id}/${Date.now()}-${name}`\n const { error } = await c.storage.from(BUCKET).upload(path, blob, { contentType: blob.type || undefined })\n if (error) throw new Error(error.message)\n return path\n }\n const signaturePath = input.signature ? await up(input.signature, 'assinatura.png') : null\n const selfiePath = input.selfie ? await up(input.selfie, 'selfie.jpg') : null\n const { data: row, error: readErr } = await c.from('documents').select('metadata').eq('id', contract.id).maybeSingle()\n if (readErr) throw new Error(readErr.message)\n const metadata = {\n ...(row?.metadata ?? {}),\n contract: {\n ...(row?.metadata?.contract ?? {}),\n signedByName: input.signerName.trim() || null,\n signedAt: new Date().toISOString(),\n signaturePath, selfiePath,\n },\n }\n // Only a pending contract signs: a second tab signing the same one must not overwrite the first.\n const { data, error } = await c.from('documents').update({ status: 'signed', metadata, updated_at: new Date().toISOString() })\n .eq('id', contract.id).eq('status', 'pending').select('id')\n if (error) throw new Error(error.message)\n if (!data?.length) throw new Error('Este contrato já foi assinado.')\n}\n\nexport async function contractMediaUrl(path: string | null): Promise<string | null> {\n if (!path) return null\n const { data } = await db().storage.from(BUCKET).createSignedUrl(path, 3600)\n return data?.signedUrl ?? null\n}\n","import React from 'react'\nimport { Camera, Check, Printer, X } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport { sanitizeHtml } from '../lib/html-text'\nimport { contractMediaUrl, signAttendanceContract, type AttendanceContract } from '../lib/attendance-contracts'\nimport { describeError } from '@fayz-ai/core'\n\nconst CONTRACT_TEXT_CLASS = [\n 'space-y-2 text-sm leading-relaxed',\n '[&_b]:font-semibold [&_strong]:font-semibold [&_h1]:text-base [&_h1]:font-semibold [&_h2]:font-semibold [&_h3]:font-semibold',\n '[&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5',\n '[&_table]:my-2 [&_table]:w-full [&_table]:text-xs [&_td]:border [&_td]:border-border [&_td]:px-2 [&_td]:py-1',\n '[&_th]:border [&_th]:border-border [&_th]:bg-muted/50 [&_th]:px-2 [&_th]:py-1 [&_th]:text-left [&_th]:font-medium',\n].join(' ')\n\nfunction useSigned(path: string | null) {\n const [url, setUrl] = React.useState<string | null>(null)\n React.useEffect(() => {\n let alive = true\n contractMediaUrl(path).then((u) => { if (alive) setUrl(u) }).catch(() => {})\n return () => { alive = false }\n }, [path])\n return url\n}\n\nfunction SignaturePad({ onChange }: { onChange: (b: Blob | null) => void }) {\n const ref = React.useRef<HTMLCanvasElement>(null)\n const drawing = React.useRef(false)\n React.useEffect(() => {\n const c = ref.current\n if (!c) return\n const r = window.devicePixelRatio || 1\n c.width = c.offsetWidth * r\n c.height = c.offsetHeight * r\n const ctx = c.getContext('2d')!\n ctx.scale(r, r); ctx.lineWidth = 2; ctx.lineCap = 'round'; ctx.strokeStyle = '#111827'\n }, [])\n const pos = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const b = e.currentTarget.getBoundingClientRect()\n return [e.clientX - b.left, e.clientY - b.top] as const\n }\n return (\n <div className=\"space-y-1.5\">\n <canvas\n ref={ref}\n aria-label=\"Área de assinatura\"\n className=\"h-36 w-full touch-none rounded-md border bg-white\"\n onPointerDown={(e) => {\n drawing.current = true\n e.currentTarget.setPointerCapture(e.pointerId)\n const ctx = e.currentTarget.getContext('2d')!; const [x, y] = pos(e); ctx.beginPath(); ctx.moveTo(x, y)\n }}\n onPointerMove={(e) => {\n if (!drawing.current) return\n const ctx = e.currentTarget.getContext('2d')!; const [x, y] = pos(e); ctx.lineTo(x, y); ctx.stroke()\n }}\n onPointerUp={(e) => {\n drawing.current = false\n e.currentTarget.toBlob((b) => onChange(b), 'image/png')\n }}\n />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" className=\"font-normal text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => { const c = ref.current; if (c) { c.getContext('2d')!.clearRect(0, 0, c.width, c.height); onChange(null) } }}>\n Limpar assinatura\n </Button>\n </div>\n )\n}\n\nfunction SelfieCapture({ value, onChange }: { value: Blob | null; onChange: (b: Blob | null) => void }) {\n const video = React.useRef<HTMLVideoElement>(null)\n const stream = React.useRef<MediaStream | null>(null)\n const [on, setOn] = React.useState(false)\n const [erro, setErro] = React.useState<string | null>(null)\n const preview = React.useMemo(() => (value ? URL.createObjectURL(value) : null), [value])\n const stop = () => { stream.current?.getTracks().forEach((t) => t.stop()); stream.current = null; setOn(false) }\n React.useEffect(() => () => stop(), [])\n async function start() {\n setErro(null)\n try {\n stream.current = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'user' } })\n setOn(true)\n requestAnimationFrame(() => { if (video.current) { video.current.srcObject = stream.current; video.current.play().catch(() => {}) } })\n } catch { setErro('Não foi possível acessar a câmera.') }\n }\n function capture() {\n const v = video.current\n if (!v?.videoWidth) return\n const c = document.createElement('canvas'); c.width = v.videoWidth; c.height = v.videoHeight\n c.getContext('2d')!.drawImage(v, 0, 0)\n c.toBlob((b) => { onChange(b); stop() }, 'image/jpeg', 0.85)\n }\n return (\n <div className=\"space-y-2\">\n <span className=\"text-sm font-medium\">Selfie</span>\n {preview ? (\n <div className=\"relative w-40\">\n <img src={preview} alt=\"Selfie\" className=\"rounded-lg border\" />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" aria-label=\"Remover selfie\" onClick={() => onChange(null)}\n className=\"font-normal absolute right-1 top-1 flex h-6 w-6 items-center justify-center rounded-full bg-background/90\"><X className=\"h-3 w-3\" /></Button>\n </div>\n ) : on ? (\n <div className=\"space-y-2\">\n <video ref={video} playsInline muted className=\"w-full max-w-[240px] rounded-lg border\" />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={capture}><Camera className=\"mr-1 h-4 w-4\" /> Capturar</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={stop}>Cancelar</Button>\n </div>\n </div>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={start}><Camera className=\"mr-1 h-4 w-4\" /> Tirar selfie</Button>\n )}\n {erro && <p className=\"text-xs text-destructive\">{erro}</p>}\n </div>\n )\n}\n\nfunction printContract(contract: AttendanceContract, signatureUrl: string | null) {\n const w = window.open('', '_blank')\n if (!w) return\n const signed = contract.status === 'signed'\n ? `<div style=\"margin-top:32px\">${signatureUrl ? `<img src=\"${signatureUrl}\" style=\"max-height:120px\"/>` : ''}\n <p>Assinado ${contract.signedByName ? `por ${contract.signedByName.replace(/</g, '<')} ` : ''}em ${contract.signedAt ? new Date(contract.signedAt).toLocaleString('pt-BR') : ''}</p></div>`\n : ''\n w.document.write(`<!doctype html><html><head><meta charset=\"utf-8\"><title>${contract.templateName.replace(/</g, '<')}</title>\n <style>body{font:14px/1.5 system-ui,sans-serif;max-width:760px;margin:32px auto;padding:0 16px;color:#111}\n table{border-collapse:collapse;width:100%;margin:8px 0}td,th{border:1px solid #ccc;padding:4px 6px;text-align:left}</style>\n </head><body>${sanitizeHtml(contract.html)}${signed}</body></html>`)\n w.document.close()\n w.focus()\n setTimeout(() => w.print(), 300)\n}\n\nexport interface ContractSignPaneProps {\n contract: AttendanceContract\n /** The client's name: V1 pre-fills \"Nome do Assinante\" with it. */\n defaultSignerName?: string | null\n onSigned: () => void\n onClose: () => void\n}\n\n/** V1 ContractSignatureModal, drawn inside the host's frame (the attendance ruler pane). */\nexport function ContractSignPane({ contract, defaultSignerName, onSigned, onClose }: ContractSignPaneProps) {\n const [signer, setSigner] = React.useState(defaultSignerName ?? '')\n const [signature, setSignature] = React.useState<Blob | null>(null)\n const [selfie, setSelfie] = React.useState<Blob | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [erro, setErro] = React.useState<string | null>(null)\n const signatureUrl = useSigned(contract.signaturePath)\n const selfieUrl = useSigned(contract.selfiePath)\n const signed = contract.status === 'signed'\n const html = React.useMemo(() => sanitizeHtml(contract.html), [contract.html])\n // The hint goes away as soon as what it asked for is there.\n React.useEffect(() => { setErro(null) }, [signature, selfie, signer])\n\n const missing = contract.requireSignature && !signature ? 'Desenhe a assinatura para confirmar.'\n : contract.requireSelfie && !selfie ? 'Tire a selfie para confirmar.'\n : !signer.trim() ? 'Informe o nome de quem assina.' : null\n\n async function sign() {\n if (missing) { setErro(missing); return }\n setSaving(true); setErro(null)\n try {\n await signAttendanceContract(contract, { signerName: signer, signature, selfie })\n onSigned()\n } catch (e) {\n setErro(describeError(e, 'Não foi possível assinar o contrato.'))\n } finally { setSaving(false) }\n }\n\n return (\n <>\n <div className=\"flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n <div className=\"flex justify-end\">\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 gap-1.5\" onClick={() => printContract(contract, signatureUrl)}>\n <Printer className=\"h-3.5 w-3.5\" /> Imprimir\n </Button>\n </div>\n <div className=\"max-h-[55vh] overflow-y-auto rounded-lg border bg-card p-4\">\n <div className={CONTRACT_TEXT_CLASS} dangerouslySetInnerHTML={{ __html: html }} />\n </div>\n\n {signed ? (\n <div className=\"space-y-3\">\n <p className=\"flex items-center gap-2 rounded-lg border border-success/40 bg-success-soft px-3 py-2 text-sm text-success-soft-foreground\">\n <Check className=\"h-4 w-4\" />\n Assinado em {contract.signedAt ? new Date(contract.signedAt).toLocaleString('pt-BR') : ''}\n {contract.signedByName ? ` por ${contract.signedByName}` : ''}\n </p>\n {signatureUrl && <img src={signatureUrl} alt=\"Assinatura\" className=\"max-h-32 rounded-md border bg-white p-2\" />}\n {selfieUrl && <img src={selfieUrl} alt=\"Selfie\" className=\"max-h-40 rounded-lg border\" />}\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"block text-sm font-medium\" htmlFor=\"contract-signer\">Nome do Assinante</label>\n <Input id=\"contract-signer\" value={signer} onChange={(e) => setSigner(e.target.value)} placeholder=\"Nome completo\" />\n </div>\n {contract.requireSignature && <SignaturePad onChange={setSignature} />}\n {contract.requireSelfie && <SelfieCapture value={selfie} onChange={setSelfie} />}\n </div>\n )}\n {erro && <p role=\"alert\" className=\"rounded-lg bg-destructive/10 px-3 py-2 text-xs text-destructive\">{erro}</p>}\n </div>\n\n <div className=\"shrink-0 border-t fayz-glass-divider px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5\">\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onClose}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n {signed ? 'Fechar' : 'Agora não'}\n </Button>\n {!signed && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={sign} disabled={saving}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\">\n {saving ? 'Assinando…' : 'Confirmar Assinatura'}\n </Button>\n )}\n </div>\n </div>\n </>\n )\n}\n","import { defineSettingsTab } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nexport const formsV1SettingsTabs = [\n defineSettingsTab({\n id: 'forms-contract-rules',\n label: tl('Contract rules', 'Regras de contrato'),\n icon: 'FileCheck2',\n section: 'registry',\n pending: true,\n defaults: { 'contracts.execution_requires_signed_contract': false, 'contracts.prepaid_purchase_flow': false },\n sections: [{\n fields: [\n { key: 'contracts.execution_requires_signed_contract', type: 'boolean', label: tl('A service runs only with the contract signed', 'Executar serviço só com contrato assinado') },\n { key: 'contracts.prepaid_purchase_flow', type: 'boolean', label: tl('Prepaid purchase flow', 'Fluxo de compra pré-paga') },\n ],\n }],\n }),\n]\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { RECORD_GROUP, recordRailFields, activeFacet } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport { T } from '@fayz-ai/forms/data/tables'\nimport { createFormsStore, createSafeFormsProvider } from '@fayz-ai/forms/store'\nimport { registerTranslations, tl } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { formsZoneWidgets } from './components/formsZoneWidgets'\nimport { customFormsLocales } from './locales'\nimport { resolveConfig } from './config'\nimport type { CustomFormsPluginOptions } from './config'\nimport { CustomFormsSettingsTab } from './views/CustomFormsSettingsTab'\nimport { PersonDocumentsWidget as PersonDocumentsWidgetImpl } from './components/PersonDocumentsWidget'\nimport { PersonAnswerAlerts } from './components/PersonAnswerAlerts'\nimport { registerDocumentTypeProvider } from './lib/document-types'\nimport {\n CATEGORY_GROUP_ORDER, CATEGORY_ICONS, categoryLabel, normalizeCategory,\n} from './lib/categories'\nimport { registerFormsTimelineSource } from './lib/timeline-source'\nimport { registerFormsTabCounts } from './lib/tab-counts'\nimport { buildFormsAnalyticsCards } from './analytics/cards'\nimport { createOrUpdateFormTool } from './lib/agent-tools'\nimport { FileText as FileTextIcon, Image as ImageIcon, Paperclip } from 'lucide-react'\n\nfunction registerBuiltInProviders(formsProvider: FormsDataProvider) {\n // Templates from custom_forms\n registerDocumentTypeProvider({\n id: 'custom_forms:templates',\n async getTypes() {\n try {\n const result = await formsProvider.getTemplates({})\n // Agrupado pela CATEGORIA do modelo, não por um literal \"Formulários\":\n // é o que transforma o menu em \"Novo ▸ Anamnese ▸ escolhe o modelo\",\n // que é como o consultório pensa. O grupo único fazia vinte e cinco\n // modelos caírem numa lista chapada onde anamnese e termo de imagem\n // pareciam a mesma coisa.\n return result.data.map((tpl) => {\n const category = normalizeCategory(tpl.category)\n return {\n id: `template:${tpl.id}`,\n label: tpl.name,\n icon: CATEGORY_ICONS[category] ?? FileTextIcon,\n group: categoryLabel(category),\n groupOrder: CATEGORY_GROUP_ORDER[category] ?? 50,\n order: 0,\n description: tpl.description,\n _templateId: tpl.id,\n }\n }) as any[]\n } catch {\n return []\n }\n },\n })\n\n // Built-in file types\n registerDocumentTypeProvider({\n id: 'core:files',\n getTypes() {\n return [\n { id: 'core:image', label: tl('Image', 'Imagem'), icon: ImageIcon, group: tl('Files', 'Arquivos'), groupOrder: 90, order: 0 },\n { id: 'core:attachment', label: tl('Attachment', 'Anexo'), icon: Paperclip, group: tl('Files', 'Arquivos'), groupOrder: 90, order: 1 },\n ]\n },\n })\n}\n\nexport type { CustomFormsPluginOptions }\nexport { registerDocumentTypeProvider, type DocumentTypeOption, type DocumentTypeProvider } from './lib/document-types'\nexport { PersonFormsAlert, type PersonFormsAlertProps } from './components/PersonFormsAlert'\nexport { FormFillDialog, recommendationsOf, type FormFillDialogProps, type FormFillResult } from './components/FormFillDialog'\nexport type { RecommendationShortcut } from './components/fields/fields'\n// The attendance's contracts and their signing — V1 generated_contracts, drawn in the host's ruler.\nexport { ContractSignPane, type ContractSignPaneProps } from './components/ContractSignPane'\nexport {\n ensureAttendanceContracts, listAttendanceContracts,\n type AttendanceContract, type ContractService, type EnsureContractsInput,\n} from './lib/attendance-contracts'\nexport type { RecommendationLine, MediaValue, StencilConfig, GalleryConfig, AnswerAlertConfig } from '@fayz-ai/forms/domain/template'\n// The published names this plugin always had; their home is now @fayz-ai/forms.\nexport { isOutstanding, type PersonFormRequirement, type RequirementState } from '@fayz-ai/forms/domain/requirement'\nexport { getPersonFormRequirements } from '@fayz-ai/forms/data/supabase'\nimport { formsV1SettingsTabs } from './settings/v1-settings'\n\nexport function createCustomFormsPlugin(options?: CustomFormsPluginOptions): PluginManifest {\n registerTranslations(customFormsLocales)\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createSafeFormsProvider()\n const store = createFormsStore(provider)\n\n // Register built-in document type providers\n registerBuiltInProviders(provider)\n\n // Documento criado passa a aparecer na linha do tempo de quem o tem.\n registerFormsTimelineSource()\n registerFormsTabCounts()\n\n\n // ---------------------------------------------------------------------\n // MODELOS DE CONTRATO\n //\n // Contrato e formulário são a mesma coisa pela METADE — um modelo com nome,\n // um interruptor de ativo e regras de quando ele passa a ser exigido —, e é\n // a metade que este plugin já resolve. A outra não se parece: o formulário é\n // uma COLEÇÃO DE PERGUNTAS, o contrato é um TEXTO com variáveis que alguém\n // assina.\n //\n // Por isso o formulário tem construtor próprio (os campos são dinâmicos) e o\n // contrato cabe no CRUD genérico: o que ele tem é um texto e sete decisões.\n // ---------------------------------------------------------------------\n const contractTemplateEntity: EntityDef = {\n name: 'Modelo de contrato',\n namePlural: 'Modelos de contrato',\n icon: 'FileSignature',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [activeFacet({ active: 'Ativos', inactive: 'Inativos', all: 'Todos' })],\n fieldGroups: [\n { id: 'identity', label: 'O contrato', columns: 1 },\n {\n id: 'when', label: 'Quando ele nasce', columns: 1,\n description: 'As duas portas convivem: um orçamento aprovado gera o contrato do pacote, e a execução gera o termo daquele procedimento.',\n },\n {\n id: 'signature', label: 'Assinatura', columns: 1,\n description: 'Os dois primeiros dizem COMO se assina. O terceiro diz o que acontece se ninguém assinar — e é o único que bloqueia.',\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: 'Nome', type: 'text', required: true, showInTable: true, searchable: true, group: 'identity' },\n // Markdown e não editor de página: quem escreve contrato precisa de\n // parágrafo e negrito. As variáveis ({{cliente.nome}}) são substituídas\n // na geração.\n {\n key: 'content', label: 'Texto do contrato', type: 'markdown', showInTable: false, group: 'identity',\n hint: 'Use {{cliente.nome}}, {{servico.nome}} e afins — a geração substitui.',\n },\n { key: 'generateOnQuoteApproval', label: 'Gerar quando um orçamento for aprovado', type: 'boolean', showInTable: false, defaultValue: false, group: 'when' },\n { key: 'generateOnExecution', label: 'Gerar na execução do serviço', type: 'boolean', showInTable: false, defaultValue: false, group: 'when' },\n // Um contrato por atendimento ou um por serviço: é o que decide se a\n // cliente assina uma folha ou seis.\n {\n key: 'groupServices', label: 'Um contrato para todos os serviços do atendimento', type: 'boolean',\n showInTable: false, defaultValue: true, group: 'when',\n hint: 'Desligado, sai um contrato por serviço.',\n },\n { key: 'requireScreenSignature', label: 'Assinar na tela', type: 'boolean', showInTable: true, defaultValue: false, group: 'signature' },\n { key: 'requireSelfie', label: 'Pedir selfie de quem assina', type: 'boolean', showInTable: false, defaultValue: false, group: 'signature' },\n {\n key: 'requireSignatureForExecution', label: 'Sem assinatura, não executa', type: 'boolean',\n showInTable: true, defaultValue: false, group: 'signature',\n hint: 'O único que bloqueia: o serviço não pode ser executado sem o contrato assinado.',\n },\n ...recordRailFields({ tagsTable: 'plg_forms_contract_templates', activeLabel: 'Ativo' }),\n ],\n data: {\n table: 'plg_forms_contract_templates',\n schema: 'public',\n tenantScoped: true,\n searchColumns: ['name'],\n },\n }\n\n const formRegistries: import('@fayz-ai/core').PluginRegistryDef[] = [\n {\n id: 'contract-templates',\n entity: contractTemplateEntity,\n icon: 'FileSignature',\n description: 'Modelos de contrato que o cliente assina',\n agentHint: 'O MODELO do contrato — não é um contrato gerado nem uma assinatura.',\n },\n {\n id: 'form-categories',\n entity: {\n name: 'Category',\n namePlural: 'Categories',\n icon: 'FolderOpen',\n displayField: 'name',\n defaultSort: 'sort_order',\n fields: [\n { key: 'name', label: 'Name', type: 'text' as const, required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text' as const, showInTable: true },\n { key: 'color', label: 'Color', type: 'color' as const, showInTable: true },\n { key: 'sortOrder', label: 'Order', type: 'number' as const, showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: 'Active', type: 'boolean' as const, showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: T.categories,\n tenantScoped: true,\n },\n },\n icon: 'FolderOpen',\n description: 'Categories for organizing form templates',\n seedData: [\n { name: 'Anamnese', sortOrder: 1, isActive: true },\n { name: 'Evolução', sortOrder: 2, isActive: true },\n { name: 'Laudo', sortOrder: 3, isActive: true },\n { name: 'Contrato', sortOrder: 4, isActive: true },\n { name: 'Geral', sortOrder: 5, isActive: true },\n ],\n },\n ]\n\n const registries = [...formRegistries, ...(options?.settingsRegistries ?? [])]\n\n const SettingsComponent: React.FC = () =>\n React.createElement(PluginSettingsPanel, {\n title: config.labels.settingsLabel,\n customTabs: [\n {\n id: 'forms',\n label: config.labels.pageTitle,\n icon: 'FileText',\n content: React.createElement(CustomFormsSettingsTab, { config, provider, store }),\n },\n ],\n registries,\n routeBase: '/settings/custom_forms',\n hostPluginId: 'custom_forms',\n })\n SettingsComponent.displayName = 'CustomFormsSettingsPanel'\n\n const PersonDocumentsWidget: React.FC<any> = (props: any) =>\n React.createElement(PersonDocumentsWidgetImpl, { ...props, config, provider, store, surface: 'records' })\n PersonDocumentsWidget.displayName = 'PersonDocumentsWidget'\n\n // O armário: foto e anexo, fora do prontuário. Mesmo componente, outra\n // superfície — a lista, o arrastar e o visualizador são os mesmos, e é\n // justamente por isso que separar as abas não custou uma segunda tela.\n const PersonFilesWidget: React.FC<any> = (props: any) =>\n React.createElement(PersonDocumentsWidgetImpl, { ...props, config, provider, store, surface: 'files' })\n PersonFilesWidget.displayName = 'PersonFilesWidget'\n\n const PersonAnswerAlertsWidget: React.FC<any> = (props: any) =>\n React.createElement(PersonAnswerAlerts, { personId: props.item?.id, provider })\n PersonAnswerAlertsWidget.displayName = 'PersonAnswerAlertsWidget'\n\n return {\n id: 'custom_forms',\n defaultAgentRole: 'setup',\n name: config.labels.pageTitle,\n icon: 'FileText',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'custom_forms', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n declaredLimits: [\n { key: 'form_templates', label: 'Form templates', table: 'plg_forms_templates' },\n { key: 'documents_month', label: 'Documents / month', table: 'documents', period: 'month' },\n ],\n\n // O formulário preenchido vira número e vira LISTA em /analytics — até aqui\n // ele só existia dentro da ficha de uma pessoa, um de cada vez. Read model\n // na migration 006.\n analyticsCards: options?.analyticsCards === false ? [] : buildFormsAnalyticsCards(),\n\n navigation: [],\n\n routes: [],\n\n settings: [\n ...formsV1SettingsTabs,\n {\n id: 'custom_forms',\n label: config.labels.settingsLabel,\n icon: 'FileText',\n component: SettingsComponent as unknown as React.ComponentType<unknown>,\n order: 15,\n },\n ],\n\n widgets: [\n {\n id: 'person-documents-tab',\n zone: 'person.detail.documents',\n component: PersonDocumentsWidget,\n order: 0,\n },\n {\n id: 'person-files-tab',\n zone: 'person.detail.files',\n component: PersonFilesWidget,\n order: 0,\n },\n ...formsZoneWidgets(provider),\n {\n // Renders nothing unless a form marks an answer as an alert (V1 alert_config).\n id: 'person-answer-alerts',\n zone: 'person.detail.above-tabs',\n component: PersonAnswerAlertsWidget,\n order: -1,\n },\n ],\n\n registries,\n\n aiTools: [\n {\n id: 'custom_forms.list-templates',\n name: 'listFormTemplates',\n description: 'Lists available form templates for the current tenant.',\n icon: 'FileText',\n mode: 'read' as const,\n category: 'Forms',\n parameters: {\n type: 'object' as const,\n properties: {\n category: {\n type: 'string' as const,\n description: 'Filter by category: anamnesis, evolution, report, contract, general',\n },\n },\n },\n suggestions: [\n { label: 'Quais formulários temos?' },\n { label: 'Mostre os modelos de anamnese' },\n ],\n permission: { feature: 'custom_forms', action: 'read' as const },\n },\n {\n id: 'custom_forms.list-documents',\n name: 'listDocuments',\n description: 'Lists filled documents, optionally filtered by person or status.',\n icon: 'FileText',\n mode: 'read' as const,\n category: 'Forms',\n parameters: {\n type: 'object' as const,\n properties: {\n personId: { type: 'string' as const, description: 'Person UUID to filter by' },\n status: {\n type: 'string' as const,\n description: 'Status filter: draft, completed, signed, archived',\n },\n },\n },\n suggestions: [\n { label: \"Mostre os documentos deste cliente\" },\n ],\n permission: { feature: 'custom_forms', action: 'read' as const },\n },\n // Server-plane write: builds/edits a form template via the pool RPC, so\n // the assistant can montar formulários from any page or channel.\n createOrUpdateFormTool,\n ],\n\n declaredRpcs: [\n {\n name: 'agent_forms_upsert_template',\n kind: 'write' as const,\n description:\n 'Guarded form-template upsert: agent_guard (role→plan→form_templates cap), grid layout computed server-side, create or edit by id, audited.',\n audits: true,\n },\n ],\n\n // Where a submitted form is supposed to land.\n integrations: ['mailchimp', 'rd-station', 'zapier'],\n locales: customFormsLocales,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/components/FormFillDialog.tsx","../src/components/PersonFormsAlert.tsx","../src/components/formsZoneWidgets.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/lib/timeline-source.ts","../src/lib/tab-counts.ts","../src/analytics/cards.ts","../src/lib/contract-render.ts","../src/lib/attendance-contracts.ts","../src/components/ContractSignPane.tsx","../src/settings/v1-settings.ts","../src/index.ts"],"names":["React","jsxs","jsx","Button","createSafeFormsProvider","tenantId","db","getSupabaseClientOptional","tl","error","describeError","Fragment","FileTextIcon","ImageIcon","createFormsStore"],"mappings":"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","file":"index.js","sourcesContent":["import type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\n\nexport interface CustomFormsPluginOptions {\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: FormsDataProvider\n navSection?: 'main' | 'secondary' | 'settings'\n navPosition?: number\n labels?: Partial<CustomFormsLabels>\n /** App-owned registries shown inside Forms & Documents settings. */\n settingsRegistries?: PluginRegistryDef[]\n /**\n * Pass `false` to leave form submissions out of /analytics. Contributed by\n * default — a filled form has no other place in the product where it can be\n * read in bulk.\n */\n analyticsCards?: false\n}\n\nexport interface CustomFormsLabels {\n pageTitle: string\n settingsLabel: string\n settingsSubtitle: string\n templates: string\n documents: string\n newTemplate: string\n addDocument: string\n}\n\nexport interface CustomFormsConfig {\n labels: CustomFormsLabels\n}\n\n// A function, not a constant: `tl` reads the locale at call time.\nconst defaultLabels = (): CustomFormsLabels => ({\n pageTitle: tl('Forms', 'Formulários'),\n settingsLabel: tl('Forms', 'Formulários'),\n settingsSubtitle: tl('Create and manage custom forms for your business', 'Crie e organize os formulários da sua empresa'),\n templates: tl('Templates', 'Modelos'),\n documents: tl('Documents', 'Documentos'),\n newTemplate: tl('New Template', 'Novo modelo'),\n addDocument: tl('Add Document', 'Adicionar documento'),\n})\n\nexport function resolveConfig(options?: CustomFormsPluginOptions): CustomFormsConfig {\n return {\n labels: { ...defaultLabels(), ...options?.labels },\n }\n}\n","import React from 'react'\nimport { Button, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from '@fayz-ai/ui'\nimport { describeError } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport type { FormTemplate, RecommendationLine } from '@fayz-ai/forms/domain/template'\nimport { createFormsStore, createSafeFormsProvider } from '@fayz-ai/forms/store'\nimport type { FormFillResult, FormFillSlotProps } from '@fayz-ai/forms/views/zones'\nimport { CustomFormsProvider } from '../context'\nimport { resolveConfig } from '../config'\nimport { FormRenderer, isFieldEmpty } from './FormRenderer'\n\nexport type { FormFillResult }\n\nexport interface FormFillDialogProps extends FormFillSlotProps {\n /** Defaults to Supabase, else the in-memory mock; the plugin passes its own. */\n provider?: FormsDataProvider\n}\n\n/** All `recommendation` lines in an answer, one line per service (quantities of repeats add up). */\nexport function recommendationsOf(template: FormTemplate, data: Record<string, unknown>): RecommendationLine[] {\n const by = new Map<string, RecommendationLine>()\n for (const f of template.schema.fields) {\n if (f.type !== 'recommendation' || !Array.isArray(data[f.id])) continue\n for (const l of data[f.id] as RecommendationLine[]) {\n const cur = by.get(l.serviceId)\n by.set(l.serviceId, cur ? { ...cur, quantity: cur.quantity + l.quantity } : { ...l })\n }\n }\n return [...by.values()]\n}\n\n/** Fills one form for a person outside the forms page, with its own store. */\nexport function FormFillDialog({\n templateId, personId, personName, onSaved, onClose, frame = 'modal',\n subject, productId, professionalId, recommendationShortcuts, provider: given,\n}: FormFillDialogProps) {\n const provider = React.useMemo(() => given ?? createSafeFormsProvider(), [given])\n const store = React.useMemo(() => createFormsStore(provider), [provider])\n const config = React.useMemo(() => resolveConfig(), [])\n const [template, setTemplate] = React.useState<FormTemplate | null>(null)\n const [erro, setErro] = React.useState<string | null>(null)\n const [data, setData] = React.useState<Record<string, unknown>>({})\n const [salvando, setSalvando] = React.useState(false)\n const [missing, setMissing] = React.useState<Set<string>>(new Set())\n\n // A field leaves the outline as soon as it gets a value.\n React.useEffect(() => {\n if (!template || missing.size === 0) return\n const still = new Set([...missing].filter((id) => {\n const f = template.schema.fields.find((x) => x.id === id)\n return f ? isFieldEmpty(f, data[id]) : false\n }))\n if (still.size !== missing.size) setMissing(still)\n if (still.size === 0) setErro(null)\n }, [data, template, missing])\n\n async function salvar() {\n if (!template) return\n const faltando = template.schema.fields.filter((f) => f.required && isFieldEmpty(f, data[f.id]))\n if (faltando.length) {\n setMissing(new Set(faltando.map((f) => f.id)))\n const primeiro = [...faltando].sort((a, b) => a.row - b.row || a.col - b.col)[0]\n // After the error banner renders: scrolling first and then growing the form above lands short.\n requestAnimationFrame(() => document.getElementById(`ff-field-${primeiro.id}`)?.scrollIntoView({ block: 'center' }))\n setErro(faltando.length === 1\n ? `Preencha o campo obrigatório destacado: ${faltando[0].label}`\n : `Preencha os ${faltando.length} campos obrigatórios destacados.`)\n return\n }\n setErro(null)\n setSalvando(true)\n try {\n const doc = await store.getState().createDocument({\n templateId: template.id,\n personId,\n title: personName ? `${template.name} — ${personName}` : template.name,\n data,\n status: 'completed',\n subjectType: subject?.type,\n subjectId: subject?.id,\n productId: productId ?? undefined,\n professionalId: professionalId ?? undefined,\n })\n await onSaved?.({ documentId: doc.id, template, data, recommendations: recommendationsOf(template, data) })\n onClose()\n } catch (e) {\n setErro(describeError(e, 'Não foi possível salvar o formulário.'))\n } finally { setSalvando(false) }\n }\n\n React.useEffect(() => {\n let vivo = true\n ;(async () => {\n try {\n const t = await store.getState().fetchTemplateById(templateId)\n if (vivo) setTemplate(t)\n } catch (e) {\n if (vivo) setErro(describeError(e, 'Não foi possível abrir o formulário.'))\n }\n })()\n return () => { vivo = false }\n }, [templateId, store])\n\n const corpo = (\n <>\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {erro && (\n <p role=\"alert\" className=\"mb-3 rounded-lg bg-destructive/10 px-3 py-2 text-xs text-destructive\">{erro}</p>\n )}\n {!template ? (erro ? null : (\n /* Esqueleto com a FORMA do formulário: três campos e um rótulo. */\n <div className=\"space-y-4\" aria-busy=\"true\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3 w-24 animate-pulse rounded bg-muted/70\" />\n <div className=\"h-9 w-full animate-pulse rounded-lg bg-muted\" />\n </div>\n ))}\n </div>\n )) : (\n <CustomFormsProvider value={{ config, provider, store }}>\n <FormRenderer schema={template.schema} data={data} onChange={setData} missing={missing}\n recommendationShortcuts={recommendationShortcuts} />\n </CustomFormsProvider>\n )}\n </div>\n\n <div className=\"border-t fayz-glass-divider px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5 shrink-0\">\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onClose}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n Agora não\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={salvar}\n disabled={!template || salvando}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\"\n >\n {salvando ? 'Salvando…' : 'Concluir'}\n </Button>\n </div>\n </div>\n </>\n )\n\n if (frame === 'inline') return corpo\n\n return (\n <Modal open onOpenChange={(o) => { if (!o) onClose() }}>\n <ModalContent size=\"2xl\" noPadding className=\"gap-0\">\n <ModalHeader className=\"border-b px-5 py-3.5\">\n <ModalTitle className=\"truncate text-base\">\n {template?.name ?? 'Formulário'}\n </ModalTitle>\n </ModalHeader>\n <ModalBody className=\"p-0\">\n {corpo}\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n","import React from 'react'\nimport { ClipboardList, Clock, CheckCircle2, Circle, QrCode } from 'lucide-react'\nimport { Button, Skeleton, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '@fayz-ai/ui'\nimport { useActiveTenantId } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport { isOutstanding, shownInChecklist, type PersonFormRequirement } from '@fayz-ai/forms/domain/requirement'\nimport { createSafeFormsProvider } from '@fayz-ai/forms/store'\nimport type { PersonChecklistItem, PersonChecklistSlotProps } from '@fayz-ai/forms/views/zones'\n\nexport type { PersonChecklistItem }\n\nconst DATE = (iso: string) => new Date(iso + 'T00:00:00').toLocaleDateString('pt-BR')\n\nexport interface PersonFormsAlertProps extends PersonChecklistSlotProps {\n /** Defaults to Supabase, else the in-memory mock; the plugin passes its own. */\n provider?: FormsDataProvider\n}\n\nfunction Linha({ item }: { item: PersonChecklistItem }) {\n const Icone = item.state === 'done' ? CheckCircle2 : item.state === 'late' ? Clock : Circle\n const cor = item.state === 'done' ? 'text-success' : item.state === 'late' ? 'text-warning' : 'text-muted-foreground'\n return (\n <li className=\"flex flex-wrap items-center gap-x-2 gap-y-0.5 px-3 py-1.5 text-xs\">\n <Icone className={`h-3.5 w-3.5 shrink-0 ${cor}`} aria-hidden />\n <span className={item.state === 'done' ? 'text-foreground' : 'font-medium text-foreground'}>{item.label}</span>\n {item.detail && <span className=\"text-muted-foreground\">— {item.detail}</span>}\n {item.action && (\n // O VERBO NÃO PODE PARECER DESLIGADO. Em `text-primary` sobre o âmbar\n // da faixa ele saía lavado e, quando quebrava a linha, parecia um\n // rótulo cinza no canto — a recepção lia \"pendente\" e não via que\n // havia o que clicar.\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={item.action.onClick}\n className=\"ml-auto shrink-0 rounded-button bg-foreground px-2 py-0.5 text-[11px] font-semibold text-background hover:opacity-90\"\n >\n {item.action.label}\n </Button>\n )}\n </li>\n )\n}\n\nexport function PersonFormsAlert({ personId, onFill, version = 0, extras, onPending, sendLink, className, provider: given }: PersonFormsAlertProps) {\n const provider = React.useMemo(() => given ?? createSafeFormsProvider(), [given])\n const tenantId = useActiveTenantId()\n const [rows, setRows] = React.useState<PersonFormRequirement[] | null>(null)\n\n React.useEffect(() => {\n if (!personId || !tenantId) { setRows([]); return }\n let cancelled = false\n setRows(null)\n provider.getPersonRequirements(personId)\n .then((r) => { if (!cancelled) setRows(r) })\n // Falhar em silêncio: um aviso que não carregou não vira um erro em cima\n // de quem só queria marcar um horário.\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [personId, tenantId, version, provider])\n\n // A CHECAGEM DO PACIENTE, numa lista só.\n //\n // Eram duas faixas diferentes — verde quando tudo em dia, âmbar quando\n // faltava —, e elas não somavam: com dois formulários, um em dia e um\n // vencido, só o vencido aparecia. Como CHECKLIST as duas coisas convivem, e\n // a lista abre espaço para o que vier depois (tarefas, avisos a dar ao\n // paciente) sem inventar uma terceira faixa.\n const itens: PersonChecklistItem[] = React.useMemo(() => [\n ...(rows ?? []).filter(shownInChecklist).map((r): PersonChecklistItem => {\n const pendente = isOutstanding(r)\n return {\n id: r.templateId,\n label: r.templateName,\n state: !pendente ? 'done' : r.state === 'expired' ? 'late' : 'todo',\n detail: !pendente\n ? (r.validUntil ? `em dia, válido até ${DATE(r.validUntil)}` : 'em dia')\n : r.state === 'expired' && r.validUntil ? `venceu em ${DATE(r.validUntil)}` : 'nunca preenchido',\n action: pendente && onFill\n ? { label: 'Preencher agora', onClick: () => onFill(r.templateId) }\n : undefined,\n }\n }),\n ...(extras ?? []),\n ], [rows, extras, onFill])\n\n // O QUE FALTA VEM PRIMEIRO. A lista existe para ser resolvida de cima para\n // baixo; o que já está em dia é confirmação, não tarefa.\n const peso = (i: PersonChecklistItem) => (i.state === 'late' ? 0 : i.state === 'todo' ? 1 : 2)\n itens.sort((a, b) => peso(a) - peso(b))\n\n const pendentes = itens.filter((i) => i.state !== 'done')\n const faltando = pendentes.length\n const chave = pendentes.map((i) => i.label).join('|')\n\n // TODO HOOK ANTES DE QUALQUER RETURN. Este efeito estava depois dos returns\n // de carregando/vazio: na primeira pintura a lista ainda não existia, o\n // componente saía antes, e o React contava menos hooks do que na pintura\n // seguinte — a tela inteira do check-in caía com \"algo deu errado\".\n React.useEffect(() => {\n onPending?.(chave ? chave.split('|') : [])\n }, [chave])\n\n if (rows === null) return <Skeleton className={`h-12 w-full ${className ?? ''}`} />\n if (itens.length === 0) return null\n\n return (\n <div className={`overflow-hidden rounded-lg border ${faltando ? 'border-warning/40 bg-warning/5' : 'border-success/30 bg-success/5'} ${className ?? ''}`}>\n <div className=\"flex items-center gap-2 border-b border-inherit px-3 py-1.5 text-[11px] font-medium text-foreground\">\n <ClipboardList className={`h-3.5 w-3.5 ${faltando ? 'text-warning' : 'text-success'}`} aria-hidden />\n {faltando === 0\n ? 'Checagem do paciente — tudo em dia'\n : faltando === 1 ? '1 item pendente com o paciente' : `${faltando} itens pendentes com o paciente`}\n {sendLink && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n {/* aria-disabled, not disabled: a disabled button gets no hover, so the \"em breve\" would never show. */}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Enviar link ao paciente pelo WhatsApp\"\n aria-disabled={sendLink === 'soon'}\n onClick={sendLink === 'soon' ? undefined : sendLink}\n className={`font-normal ${`ml-auto inline-flex h-6 w-6 items-center justify-center rounded-md transition-colors ${\n sendLink === 'soon' ? 'cursor-not-allowed text-muted-foreground/60' : 'text-foreground hover:bg-muted'\n }`}`}\n >\n <QrCode className=\"h-3.5 w-3.5\" aria-hidden />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"left\">\n {sendLink === 'soon' ? 'Enviar pelo WhatsApp (QR Code) — em breve' : 'Enviar pelo WhatsApp (QR Code)'}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n <ul className=\"divide-y divide-border/60\">\n {itens.map((i) => <Linha key={i.id} item={i} />)}\n </ul>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginWidgetDefinition } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport { FORMS_ZONES, type FormFillSlotProps, type PersonChecklistSlotProps } from '@fayz-ai/forms/views/zones'\nimport { FormFillDialog } from './FormFillDialog'\nimport { PersonFormsAlert } from './PersonFormsAlert'\n\n/** The forms screens other plugins open in place, bound to this plugin's provider. */\nexport function formsZoneWidgets(provider: FormsDataProvider): PluginWidgetDefinition[] {\n const PersonChecklist = (props: PersonChecklistSlotProps) => React.createElement(PersonFormsAlert, { ...props, provider })\n const FormFill = (props: FormFillSlotProps) => React.createElement(FormFillDialog, { ...props, provider })\n return [\n {\n id: 'forms-person-checklist',\n zone: FORMS_ZONES.personChecklist,\n component: PersonChecklist as React.ComponentType<unknown>,\n },\n {\n id: 'forms-form-fill',\n zone: FORMS_ZONES.formFill,\n component: FormFill as React.ComponentType<unknown>,\n },\n ]\n}\n","export const en: Record<string, string> = {\n // Settings\n 'customForms.settingsTitle': 'Forms & Documents',\n 'customForms.settingsSubtitle': 'Create and manage custom forms for your business',\n\n // Templates\n 'customForms.templates': 'Templates',\n 'customForms.newWithAIHint': 'Describe the form and I build the fields.',\n 'customForms.newByHand': 'Create by hand',\n 'customForms.newByHandHint': 'Build it field by field in the builder.',\n 'customForms.askPlaceholder': 'Describe the form…',\n 'customForms.askPersona': 'Form builder',\n 'customForms.askPitch': 'Tell me the form you need.',\n 'customForms.askDescription': 'Describe what it is for and I propose the fields, their types and options in one go. You check and adjust before saving.',\n 'customForms.askSuggestion.0': 'A full intake form',\n 'customForms.askSuggestion.1': 'Consent form for an aesthetic procedure',\n 'customForms.askSuggestion.2': 'Session progress note',\n 'customForms.newTemplate': 'New Template',\n 'customForms.editTemplate': 'Edit Template',\n 'customForms.templateName': 'Form name',\n 'customForms.templateDescription': 'Description',\n 'customForms.templateCategory': 'Category',\n 'customForms.templateSpecialty': 'Specialty',\n 'customForms.noTemplates': 'No form templates yet',\n 'customForms.noTemplatesDescription': 'Create your first custom form to start collecting structured data.',\n 'customForms.deleteTemplateConfirm': 'Delete this form template? Existing documents will be preserved.',\n 'customForms.archiveTemplateConfirm': 'Archive this form template? It leaves the list and the document picker, but is kept and existing documents are preserved.',\n\n // Categories\n 'customForms.category.anamnesis': 'Anamnesis',\n 'customForms.category.evaluation': 'Evaluation',\n 'customForms.category.photos': 'Photos',\n 'customForms.category.evolution': 'Evolution Note',\n 'customForms.category.report': 'Report',\n 'customForms.category.contract': 'Contract',\n 'customForms.category.general': 'General',\n\n // Builder\n 'customForms.builder.fields': 'Fields',\n 'customForms.builder.fieldCount': '{{count}} fields',\n 'customForms.builder.settings': 'Settings',\n 'customForms.builder.save': 'Save',\n 'customForms.builder.saving': 'Saving...',\n 'customForms.builder.saved': 'Form saved',\n 'customForms.builder.emptyCanvas': 'Drag fields from the left panel to start building your form',\n 'customForms.builder.fieldLabel': 'Field label',\n 'customForms.builder.fieldPlaceholder': 'Placeholder',\n 'customForms.builder.fieldRequired': 'Required',\n 'customForms.builder.fieldOptions': 'Options',\n 'customForms.builder.addOption': 'Add option',\n 'customForms.builder.colSpan': 'Column span',\n 'customForms.builder.deleteField': 'Remove field',\n 'customForms.builder.mapToPerson': 'Auto-fill from record',\n 'customForms.builder.mapNone': \"Don't auto-fill\",\n 'customForms.builder.mapHint': \"When creating the document from a person's profile, this field is pre-filled with the chosen value (still editable).\",\n 'customForms.preview.editor': 'Editor',\n 'customForms.preview.print': 'Print',\n\n // Person field mappings (auto-fill)\n 'customForms.personField.name': 'Name',\n 'customForms.personField.documentNumber': 'ID / Document',\n 'customForms.personField.email': 'Email',\n 'customForms.personField.phone': 'Phone',\n 'customForms.personField.dateOfBirth': 'Date of Birth',\n 'customForms.personField.guardianName': 'Guardian',\n 'customForms.personField.address': 'Address',\n 'customForms.personField.city': 'City',\n 'customForms.personField.state': 'State',\n\n // Field types\n 'customForms.fieldType.title': 'Title',\n 'customForms.fieldType.text': 'Simple Text',\n 'customForms.fieldType.memo': 'Memo',\n 'customForms.fieldType.richtext': 'Rich Text',\n 'customForms.fieldType.date': 'Date',\n 'customForms.fieldType.select': 'Select',\n 'customForms.fieldType.radio': 'Radio',\n 'customForms.fieldType.tags': 'Tags',\n 'customForms.fieldType.checkbox': 'Checkbox',\n 'customForms.fieldType.image': 'Image / Drawing',\n 'customForms.fieldType.gallery': 'Gallery',\n 'customForms.fieldType.budget': 'Budget',\n 'customForms.fieldType.yes_no': 'Yes or No',\n 'customForms.fieldType.yes_no_text': 'Yes or No + Text',\n 'customForms.fieldType.stencil_photo': 'Photo with stencil',\n 'customForms.fieldType.recommendation': 'Recommendations',\n 'customForms.fieldType.signature': 'Signature (drawn on screen)',\n\n // Documents\n 'customForms.documents': 'Documents',\n 'customForms.addDocument': 'Add Document',\n 'customForms.selectTemplate': 'Select a form',\n 'customForms.searchDocumentTypes': 'Search forms or files...',\n 'customForms.noResults': 'No results',\n 'customForms.noDocuments': 'No documents yet',\n 'customForms.noDocumentsDescription': 'Add a document to start recording information.',\n 'customForms.bucket.all': 'All',\n 'customForms.bucket.file': 'Files',\n 'customForms.noDocumentsInFilter': 'Nothing of this kind on this record.',\n 'customForms.documentFallbackTitle': 'Document',\n 'customForms.recordsTitle': 'Records',\n 'customForms.filesTitle': 'Files',\n 'customForms.addRecord': 'New',\n 'customForms.addFile': 'Upload',\n 'customForms.view': 'View',\n 'customForms.showContent': 'Show content',\n 'customForms.hideContent': 'Hide content',\n 'customForms.previewEmpty': 'This record has no filled field.',\n 'customForms.previewMore': 'See the other {{count}} fields',\n 'customForms.loadMore': 'Load {{count}} more',\n 'customForms.loadingMore': 'Loading…',\n 'customForms.noRecords': 'No records yet',\n 'customForms.noRecordsDescription': 'Anamnesis, evolution, report or contract — start with \"New\".',\n 'customForms.noFiles': 'No files yet',\n 'customForms.noFilesDescription': 'Keep photos, exams and scanned documents here.',\n 'customForms.dragFilesHere': 'Drag files here',\n 'customForms.dropFilesHere': 'Drop the files here',\n 'customForms.documentTitle': 'Document title',\n 'customForms.saveAsDraft': 'Save as Draft',\n 'customForms.saveAndComplete': 'Save & Complete',\n 'customForms.deleteDocumentConfirm': 'Delete this document?',\n 'customForms.archive': 'Archive',\n 'customForms.archiveTitle': 'Archive record',\n 'customForms.archiveDescription': '{{name}} leaves this record\\'s list but stays stored — archiving does not delete.',\n 'customForms.archiveDocumentConfirm': 'Archive this document? It leaves the active list but is kept on file.',\n 'customForms.printPdf': 'Print / PDF',\n 'customForms.usageCount': '{{count}} filled in',\n 'customForms.usageLast': 'last on {{date}}',\n\n // Template list columns\n 'customForms.template': 'Template',\n 'customForms.categoryColumn': 'Category',\n 'customForms.usageColumn': 'Usage',\n\n // Registry\n 'registry.form-categories': 'Categories',\n 'registry.form-categories.description': 'Categories for organizing form templates',\n\n // Status\n 'customForms.status.draft': 'Draft',\n 'customForms.status.completed': 'Completed',\n 'customForms.status.signed': 'Signed',\n 'customForms.status.archived': 'Archived',\n}\n","export const ptBR: Record<string, string> = {\n // Settings\n 'customForms.settingsTitle': 'Formulários e Documentos',\n 'customForms.settingsSubtitle': 'Crie e gerencie formulários personalizados para o seu negócio',\n\n // Templates\n 'customForms.templates': 'Modelos',\n 'customForms.newWithAIHint': 'Descreva o formulário e eu monto os campos.',\n 'customForms.newByHand': 'Criar manualmente',\n 'customForms.newByHandHint': 'Montar campo a campo no construtor.',\n 'customForms.askPlaceholder': 'Descreva o formulário…',\n 'customForms.askPersona': 'Montador de formulários',\n 'customForms.askPitch': 'Diga o formulário que você precisa.',\n 'customForms.askDescription': 'Descreva para que serve e eu proponho os campos, os tipos e as opções de uma vez. Você confere e ajusta antes de salvar.',\n 'customForms.askSuggestion.0': 'Uma ficha de anamnese completa',\n 'customForms.askSuggestion.1': 'Termo de consentimento para procedimento estético',\n 'customForms.askSuggestion.2': 'Ficha de evolução de atendimento',\n 'customForms.newTemplate': 'Novo Modelo',\n 'customForms.editTemplate': 'Editar Modelo',\n 'customForms.templateName': 'Nome do formulário',\n 'customForms.templateDescription': 'Descrição',\n 'customForms.templateCategory': 'Categoria',\n 'customForms.templateSpecialty': 'Especialidade',\n 'customForms.noTemplates': 'Nenhum modelo criado',\n 'customForms.noTemplatesDescription': 'Crie seu primeiro formulário personalizado para começar a coletar dados estruturados.',\n 'customForms.deleteTemplateConfirm': 'Excluir este modelo de formulário? Documentos existentes serão preservados.',\n 'customForms.archiveTemplateConfirm': 'Arquivar este modelo? Ele sai da lista e do seletor de documentos, mas fica guardado e os documentos existentes são preservados.',\n\n // Categories\n 'customForms.category.anamnesis': 'Anamnese',\n 'customForms.category.evaluation': 'Avaliação',\n 'customForms.category.photos': 'Fotos',\n 'customForms.category.evolution': 'Evolução',\n 'customForms.category.report': 'Laudo',\n 'customForms.category.contract': 'Contrato',\n 'customForms.category.general': 'Geral',\n\n // Builder\n 'customForms.builder.fields': 'Campos',\n 'customForms.builder.fieldCount': '{{count}} campos',\n 'customForms.builder.settings': 'Configurações',\n 'customForms.builder.save': 'Salvar',\n 'customForms.builder.saving': 'Salvando...',\n 'customForms.builder.saved': 'Formulário salvo',\n 'customForms.builder.emptyCanvas': 'Arraste os campos do painel esquerdo para começar a montar seu formulário',\n 'customForms.builder.fieldLabel': 'Rótulo do campo',\n 'customForms.builder.fieldPlaceholder': 'Placeholder',\n 'customForms.builder.fieldRequired': 'Obrigatório',\n 'customForms.builder.fieldOptions': 'Opções',\n 'customForms.builder.addOption': 'Adicionar opção',\n 'customForms.builder.colSpan': 'Largura em colunas',\n 'customForms.builder.deleteField': 'Remover campo',\n 'customForms.builder.mapToPerson': 'Preencher com dado da ficha',\n 'customForms.builder.mapNone': 'Não preencher',\n 'customForms.builder.mapHint': 'Ao criar o documento na ficha da pessoa, este campo já vem preenchido com o dado escolhido (editável).',\n 'customForms.preview.editor': 'Editor',\n 'customForms.preview.print': 'Impressão',\n\n // Person field mappings (auto-fill)\n 'customForms.personField.name': 'Nome',\n 'customForms.personField.documentNumber': 'CPF / Documento',\n 'customForms.personField.email': 'E-mail',\n 'customForms.personField.phone': 'Telefone',\n 'customForms.personField.dateOfBirth': 'Data de Nascimento',\n 'customForms.personField.guardianName': 'Responsável',\n 'customForms.personField.address': 'Endereço',\n 'customForms.personField.city': 'Cidade',\n 'customForms.personField.state': 'Estado',\n\n // Field types\n 'customForms.fieldType.title': 'Título',\n 'customForms.fieldType.text': 'Texto Simples',\n 'customForms.fieldType.memo': 'Memorando',\n 'customForms.fieldType.richtext': 'Texto Rico',\n 'customForms.fieldType.date': 'Data',\n 'customForms.fieldType.select': 'Seleção',\n 'customForms.fieldType.radio': 'Radio',\n 'customForms.fieldType.tags': 'Tags',\n 'customForms.fieldType.checkbox': 'Checkbox',\n 'customForms.fieldType.image': 'Imagem / Desenho',\n 'customForms.fieldType.gallery': 'Galeria',\n 'customForms.fieldType.budget': 'Orçamento',\n 'customForms.fieldType.yes_no': 'Sim ou Não',\n 'customForms.fieldType.yes_no_text': 'Sim ou Não + Texto',\n 'customForms.fieldType.stencil_photo': 'Foto com Gabarito',\n 'customForms.fieldType.recommendation': 'Indicações',\n 'customForms.fieldType.signature': 'Assinatura (escrita em tela)',\n\n // Documents\n 'customForms.documents': 'Documentos',\n 'customForms.addDocument': 'Novo Documento',\n 'customForms.selectTemplate': 'Selecione um formulário',\n 'customForms.searchDocumentTypes': 'Buscar formulário ou arquivo...',\n 'customForms.noResults': 'Nenhum resultado',\n 'customForms.noDocuments': 'Nenhum documento',\n 'customForms.noDocumentsDescription': 'Adicione um documento para começar a registrar informações.',\n // Pastilhas do prontuário — o balde \"file\" é o que não tem modelo (foto, anexo).\n 'customForms.bucket.all': 'Tudo',\n 'customForms.bucket.file': 'Arquivos',\n 'customForms.noDocumentsInFilter': 'Nada deste tipo nesta ficha.',\n 'customForms.documentFallbackTitle': 'Documento',\n // Prontuário × Arquivos — as duas superfícies do mesmo widget.\n 'customForms.recordsTitle': 'Registros',\n 'customForms.filesTitle': 'Arquivos',\n 'customForms.addRecord': 'Novo',\n 'customForms.addFile': 'Enviar',\n 'customForms.view': 'Ver',\n // Olhinho, prévia e paginação da linha do tempo de registros.\n 'customForms.showContent': 'Mostrar conteúdo',\n 'customForms.hideContent': 'Ocultar conteúdo',\n 'customForms.previewEmpty': 'Registro sem nenhum campo preenchido.',\n 'customForms.previewMore': 'Ver os outros {{count}} campos',\n 'customForms.loadMore': 'Carregar mais {{count}}',\n 'customForms.loadingMore': 'Carregando…',\n 'customForms.noRecords': 'Nenhum registro',\n 'customForms.noRecordsDescription': 'Anamnese, evolução, laudo ou contrato — comece em \"Novo\".',\n 'customForms.noFiles': 'Nenhum arquivo',\n 'customForms.noFilesDescription': 'Guarde aqui foto, exame, documento digitalizado.',\n 'customForms.dragFilesHere': 'Arraste arquivos para cá',\n 'customForms.dropFilesHere': 'Solte os arquivos aqui',\n 'customForms.documentTitle': 'Título do documento',\n 'customForms.saveAsDraft': 'Salvar Rascunho',\n 'customForms.saveAndComplete': 'Salvar e Finalizar',\n 'customForms.deleteDocumentConfirm': 'Excluir este documento?',\n 'customForms.archive': 'Arquivar',\n 'customForms.archiveDocumentConfirm': 'Arquivar este documento? Ele sai da lista ativa mas fica guardado.',\n // O diálogo diz DE QUAL registro se trata: \"Tem certeza?\" sozinho é a\n // pergunta que ninguém consegue responder.\n 'customForms.archiveTitle': 'Arquivar registro',\n 'customForms.archiveDescription': '{{name}} sai da lista desta ficha, mas continua guardado — arquivar não apaga.',\n 'customForms.printPdf': 'Imprimir / PDF',\n 'customForms.usageCount': '{{count}} preenchidos',\n 'customForms.usageLast': 'último em {{date}}',\n\n // Colunas da lista de modelos\n 'customForms.template': 'Modelo',\n 'customForms.categoryColumn': 'Categoria',\n 'customForms.usageColumn': 'Uso',\n\n // Registry\n 'registry.form-categories': 'Categorias',\n 'registry.form-categories.description': 'Categorias para organizar modelos de formulários',\n\n // Status\n 'customForms.status.draft': 'Rascunho',\n 'customForms.status.completed': 'Finalizado',\n 'customForms.status.signed': 'Assinado',\n 'customForms.status.archived': 'Arquivado',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const customFormsLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { registerTimelineSource, type TimelineItem } from '@fayz-ai/admin'\n\n/**\n * Documentos criados na linha do tempo da pessoa.\n *\n * Registrado pela fábrica do plugin, não importado pelo core: num pool sem o\n * plugin de formulários, `public.documents` não existe, e a fonte simplesmente\n * não está lá. É o que dispensa a linha do tempo de saber quais plugins um\n * tenant instalou.\n */\nexport function registerFormsTimelineSource(): void {\n registerTimelineSource({\n id: 'documents',\n label: 'Documentos',\n icon: 'FileText',\n tone: 'primary',\n async fetch(args): Promise<TimelineItem[]> {\n const db = getSupabaseClientOptional() as any\n if (!db) return []\n\n let query = db\n .from('v_documents')\n .select('id, title, kind, status, template_name, created_at')\n .eq('tenant_id', args.tenantId)\n .eq('person_id', args.personId)\n .eq('is_active', true)\n .order('created_at', { ascending: false })\n .limit(args.limit)\n\n if (args.before) query = query.lt('created_at', args.before)\n\n const { data, error } = await query\n if (error) return []\n\n return (data ?? []).map((row: any) => ({\n id: `document:${row.id}`,\n sourceId: 'documents',\n occurredAt: row.created_at,\n title: row.title ?? row.template_name ?? 'Documento',\n // O modelo só entra como descrição quando o título não veio dele —\n // senão a linha diria a mesma coisa duas vezes.\n description: row.template_name && row.template_name !== row.title ? row.template_name : undefined,\n badge: row.status ?? undefined,\n icon: row.kind === 'image' ? 'Image' : row.kind === 'attachment' ? 'Paperclip' : 'FileText',\n targetTab: 'documents',\n }))\n },\n })\n}\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport { registerTabCountProvider } from '@fayz-ai/admin'\n\n/**\n * Quantos registros e quantos arquivos esta pessoa tem.\n *\n * UMA consulta para as duas abas: as duas saem de `public.documents`, e pedir\n * dois `count` seria pagar o mesmo `where` duas vezes. Só a coluna `kind` vem —\n * o corpo do documento não interessa para contar.\n *\n * `is_active` e o status arquivado seguem a mesma regra da lista: o que não\n * aparece na aba não pode ser contado na aba.\n */\nexport function registerFormsTabCounts(): void {\n registerTabCountProvider({\n id: 'custom_forms:documents',\n async fetch({ tenantId, personId }): Promise<Record<string, number>> {\n const db = getSupabaseClientOptional() as any\n if (!db) return {}\n const { data, error } = await db\n .from('documents')\n .select('kind')\n .eq('tenant_id', tenantId)\n .eq('person_id', personId)\n .eq('is_active', true)\n .neq('status', 'archived')\n if (error) return {}\n\n let records = 0\n let files = 0\n for (const row of data ?? []) {\n if (row.kind === 'image' || row.kind === 'attachment') files += 1\n else records += 1\n }\n return { documents: records, files }\n },\n })\n}\n","import type { AnalyticsCardDef } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// The forms analytics pack.\n//\n// A submission lives on the person who made it, one document at a time, so the\n// product could show you a form and never a LIST of forms. These cards are the\n// missing surface: how many came in, which template they answered, and the\n// table of them — which is also, through the report viewer, the export.\n//\n// Read model: migration 006. Everything goes through the generic analytics_run\n// engine, so no card here carries SQL.\n// ---------------------------------------------------------------------------\n\nconst SUBMISSIONS = 'plg_forms_rep_submissions'\n\nconst CAT = tl('Forms', 'Formulários')\n\n/** Os códigos de `documents.status` → a palavra que alguém lê. */\nconst STATUS_LABELS: Record<string, string> = {\n draft: tl('Draft', 'Rascunho'),\n completed: tl('Completed', 'Concluído'),\n signed: tl('Signed', 'Assinado'),\n archived: tl('Archived', 'Arquivado'),\n}\n\nexport function buildFormsAnalyticsCards(): AnalyticsCardDef[] {\n const base = { domain: 'custom_forms', compare: true, canonicalOwner: 'public.documents' }\n\n return [\n {\n ...base,\n id: 'forms.submissions',\n name: tl('Form submissions', 'Formulários preenchidos'),\n description: tl(\n 'Forms filled in during the period, whoever filled them.',\n 'Formulários preenchidos no período, por quem quer que seja.',\n ),\n icon: 'FileText',\n category: CAT,\n grain: 'submission',\n query: {\n source: { kind: 'view', name: SUBMISSIONS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'submissions', label: tl('Submissions', 'Preenchimentos'), agg: 'count', format: 'number' }],\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 30 },\n },\n {\n ...base,\n id: 'forms.by-template',\n name: tl('Submissions by form', 'Preenchimentos por formulário'),\n description: tl(\n 'Which templates are actually being used — and which one nobody answers.',\n 'Quais modelos estão realmente em uso — e qual ninguém responde.',\n ),\n icon: 'ClipboardList',\n category: CAT,\n grain: 'submission',\n query: {\n source: { kind: 'view', name: SUBMISSIONS },\n dimensions: [{ key: 'template_name', label: tl('Form', 'Formulário') }],\n measures: [{ key: 'submissions', label: tl('Submissions', 'Preenchimentos'), agg: 'count', format: 'number' }],\n defaultSort: 'submissions',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', limit: 8 },\n },\n {\n // The list the product never had: one row per filled form, with the\n // person behind it. No measures, so it is a plain select — the rows ARE\n // the report, and the viewer's export button turns them into a file.\n ...base,\n id: 'forms.submissions-list',\n name: tl('Submission list', 'Lista de preenchimentos'),\n description: tl(\n 'Every form filled in the period, with who filled it — ready to export.',\n 'Todo formulário preenchido no período, com quem preencheu — pronto para exportar.',\n ),\n icon: 'Table',\n category: CAT,\n grain: 'submission',\n query: {\n source: { kind: 'view', name: SUBMISSIONS },\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n columns: [\n { key: 'created_at', label: tl('Filled', 'Preenchido em'), type: 'date', sortable: true },\n { key: 'template_name', label: tl('Form', 'Formulário'), type: 'text' },\n { key: 'person_name', label: tl('Person', 'Pessoa'), type: 'person', idKey: 'person_id' },\n { key: 'person_email', label: tl('E-mail', 'E-mail'), type: 'email' },\n { key: 'person_phone', label: tl('Phone', 'Telefone'), type: 'text' },\n { key: 'status', label: tl('Status', 'Situação'), type: 'text', valueMap: STATUS_LABELS },\n { key: 'template_category', label: tl('Category', 'Categoria'), type: 'text', visible: false },\n { key: 'signed_at', label: tl('Signed at', 'Assinado em'), type: 'date', visible: false },\n ],\n viz: { type: 'table' },\n },\n ]\n}\n","import { formatCurrency } from '@fayz-ai/core'\n// The V1 contract tags ({{Cliente.Nome}}, {{Indicacoes.Itens}}…), so templates brought from V1 render as written.\n\nexport interface ContractLine {\n description: string\n quantity: number\n unitPrice: number\n discount?: number\n total: number\n}\n\nexport interface ContractContext {\n client?: {\n name?: string; socialName?: string; cpf?: string; rg?: string; birthDate?: string; email?: string\n street?: string; number?: string; complement?: string; district?: string; city?: string; state?: string\n postalCode?: string; phone?: string; mobile?: string\n }\n unit?: {\n tradeName?: string; legalName?: string; cnpj?: string; street?: string; number?: string; complement?: string\n district?: string; city?: string; state?: string; postalCode?: string; phone?: string; mobile?: string; email?: string\n }\n professional?: { name?: string }\n services?: Array<{ name: string; price: number; contractText?: string }>\n paymentMethods?: string[]\n /** \"Serviços Contratados\" — what the client closed. */\n approvedItems?: ContractLine[]\n /** \"Serviços Propostos\" — what the professional indicated. Independent of what was closed. */\n recommendedItems?: ContractLine[]\n now?: Date\n}\n\nconst MONTHS = ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro']\n\nconst brl = (n: number) => formatCurrency(n)\nconst pad = (n: number) => String(n).padStart(2, '0')\nconst esc = (s: string) => s.replace(/[&<>\"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[c]!))\n\nfunction dateBR(value?: string): string {\n if (!value) return ''\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value)\n return m ? `${m[3]}/${m[2]}/${m[1]}` : value\n}\n\nfunction itemsTable(items: ContractLine[] | undefined, withDiscount: boolean): string {\n if (!items?.length) return ''\n const head = ['Item', 'Qtd', 'Valor Unit.', ...(withDiscount ? ['Desconto'] : []), 'Total']\n const rows = items.map((i) => [\n esc(i.description), String(i.quantity), brl(i.unitPrice), ...(withDiscount ? [brl(i.discount ?? 0)] : []), brl(i.total),\n ])\n return `<table><thead><tr>${head.map((h) => `<th>${h}</th>`).join('')}</tr></thead><tbody>${\n rows.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('')\n }</tbody></table>`\n}\n\nexport function renderContractTags(templateHtml: string, ctx: ContractContext): string {\n const now = ctx.now ?? new Date()\n const c = ctx.client ?? {}\n const u = ctx.unit ?? {}\n const services = ctx.services ?? []\n const names = services.map((s) => esc(s.name)).join(', ')\n const map: Record<string, string> = {\n 'Cliente.Nome': c.name ?? '', 'Cliente.NomeSocial': c.socialName ?? '', 'Cliente.CPF': c.cpf ?? '',\n 'Cliente.RG': c.rg ?? '', 'Cliente.Nascimento': dateBR(c.birthDate), 'Cliente.Email': c.email ?? '',\n 'Cliente.Endereco': c.street ?? '', 'Cliente.Numero': c.number ?? '', 'Cliente.Complemento': c.complement ?? '',\n 'Cliente.Bairro': c.district ?? '', 'Cliente.Cidade': c.city ?? '', 'Cliente.Estado': c.state ?? '',\n 'Cliente.Cep': c.postalCode ?? '', 'Cliente.Telefone': c.phone ?? '', 'Cliente.Celular': c.mobile ?? '',\n 'Unidade.NomeFantasia': u.tradeName ?? '', 'Unidade.RazaoSocial': u.legalName ?? '', 'Unidade.CNPJ': u.cnpj ?? '',\n 'Unidade.Endereco': u.street ?? '', 'Unidade.Numero': u.number ?? '', 'Unidade.Complemento': u.complement ?? '',\n 'Unidade.Bairro': u.district ?? '', 'Unidade.Cidade': u.city ?? '', 'Unidade.Estado': u.state ?? '',\n 'Unidade.Cep': u.postalCode ?? '', 'Unidade.Telefone': u.phone ?? '', 'Unidade.Celular': u.mobile ?? '',\n 'Unidade.Email': u.email ?? '',\n 'Profissional.Nome': ctx.professional?.name ?? '',\n 'Servicos.Lista': names, 'Servicos.Nome': names,\n 'Servicos.PrecoTotal': brl(services.reduce((s, x) => s + x.price, 0)),\n 'Servicos.TextoContrato': services.filter((s) => s.contractText).map((s) => s.contractText).join('<br/><br/>'),\n 'FormasPagto.Lista': (ctx.paymentMethods ?? []).map(esc).join(', '),\n 'Orcamento.Itens': itemsTable(ctx.approvedItems, true),\n 'Orcamento.ItensAprovados': itemsTable(ctx.approvedItems, true),\n 'Indicacoes.Itens': itemsTable(ctx.recommendedItems, false),\n 'Indicacoes.Lista': (ctx.recommendedItems ?? []).map((i) => esc(i.description)).join(', '),\n 'Sistema.Data': `${pad(now.getDate())}/${pad(now.getMonth() + 1)}/${now.getFullYear()}`,\n 'Sistema.DataExtenso': `${pad(now.getDate())} de ${MONTHS[now.getMonth()]} de ${now.getFullYear()}`,\n 'Sistema.Hora': `${pad(now.getHours())}:${pad(now.getMinutes())}`,\n }\n // These are built here (tables) or escaped above; every other value is plain text and escaped now.\n // The whole result is sanitized again on display.\n const built = new Set(['Orcamento.Itens', 'Orcamento.ItensAprovados', 'Indicacoes.Itens', 'Servicos.TextoContrato',\n 'Servicos.Lista', 'Servicos.Nome', 'Indicacoes.Lista', 'FormasPagto.Lista'])\n return templateHtml.replace(/\\{\\{\\s*([A-Za-z]+\\.[A-Za-z]+)\\s*\\}\\}/g, (whole, key: string) => {\n if (!(key in map)) return whole\n return built.has(key) ? map[key] : esc(map[key])\n })\n}\n","import { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { renderContractTags, type ContractContext, type ContractLine } from './contract-render'\n\n/**\n * A contract generated for an attendance: a `documents` row (kind `contract`) hanging on the\n * appointment, with the rendered text frozen at generation — what was signed must not change when\n * the template does. V1: `generated_contracts`.\n */\nexport interface AttendanceContract {\n id: string\n templateId: string\n templateName: string\n status: 'pending' | 'signed'\n html: string\n serviceIds: string[]\n /** The session term (signed before executing), as opposed to the service contract. */\n isSessionTerm: boolean\n requireSignature: boolean\n requireSelfie: boolean\n /** \"Obrigar Assinatura para Execução\": the attendance does not finish without it. */\n blocksFinish: boolean\n signedByName: string | null\n signedAt: string | null\n signaturePath: string | null\n selfiePath: string | null\n}\n\nexport interface ContractService {\n serviceId: string\n name: string\n quantity: number\n unitPrice: number\n discount?: number\n}\n\nexport interface EnsureContractsInput {\n bookingId: string\n personId: string\n unitId: string | null\n professionalId: string | null\n /** What the client closed in this attendance. */\n contracted: ContractService[]\n /** What the professional indicated (may differ from what was closed). */\n indicated: ContractService[]\n /** The services of this session — the session term lists them. */\n sessionServices: ContractService[]\n}\n\ninterface TemplateRow {\n id: string; name: string; content: string | null; is_active: boolean; group_services: boolean\n require_screen_signature: boolean; require_selfie: boolean; require_signature_for_execution: boolean\n generate_on_execution: boolean; generate_on_quote_approval: boolean; execution_scope: string | null\n metadata: { service_ids?: string[] } | null\n}\n\nconst db = () => {\n const c = getSupabaseClientOptional() as any\n if (!c) throw new Error('Supabase not initialized')\n return c\n}\nconst tenantId = () => getActiveTenantId() ?? getActiveTenantId() ?? ''\nconst BUCKET = 'attachments'\n\nfunction toLine(s: ContractService): ContractLine {\n const total = s.unitPrice * s.quantity - (s.discount ?? 0)\n return { description: s.name, quantity: s.quantity, unitPrice: s.unitPrice, discount: s.discount ?? 0, total }\n}\n\nfunction mapContract(row: any, templates: Map<string, TemplateRow>, sessionTermId: string | null): AttendanceContract {\n const m = row.metadata?.contract ?? {}\n const t = templates.get(m.templateId)\n return {\n id: row.id,\n templateId: m.templateId,\n templateName: t?.name ?? row.title ?? 'Contrato',\n status: row.status === 'signed' ? 'signed' : 'pending',\n html: m.html ?? '',\n serviceIds: m.serviceIds ?? [],\n isSessionTerm: !!sessionTermId && m.templateId === sessionTermId,\n requireSignature: t?.require_screen_signature ?? true,\n requireSelfie: t?.require_selfie ?? false,\n blocksFinish: t?.require_signature_for_execution ?? false,\n signedByName: m.signedByName ?? null,\n signedAt: m.signedAt ?? null,\n signaturePath: m.signaturePath ?? null,\n selfiePath: m.selfiePath ?? null,\n }\n}\n\nasync function loadTemplates(): Promise<Map<string, TemplateRow>> {\n const { data, error } = await db().from('plg_forms_contract_templates').select('*').eq('tenant_id', tenantId())\n if (error) throw new Error(error.message)\n return new Map(((data ?? []) as TemplateRow[]).map((t) => [t.id, t]))\n}\n\nasync function sessionTermTemplateId(): Promise<string | null> {\n const { data } = await db().from('tenants').select('settings').eq('id', tenantId()).maybeSingle()\n return data?.settings?.attendance_flow?.session_term_template_id ?? null\n}\n\nasync function loadContext(input: EnsureContractsInput): Promise<ContractContext> {\n const c = db()\n const [person, address, unit, pro] = await Promise.all([\n c.from('people').select('name, document_number, date_of_birth, email, phone, address, city, state, postal_code')\n .eq('id', input.personId).maybeSingle(),\n c.from('addresses').select('street, number, complement, district, city, state, postal_code, is_default')\n .eq('owner_type', 'person').eq('owner_id', input.personId).order('is_default', { ascending: false }).limit(1).maybeSingle(),\n input.unitId\n ? c.from('v_units').select('name, legal_name, cnpj, address_street, address_number, address_complement, address_district, city, state, postal_code, phone, mobile_1, email')\n .eq('id', input.unitId).maybeSingle()\n : Promise.resolve({ data: null }),\n input.professionalId\n ? c.from('people').select('name').eq('id', input.professionalId).maybeSingle()\n : Promise.resolve({ data: null }),\n ])\n const p = person.data ?? {}\n const a = address.data ?? {}\n const u = unit.data ?? {}\n return {\n client: {\n name: p.name, cpf: p.document_number, birthDate: p.date_of_birth, email: p.email, phone: p.phone, mobile: p.phone,\n street: a.street ?? p.address, number: a.number, complement: a.complement, district: a.district,\n city: a.city ?? p.city, state: a.state ?? p.state, postalCode: a.postal_code ?? p.postal_code,\n },\n unit: {\n tradeName: u.name, legalName: u.legal_name ?? u.name, cnpj: u.cnpj, street: u.address_street, number: u.address_number,\n complement: u.address_complement, district: u.address_district, city: u.city, state: u.state, postalCode: u.postal_code,\n phone: u.phone, mobile: u.mobile_1, email: u.email,\n },\n professional: { name: pro.data?.name },\n }\n}\n\nasync function serviceTexts(ids: string[]): Promise<Map<string, string>> {\n if (!ids.length) return new Map()\n const { data } = await db().from('products').select('id, metadata').in('id', ids)\n return new Map(((data ?? []) as any[]).map((r) => [r.id, r.metadata?.beauty?.contract_text ?? '']))\n}\n\nexport async function listAttendanceContracts(bookingId: string): Promise<AttendanceContract[]> {\n const [templates, termId, rows] = await Promise.all([\n loadTemplates(),\n sessionTermTemplateId(),\n db().from('documents').select('id, title, status, metadata, created_at')\n .eq('tenant_id', tenantId()).eq('kind', 'contract').eq('subject_type', 'appointment').eq('subject_id', bookingId)\n .eq('is_active', true).order('created_at'),\n ])\n if (rows.error) throw new Error(rows.error.message)\n return ((rows.data ?? []) as any[]).map((r) => mapContract(r, templates, termId))\n}\n\nconst sameSet = (a: string[], b: string[]) => a.length === b.length && a.every((x) => b.includes(x))\n\n/**\n * Generates what this attendance must sign, idempotently (V1 contractGenerator + ensureSessionTerm):\n * - templates generated at contracting (`generate_on_quote_approval`, or all billed services on\n * execution): one contract with every contracted service, or one per service when not grouped;\n * - templates bound to specific services (`metadata.service_ids`): for the contracted ones;\n * - the session term (`attendance_flow.session_term_template_id`): one per attendance, listing the\n * session's services.\n * A pending contract whose services changed is re-rendered; a signed one is never touched — a new\n * service after signing gets a new contract.\n */\nexport function ensureAttendanceContracts(input: EnsureContractsInput): Promise<AttendanceContract[]> {\n // One generation per attendance at a time (V1 appointmentGenerationQueue): two ruler opens at once\n // each saw \"no term yet\" and each inserted one.\n const prev = queue.get(input.bookingId) ?? Promise.resolve([])\n const next = prev.catch(() => []).then(() => generate(input))\n queue.set(input.bookingId, next)\n next.finally(() => { if (queue.get(input.bookingId) === next) queue.delete(input.bookingId) }).catch(() => {})\n return next\n}\n\nconst queue = new Map<string, Promise<AttendanceContract[]>>()\n\nasync function generate(input: EnsureContractsInput): Promise<AttendanceContract[]> {\n const [templates, termId, existing] = await Promise.all([\n loadTemplates(), sessionTermTemplateId(), listAttendanceContracts(input.bookingId),\n ])\n const active = [...templates.values()].filter((t) => t.is_active)\n const wanted: Array<{ template: TemplateRow; services: ContractService[] }> = []\n\n if (input.contracted.length) {\n for (const t of active) {\n if (t.id === termId) continue\n const allBilled = t.generate_on_quote_approval || (t.generate_on_execution && t.execution_scope === 'all_billed_services')\n const linked = t.generate_on_execution && (t.execution_scope ?? 'linked_services') === 'linked_services'\n ? input.contracted.filter((s) => t.metadata?.service_ids?.includes(s.serviceId)) : []\n const services = allBilled ? input.contracted : linked\n if (!services.length) continue\n if (t.group_services || allBilled) wanted.push({ template: t, services })\n else for (const s of services) wanted.push({ template: t, services: [s] })\n }\n }\n const term = termId ? templates.get(termId) : undefined\n if (term?.is_active && input.sessionServices.length) wanted.push({ template: term, services: input.sessionServices })\n\n if (!wanted.length) return existing\n\n const ctx = await loadContext(input)\n const texts = await serviceTexts([...new Set(wanted.flatMap((w) => w.services.map((s) => s.serviceId)))])\n const c = db()\n for (const w of wanted) {\n const ids = [...new Set(w.services.map((s) => s.serviceId))].sort()\n const mine = existing.filter((e) => e.templateId === w.template.id)\n // One contract per template here, unless the template splits per service.\n const perService = !w.template.group_services && w.template.id !== termId && !w.template.generate_on_quote_approval\n const scope = perService ? mine.filter((e) => sameSet(e.serviceIds, ids)) : mine\n if (scope.some((e) => e.status === 'signed' && ids.every((id) => e.serviceIds.includes(id)))) continue\n const html = renderContractTags(w.template.content ?? '', {\n ...ctx,\n services: w.services.map((s) => ({ name: s.name, price: s.unitPrice * s.quantity, contractText: texts.get(s.serviceId) || undefined })),\n approvedItems: input.contracted.map(toLine),\n recommendedItems: input.indicated.map(toLine),\n })\n const meta = { contract: { templateId: w.template.id, html, serviceIds: ids } }\n const pending = scope.find((e) => e.status === 'pending')\n if (pending) {\n if (sameSet(pending.serviceIds, ids)) continue\n const { error } = await c.from('documents').update({ metadata: meta, updated_at: new Date().toISOString() })\n .eq('id', pending.id).eq('status', 'pending')\n if (error) throw new Error(error.message)\n continue\n }\n const { error } = await c.from('documents').insert({\n tenant_id: tenantId(), kind: 'contract', person_id: input.personId, unit_id: input.unitId,\n title: w.template.name, status: 'pending', subject_type: 'appointment', subject_id: input.bookingId, metadata: meta,\n })\n if (error) throw new Error(error.message)\n }\n return listAttendanceContracts(input.bookingId)\n}\n\nexport async function signAttendanceContract(contract: AttendanceContract, input: {\n signerName: string\n signature: Blob | null\n selfie: Blob | null\n}): Promise<void> {\n const c = db()\n const up = async (blob: Blob, name: string) => {\n const path = `${tenantId()}/contracts/${contract.id}/${Date.now()}-${name}`\n const { error } = await c.storage.from(BUCKET).upload(path, blob, { contentType: blob.type || undefined })\n if (error) throw new Error(error.message)\n return path\n }\n const signaturePath = input.signature ? await up(input.signature, 'assinatura.png') : null\n const selfiePath = input.selfie ? await up(input.selfie, 'selfie.jpg') : null\n const { data: row, error: readErr } = await c.from('documents').select('metadata').eq('id', contract.id).maybeSingle()\n if (readErr) throw new Error(readErr.message)\n const metadata = {\n ...(row?.metadata ?? {}),\n contract: {\n ...(row?.metadata?.contract ?? {}),\n signedByName: input.signerName.trim() || null,\n signedAt: new Date().toISOString(),\n signaturePath, selfiePath,\n },\n }\n // Only a pending contract signs: a second tab signing the same one must not overwrite the first.\n const { data, error } = await c.from('documents').update({ status: 'signed', metadata, updated_at: new Date().toISOString() })\n .eq('id', contract.id).eq('status', 'pending').select('id')\n if (error) throw new Error(error.message)\n if (!data?.length) throw new Error('Este contrato já foi assinado.')\n}\n\nexport async function contractMediaUrl(path: string | null): Promise<string | null> {\n if (!path) return null\n const { data } = await db().storage.from(BUCKET).createSignedUrl(path, 3600)\n return data?.signedUrl ?? null\n}\n","import React from 'react'\nimport { Camera, Check, Printer, X } from 'lucide-react'\nimport { Button, Input } from '@fayz-ai/ui'\nimport { sanitizeHtml } from '../lib/html-text'\nimport { contractMediaUrl, signAttendanceContract, type AttendanceContract } from '../lib/attendance-contracts'\nimport { describeError } from '@fayz-ai/core'\n\nconst CONTRACT_TEXT_CLASS = [\n 'space-y-2 text-sm leading-relaxed',\n '[&_b]:font-semibold [&_strong]:font-semibold [&_h1]:text-base [&_h1]:font-semibold [&_h2]:font-semibold [&_h3]:font-semibold',\n '[&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5',\n '[&_table]:my-2 [&_table]:w-full [&_table]:text-xs [&_td]:border [&_td]:border-border [&_td]:px-2 [&_td]:py-1',\n '[&_th]:border [&_th]:border-border [&_th]:bg-muted/50 [&_th]:px-2 [&_th]:py-1 [&_th]:text-left [&_th]:font-medium',\n].join(' ')\n\nfunction useSigned(path: string | null) {\n const [url, setUrl] = React.useState<string | null>(null)\n React.useEffect(() => {\n let alive = true\n contractMediaUrl(path).then((u) => { if (alive) setUrl(u) }).catch(() => {})\n return () => { alive = false }\n }, [path])\n return url\n}\n\nfunction SignaturePad({ onChange }: { onChange: (b: Blob | null) => void }) {\n const ref = React.useRef<HTMLCanvasElement>(null)\n const drawing = React.useRef(false)\n React.useEffect(() => {\n const c = ref.current\n if (!c) return\n const r = window.devicePixelRatio || 1\n c.width = c.offsetWidth * r\n c.height = c.offsetHeight * r\n const ctx = c.getContext('2d')!\n ctx.scale(r, r); ctx.lineWidth = 2; ctx.lineCap = 'round'; ctx.strokeStyle = '#111827'\n }, [])\n const pos = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const b = e.currentTarget.getBoundingClientRect()\n return [e.clientX - b.left, e.clientY - b.top] as const\n }\n return (\n <div className=\"space-y-1.5\">\n <canvas\n ref={ref}\n aria-label=\"Área de assinatura\"\n className=\"h-36 w-full touch-none rounded-md border bg-white\"\n onPointerDown={(e) => {\n drawing.current = true\n e.currentTarget.setPointerCapture(e.pointerId)\n const ctx = e.currentTarget.getContext('2d')!; const [x, y] = pos(e); ctx.beginPath(); ctx.moveTo(x, y)\n }}\n onPointerMove={(e) => {\n if (!drawing.current) return\n const ctx = e.currentTarget.getContext('2d')!; const [x, y] = pos(e); ctx.lineTo(x, y); ctx.stroke()\n }}\n onPointerUp={(e) => {\n drawing.current = false\n e.currentTarget.toBlob((b) => onChange(b), 'image/png')\n }}\n />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" className=\"font-normal text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => { const c = ref.current; if (c) { c.getContext('2d')!.clearRect(0, 0, c.width, c.height); onChange(null) } }}>\n Limpar assinatura\n </Button>\n </div>\n )\n}\n\nfunction SelfieCapture({ value, onChange }: { value: Blob | null; onChange: (b: Blob | null) => void }) {\n const video = React.useRef<HTMLVideoElement>(null)\n const stream = React.useRef<MediaStream | null>(null)\n const [on, setOn] = React.useState(false)\n const [erro, setErro] = React.useState<string | null>(null)\n const preview = React.useMemo(() => (value ? URL.createObjectURL(value) : null), [value])\n const stop = () => { stream.current?.getTracks().forEach((t) => t.stop()); stream.current = null; setOn(false) }\n React.useEffect(() => () => stop(), [])\n async function start() {\n setErro(null)\n try {\n stream.current = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'user' } })\n setOn(true)\n requestAnimationFrame(() => { if (video.current) { video.current.srcObject = stream.current; video.current.play().catch(() => {}) } })\n } catch { setErro('Não foi possível acessar a câmera.') }\n }\n function capture() {\n const v = video.current\n if (!v?.videoWidth) return\n const c = document.createElement('canvas'); c.width = v.videoWidth; c.height = v.videoHeight\n c.getContext('2d')!.drawImage(v, 0, 0)\n c.toBlob((b) => { onChange(b); stop() }, 'image/jpeg', 0.85)\n }\n return (\n <div className=\"space-y-2\">\n <span className=\"text-sm font-medium\">Selfie</span>\n {preview ? (\n <div className=\"relative w-40\">\n <img src={preview} alt=\"Selfie\" className=\"rounded-lg border\" />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" aria-label=\"Remover selfie\" onClick={() => onChange(null)}\n className=\"font-normal absolute right-1 top-1 flex h-6 w-6 items-center justify-center rounded-full bg-background/90\"><X className=\"h-3 w-3\" /></Button>\n </div>\n ) : on ? (\n <div className=\"space-y-2\">\n <video ref={video} playsInline muted className=\"w-full max-w-[240px] rounded-lg border\" />\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={capture}><Camera className=\"mr-1 h-4 w-4\" /> Capturar</Button>\n <Button size=\"sm\" variant=\"outline\" onClick={stop}>Cancelar</Button>\n </div>\n </div>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={start}><Camera className=\"mr-1 h-4 w-4\" /> Tirar selfie</Button>\n )}\n {erro && <p className=\"text-xs text-destructive\">{erro}</p>}\n </div>\n )\n}\n\nfunction printContract(contract: AttendanceContract, signatureUrl: string | null) {\n const w = window.open('', '_blank')\n if (!w) return\n const signed = contract.status === 'signed'\n ? `<div style=\"margin-top:32px\">${signatureUrl ? `<img src=\"${signatureUrl}\" style=\"max-height:120px\"/>` : ''}\n <p>Assinado ${contract.signedByName ? `por ${contract.signedByName.replace(/</g, '<')} ` : ''}em ${contract.signedAt ? new Date(contract.signedAt).toLocaleString('pt-BR') : ''}</p></div>`\n : ''\n w.document.write(`<!doctype html><html><head><meta charset=\"utf-8\"><title>${contract.templateName.replace(/</g, '<')}</title>\n <style>body{font:14px/1.5 system-ui,sans-serif;max-width:760px;margin:32px auto;padding:0 16px;color:#111}\n table{border-collapse:collapse;width:100%;margin:8px 0}td,th{border:1px solid #ccc;padding:4px 6px;text-align:left}</style>\n </head><body>${sanitizeHtml(contract.html)}${signed}</body></html>`)\n w.document.close()\n w.focus()\n setTimeout(() => w.print(), 300)\n}\n\nexport interface ContractSignPaneProps {\n contract: AttendanceContract\n /** The client's name: V1 pre-fills \"Nome do Assinante\" with it. */\n defaultSignerName?: string | null\n onSigned: () => void\n onClose: () => void\n}\n\n/** V1 ContractSignatureModal, drawn inside the host's frame (the attendance ruler pane). */\nexport function ContractSignPane({ contract, defaultSignerName, onSigned, onClose }: ContractSignPaneProps) {\n const [signer, setSigner] = React.useState(defaultSignerName ?? '')\n const [signature, setSignature] = React.useState<Blob | null>(null)\n const [selfie, setSelfie] = React.useState<Blob | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [erro, setErro] = React.useState<string | null>(null)\n const signatureUrl = useSigned(contract.signaturePath)\n const selfieUrl = useSigned(contract.selfiePath)\n const signed = contract.status === 'signed'\n const html = React.useMemo(() => sanitizeHtml(contract.html), [contract.html])\n // The hint goes away as soon as what it asked for is there.\n React.useEffect(() => { setErro(null) }, [signature, selfie, signer])\n\n const missing = contract.requireSignature && !signature ? 'Desenhe a assinatura para confirmar.'\n : contract.requireSelfie && !selfie ? 'Tire a selfie para confirmar.'\n : !signer.trim() ? 'Informe o nome de quem assina.' : null\n\n async function sign() {\n if (missing) { setErro(missing); return }\n setSaving(true); setErro(null)\n try {\n await signAttendanceContract(contract, { signerName: signer, signature, selfie })\n onSigned()\n } catch (e) {\n setErro(describeError(e, 'Não foi possível assinar o contrato.'))\n } finally { setSaving(false) }\n }\n\n return (\n <>\n <div className=\"flex-1 space-y-4 overflow-y-auto px-5 py-4\">\n <div className=\"flex justify-end\">\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 gap-1.5\" onClick={() => printContract(contract, signatureUrl)}>\n <Printer className=\"h-3.5 w-3.5\" /> Imprimir\n </Button>\n </div>\n <div className=\"max-h-[55vh] overflow-y-auto rounded-lg border bg-card p-4\">\n <div className={CONTRACT_TEXT_CLASS} dangerouslySetInnerHTML={{ __html: html }} />\n </div>\n\n {signed ? (\n <div className=\"space-y-3\">\n <p className=\"flex items-center gap-2 rounded-lg border border-success/40 bg-success-soft px-3 py-2 text-sm text-success-soft-foreground\">\n <Check className=\"h-4 w-4\" />\n Assinado em {contract.signedAt ? new Date(contract.signedAt).toLocaleString('pt-BR') : ''}\n {contract.signedByName ? ` por ${contract.signedByName}` : ''}\n </p>\n {signatureUrl && <img src={signatureUrl} alt=\"Assinatura\" className=\"max-h-32 rounded-md border bg-white p-2\" />}\n {selfieUrl && <img src={selfieUrl} alt=\"Selfie\" className=\"max-h-40 rounded-lg border\" />}\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"block text-sm font-medium\" htmlFor=\"contract-signer\">Nome do Assinante</label>\n <Input id=\"contract-signer\" value={signer} onChange={(e) => setSigner(e.target.value)} placeholder=\"Nome completo\" />\n </div>\n {contract.requireSignature && <SignaturePad onChange={setSignature} />}\n {contract.requireSelfie && <SelfieCapture value={selfie} onChange={setSelfie} />}\n </div>\n )}\n {erro && <p role=\"alert\" className=\"rounded-lg bg-destructive/10 px-3 py-2 text-xs text-destructive\">{erro}</p>}\n </div>\n\n <div className=\"shrink-0 border-t fayz-glass-divider px-5 py-2.5 pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5\">\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onClose}\n className=\"rounded-button px-2 py-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n {signed ? 'Fechar' : 'Agora não'}\n </Button>\n {!signed && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={sign} disabled={saving}\n className=\"rounded-button bg-foreground px-3 py-1.5 text-xs font-semibold text-background disabled:opacity-40\">\n {saving ? 'Assinando…' : 'Confirmar Assinatura'}\n </Button>\n )}\n </div>\n </div>\n </>\n )\n}\n","import { defineSettingsTab } from '@fayz-ai/admin'\nimport { tl } from '@fayz-ai/core'\n\nexport const formsV1SettingsTabs = [\n defineSettingsTab({\n id: 'forms-contract-rules',\n label: tl('Contract rules', 'Regras de contrato'),\n icon: 'FileCheck2',\n section: 'registry',\n pending: true,\n defaults: { 'contracts.execution_requires_signed_contract': false, 'contracts.prepaid_purchase_flow': false },\n sections: [{\n fields: [\n { key: 'contracts.execution_requires_signed_contract', type: 'boolean', label: tl('A service runs only with the contract signed', 'Executar serviço só com contrato assinado') },\n { key: 'contracts.prepaid_purchase_flow', type: 'boolean', label: tl('Prepaid purchase flow', 'Fluxo de compra pré-paga') },\n ],\n }],\n }),\n]\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { lazyComponent, RECORD_GROUP, recordRailFields, activeFacet } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport type { FormsDataProvider } from '@fayz-ai/forms/data/provider'\nimport { T } from '@fayz-ai/forms/data/tables'\nimport { createFormsStore, createSafeFormsProvider } from '@fayz-ai/forms/store'\nimport { registerTranslations, tl } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { formsZoneWidgets } from './components/formsZoneWidgets'\nimport { customFormsLocales } from './locales'\nimport { resolveConfig } from './config'\nimport type { CustomFormsPluginOptions } from './config'\nimport { registerDocumentTypeProvider } from './lib/document-types'\nimport {\n CATEGORY_GROUP_ORDER, CATEGORY_ICONS, categoryLabel, normalizeCategory,\n} from './lib/categories'\nimport { registerFormsTimelineSource } from './lib/timeline-source'\nimport { registerFormsTabCounts } from './lib/tab-counts'\nimport { buildFormsAnalyticsCards } from './analytics/cards'\nimport { createOrUpdateFormTool } from './lib/agent-tools'\nimport { FileText as FileTextIcon, Image as ImageIcon, Paperclip } from 'lucide-react'\n\nfunction registerBuiltInProviders(formsProvider: FormsDataProvider) {\n // Templates from custom_forms\n registerDocumentTypeProvider({\n id: 'custom_forms:templates',\n async getTypes() {\n try {\n const result = await formsProvider.getTemplates({})\n // Agrupado pela CATEGORIA do modelo, não por um literal \"Formulários\":\n // é o que transforma o menu em \"Novo ▸ Anamnese ▸ escolhe o modelo\",\n // que é como o consultório pensa. O grupo único fazia vinte e cinco\n // modelos caírem numa lista chapada onde anamnese e termo de imagem\n // pareciam a mesma coisa.\n return result.data.map((tpl) => {\n const category = normalizeCategory(tpl.category)\n return {\n id: `template:${tpl.id}`,\n label: tpl.name,\n icon: CATEGORY_ICONS[category] ?? FileTextIcon,\n group: categoryLabel(category),\n groupOrder: CATEGORY_GROUP_ORDER[category] ?? 50,\n order: 0,\n description: tpl.description,\n _templateId: tpl.id,\n }\n }) as any[]\n } catch {\n return []\n }\n },\n })\n\n // Built-in file types\n registerDocumentTypeProvider({\n id: 'core:files',\n getTypes() {\n return [\n { id: 'core:image', label: tl('Image', 'Imagem'), icon: ImageIcon, group: tl('Files', 'Arquivos'), groupOrder: 90, order: 0 },\n { id: 'core:attachment', label: tl('Attachment', 'Anexo'), icon: Paperclip, group: tl('Files', 'Arquivos'), groupOrder: 90, order: 1 },\n ]\n },\n })\n}\n\nexport type { CustomFormsPluginOptions }\nexport { registerDocumentTypeProvider, type DocumentTypeOption, type DocumentTypeProvider } from './lib/document-types'\nexport { PersonFormsAlert, type PersonFormsAlertProps } from './components/PersonFormsAlert'\nexport { FormFillDialog, recommendationsOf, type FormFillDialogProps, type FormFillResult } from './components/FormFillDialog'\nexport type { RecommendationShortcut } from './components/fields/fields'\n// The attendance's contracts and their signing — V1 generated_contracts, drawn in the host's ruler.\nexport { ContractSignPane, type ContractSignPaneProps } from './components/ContractSignPane'\nexport {\n ensureAttendanceContracts, listAttendanceContracts,\n type AttendanceContract, type ContractService, type EnsureContractsInput,\n} from './lib/attendance-contracts'\nexport type { RecommendationLine, MediaValue, StencilConfig, GalleryConfig, AnswerAlertConfig } from '@fayz-ai/forms/domain/template'\n// The published names this plugin always had; their home is now @fayz-ai/forms.\nexport { isOutstanding, type PersonFormRequirement, type RequirementState } from '@fayz-ai/forms/domain/requirement'\nexport { getPersonFormRequirements } from '@fayz-ai/forms/data/supabase'\nimport { formsV1SettingsTabs } from './settings/v1-settings'\n\n// Code loads when it is first drawn, not with the app. Pages use React.lazy\n// (the shell's route boundary shows the page skeleton); anything that may\n// render elsewhere uses lazyComponent, which carries its own boundary.\nconst PersonDocumentsWidgetImpl = lazyComponent(() =>\n import('./components/PersonDocumentsWidget').then((m) => m.PersonDocumentsWidget))\nconst CustomFormsSettingsTab = lazyComponent(() => import('./views/CustomFormsSettingsTab').then((m) => m.CustomFormsSettingsTab))\nconst PersonAnswerAlerts = lazyComponent(() => import('./components/PersonAnswerAlerts').then((m) => m.PersonAnswerAlerts))\n\nexport function createCustomFormsPlugin(options?: CustomFormsPluginOptions): PluginManifest {\n registerTranslations(customFormsLocales)\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createSafeFormsProvider()\n const store = createFormsStore(provider)\n\n // Register built-in document type providers\n registerBuiltInProviders(provider)\n\n // Documento criado passa a aparecer na linha do tempo de quem o tem.\n registerFormsTimelineSource()\n registerFormsTabCounts()\n\n\n // ---------------------------------------------------------------------\n // MODELOS DE CONTRATO\n //\n // Contrato e formulário são a mesma coisa pela METADE — um modelo com nome,\n // um interruptor de ativo e regras de quando ele passa a ser exigido —, e é\n // a metade que este plugin já resolve. A outra não se parece: o formulário é\n // uma COLEÇÃO DE PERGUNTAS, o contrato é um TEXTO com variáveis que alguém\n // assina.\n //\n // Por isso o formulário tem construtor próprio (os campos são dinâmicos) e o\n // contrato cabe no CRUD genérico: o que ele tem é um texto e sete decisões.\n // ---------------------------------------------------------------------\n const contractTemplateEntity: EntityDef = {\n name: 'Modelo de contrato',\n namePlural: 'Modelos de contrato',\n icon: 'FileSignature',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [activeFacet({ active: 'Ativos', inactive: 'Inativos', all: 'Todos' })],\n fieldGroups: [\n { id: 'identity', label: 'O contrato', columns: 1 },\n {\n id: 'when', label: 'Quando ele nasce', columns: 1,\n description: 'As duas portas convivem: um orçamento aprovado gera o contrato do pacote, e a execução gera o termo daquele procedimento.',\n },\n {\n id: 'signature', label: 'Assinatura', columns: 1,\n description: 'Os dois primeiros dizem COMO se assina. O terceiro diz o que acontece se ninguém assinar — e é o único que bloqueia.',\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: 'Nome', type: 'text', required: true, showInTable: true, searchable: true, group: 'identity' },\n // Markdown e não editor de página: quem escreve contrato precisa de\n // parágrafo e negrito. As variáveis ({{cliente.nome}}) são substituídas\n // na geração.\n {\n key: 'content', label: 'Texto do contrato', type: 'markdown', showInTable: false, group: 'identity',\n hint: 'Use {{cliente.nome}}, {{servico.nome}} e afins — a geração substitui.',\n },\n { key: 'generateOnQuoteApproval', label: 'Gerar quando um orçamento for aprovado', type: 'boolean', showInTable: false, defaultValue: false, group: 'when' },\n { key: 'generateOnExecution', label: 'Gerar na execução do serviço', type: 'boolean', showInTable: false, defaultValue: false, group: 'when' },\n // Um contrato por atendimento ou um por serviço: é o que decide se a\n // cliente assina uma folha ou seis.\n {\n key: 'groupServices', label: 'Um contrato para todos os serviços do atendimento', type: 'boolean',\n showInTable: false, defaultValue: true, group: 'when',\n hint: 'Desligado, sai um contrato por serviço.',\n },\n { key: 'requireScreenSignature', label: 'Assinar na tela', type: 'boolean', showInTable: true, defaultValue: false, group: 'signature' },\n { key: 'requireSelfie', label: 'Pedir selfie de quem assina', type: 'boolean', showInTable: false, defaultValue: false, group: 'signature' },\n {\n key: 'requireSignatureForExecution', label: 'Sem assinatura, não executa', type: 'boolean',\n showInTable: true, defaultValue: false, group: 'signature',\n hint: 'O único que bloqueia: o serviço não pode ser executado sem o contrato assinado.',\n },\n ...recordRailFields({ tagsTable: 'plg_forms_contract_templates', activeLabel: 'Ativo' }),\n ],\n data: {\n table: 'plg_forms_contract_templates',\n schema: 'public',\n tenantScoped: true,\n searchColumns: ['name'],\n },\n }\n\n const formRegistries: import('@fayz-ai/core').PluginRegistryDef[] = [\n {\n id: 'contract-templates',\n entity: contractTemplateEntity,\n icon: 'FileSignature',\n description: 'Modelos de contrato que o cliente assina',\n agentHint: 'O MODELO do contrato — não é um contrato gerado nem uma assinatura.',\n },\n {\n id: 'form-categories',\n entity: {\n name: 'Category',\n namePlural: 'Categories',\n icon: 'FolderOpen',\n displayField: 'name',\n defaultSort: 'sort_order',\n fields: [\n { key: 'name', label: 'Name', type: 'text' as const, required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text' as const, showInTable: true },\n { key: 'color', label: 'Color', type: 'color' as const, showInTable: true },\n { key: 'sortOrder', label: 'Order', type: 'number' as const, showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: 'Active', type: 'boolean' as const, showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: T.categories,\n tenantScoped: true,\n },\n },\n icon: 'FolderOpen',\n description: 'Categories for organizing form templates',\n seedData: [\n { name: 'Anamnese', sortOrder: 1, isActive: true },\n { name: 'Evolução', sortOrder: 2, isActive: true },\n { name: 'Laudo', sortOrder: 3, isActive: true },\n { name: 'Contrato', sortOrder: 4, isActive: true },\n { name: 'Geral', sortOrder: 5, isActive: true },\n ],\n },\n ]\n\n const registries = [...formRegistries, ...(options?.settingsRegistries ?? [])]\n\n const SettingsComponent: React.FC = () =>\n React.createElement(PluginSettingsPanel, {\n title: config.labels.settingsLabel,\n customTabs: [\n {\n id: 'forms',\n label: config.labels.pageTitle,\n icon: 'FileText',\n content: React.createElement(CustomFormsSettingsTab, { config, provider, store }),\n },\n ],\n registries,\n routeBase: '/settings/custom_forms',\n hostPluginId: 'custom_forms',\n })\n SettingsComponent.displayName = 'CustomFormsSettingsPanel'\n\n const PersonDocumentsWidget: React.FC<any> = (props: any) =>\n React.createElement(PersonDocumentsWidgetImpl, { ...props, config, provider, store, surface: 'records' })\n PersonDocumentsWidget.displayName = 'PersonDocumentsWidget'\n\n // O armário: foto e anexo, fora do prontuário. Mesmo componente, outra\n // superfície — a lista, o arrastar e o visualizador são os mesmos, e é\n // justamente por isso que separar as abas não custou uma segunda tela.\n const PersonFilesWidget: React.FC<any> = (props: any) =>\n React.createElement(PersonDocumentsWidgetImpl, { ...props, config, provider, store, surface: 'files' })\n PersonFilesWidget.displayName = 'PersonFilesWidget'\n\n const PersonAnswerAlertsWidget: React.FC<any> = (props: any) =>\n React.createElement(PersonAnswerAlerts, { personId: props.item?.id, provider })\n PersonAnswerAlertsWidget.displayName = 'PersonAnswerAlertsWidget'\n\n return {\n id: 'custom_forms',\n defaultAgentRole: 'setup',\n name: config.labels.pageTitle,\n icon: 'FileText',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'custom_forms', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n declaredLimits: [\n { key: 'form_templates', label: 'Form templates', table: 'plg_forms_templates' },\n { key: 'documents_month', label: 'Documents / month', table: 'documents', period: 'month' },\n ],\n\n // O formulário preenchido vira número e vira LISTA em /analytics — até aqui\n // ele só existia dentro da ficha de uma pessoa, um de cada vez. Read model\n // na migration 006.\n analyticsCards: options?.analyticsCards === false ? [] : buildFormsAnalyticsCards(),\n\n navigation: [],\n\n routes: [],\n\n settings: [\n ...formsV1SettingsTabs,\n {\n id: 'custom_forms',\n label: config.labels.settingsLabel,\n icon: 'FileText',\n component: SettingsComponent as unknown as React.ComponentType<unknown>,\n order: 15,\n },\n ],\n\n widgets: [\n {\n id: 'person-documents-tab',\n zone: 'person.detail.documents',\n component: PersonDocumentsWidget,\n order: 0,\n },\n {\n id: 'person-files-tab',\n zone: 'person.detail.files',\n component: PersonFilesWidget,\n order: 0,\n },\n ...formsZoneWidgets(provider),\n {\n // Renders nothing unless a form marks an answer as an alert (V1 alert_config).\n id: 'person-answer-alerts',\n zone: 'person.detail.above-tabs',\n component: PersonAnswerAlertsWidget,\n order: -1,\n },\n ],\n\n registries,\n\n aiTools: [\n {\n id: 'custom_forms.list-templates',\n name: 'listFormTemplates',\n description: 'Lists available form templates for the current tenant.',\n icon: 'FileText',\n mode: 'read' as const,\n category: 'Forms',\n parameters: {\n type: 'object' as const,\n properties: {\n category: {\n type: 'string' as const,\n description: 'Filter by category: anamnesis, evolution, report, contract, general',\n },\n },\n },\n suggestions: [\n { label: 'Quais formulários temos?' },\n { label: 'Mostre os modelos de anamnese' },\n ],\n permission: { feature: 'custom_forms', action: 'read' as const },\n },\n {\n id: 'custom_forms.list-documents',\n name: 'listDocuments',\n description: 'Lists filled documents, optionally filtered by person or status.',\n icon: 'FileText',\n mode: 'read' as const,\n category: 'Forms',\n parameters: {\n type: 'object' as const,\n properties: {\n personId: { type: 'string' as const, description: 'Person UUID to filter by' },\n status: {\n type: 'string' as const,\n description: 'Status filter: draft, completed, signed, archived',\n },\n },\n },\n suggestions: [\n { label: \"Mostre os documentos deste cliente\" },\n ],\n permission: { feature: 'custom_forms', action: 'read' as const },\n },\n // Server-plane write: builds/edits a form template via the pool RPC, so\n // the assistant can montar formulários from any page or channel.\n createOrUpdateFormTool,\n ],\n\n declaredRpcs: [\n {\n name: 'agent_forms_upsert_template',\n kind: 'write' as const,\n description:\n 'Guarded form-template upsert: agent_guard (role→plan→form_templates cap), grid layout computed server-side, create or edit by id, audited.',\n audits: true,\n },\n ],\n\n // Where a submitted form is supposed to land.\n integrations: ['mailchimp', 'rd-station', 'zapier'],\n locales: customFormsLocales,\n }\n}\n"]}
|