@fayz-ai/plugin-forms 0.9.4 → 0.10.0
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/components/AddDocumentDropdown.d.ts.map +1 -1
- package/dist/index.js +297 -127
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/store.d.ts +7 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/views/TemplateListView.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/tables.ts","../src/data/mock.ts","../src/lib/tenant.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/config.ts","../src/views/TemplateListView.tsx","../src/views/CustomFormsSettingsTab.tsx","../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/lib/timeline-source.ts","../src/index.ts"],"names":["getActiveTenantId","now","useState","useCallback","React","jsx","FileText","ImageIcon","useTranslation","useEffect","jsxs","Badge","Archive","STATUS_COLORS","ArrowLeft","Button","Pencil","useRef","Plus","useLimitGuard","invalidateLimit","Paperclip","getSupabaseClientOptional","FileTextIcon","PersonDocumentsWidget"],"mappings":"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","file":"index.js","sourcesContent":["// Central physical-table-name registry for plugin-forms. `documents` stays core.\nexport const T = {\n documents: 'plg_forms_documents',\n templates: 'plg_forms_templates',\n documentFiles: 'plg_forms_document_files',\n categories: 'plg_forms_categories',\n} as const\n","import type { CustomFormsDataProvider } from './types'\nimport type {\n FormTemplate,\n FormDocument,\n DocumentFile,\n TemplateQuery,\n DocumentQuery,\n PaginatedResult,\n CreateTemplateInput,\n UpdateTemplateInput,\n CreateDocumentInput,\n UpdateDocumentInput,\n TemplateUsage,\n} from '../types'\n\nfunction uuid() {\n return crypto.randomUUID()\n}\n\nfunction now() {\n return new Date().toISOString()\n}\n\nexport function createMockFormsProvider(): CustomFormsDataProvider {\n const templates: FormTemplate[] = []\n const documents: FormDocument[] = []\n const files: DocumentFile[] = []\n\n return {\n // ── Templates ──────────────────────────────────────────\n async getTemplates(query: TemplateQuery): Promise<PaginatedResult<FormTemplate>> {\n let filtered = templates.filter((t) => !t.isDeleted && t.isCurrent)\n if (query.category) {\n filtered = filtered.filter((t) => t.category === query.category)\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n filtered = filtered.filter((t) => t.name.toLowerCase().includes(s))\n }\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 25\n const start = (page - 1) * pageSize\n return { data: filtered.slice(start, start + pageSize), total: filtered.length }\n },\n\n async getTemplateById(id: string): Promise<FormTemplate | null> {\n return templates.find((t) => t.id === id && !t.isDeleted) ?? null\n },\n\n async createTemplate(input: CreateTemplateInput): Promise<FormTemplate> {\n const template: FormTemplate = {\n id: uuid(),\n tenantId: 'mock-tenant',\n name: input.name,\n description: input.description,\n category: input.category,\n version: 1,\n isCurrent: true,\n schema: input.schema,\n specialty: input.specialty,\n tags: input.tags ?? [],\n metadata: input.metadata ?? {},\n isActive: true,\n isDeleted: false,\n createdAt: now(),\n updatedAt: now(),\n }\n templates.push(template)\n return template\n },\n\n async updateTemplate(id: string, input: UpdateTemplateInput): Promise<FormTemplate> {\n const idx = templates.findIndex((t) => t.id === id)\n if (idx === -1) throw new Error('Template not found')\n const existing = templates[idx]\n const updated: FormTemplate = {\n ...existing,\n ...input,\n tags: input.tags ?? existing.tags,\n metadata: input.metadata ?? existing.metadata,\n schema: input.schema ?? existing.schema,\n updatedAt: now(),\n }\n templates[idx] = updated\n return updated\n },\n\n async deleteTemplate(id: string): Promise<void> {\n const idx = templates.findIndex((t) => t.id === id)\n if (idx !== -1) templates[idx] = { ...templates[idx], isDeleted: true }\n },\n\n async getTemplateUsage(): Promise<Record<string, TemplateUsage>> {\n const usage: Record<string, TemplateUsage> = {}\n for (const doc of documents) {\n if (doc.isDeleted || !doc.templateId) continue\n const current = usage[doc.templateId] ?? { documentCount: 0, lastDocumentAt: null }\n current.documentCount += 1\n if (!current.lastDocumentAt || doc.createdAt > current.lastDocumentAt) {\n current.lastDocumentAt = doc.createdAt\n }\n usage[doc.templateId] = current\n }\n return usage\n },\n\n // ── Documents ──────────────────────────────────────────\n async getDocuments(query: DocumentQuery): Promise<PaginatedResult<FormDocument>> {\n let filtered = documents.filter((d) => !d.isDeleted)\n if (query.personId) {\n filtered = filtered.filter((d) => d.personId === query.personId)\n }\n if (query.templateId) {\n filtered = filtered.filter((d) => d.templateId === query.templateId)\n }\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n filtered = filtered.filter((d) => statuses.includes(d.status))\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n filtered = filtered.filter(\n (d) =>\n d.title?.toLowerCase().includes(s) ||\n d.templateName?.toLowerCase().includes(s),\n )\n }\n filtered.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 25\n const start = (page - 1) * pageSize\n return { data: filtered.slice(start, start + pageSize), total: filtered.length }\n },\n\n async getDocumentById(id: string): Promise<FormDocument | null> {\n return documents.find((d) => d.id === id && !d.isDeleted) ?? null\n },\n\n async createDocument(input: CreateDocumentInput): Promise<FormDocument> {\n const template = templates.find((t) => t.id === input.templateId)\n const doc: FormDocument = {\n id: uuid(),\n tenantId: 'mock-tenant',\n templateId: input.templateId ?? '',\n templateName: template?.name,\n templateCategory: template?.category,\n personId: input.personId,\n title: input.title,\n data: input.data ?? {},\n kind: input.kind ?? (input.templateId ? 'form' : 'attachment'),\n status: input.status ?? 'draft',\n metadata: {},\n isDeleted: false,\n createdAt: now(),\n updatedAt: now(),\n }\n documents.push(doc)\n return doc\n },\n\n async updateDocument(id: string, input: UpdateDocumentInput): Promise<FormDocument> {\n const idx = documents.findIndex((d) => d.id === id)\n if (idx === -1) throw new Error('Document not found')\n const existing = documents[idx]\n const updated: FormDocument = {\n ...existing,\n ...input,\n data: input.data ?? existing.data,\n updatedAt: now(),\n }\n documents[idx] = updated\n return updated\n },\n\n async deleteDocument(id: string): Promise<void> {\n const idx = documents.findIndex((d) => d.id === id)\n if (idx !== -1) documents[idx] = { ...documents[idx], isDeleted: true }\n },\n\n // ── Files ──────────────────────────────────────────────\n async getDocumentFiles(documentId: string): Promise<DocumentFile[]> {\n return files.filter((f) => f.documentId === documentId)\n },\n\n async uploadFile(documentId: string, fieldKey: string, file: File): Promise<DocumentFile> {\n const docFile: DocumentFile = {\n id: uuid(),\n tenantId: 'mock-tenant',\n documentId,\n fieldKey,\n fileUrl: URL.createObjectURL(file),\n fileName: file.name,\n fileSize: file.size,\n mimeType: file.type,\n sortOrder: files.filter((f) => f.documentId === documentId && f.fieldKey === fieldKey).length,\n metadata: {},\n createdAt: now(),\n }\n files.push(docFile)\n return docFile\n },\n\n async deleteFile(fileId: string): Promise<void> {\n const idx = files.findIndex((f) => f.id === fileId)\n if (idx !== -1) files.splice(idx, 1)\n },\n }\n}\n","// Current tenant id holder (runtime DI), decoupling the plugin from saas-core's\n// organization.store. Falls back to the core active-tenant when the host has\n// not injected one explicitly (mirrors plugin-crm's resolver), so the settings\n// template list — gated on this id — loads without extra host wiring.\nimport { getActiveTenantId } from '@fayz-ai/core'\n\nlet currentTenantId: string | undefined\nexport function setFormsTenantId(id: string | undefined): void { currentTenantId = id }\nexport function getFormsTenantId(): string | undefined { return currentTenantId ?? getActiveTenantId() }\n","import { getFormsTenantId } from '../lib/tenant'\nimport type { CustomFormsDataProvider } from './types'\nimport type {\n FormTemplate,\n FormDocument,\n DocumentFile,\n TemplateQuery,\n DocumentQuery,\n PaginatedResult,\n CreateTemplateInput,\n UpdateTemplateInput,\n CreateDocumentInput,\n UpdateDocumentInput,\n TemplateUsage,\n} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { T } from './tables'\n\nfunction getTenantId(): string {\n // Local override wins; else use the app's active tenant so writes pass RLS.\n return getFormsTenantId() ?? getActiveTenantId() ?? ''\n}\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\n/** Teto do fallback de contagem. Acima disso a agregação no navegador estaria\n * somando um recorte e chamando de total — some em vez de mentir. */\nconst USAGE_FALLBACK_LIMIT = 5000\n\nasync function countTemplateUsageClientSide(\n db: any,\n tenantId: string,\n): Promise<Record<string, TemplateUsage>> {\n try {\n const { data, error, count } = await db\n .from('v_documents')\n .select('template_id, created_at', { count: 'exact' })\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .not('template_id', 'is', null)\n .limit(USAGE_FALLBACK_LIMIT)\n\n if (error) return {}\n if (typeof count === 'number' && count > USAGE_FALLBACK_LIMIT) return {}\n\n const usage: Record<string, TemplateUsage> = {}\n for (const row of (data ?? []) as any[]) {\n const current = usage[row.template_id] ?? { documentCount: 0, lastDocumentAt: null }\n current.documentCount += 1\n if (!current.lastDocumentAt || row.created_at > current.lastDocumentAt) {\n current.lastDocumentAt = row.created_at\n }\n usage[row.template_id] = current\n }\n return usage\n } catch {\n return {}\n }\n}\n\n\nfunction mapTemplate(r: any): FormTemplate {\n return {\n id: r.id,\n tenantId: r.tenant_id,\n name: r.name,\n description: r.description,\n category: r.category,\n version: r.version,\n isCurrent: r.is_current,\n parentId: r.parent_id,\n schema: r.schema,\n specialty: r.specialty,\n tags: r.tags ?? [],\n metadata: r.metadata ?? {},\n isActive: r.is_active,\n isDeleted: r.is_deleted,\n createdBy: r.created_by,\n updatedBy: r.updated_by,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n }\n}\n\nfunction mapDocument(r: any): FormDocument {\n return {\n id: r.id,\n tenantId: r.tenant_id,\n templateId: r.template_id ?? '',\n templateName: r.template_name,\n templateCategory: r.template_category,\n personId: r.person_id,\n personName: r.person_name,\n title: r.title,\n data: r.form_data ?? {},\n status: r.status,\n signedAt: r.signed_at,\n signedBy: r.signed_by,\n notes: r.notes,\n metadata: r.metadata ?? {},\n isDeleted: false,\n createdBy: r.created_by,\n updatedBy: r.updated_by,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n // Extra fields from core document\n kind: r.kind,\n fileUrl: r.file_url,\n fileName: r.file_name,\n fileSize: r.file_size,\n mimeType: r.mime_type,\n }\n}\n\nfunction mapFile(r: any): DocumentFile {\n return {\n id: r.id,\n tenantId: r.tenant_id,\n documentId: r.document_id,\n fieldKey: r.field_key,\n fileUrl: r.file_url,\n fileName: r.file_name,\n fileSize: r.file_size,\n mimeType: r.mime_type,\n sortOrder: r.sort_order,\n metadata: r.metadata ?? {},\n createdAt: r.created_at,\n }\n}\n\nexport function createSupabaseFormsProvider(): CustomFormsDataProvider {\n return {\n // ── Templates ──────────────────────────────────────────\n\n async getTemplates(query: TemplateQuery): Promise<PaginatedResult<FormTemplate>> {\n const db = getClient()\n let qb = db\n .from(T.templates)\n .select('*', { count: 'exact' })\n .eq('tenant_id', getTenantId())\n .eq('is_current', true)\n .eq('is_deleted', false)\n // Archived templates (isActive=false) leave the list and the picker.\n .eq('is_active', true)\n\n if (query.category) qb = qb.eq('category', query.category)\n if (query.search) qb = qb.ilike('name', `%${query.search}%`)\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 25\n qb = qb\n .order('updated_at', { ascending: false })\n .range((page - 1) * pageSize, page * pageSize - 1)\n\n const { data, count, error } = await qb\n if (error) throw new Error(error.message)\n return { data: (data ?? []).map(mapTemplate), total: count ?? 0 }\n },\n\n async getTemplateById(id: string): Promise<FormTemplate | null> {\n const db = getClient()\n const { data, error } = await db\n .from(T.templates)\n .select('*')\n .eq('id', id)\n .eq('is_deleted', false)\n .single()\n if (error || !data) return null\n return mapTemplate(data)\n },\n\n async createTemplate(input: CreateTemplateInput): Promise<FormTemplate> {\n const db = getClient()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.templates)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n category: input.category,\n schema: input.schema,\n specialty: input.specialty,\n tags: input.tags ?? [],\n metadata: input.metadata ?? {},\n })\n .select()\n .single()\n if (error) throw new Error(error.message)\n return mapTemplate(data)\n },\n\n async updateTemplate(id: string, input: UpdateTemplateInput): Promise<FormTemplate> {\n const db = getClient()\n const tenantId = getTenantId()\n\n const { count } = await db\n .from(T.documents)\n .select('document_id', { count: 'exact', head: true })\n .eq('template_id', id)\n\n const hasDocuments = (count ?? 0) > 0\n\n if (hasDocuments && input.schema) {\n const existing = await this.getTemplateById(id)\n if (!existing) throw new Error('Template not found')\n\n const { data: newRow, error: insertError } = await db\n .from(T.templates)\n .insert({\n tenant_id: tenantId,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n category: input.category ?? existing.category,\n schema: input.schema,\n specialty: input.specialty ?? existing.specialty,\n tags: input.tags ?? existing.tags,\n metadata: input.metadata ?? existing.metadata,\n is_active: input.isActive ?? existing.isActive,\n version: existing.version + 1,\n is_current: true,\n parent_id: existing.parentId ?? existing.id,\n })\n .select()\n .single()\n if (insertError) throw new Error(insertError.message)\n\n await db\n .from(T.templates)\n .update({ is_current: false, updated_at: new Date().toISOString() })\n .eq('id', id)\n\n return mapTemplate(newRow)\n }\n\n const updates: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.category !== undefined) updates.category = input.category\n if (input.schema !== undefined) updates.schema = input.schema\n if (input.specialty !== undefined) updates.specialty = input.specialty\n if (input.tags !== undefined) updates.tags = input.tags\n if (input.metadata !== undefined) updates.metadata = input.metadata\n if (input.isActive !== undefined) updates.is_active = input.isActive\n\n const { data, error } = await db\n .from(T.templates)\n .update(updates)\n .eq('id', id)\n .select()\n .single()\n if (error) throw new Error(error.message)\n return mapTemplate(data)\n },\n\n async deleteTemplate(id: string): Promise<void> {\n const db = getClient()\n const { error } = await db\n .from(T.templates)\n .update({ is_deleted: true, updated_at: new Date().toISOString() })\n .eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n // Uso por modelo. Caminho principal: `v_forms_template_usage`, que agrega no\n // banco (004_template_usage.sql) e devolve uma linha por modelo.\n //\n // O fallback existe porque um pool provisionado antes daquela migração não\n // tem a view, e a tela não pode ficar sem o número por causa disso: ele\n // relê as colunas mínimas dos documentos e agrega aqui. É limitado de\n // propósito — acima do teto o número seria mentira, e mentir sobre uma\n // contagem é pior do que omiti-la, então ele desiste em silêncio.\n async getTemplateUsage(): Promise<Record<string, TemplateUsage>> {\n const db = getClient()\n const tenantId = getTenantId()\n if (!tenantId) return {}\n\n const { data, error } = await db\n .from('v_forms_template_usage')\n .select('template_id, document_count, last_document_at')\n .eq('tenant_id', tenantId)\n\n if (!error) {\n const usage: Record<string, TemplateUsage> = {}\n for (const row of (data ?? []) as any[]) {\n usage[row.template_id] = {\n documentCount: Number(row.document_count ?? 0),\n lastDocumentAt: row.last_document_at ?? null,\n }\n }\n return usage\n }\n\n return countTemplateUsageClientSide(db, tenantId)\n },\n\n // ── Documents (public.documents + plg_forms_documents extension) ──\n\n async getDocuments(query: DocumentQuery): Promise<PaginatedResult<FormDocument>> {\n const db = getClient()\n // Query through the v_documents view (joins core + form extension)\n let qb = db\n .from('v_documents')\n .select('*', { count: 'exact' })\n .eq('tenant_id', getTenantId())\n .eq('is_active', true)\n\n if (query.personId) qb = qb.eq('person_id', query.personId)\n if (query.templateId) qb = qb.eq('template_id', query.templateId)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n qb = qb.in('status', statuses)\n }\n if (query.search) qb = qb.or(`title.ilike.%${query.search}%,template_name.ilike.%${query.search}%`)\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb\n .order('created_at', { ascending: false })\n .range((page - 1) * pageSize, page * pageSize - 1)\n\n const { data, count, error } = await qb\n if (error) throw new Error(error.message)\n return { data: (data ?? []).map(mapDocument), total: count ?? 0 }\n },\n\n async getDocumentById(id: string): Promise<FormDocument | null> {\n const db = getClient()\n const { data, error } = await db\n .from('v_documents')\n .select('*')\n .eq('id', id)\n .single()\n if (error || !data) return null\n return mapDocument(data)\n },\n\n async createDocument(input: CreateDocumentInput): Promise<FormDocument> {\n const tenantId = getTenantId()\n const isForm = !!input.templateId\n\n // Step 1: Insert into public.documents\n const { data: coreDoc, error: coreError } = await getClient()\n .from('documents')\n .insert({\n tenant_id: tenantId,\n kind: input.kind ?? (isForm ? 'form' : 'attachment'),\n person_id: input.personId,\n title: input.title,\n status: input.status ?? 'draft',\n file_url: input.fileUrl,\n file_name: input.fileName,\n file_size: input.fileSize,\n mime_type: input.mimeType,\n metadata: {},\n })\n .select()\n .single()\n if (coreError) throw new Error(coreError.message)\n\n // Step 2: For form documents, insert extension row\n if (isForm && input.templateId) {\n const db = getClient()\n const { error: extError } = await db\n .from(T.documents)\n .insert({\n document_id: coreDoc.id,\n tenant_id: tenantId,\n template_id: input.templateId,\n data: input.data ?? {},\n })\n if (extError) {\n // Rollback core insert\n await getClient().from('documents').delete().eq('id', coreDoc.id)\n throw new Error(extError.message)\n }\n }\n\n // Fetch via view to get joined data\n const doc = await this.getDocumentById(coreDoc.id)\n return doc!\n },\n\n async updateDocument(id: string, input: UpdateDocumentInput): Promise<FormDocument> {\n const now = new Date().toISOString()\n\n // Update core document fields\n const coreUpdates: Record<string, unknown> = { updated_at: now }\n if (input.status !== undefined) coreUpdates.status = input.status\n if (input.title !== undefined) coreUpdates.title = input.title\n if (input.notes !== undefined) coreUpdates.notes = input.notes\n\n const { error: coreError } = await getClient()\n .from('documents')\n .update(coreUpdates)\n .eq('id', id)\n if (coreError) throw new Error(coreError.message)\n\n // Update form extension if data is provided\n if (input.data !== undefined) {\n const db = getClient()\n await db\n .from(T.documents)\n .update({ data: input.data, updated_at: now })\n .eq('document_id', id)\n }\n\n const doc = await this.getDocumentById(id)\n return doc!\n },\n\n async deleteDocument(id: string): Promise<void> {\n const { error } = await getClient()\n .from('documents')\n .update({ is_active: false, updated_at: new Date().toISOString() })\n .eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n // ── Files ──────────────────────────────────────────────\n\n async getDocumentFiles(documentId: string): Promise<DocumentFile[]> {\n const db = getClient()\n const { data, error } = await db\n .from(T.documentFiles)\n .select('*')\n .eq('document_id', documentId)\n .order('sort_order')\n if (error) throw new Error(error.message)\n return (data ?? []).map(mapFile)\n },\n\n async uploadFile(documentId: string, fieldKey: string, file: File): Promise<DocumentFile> {\n const db = getClient()\n const tenantId = getTenantId()\n const ext = file.name.split('.').pop() ?? 'bin'\n const storagePath = `${tenantId}/forms/${documentId}/${fieldKey}/${crypto.randomUUID()}.${ext}`\n\n const { error: uploadError } = await db.storage\n .from('documents')\n .upload(storagePath, file, { contentType: file.type })\n if (uploadError) throw new Error(uploadError.message)\n\n const { data: urlData } = db.storage.from('documents').getPublicUrl(storagePath)\n\n const { data, error } = await db\n .from(T.documentFiles)\n .insert({\n tenant_id: tenantId,\n document_id: documentId,\n field_key: fieldKey,\n file_url: urlData.publicUrl,\n file_name: file.name,\n file_size: file.size,\n mime_type: file.type,\n })\n .select()\n .single()\n if (error) throw new Error(error.message)\n return mapFile(data)\n },\n\n async deleteFile(fileId: string): Promise<void> {\n const db = getClient()\n const { error } = await db\n .from(T.documentFiles)\n .delete()\n .eq('id', fileId)\n if (error) throw new Error(error.message)\n },\n }\n}\n","import { create } from 'zustand'\nimport type { CustomFormsDataProvider } from './data/types'\nimport type {\n FormTemplate,\n FormDocument,\n TemplateQuery,\n DocumentQuery,\n CreateTemplateInput,\n UpdateTemplateInput,\n CreateDocumentInput,\n UpdateDocumentInput,\n TemplateUsage,\n} from './types'\n\nexport interface CustomFormsState {\n // Templates\n templates: FormTemplate[]\n templatesTotal: number\n templatesLoading: boolean\n templatesError: string | null\n /** Uso por id de modelo. Vazio até `fetchTemplateUsage` responder — e vazio\n * também quando o pool não tem a view nem cabe no fallback. */\n templateUsage: Record<string, TemplateUsage>\n\n // Documents\n documents: FormDocument[]\n documentsTotal: number\n documentsLoading: boolean\n documentsError: string | null\n\n // Active template (for builder)\n activeTemplate: FormTemplate | null\n activeTemplateLoading: boolean\n\n // Active document (for viewer/editor)\n activeDocument: FormDocument | null\n activeDocumentLoading: boolean\n\n // Actions\n fetchTemplates(query?: TemplateQuery): Promise<void>\n fetchTemplateUsage(): Promise<void>\n fetchTemplateById(id: string): Promise<FormTemplate | null>\n createTemplate(input: CreateTemplateInput): Promise<FormTemplate>\n updateTemplate(id: string, input: UpdateTemplateInput): Promise<FormTemplate>\n deleteTemplate(id: string): Promise<void>\n\n fetchDocuments(query?: DocumentQuery): Promise<void>\n fetchDocumentById(id: string): Promise<FormDocument | null>\n createDocument(input: CreateDocumentInput): Promise<FormDocument>\n updateDocument(id: string, input: UpdateDocumentInput): Promise<FormDocument>\n deleteDocument(id: string): Promise<void>\n}\n\nexport function createCustomFormsStore(provider: CustomFormsDataProvider) {\n return create<CustomFormsState>((set) => ({\n templates: [],\n templatesTotal: 0,\n templatesLoading: false,\n templatesError: null,\n templateUsage: {},\n\n documents: [],\n documentsTotal: 0,\n documentsLoading: false,\n documentsError: null,\n\n activeTemplate: null,\n activeTemplateLoading: false,\n\n activeDocument: null,\n activeDocumentLoading: false,\n\n async fetchTemplates(query?: TemplateQuery) {\n set({ templatesLoading: true, templatesError: null })\n try {\n const result = await provider.getTemplates(query ?? {})\n set({ templates: result.data, templatesTotal: result.total })\n } catch (e: any) {\n set({ templatesError: e.message ?? 'Failed to fetch templates' })\n } finally {\n set({ templatesLoading: false })\n }\n },\n\n // Separado de `fetchTemplates` porque é outra pergunta e outro custo: a\n // lista precisa dos modelos para desenhar, e o uso é um enfeite que chega\n // depois. Junto, a tela inteira esperaria a agregação; e uma falha na\n // contagem levaria embora a lista, que não tem nada a ver com isso — daí\n // ele engolir o erro em vez de escrevê-lo em `templatesError`.\n async fetchTemplateUsage() {\n try {\n set({ templateUsage: await provider.getTemplateUsage() })\n } catch {\n set({ templateUsage: {} })\n }\n },\n\n async fetchTemplateById(id: string) {\n set({ activeTemplateLoading: true })\n try {\n const template = await provider.getTemplateById(id)\n set({ activeTemplate: template })\n return template\n } catch {\n set({ activeTemplate: null })\n return null\n } finally {\n set({ activeTemplateLoading: false })\n }\n },\n\n async createTemplate(input: CreateTemplateInput) {\n const template = await provider.createTemplate(input)\n set((s) => ({ templates: [template, ...s.templates], templatesTotal: s.templatesTotal + 1 }))\n return template\n },\n\n async updateTemplate(id: string, input: UpdateTemplateInput) {\n const template = await provider.updateTemplate(id, input)\n set((s) => ({\n templates: s.templates.map((t) => (t.id === id ? template : t)),\n activeTemplate: s.activeTemplate?.id === id ? template : s.activeTemplate,\n }))\n return template\n },\n\n async deleteTemplate(id: string) {\n await provider.deleteTemplate(id)\n set((s) => ({\n templates: s.templates.filter((t) => t.id !== id),\n templatesTotal: s.templatesTotal - 1,\n }))\n },\n\n async fetchDocuments(query?: DocumentQuery) {\n set({ documentsLoading: true, documentsError: null })\n try {\n const result = await provider.getDocuments(query ?? {})\n set({ documents: result.data, documentsTotal: result.total })\n } catch (e: any) {\n set({ documentsError: e.message ?? 'Failed to fetch documents' })\n } finally {\n set({ documentsLoading: false })\n }\n },\n\n async fetchDocumentById(id: string) {\n set({ activeDocumentLoading: true })\n try {\n const doc = await provider.getDocumentById(id)\n set({ activeDocument: doc })\n return doc\n } catch {\n set({ activeDocument: null })\n return null\n } finally {\n set({ activeDocumentLoading: false })\n }\n },\n\n async createDocument(input: CreateDocumentInput) {\n const doc = await provider.createDocument(input)\n set((s) => ({ documents: [doc, ...s.documents], documentsTotal: s.documentsTotal + 1 }))\n return doc\n },\n\n async updateDocument(id: string, input: UpdateDocumentInput) {\n const doc = await provider.updateDocument(id, input)\n set((s) => ({\n documents: s.documents.map((d) => (d.id === id ? doc : d)),\n activeDocument: s.activeDocument?.id === id ? doc : s.activeDocument,\n }))\n return doc\n },\n\n async deleteDocument(id: string) {\n await provider.deleteDocument(id)\n set((s) => ({\n documents: s.documents.filter((d) => d.id !== id),\n documentsTotal: s.documentsTotal - 1,\n }))\n },\n }))\n}\n\nexport type CustomFormsStore = ReturnType<typeof createCustomFormsStore>\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.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.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\n // Documents\n 'customForms.documents': 'Documents',\n 'customForms.addDocument': 'Add Document',\n 'customForms.selectTemplate': 'Select a form',\n 'customForms.noDocuments': 'No documents yet',\n 'customForms.noDocumentsDescription': 'Add a document to start recording information.',\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.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 // 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.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.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\n // Documents\n 'customForms.documents': 'Documentos',\n 'customForms.addDocument': 'Novo Documento',\n 'customForms.selectTemplate': 'Selecione um formulário',\n 'customForms.noDocuments': 'Nenhum documento',\n 'customForms.noDocumentsDescription': 'Adicione um documento para começar a registrar informações.',\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 'customForms.printPdf': 'Imprimir / PDF',\n 'customForms.usageCount': '{{count}} preenchidos',\n 'customForms.usageLast': 'último em {{date}}',\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 type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\n\nexport interface CustomFormsPluginOptions {\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: CustomFormsDataProvider\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\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\nconst DEFAULT_LABELS: CustomFormsLabels = {\n pageTitle: 'Custom Forms',\n settingsLabel: 'Forms & Documents',\n settingsSubtitle: 'Create and manage custom forms for your business',\n templates: 'Templates',\n documents: 'Documents',\n newTemplate: 'New Template',\n addDocument: 'Add Document',\n}\n\nexport function resolveConfig(options?: CustomFormsPluginOptions): CustomFormsConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n }\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { Plus, Pencil, Archive, FileText, Search } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { PermissionGate } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getFormsTenantId } from '../lib/tenant'\nimport type { CustomFormsStore } from '../store'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormTemplate, TemplateCategory } from '../types'\n\ninterface TemplateListViewProps {\n store: CustomFormsStore\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 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 = getFormsTenantId()\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])\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) =>\n t(`customForms.category.${cat}`)\n\n return (\n <div className=\"space-y-4\">\n {/* Search + New */}\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-xs\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\" />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('common.search')}\n className=\"h-9 pl-8 text-sm\"\n />\n </div>\n <PermissionGate feature=\"custom_forms\" action=\"create\">\n <Button onClick={onNew} size=\"sm\" className=\"h-9\">\n <Plus className=\"h-3.5 w-3.5 mr-1.5\" />\n {t('customForms.newTemplate')}\n </Button>\n </PermissionGate>\n </div>\n\n {/* Empty state */}\n {!loading && visibleTemplates.length === 0 && (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"font-medium\">{t('customForms.noTemplates')}</p>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">\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=\"h-3.5 w-3.5 mr-1.5\" />\n {t('customForms.newTemplate')}\n </Button>\n </PermissionGate>\n </CardContent>\n </Card>\n )}\n\n {/* Template list */}\n {visibleTemplates.length > 0 && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {visibleTemplates.map((template) => (\n <Card\n key={template.id}\n className=\"group cursor-pointer hover:shadow-md transition-shadow\"\n onClick={() => onEdit(template)}\n >\n <CardContent className=\"p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-medium text-sm truncate\">{template.name}</h3>\n {template.description && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">\n {template.description}\n </p>\n )}\n </div>\n <div className=\"flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={(e) => { e.stopPropagation(); onEdit(template) }}\n className=\"p-1.5 rounded-md hover:bg-muted\"\n >\n <Pencil className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); handleArchive(template) }}\n className=\"p-1.5 rounded-md hover:bg-muted\"\n title={t('customForms.archive')}\n >\n <Archive className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-2 mt-3\">\n <Badge variant=\"secondary\" className={`text-[10px] ${CATEGORY_COLORS[template.category]}`}>\n {categoryLabel(template.category)}\n </Badge>\n <span className=\"text-[10px] text-muted-foreground\">\n {template.schema.fields.length} {t('customForms.builder.fields').toLowerCase()}\n </span>\n {template.version > 1 && (\n <span className=\"text-[10px] text-muted-foreground\">v{template.version}</span>\n )}\n </div>\n {/* Quanto o modelo rodou. \"0 preenchimentos\" é informação, não\n ausência dela: é o que separa um formulário que o salão usa\n todo dia de um que sobrou de uma importação. */}\n <p className=\"mt-2 text-[10px] text-muted-foreground\">\n {t('customForms.usageCount', {\n count: String(usage[template.id]?.documentCount ?? 0),\n })}\n {usage[template.id]?.lastDocumentAt && (\n <>\n <span className=\"px-1\">·</span>\n {t('customForms.usageLast', {\n date: new Date(usage[template.id]!.lastDocumentAt!).toLocaleDateString(),\n })}\n </>\n )}\n </p>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {/* Loading skeleton */}\n {loading && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Card key={i}>\n <CardContent className=\"p-4 space-y-3\">\n <div className=\"h-4 w-2/3 bg-muted animate-pulse rounded\" />\n <div className=\"h-3 w-full bg-muted animate-pulse rounded\" />\n <div className=\"flex gap-2\">\n <div className=\"h-5 w-16 bg-muted animate-pulse rounded-full\" />\n <div className=\"h-5 w-12 bg-muted animate-pulse rounded-full\" />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { TemplateListView } from './TemplateListView'\nimport type { CustomFormsConfig } from '../config'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormTemplate } from '../types'\n\ninterface CustomFormsSettingsTabProps {\n config: CustomFormsConfig\n provider: CustomFormsDataProvider\n store: CustomFormsStore\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: CustomFormsStore\n provider: CustomFormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}) {\n const FormBuilderLazy = React.lazy(() =>\n import('../components/FormBuilder').then((m) => ({ default: m.FormBuilder })),\n )\n\n return (\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 )\n}\n","import React, { useEffect, useState, useCallback, useRef } from 'react'\nimport { FileText, Archive, Eye, Upload, Image as ImageIcon, Paperclip } from 'lucide-react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormDocument, DocumentStatus } from '../types'\n\ninterface DocumentListProps {\n personId: string\n provider: CustomFormsDataProvider\n store: CustomFormsStore\n onView: (doc: FormDocument) => void\n onFileDrop?: (files: File[]) => void\n}\n\nconst STATUS_COLORS: Record<DocumentStatus, 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\nconst KIND_ICONS: Record<string, React.ElementType> = {\n form: FileText,\n image: ImageIcon,\n attachment: Paperclip,\n prescription: FileText,\n contract: FileText,\n}\n\nfunction formatDateLabel(dateStr: string): string {\n const date = new Date(dateStr)\n const now = new Date()\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n const docDate = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n const diffDays = Math.round((today.getTime() - docDate.getTime()) / (1000 * 60 * 60 * 24))\n\n if (diffDays === 0) return 'Hoje'\n if (diffDays === 1) return 'Ontem'\n if (diffDays < 7) return `${diffDays} dias atrás`\n return date.toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' })\n}\n\nfunction groupByDate(docs: FormDocument[]): Array<{ date: string; label: string; items: FormDocument[] }> {\n const groups: Map<string, FormDocument[]> = new Map()\n for (const doc of docs) {\n const dateKey = doc.createdAt.slice(0, 10)\n if (!groups.has(dateKey)) groups.set(dateKey, [])\n groups.get(dateKey)!.push(doc)\n }\n return Array.from(groups.entries())\n .sort(([a], [b]) => b.localeCompare(a))\n .map(([date, items]) => ({\n date,\n label: formatDateLabel(date),\n items,\n }))\n}\n\nexport function DocumentList({ personId, provider, store, onView, onFileDrop }: DocumentListProps) {\n const t = useTranslation()\n const [documents, setDocuments] = useState<FormDocument[]>([])\n const [loading, setLoading] = useState(true)\n const [isDragOver, setIsDragOver] = useState(false)\n const dragCounter = useRef(0)\n\n const fetchDocs = useCallback(async () => {\n setLoading(true)\n try {\n const result = await provider.getDocuments({ personId })\n // Archived docs are kept (not deleted) but drop out of the active list.\n setDocuments(result.data.filter((d) => d.status !== 'archived'))\n } finally {\n setLoading(false)\n }\n }, [personId, provider])\n\n useEffect(() => {\n const timer = setTimeout(() => fetchDocs(), 50)\n return () => clearTimeout(timer)\n }, [fetchDocs])\n\n useEffect(() => {\n const unsub = store.subscribe(() => fetchDocs())\n return unsub\n }, [store, fetchDocs])\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 const handleArchive = useCallback(async (doc: FormDocument) => {\n if (!window.confirm(t('customForms.archiveDocumentConfirm'))) return\n await provider.updateDocument(doc.id, { status: 'archived' })\n setDocuments((prev) => prev.filter((d) => d.id !== doc.id))\n }, [provider, t])\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 const groups = groupByDate(documents)\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 return (\n <div\n className={`relative min-h-[200px] rounded-xl border-2 border-dashed transition-colors ${\n isDragOver\n ? 'border-primary bg-primary/5'\n : documents.length === 0\n ? 'border-border'\n : 'border-transparent'\n }`}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\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\">Solte os arquivos aqui</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 <FileText className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('customForms.noDocuments')}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">\n {t('customForms.noDocumentsDescription')}\n </p>\n <p className=\"text-[10px] text-muted-foreground mt-3 flex items-center gap-1\">\n <Upload className=\"h-3 w-3\" />\n Arraste arquivos para cá\n </p>\n </div>\n )}\n\n {/* Timeline */}\n {groups.length > 0 && (\n <div className=\"space-y-5 py-2\">\n {groups.map((group) => (\n <div key={group.date}>\n {/* Date header */}\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground px-1\">\n {group.label}\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Documents for this date */}\n <div className=\"space-y-1.5\">\n {group.items.map((doc) => {\n const Icon = KIND_ICONS[doc.kind ?? 'form'] ?? FileText\n const time = new Date(doc.createdAt).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n\n return (\n <div\n key={doc.id}\n className=\"group flex items-center gap-3 rounded-lg p-2.5 hover:bg-muted/50 cursor-pointer transition-colors\"\n onClick={() => onView(doc)}\n >\n {/* Icon */}\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10 shrink-0\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {doc.title ?? doc.templateName ?? 'Documento'}\n </p>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n {doc.templateName && (\n <span className=\"text-[10px] text-muted-foreground\">{doc.templateName}</span>\n )}\n <span className=\"text-[10px] text-muted-foreground\">{time}</span>\n </div>\n </div>\n\n {/* Status + actions */}\n <Badge variant=\"secondary\" className={`text-[10px] shrink-0 ${STATUS_COLORS[doc.status] ?? ''}`}>\n {t(`customForms.status.${doc.status}`)}\n </Badge>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={(e) => { e.stopPropagation(); onView(doc) }}\n className=\"p-1.5 rounded-md hover:bg-muted\"\n >\n <Eye className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); handleArchive(doc) }}\n className=\"p-1.5 rounded-md hover:bg-muted\"\n title={t('customForms.archive')}\n >\n <Archive className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ))}\n </div>\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 { useSaveBar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit } from '@fayz-ai/admin'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormTemplate, FormDocument } from '../types'\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: CustomFormsDataProvider\n store: CustomFormsStore\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\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\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 { CustomFormsDataProvider } from '../data/types'\nimport type { FormDocument, FormTemplate } from '../types'\nimport { FormRenderer } from './FormRenderer'\nimport { DocumentBodySkeleton } from './DocumentSkeleton'\nimport { printDocument } from '../lib/print'\n\ninterface FormViewerProps {\n document: FormDocument\n provider: CustomFormsDataProvider\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\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 } from 'react'\nimport { Plus, ChevronDown } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\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\nexport function AddDocumentDropdown({ personId, onSelect }: AddDocumentDropdownProps) {\n const t = useTranslation()\n const [options, setOptions] = useState<DocumentTypeOption[]>([])\n const [loaded, setLoaded] = useState(false)\n const loadingRef = useRef(false)\n\n const handleOpen = useCallback((open: boolean) => {\n if (!open || loaded || loadingRef.current) return\n loadingRef.current = true\n getAllDocumentTypes(personId).then((opts) => {\n setOptions(opts)\n setLoaded(true)\n loadingRef.current = false\n })\n }, [personId, loaded])\n\n // Group options by group label\n const groups: Array<{ label: string; items: DocumentTypeOption[] }> = []\n for (const opt of options) {\n let group = groups.find((g) => g.label === opt.group)\n if (!group) {\n group = { label: opt.group, items: [] }\n groups.push(group)\n }\n group.items.push(opt)\n }\n\n return (\n <Dropdown onOpenChange={handleOpen}>\n <DropdownTrigger asChild>\n <Button size=\"sm\" className=\"h-8\">\n <Plus className=\"h-3.5 w-3.5 mr-1\" />\n {t('customForms.addDocument')}\n <ChevronDown className=\"h-3 w-3 ml-1 opacity-50\" />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\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 return (\n <DropdownItem key={opt.id} onClick={() => onSelect(opt)} className=\"gap-2\">\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\">{opt.description}</p>\n )}\n </div>\n </DropdownItem>\n )\n })}\n </React.Fragment>\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 </DropdownContent>\n </Dropdown>\n )\n}\n","import React, { useState, useCallback, useRef } from 'react'\nimport { ArrowLeft, Image as ImageIcon, Paperclip } from 'lucide-react'\nimport { 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 { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormDocument, FormTemplate } from '../types'\nimport type { DocumentTypeOption } from '../lib/document-types'\nimport { DocumentList } from './DocumentList'\nimport { DocumentFormDialog } from './DocumentFormDialog'\nimport { FormViewer } from './FormViewer'\nimport { AddDocumentDropdown } from './AddDocumentDropdown'\n\ninterface PersonDocumentsWidgetProps {\n item: { id: string; name?: string; [key: string]: any }\n config: CustomFormsConfig\n provider: CustomFormsDataProvider\n store: CustomFormsStore\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 }: PersonDocumentsWidgetProps) {\n const t = useTranslation()\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\">{t('customForms.documents')}</h3>\n <AddDocumentDropdown personId={item.id} onSelect={handleDocTypeSelect} />\n </div>\n <DocumentList\n personId={item.id}\n provider={provider}\n store={store}\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\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 { 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 React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\nimport { T } from './data/tables'\nimport { createMockFormsProvider } from './data/mock'\nimport { createSupabaseFormsProvider } from './data/supabase'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { createCustomFormsStore } from './store'\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 { registerDocumentTypeProvider } from './lib/document-types'\nimport { registerFormsTimelineSource } from './lib/timeline-source'\nimport { createOrUpdateFormTool } from './lib/agent-tools'\nimport { FileText as FileTextIcon, Image as ImageIcon, Paperclip } from 'lucide-react'\n\nfunction registerBuiltInProviders(formsProvider: CustomFormsDataProvider) {\n // Templates from custom_forms\n registerDocumentTypeProvider({\n id: 'custom_forms:templates',\n async getTypes() {\n try {\n const result = await formsProvider.getTemplates({})\n return result.data.map((tpl) => ({\n id: `template:${tpl.id}`,\n label: tpl.name,\n icon: FileTextIcon,\n group: 'Formulários',\n groupOrder: 10,\n order: 0,\n description: tpl.description,\n _templateId: tpl.id,\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: 'Imagem', icon: ImageIcon, group: 'Arquivos', groupOrder: 90, order: 0 },\n { id: 'core:attachment', label: 'Anexo', icon: Paperclip, group: 'Arquivos', groupOrder: 90, order: 1 },\n ]\n },\n })\n}\n\nexport type { CustomFormsPluginOptions }\nexport { registerDocumentTypeProvider, type DocumentTypeOption, type DocumentTypeProvider } from './lib/document-types'\n\nexport function createCustomFormsPlugin(options?: CustomFormsPluginOptions): PluginManifest {\n registerTranslations(customFormsLocales)\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseFormsProvider(),\n () => createMockFormsProvider(),\n )\n const store = createCustomFormsStore(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\n\n const formRegistries: import('@fayz-ai/core').PluginRegistryDef[] = [\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 subtitle: config.labels.settingsSubtitle,\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 })\n PersonDocumentsWidget.displayName = 'PersonDocumentsWidget'\n\n return {\n id: 'custom_forms',\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 navigation: [],\n\n routes: [],\n\n settings: [\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\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: 'What forms do we have?' },\n { label: 'Show me anamnesis templates' },\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: \"Show this client's documents\" },\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/data/tables.ts","../src/data/mock.ts","../src/lib/tenant.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/config.ts","../src/views/TemplateListView.tsx","../src/views/CustomFormsSettingsTab.tsx","../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/lib/timeline-source.ts","../src/index.ts"],"names":["getActiveTenantId","now","useState","useCallback","React","jsx","FileText","ImageIcon","useTranslation","useEffect","jsxs","Badge","Archive","STATUS_COLORS","ArrowLeft","Button","Pencil","useRef","useMemo","Plus","Search","useLimitGuard","invalidateLimit","Paperclip","getSupabaseClientOptional","FileTextIcon","PersonDocumentsWidget"],"mappings":"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","file":"index.js","sourcesContent":["// Central physical-table-name registry for plugin-forms. `documents` stays core.\nexport const T = {\n documents: 'plg_forms_documents',\n templates: 'plg_forms_templates',\n documentFiles: 'plg_forms_document_files',\n categories: 'plg_forms_categories',\n} as const\n","import type { CustomFormsDataProvider } from './types'\nimport type {\n FormTemplate,\n FormDocument,\n DocumentFile,\n TemplateQuery,\n DocumentQuery,\n PaginatedResult,\n CreateTemplateInput,\n UpdateTemplateInput,\n CreateDocumentInput,\n UpdateDocumentInput,\n TemplateUsage,\n} from '../types'\n\nfunction uuid() {\n return crypto.randomUUID()\n}\n\nfunction now() {\n return new Date().toISOString()\n}\n\nexport function createMockFormsProvider(): CustomFormsDataProvider {\n const templates: FormTemplate[] = []\n const documents: FormDocument[] = []\n const files: DocumentFile[] = []\n\n return {\n // ── Templates ──────────────────────────────────────────\n async getTemplates(query: TemplateQuery): Promise<PaginatedResult<FormTemplate>> {\n let filtered = templates.filter((t) => !t.isDeleted && t.isCurrent)\n if (query.category) {\n filtered = filtered.filter((t) => t.category === query.category)\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n filtered = filtered.filter((t) => t.name.toLowerCase().includes(s))\n }\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 25\n const start = (page - 1) * pageSize\n return { data: filtered.slice(start, start + pageSize), total: filtered.length }\n },\n\n async getTemplateById(id: string): Promise<FormTemplate | null> {\n return templates.find((t) => t.id === id && !t.isDeleted) ?? null\n },\n\n async createTemplate(input: CreateTemplateInput): Promise<FormTemplate> {\n const template: FormTemplate = {\n id: uuid(),\n tenantId: 'mock-tenant',\n name: input.name,\n description: input.description,\n category: input.category,\n version: 1,\n isCurrent: true,\n schema: input.schema,\n specialty: input.specialty,\n tags: input.tags ?? [],\n metadata: input.metadata ?? {},\n isActive: true,\n isDeleted: false,\n createdAt: now(),\n updatedAt: now(),\n }\n templates.push(template)\n return template\n },\n\n async updateTemplate(id: string, input: UpdateTemplateInput): Promise<FormTemplate> {\n const idx = templates.findIndex((t) => t.id === id)\n if (idx === -1) throw new Error('Template not found')\n const existing = templates[idx]\n const updated: FormTemplate = {\n ...existing,\n ...input,\n tags: input.tags ?? existing.tags,\n metadata: input.metadata ?? existing.metadata,\n schema: input.schema ?? existing.schema,\n updatedAt: now(),\n }\n templates[idx] = updated\n return updated\n },\n\n async deleteTemplate(id: string): Promise<void> {\n const idx = templates.findIndex((t) => t.id === id)\n if (idx !== -1) templates[idx] = { ...templates[idx], isDeleted: true }\n },\n\n async getTemplateUsage(): Promise<Record<string, TemplateUsage>> {\n const usage: Record<string, TemplateUsage> = {}\n for (const doc of documents) {\n if (doc.isDeleted || !doc.templateId) continue\n const current = usage[doc.templateId] ?? { documentCount: 0, lastDocumentAt: null }\n current.documentCount += 1\n if (!current.lastDocumentAt || doc.createdAt > current.lastDocumentAt) {\n current.lastDocumentAt = doc.createdAt\n }\n usage[doc.templateId] = current\n }\n return usage\n },\n\n // ── Documents ──────────────────────────────────────────\n async getDocuments(query: DocumentQuery): Promise<PaginatedResult<FormDocument>> {\n let filtered = documents.filter((d) => !d.isDeleted)\n if (query.personId) {\n filtered = filtered.filter((d) => d.personId === query.personId)\n }\n if (query.templateId) {\n filtered = filtered.filter((d) => d.templateId === query.templateId)\n }\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n filtered = filtered.filter((d) => statuses.includes(d.status))\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n filtered = filtered.filter(\n (d) =>\n d.title?.toLowerCase().includes(s) ||\n d.templateName?.toLowerCase().includes(s),\n )\n }\n filtered.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 25\n const start = (page - 1) * pageSize\n return { data: filtered.slice(start, start + pageSize), total: filtered.length }\n },\n\n async getDocumentById(id: string): Promise<FormDocument | null> {\n return documents.find((d) => d.id === id && !d.isDeleted) ?? null\n },\n\n async createDocument(input: CreateDocumentInput): Promise<FormDocument> {\n const template = templates.find((t) => t.id === input.templateId)\n const doc: FormDocument = {\n id: uuid(),\n tenantId: 'mock-tenant',\n templateId: input.templateId ?? '',\n templateName: template?.name,\n templateCategory: template?.category,\n personId: input.personId,\n title: input.title,\n data: input.data ?? {},\n kind: input.kind ?? (input.templateId ? 'form' : 'attachment'),\n status: input.status ?? 'draft',\n metadata: {},\n isDeleted: false,\n createdAt: now(),\n updatedAt: now(),\n }\n documents.push(doc)\n return doc\n },\n\n async updateDocument(id: string, input: UpdateDocumentInput): Promise<FormDocument> {\n const idx = documents.findIndex((d) => d.id === id)\n if (idx === -1) throw new Error('Document not found')\n const existing = documents[idx]\n const updated: FormDocument = {\n ...existing,\n ...input,\n data: input.data ?? existing.data,\n updatedAt: now(),\n }\n documents[idx] = updated\n return updated\n },\n\n async deleteDocument(id: string): Promise<void> {\n const idx = documents.findIndex((d) => d.id === id)\n if (idx !== -1) documents[idx] = { ...documents[idx], isDeleted: true }\n },\n\n // ── Files ──────────────────────────────────────────────\n async getDocumentFiles(documentId: string): Promise<DocumentFile[]> {\n return files.filter((f) => f.documentId === documentId)\n },\n\n async uploadFile(documentId: string, fieldKey: string, file: File): Promise<DocumentFile> {\n const docFile: DocumentFile = {\n id: uuid(),\n tenantId: 'mock-tenant',\n documentId,\n fieldKey,\n fileUrl: URL.createObjectURL(file),\n fileName: file.name,\n fileSize: file.size,\n mimeType: file.type,\n sortOrder: files.filter((f) => f.documentId === documentId && f.fieldKey === fieldKey).length,\n metadata: {},\n createdAt: now(),\n }\n files.push(docFile)\n return docFile\n },\n\n async deleteFile(fileId: string): Promise<void> {\n const idx = files.findIndex((f) => f.id === fileId)\n if (idx !== -1) files.splice(idx, 1)\n },\n }\n}\n","// Current tenant id holder (runtime DI), decoupling the plugin from saas-core's\n// organization.store. Falls back to the core active-tenant when the host has\n// not injected one explicitly (mirrors plugin-crm's resolver), so the settings\n// template list — gated on this id — loads without extra host wiring.\nimport { getActiveTenantId } from '@fayz-ai/core'\n\nlet currentTenantId: string | undefined\nexport function setFormsTenantId(id: string | undefined): void { currentTenantId = id }\nexport function getFormsTenantId(): string | undefined { return currentTenantId ?? getActiveTenantId() }\n","import { getFormsTenantId } from '../lib/tenant'\nimport type { CustomFormsDataProvider } from './types'\nimport type {\n FormTemplate,\n FormDocument,\n DocumentFile,\n TemplateQuery,\n DocumentQuery,\n PaginatedResult,\n CreateTemplateInput,\n UpdateTemplateInput,\n CreateDocumentInput,\n UpdateDocumentInput,\n TemplateUsage,\n} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { T } from './tables'\n\nfunction getTenantId(): string {\n // Local override wins; else use the app's active tenant so writes pass RLS.\n return getFormsTenantId() ?? getActiveTenantId() ?? ''\n}\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\n/** Teto do fallback de contagem. Acima disso a agregação no navegador estaria\n * somando um recorte e chamando de total — some em vez de mentir. */\nconst USAGE_FALLBACK_LIMIT = 5000\n\nasync function countTemplateUsageClientSide(\n db: any,\n tenantId: string,\n): Promise<Record<string, TemplateUsage>> {\n try {\n const { data, error, count } = await db\n .from('v_documents')\n .select('template_id, created_at', { count: 'exact' })\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .not('template_id', 'is', null)\n .limit(USAGE_FALLBACK_LIMIT)\n\n if (error) return {}\n if (typeof count === 'number' && count > USAGE_FALLBACK_LIMIT) return {}\n\n const usage: Record<string, TemplateUsage> = {}\n for (const row of (data ?? []) as any[]) {\n const current = usage[row.template_id] ?? { documentCount: 0, lastDocumentAt: null }\n current.documentCount += 1\n if (!current.lastDocumentAt || row.created_at > current.lastDocumentAt) {\n current.lastDocumentAt = row.created_at\n }\n usage[row.template_id] = current\n }\n return usage\n } catch {\n return {}\n }\n}\n\n\nfunction mapTemplate(r: any): FormTemplate {\n return {\n id: r.id,\n tenantId: r.tenant_id,\n name: r.name,\n description: r.description,\n category: r.category,\n version: r.version,\n isCurrent: r.is_current,\n parentId: r.parent_id,\n schema: r.schema,\n specialty: r.specialty,\n tags: r.tags ?? [],\n metadata: r.metadata ?? {},\n isActive: r.is_active,\n isDeleted: r.is_deleted,\n createdBy: r.created_by,\n updatedBy: r.updated_by,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n }\n}\n\nfunction mapDocument(r: any): FormDocument {\n return {\n id: r.id,\n tenantId: r.tenant_id,\n templateId: r.template_id ?? '',\n templateName: r.template_name,\n templateCategory: r.template_category,\n personId: r.person_id,\n personName: r.person_name,\n title: r.title,\n data: r.form_data ?? {},\n status: r.status,\n signedAt: r.signed_at,\n signedBy: r.signed_by,\n notes: r.notes,\n metadata: r.metadata ?? {},\n isDeleted: false,\n createdBy: r.created_by,\n updatedBy: r.updated_by,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n // Extra fields from core document\n kind: r.kind,\n fileUrl: r.file_url,\n fileName: r.file_name,\n fileSize: r.file_size,\n mimeType: r.mime_type,\n }\n}\n\nfunction mapFile(r: any): DocumentFile {\n return {\n id: r.id,\n tenantId: r.tenant_id,\n documentId: r.document_id,\n fieldKey: r.field_key,\n fileUrl: r.file_url,\n fileName: r.file_name,\n fileSize: r.file_size,\n mimeType: r.mime_type,\n sortOrder: r.sort_order,\n metadata: r.metadata ?? {},\n createdAt: r.created_at,\n }\n}\n\nexport function createSupabaseFormsProvider(): CustomFormsDataProvider {\n return {\n // ── Templates ──────────────────────────────────────────\n\n async getTemplates(query: TemplateQuery): Promise<PaginatedResult<FormTemplate>> {\n const db = getClient()\n let qb = db\n .from(T.templates)\n .select('*', { count: 'exact' })\n .eq('tenant_id', getTenantId())\n .eq('is_current', true)\n .eq('is_deleted', false)\n // Archived templates (isActive=false) leave the list and the picker.\n .eq('is_active', true)\n\n if (query.category) qb = qb.eq('category', query.category)\n if (query.search) qb = qb.ilike('name', `%${query.search}%`)\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 25\n qb = qb\n .order('updated_at', { ascending: false })\n .range((page - 1) * pageSize, page * pageSize - 1)\n\n const { data, count, error } = await qb\n if (error) throw new Error(error.message)\n return { data: (data ?? []).map(mapTemplate), total: count ?? 0 }\n },\n\n async getTemplateById(id: string): Promise<FormTemplate | null> {\n const db = getClient()\n const { data, error } = await db\n .from(T.templates)\n .select('*')\n .eq('id', id)\n .eq('is_deleted', false)\n .single()\n if (error || !data) return null\n return mapTemplate(data)\n },\n\n async createTemplate(input: CreateTemplateInput): Promise<FormTemplate> {\n const db = getClient()\n const tenantId = getTenantId()\n const { data, error } = await db\n .from(T.templates)\n .insert({\n tenant_id: tenantId,\n name: input.name,\n description: input.description,\n category: input.category,\n schema: input.schema,\n specialty: input.specialty,\n tags: input.tags ?? [],\n metadata: input.metadata ?? {},\n })\n .select()\n .single()\n if (error) throw new Error(error.message)\n return mapTemplate(data)\n },\n\n async updateTemplate(id: string, input: UpdateTemplateInput): Promise<FormTemplate> {\n const db = getClient()\n const tenantId = getTenantId()\n\n const { count } = await db\n .from(T.documents)\n .select('document_id', { count: 'exact', head: true })\n .eq('template_id', id)\n\n const hasDocuments = (count ?? 0) > 0\n\n if (hasDocuments && input.schema) {\n const existing = await this.getTemplateById(id)\n if (!existing) throw new Error('Template not found')\n\n const { data: newRow, error: insertError } = await db\n .from(T.templates)\n .insert({\n tenant_id: tenantId,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n category: input.category ?? existing.category,\n schema: input.schema,\n specialty: input.specialty ?? existing.specialty,\n tags: input.tags ?? existing.tags,\n metadata: input.metadata ?? existing.metadata,\n is_active: input.isActive ?? existing.isActive,\n version: existing.version + 1,\n is_current: true,\n parent_id: existing.parentId ?? existing.id,\n })\n .select()\n .single()\n if (insertError) throw new Error(insertError.message)\n\n await db\n .from(T.templates)\n .update({ is_current: false, updated_at: new Date().toISOString() })\n .eq('id', id)\n\n return mapTemplate(newRow)\n }\n\n const updates: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.name !== undefined) updates.name = input.name\n if (input.description !== undefined) updates.description = input.description\n if (input.category !== undefined) updates.category = input.category\n if (input.schema !== undefined) updates.schema = input.schema\n if (input.specialty !== undefined) updates.specialty = input.specialty\n if (input.tags !== undefined) updates.tags = input.tags\n if (input.metadata !== undefined) updates.metadata = input.metadata\n if (input.isActive !== undefined) updates.is_active = input.isActive\n\n const { data, error } = await db\n .from(T.templates)\n .update(updates)\n .eq('id', id)\n .select()\n .single()\n if (error) throw new Error(error.message)\n return mapTemplate(data)\n },\n\n async deleteTemplate(id: string): Promise<void> {\n const db = getClient()\n const { error } = await db\n .from(T.templates)\n .update({ is_deleted: true, updated_at: new Date().toISOString() })\n .eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n // Uso por modelo. Caminho principal: `v_forms_template_usage`, que agrega no\n // banco (004_template_usage.sql) e devolve uma linha por modelo.\n //\n // O fallback existe porque um pool provisionado antes daquela migração não\n // tem a view, e a tela não pode ficar sem o número por causa disso: ele\n // relê as colunas mínimas dos documentos e agrega aqui. É limitado de\n // propósito — acima do teto o número seria mentira, e mentir sobre uma\n // contagem é pior do que omiti-la, então ele desiste em silêncio.\n async getTemplateUsage(): Promise<Record<string, TemplateUsage>> {\n const db = getClient()\n const tenantId = getTenantId()\n if (!tenantId) return {}\n\n const { data, error } = await db\n .from('v_forms_template_usage')\n .select('template_id, document_count, last_document_at')\n .eq('tenant_id', tenantId)\n\n if (!error) {\n const usage: Record<string, TemplateUsage> = {}\n for (const row of (data ?? []) as any[]) {\n usage[row.template_id] = {\n documentCount: Number(row.document_count ?? 0),\n lastDocumentAt: row.last_document_at ?? null,\n }\n }\n return usage\n }\n\n return countTemplateUsageClientSide(db, tenantId)\n },\n\n // ── Documents (public.documents + plg_forms_documents extension) ──\n\n async getDocuments(query: DocumentQuery): Promise<PaginatedResult<FormDocument>> {\n const db = getClient()\n // Query through the v_documents view (joins core + form extension)\n let qb = db\n .from('v_documents')\n .select('*', { count: 'exact' })\n .eq('tenant_id', getTenantId())\n .eq('is_active', true)\n\n if (query.personId) qb = qb.eq('person_id', query.personId)\n if (query.templateId) qb = qb.eq('template_id', query.templateId)\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n qb = qb.in('status', statuses)\n }\n if (query.search) qb = qb.or(`title.ilike.%${query.search}%,template_name.ilike.%${query.search}%`)\n\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 50\n qb = qb\n .order('created_at', { ascending: false })\n .range((page - 1) * pageSize, page * pageSize - 1)\n\n const { data, count, error } = await qb\n if (error) throw new Error(error.message)\n return { data: (data ?? []).map(mapDocument), total: count ?? 0 }\n },\n\n async getDocumentById(id: string): Promise<FormDocument | null> {\n const db = getClient()\n const { data, error } = await db\n .from('v_documents')\n .select('*')\n .eq('id', id)\n .single()\n if (error || !data) return null\n return mapDocument(data)\n },\n\n async createDocument(input: CreateDocumentInput): Promise<FormDocument> {\n const tenantId = getTenantId()\n const isForm = !!input.templateId\n\n // Step 1: Insert into public.documents\n const { data: coreDoc, error: coreError } = await getClient()\n .from('documents')\n .insert({\n tenant_id: tenantId,\n kind: input.kind ?? (isForm ? 'form' : 'attachment'),\n person_id: input.personId,\n title: input.title,\n status: input.status ?? 'draft',\n file_url: input.fileUrl,\n file_name: input.fileName,\n file_size: input.fileSize,\n mime_type: input.mimeType,\n metadata: {},\n })\n .select()\n .single()\n if (coreError) throw new Error(coreError.message)\n\n // Step 2: For form documents, insert extension row\n if (isForm && input.templateId) {\n const db = getClient()\n const { error: extError } = await db\n .from(T.documents)\n .insert({\n document_id: coreDoc.id,\n tenant_id: tenantId,\n template_id: input.templateId,\n data: input.data ?? {},\n })\n if (extError) {\n // Rollback core insert\n await getClient().from('documents').delete().eq('id', coreDoc.id)\n throw new Error(extError.message)\n }\n }\n\n // Fetch via view to get joined data\n const doc = await this.getDocumentById(coreDoc.id)\n return doc!\n },\n\n async updateDocument(id: string, input: UpdateDocumentInput): Promise<FormDocument> {\n const now = new Date().toISOString()\n\n // Update core document fields\n const coreUpdates: Record<string, unknown> = { updated_at: now }\n if (input.status !== undefined) coreUpdates.status = input.status\n if (input.title !== undefined) coreUpdates.title = input.title\n if (input.notes !== undefined) coreUpdates.notes = input.notes\n\n const { error: coreError } = await getClient()\n .from('documents')\n .update(coreUpdates)\n .eq('id', id)\n if (coreError) throw new Error(coreError.message)\n\n // Update form extension if data is provided\n if (input.data !== undefined) {\n const db = getClient()\n await db\n .from(T.documents)\n .update({ data: input.data, updated_at: now })\n .eq('document_id', id)\n }\n\n const doc = await this.getDocumentById(id)\n return doc!\n },\n\n async deleteDocument(id: string): Promise<void> {\n const { error } = await getClient()\n .from('documents')\n .update({ is_active: false, updated_at: new Date().toISOString() })\n .eq('id', id)\n if (error) throw new Error(error.message)\n },\n\n // ── Files ──────────────────────────────────────────────\n\n async getDocumentFiles(documentId: string): Promise<DocumentFile[]> {\n const db = getClient()\n const { data, error } = await db\n .from(T.documentFiles)\n .select('*')\n .eq('document_id', documentId)\n .order('sort_order')\n if (error) throw new Error(error.message)\n return (data ?? []).map(mapFile)\n },\n\n async uploadFile(documentId: string, fieldKey: string, file: File): Promise<DocumentFile> {\n const db = getClient()\n const tenantId = getTenantId()\n const ext = file.name.split('.').pop() ?? 'bin'\n const storagePath = `${tenantId}/forms/${documentId}/${fieldKey}/${crypto.randomUUID()}.${ext}`\n\n const { error: uploadError } = await db.storage\n .from('documents')\n .upload(storagePath, file, { contentType: file.type })\n if (uploadError) throw new Error(uploadError.message)\n\n const { data: urlData } = db.storage.from('documents').getPublicUrl(storagePath)\n\n const { data, error } = await db\n .from(T.documentFiles)\n .insert({\n tenant_id: tenantId,\n document_id: documentId,\n field_key: fieldKey,\n file_url: urlData.publicUrl,\n file_name: file.name,\n file_size: file.size,\n mime_type: file.type,\n })\n .select()\n .single()\n if (error) throw new Error(error.message)\n return mapFile(data)\n },\n\n async deleteFile(fileId: string): Promise<void> {\n const db = getClient()\n const { error } = await db\n .from(T.documentFiles)\n .delete()\n .eq('id', fileId)\n if (error) throw new Error(error.message)\n },\n }\n}\n","import { create } from 'zustand'\nimport { emitDomainEvent, getActiveTenantId } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\nimport type {\n FormTemplate,\n FormDocument,\n TemplateQuery,\n DocumentQuery,\n CreateTemplateInput,\n UpdateTemplateInput,\n CreateDocumentInput,\n UpdateDocumentInput,\n TemplateUsage,\n} from './types'\n\n\n/** `forms.template.created|updated|deleted` — os fatos de um modelo.\n *\n * Mesma forma dos fatos de cadastro, e pelo mesmo barramento: quem mostra a\n * lista usa `useDataVersion` e relê, e a auditoria vê isto sem ter sido\n * inscrita. Um contador só para formulários seria mais um mecanismo para uma\n * ideia que já tem um. */\nexport const FORM_TEMPLATE_EVENT = 'forms.template.'\n\nfunction emitTemplateEvent(action: 'created' | 'updated' | 'deleted', id: string, name?: string): void {\n emitDomainEvent(\n `${FORM_TEMPLATE_EVENT}${action}`,\n { record_id: id, record_name: name ?? null },\n { tenantId: getActiveTenantId() ?? null, subject: { type: 'form_template', id } },\n )\n}\n\nexport interface CustomFormsState {\n // Templates\n templates: FormTemplate[]\n templatesTotal: number\n templatesLoading: boolean\n templatesError: string | null\n /** Uso por id de modelo. Vazio até `fetchTemplateUsage` responder — e vazio\n * também quando o pool não tem a view nem cabe no fallback. */\n templateUsage: Record<string, TemplateUsage>\n\n // Documents\n documents: FormDocument[]\n documentsTotal: number\n documentsLoading: boolean\n documentsError: string | null\n\n // Active template (for builder)\n activeTemplate: FormTemplate | null\n activeTemplateLoading: boolean\n\n // Active document (for viewer/editor)\n activeDocument: FormDocument | null\n activeDocumentLoading: boolean\n\n // Actions\n fetchTemplates(query?: TemplateQuery): Promise<void>\n fetchTemplateUsage(): Promise<void>\n fetchTemplateById(id: string): Promise<FormTemplate | null>\n createTemplate(input: CreateTemplateInput): Promise<FormTemplate>\n updateTemplate(id: string, input: UpdateTemplateInput): Promise<FormTemplate>\n deleteTemplate(id: string): Promise<void>\n\n fetchDocuments(query?: DocumentQuery): Promise<void>\n fetchDocumentById(id: string): Promise<FormDocument | null>\n createDocument(input: CreateDocumentInput): Promise<FormDocument>\n updateDocument(id: string, input: UpdateDocumentInput): Promise<FormDocument>\n deleteDocument(id: string): Promise<void>\n}\n\nexport function createCustomFormsStore(provider: CustomFormsDataProvider) {\n return create<CustomFormsState>((set) => ({\n templates: [],\n templatesTotal: 0,\n templatesLoading: false,\n templatesError: null,\n templateUsage: {},\n\n documents: [],\n documentsTotal: 0,\n documentsLoading: false,\n documentsError: null,\n\n activeTemplate: null,\n activeTemplateLoading: false,\n\n activeDocument: null,\n activeDocumentLoading: false,\n\n async fetchTemplates(query?: TemplateQuery) {\n set({ templatesLoading: true, templatesError: null })\n try {\n const result = await provider.getTemplates(query ?? {})\n set({ templates: result.data, templatesTotal: result.total })\n } catch (e: any) {\n set({ templatesError: e.message ?? 'Failed to fetch templates' })\n } finally {\n set({ templatesLoading: false })\n }\n },\n\n // Separado de `fetchTemplates` porque é outra pergunta e outro custo: a\n // lista precisa dos modelos para desenhar, e o uso é um enfeite que chega\n // depois. Junto, a tela inteira esperaria a agregação; e uma falha na\n // contagem levaria embora a lista, que não tem nada a ver com isso — daí\n // ele engolir o erro em vez de escrevê-lo em `templatesError`.\n async fetchTemplateUsage() {\n try {\n set({ templateUsage: await provider.getTemplateUsage() })\n } catch {\n set({ templateUsage: {} })\n }\n },\n\n async fetchTemplateById(id: string) {\n set({ activeTemplateLoading: true })\n try {\n const template = await provider.getTemplateById(id)\n set({ activeTemplate: template })\n return template\n } catch {\n set({ activeTemplate: null })\n return null\n } finally {\n set({ activeTemplateLoading: false })\n }\n },\n\n async createTemplate(input: CreateTemplateInput) {\n const template = await provider.createTemplate(input)\n set((s) => ({ templates: [template, ...s.templates], templatesTotal: s.templatesTotal + 1 }))\n // Emitido na ESCRITA, não na tela: um modelo criado pelo assistente não\n // passa por este store, e a lista continuava mostrando o mundo de antes.\n // Pelo barramento, quem estiver com a lista aberta relê — venha o modelo\n // do construtor, do agente ou de outra aba.\n emitTemplateEvent('created', template.id, template.name)\n return template\n },\n\n async updateTemplate(id: string, input: UpdateTemplateInput) {\n const template = await provider.updateTemplate(id, input)\n set((s) => ({\n templates: s.templates.map((t) => (t.id === id ? template : t)),\n activeTemplate: s.activeTemplate?.id === id ? template : s.activeTemplate,\n }))\n emitTemplateEvent('updated', template.id, template.name)\n return template\n },\n\n async deleteTemplate(id: string) {\n await provider.deleteTemplate(id)\n emitTemplateEvent('deleted', id)\n set((s) => ({\n templates: s.templates.filter((t) => t.id !== id),\n templatesTotal: s.templatesTotal - 1,\n }))\n },\n\n async fetchDocuments(query?: DocumentQuery) {\n set({ documentsLoading: true, documentsError: null })\n try {\n const result = await provider.getDocuments(query ?? {})\n set({ documents: result.data, documentsTotal: result.total })\n } catch (e: any) {\n set({ documentsError: e.message ?? 'Failed to fetch documents' })\n } finally {\n set({ documentsLoading: false })\n }\n },\n\n async fetchDocumentById(id: string) {\n set({ activeDocumentLoading: true })\n try {\n const doc = await provider.getDocumentById(id)\n set({ activeDocument: doc })\n return doc\n } catch {\n set({ activeDocument: null })\n return null\n } finally {\n set({ activeDocumentLoading: false })\n }\n },\n\n async createDocument(input: CreateDocumentInput) {\n const doc = await provider.createDocument(input)\n set((s) => ({ documents: [doc, ...s.documents], documentsTotal: s.documentsTotal + 1 }))\n return doc\n },\n\n async updateDocument(id: string, input: UpdateDocumentInput) {\n const doc = await provider.updateDocument(id, input)\n set((s) => ({\n documents: s.documents.map((d) => (d.id === id ? doc : d)),\n activeDocument: s.activeDocument?.id === id ? doc : s.activeDocument,\n }))\n return doc\n },\n\n async deleteDocument(id: string) {\n await provider.deleteDocument(id)\n set((s) => ({\n documents: s.documents.filter((d) => d.id !== id),\n documentsTotal: s.documentsTotal - 1,\n }))\n },\n }))\n}\n\nexport type CustomFormsStore = ReturnType<typeof createCustomFormsStore>\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.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\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.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.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.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\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 '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 '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 type { PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\n\nexport interface CustomFormsPluginOptions {\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: CustomFormsDataProvider\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\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\nconst DEFAULT_LABELS: CustomFormsLabels = {\n pageTitle: 'Custom Forms',\n settingsLabel: 'Forms & Documents',\n settingsSubtitle: 'Create and manage custom forms for your business',\n templates: 'Templates',\n documents: 'Documents',\n newTemplate: 'New Template',\n addDocument: 'Add Document',\n}\n\nexport function resolveConfig(options?: CustomFormsPluginOptions): CustomFormsConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n }\n}\n","import React, { useEffect, useState, useCallback, useMemo } from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport { FORM_TEMPLATE_EVENT } from '../store'\nimport { Plus, Pencil, Archive, FileText, Search } from 'lucide-react'\nimport { Button, Card, Badge, DataTable, PageHeaderActions, type DataTableProps } from '@fayz-ai/ui'\nimport { QuickActionsButton, askAI } from '@fayz-ai/admin'\nimport type { PluginQuickAction } from '@fayz-ai/core'\nimport { PermissionGate } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { getFormsTenantId } from '../lib/tenant'\nimport type { CustomFormsStore } from '../store'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormTemplate, TemplateCategory } from '../types'\n\ninterface TemplateListViewProps {\n store: CustomFormsStore\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 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 = getFormsTenantId()\n\n const createActions = useMemo<PluginQuickAction[]>(() => [\n {\n id: 'with-ai',\n label: t('assistant.askAI'),\n description: t('customForms.newWithAIHint'),\n icon: 'WandSparkles',\n highlight: true,\n action: () => 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 },\n {\n id: 'by-hand',\n label: t('customForms.newByHand'),\n description: t('customForms.newByHandHint'),\n icon: 'SlidersHorizontal',\n action: onNew,\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: '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 cell: ({ row }) => (\n <div className=\"flex justify-end gap-1\">\n <button\n onClick={(e) => { e.stopPropagation(); onEdit(row.original) }}\n className=\"rounded-md p-1.5 hover:bg-muted\"\n title={t('common.edit')}\n >\n <Pencil className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); void handleArchive(row.original) }}\n className=\"rounded-md p-1.5 hover:bg-muted\"\n title={t('customForms.archive')}\n >\n <Archive className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\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 <PermissionGate feature=\"custom_forms\" action=\"create\">\n <PageHeaderActions>\n {/* Duas portas para o mesmo modelo, e a de IA é a promovida: montar\n uma anamnese campo a campo é meia hora de cliques, e descrevê-la é\n uma frase. A ferramenta atrás dela é `createOrUpdateForm`, que é\n server-plane e já existia — aqui só se abre a porta. */}\n <QuickActionsButton\n label={t('customForms.newTemplate')}\n variant=\"default\"\n actions={createActions}\n />\n </PageHeaderActions>\n </PermissionGate>\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 type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={t('common.search')}\n className=\"w-full bg-transparent py-1.5 pl-8 pr-3 text-sm placeholder:text-muted-foreground focus:outline-none\"\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 type { CustomFormsConfig } from '../config'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormTemplate } from '../types'\n\ninterface CustomFormsSettingsTabProps {\n config: CustomFormsConfig\n provider: CustomFormsDataProvider\n store: CustomFormsStore\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: CustomFormsStore\n provider: CustomFormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}) {\n const FormBuilderLazy = React.lazy(() =>\n import('../components/FormBuilder').then((m) => ({ default: m.FormBuilder })),\n )\n\n return (\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 )\n}\n","import React, { useEffect, useState, useCallback, useRef } from 'react'\nimport { FileText, Archive, Eye, Upload, Image as ImageIcon, Paperclip } from 'lucide-react'\nimport { Badge } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormDocument, DocumentStatus } from '../types'\n\ninterface DocumentListProps {\n personId: string\n provider: CustomFormsDataProvider\n store: CustomFormsStore\n onView: (doc: FormDocument) => void\n onFileDrop?: (files: File[]) => void\n}\n\nconst STATUS_COLORS: Record<DocumentStatus, 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\nconst KIND_ICONS: Record<string, React.ElementType> = {\n form: FileText,\n image: ImageIcon,\n attachment: Paperclip,\n prescription: FileText,\n contract: FileText,\n}\n\nfunction formatDateLabel(dateStr: string): string {\n const date = new Date(dateStr)\n const now = new Date()\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n const docDate = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n const diffDays = Math.round((today.getTime() - docDate.getTime()) / (1000 * 60 * 60 * 24))\n\n if (diffDays === 0) return 'Hoje'\n if (diffDays === 1) return 'Ontem'\n if (diffDays < 7) return `${diffDays} dias atrás`\n return date.toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' })\n}\n\nfunction groupByDate(docs: FormDocument[]): Array<{ date: string; label: string; items: FormDocument[] }> {\n const groups: Map<string, FormDocument[]> = new Map()\n for (const doc of docs) {\n const dateKey = doc.createdAt.slice(0, 10)\n if (!groups.has(dateKey)) groups.set(dateKey, [])\n groups.get(dateKey)!.push(doc)\n }\n return Array.from(groups.entries())\n .sort(([a], [b]) => b.localeCompare(a))\n .map(([date, items]) => ({\n date,\n label: formatDateLabel(date),\n items,\n }))\n}\n\nexport function DocumentList({ personId, provider, store, onView, onFileDrop }: DocumentListProps) {\n const t = useTranslation()\n const [documents, setDocuments] = useState<FormDocument[]>([])\n const [loading, setLoading] = useState(true)\n const [isDragOver, setIsDragOver] = useState(false)\n const dragCounter = useRef(0)\n\n const fetchDocs = useCallback(async () => {\n setLoading(true)\n try {\n const result = await provider.getDocuments({ personId })\n // Archived docs are kept (not deleted) but drop out of the active list.\n setDocuments(result.data.filter((d) => d.status !== 'archived'))\n } finally {\n setLoading(false)\n }\n }, [personId, provider])\n\n useEffect(() => {\n const timer = setTimeout(() => fetchDocs(), 50)\n return () => clearTimeout(timer)\n }, [fetchDocs])\n\n useEffect(() => {\n const unsub = store.subscribe(() => fetchDocs())\n return unsub\n }, [store, fetchDocs])\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 const handleArchive = useCallback(async (doc: FormDocument) => {\n if (!window.confirm(t('customForms.archiveDocumentConfirm'))) return\n await provider.updateDocument(doc.id, { status: 'archived' })\n setDocuments((prev) => prev.filter((d) => d.id !== doc.id))\n }, [provider, t])\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 const groups = groupByDate(documents)\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 return (\n <div\n className={`relative min-h-[200px] rounded-xl border-2 border-dashed transition-colors ${\n isDragOver\n ? 'border-primary bg-primary/5'\n : documents.length === 0\n ? 'border-border'\n : 'border-transparent'\n }`}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\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\">Solte os arquivos aqui</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 <FileText className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm font-medium\">{t('customForms.noDocuments')}</p>\n <p className=\"text-xs text-muted-foreground mt-1 max-w-xs\">\n {t('customForms.noDocumentsDescription')}\n </p>\n <p className=\"text-[10px] text-muted-foreground mt-3 flex items-center gap-1\">\n <Upload className=\"h-3 w-3\" />\n Arraste arquivos para cá\n </p>\n </div>\n )}\n\n {/* Timeline */}\n {groups.length > 0 && (\n <div className=\"space-y-5 py-2\">\n {groups.map((group) => (\n <div key={group.date}>\n {/* Date header */}\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground px-1\">\n {group.label}\n </span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Documents for this date */}\n <div className=\"space-y-1.5\">\n {group.items.map((doc) => {\n const Icon = KIND_ICONS[doc.kind ?? 'form'] ?? FileText\n const time = new Date(doc.createdAt).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n\n return (\n <div\n key={doc.id}\n className=\"group flex items-center gap-3 rounded-lg p-2.5 hover:bg-muted/50 cursor-pointer transition-colors\"\n onClick={() => onView(doc)}\n >\n {/* Icon */}\n <div className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-primary/10 shrink-0\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {doc.title ?? doc.templateName ?? 'Documento'}\n </p>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n {doc.templateName && (\n <span className=\"text-[10px] text-muted-foreground\">{doc.templateName}</span>\n )}\n <span className=\"text-[10px] text-muted-foreground\">{time}</span>\n </div>\n </div>\n\n {/* Status + actions */}\n <Badge variant=\"secondary\" className={`text-[10px] shrink-0 ${STATUS_COLORS[doc.status] ?? ''}`}>\n {t(`customForms.status.${doc.status}`)}\n </Badge>\n <div className=\"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n onClick={(e) => { e.stopPropagation(); onView(doc) }}\n className=\"p-1.5 rounded-md hover:bg-muted\"\n >\n <Eye className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); handleArchive(doc) }}\n className=\"p-1.5 rounded-md hover:bg-muted\"\n title={t('customForms.archive')}\n >\n <Archive className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ))}\n </div>\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 { useSaveBar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit } from '@fayz-ai/admin'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormTemplate, FormDocument } from '../types'\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: CustomFormsDataProvider\n store: CustomFormsStore\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\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\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 { CustomFormsDataProvider } from '../data/types'\nimport type { FormDocument, FormTemplate } from '../types'\nimport { FormRenderer } from './FormRenderer'\nimport { DocumentBodySkeleton } from './DocumentSkeleton'\nimport { printDocument } from '../lib/print'\n\ninterface FormViewerProps {\n document: FormDocument\n provider: CustomFormsDataProvider\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\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 } 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\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 }: 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(opts)\n setLoaded(true)\n loadingRef.current = false\n })\n }, [personId, loaded])\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 {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=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\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\n key={opt.id}\n type=\"button\"\n data-index={index}\n onClick={() => choose(opt)}\n onMouseEnter={() => setActiveIndex(index)}\n className={`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 { 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 { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormDocument, FormTemplate } from '../types'\nimport type { DocumentTypeOption } from '../lib/document-types'\nimport { DocumentList } from './DocumentList'\nimport { DocumentFormDialog } from './DocumentFormDialog'\nimport { FormViewer } from './FormViewer'\nimport { AddDocumentDropdown } from './AddDocumentDropdown'\n\ninterface PersonDocumentsWidgetProps {\n item: { id: string; name?: string; [key: string]: any }\n config: CustomFormsConfig\n provider: CustomFormsDataProvider\n store: CustomFormsStore\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 }: PersonDocumentsWidgetProps) {\n const t = useTranslation()\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\">{t('customForms.documents')}</h3>\n <AddDocumentDropdown personId={item.id} onSelect={handleDocTypeSelect} />\n </div>\n <DocumentList\n personId={item.id}\n provider={provider}\n store={store}\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\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 { 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 React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\nimport { T } from './data/tables'\nimport { createMockFormsProvider } from './data/mock'\nimport { createSupabaseFormsProvider } from './data/supabase'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\nimport { createCustomFormsStore } from './store'\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 { registerDocumentTypeProvider } from './lib/document-types'\nimport { registerFormsTimelineSource } from './lib/timeline-source'\nimport { createOrUpdateFormTool } from './lib/agent-tools'\nimport { FileText as FileTextIcon, Image as ImageIcon, Paperclip } from 'lucide-react'\n\nfunction registerBuiltInProviders(formsProvider: CustomFormsDataProvider) {\n // Templates from custom_forms\n registerDocumentTypeProvider({\n id: 'custom_forms:templates',\n async getTypes() {\n try {\n const result = await formsProvider.getTemplates({})\n return result.data.map((tpl) => ({\n id: `template:${tpl.id}`,\n label: tpl.name,\n icon: FileTextIcon,\n group: 'Formulários',\n groupOrder: 10,\n order: 0,\n description: tpl.description,\n _templateId: tpl.id,\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: 'Imagem', icon: ImageIcon, group: 'Arquivos', groupOrder: 90, order: 0 },\n { id: 'core:attachment', label: 'Anexo', icon: Paperclip, group: 'Arquivos', groupOrder: 90, order: 1 },\n ]\n },\n })\n}\n\nexport type { CustomFormsPluginOptions }\nexport { registerDocumentTypeProvider, type DocumentTypeOption, type DocumentTypeProvider } from './lib/document-types'\n\nexport function createCustomFormsPlugin(options?: CustomFormsPluginOptions): PluginManifest {\n registerTranslations(customFormsLocales)\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseFormsProvider(),\n () => createMockFormsProvider(),\n )\n const store = createCustomFormsStore(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\n\n const formRegistries: import('@fayz-ai/core').PluginRegistryDef[] = [\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 })\n PersonDocumentsWidget.displayName = 'PersonDocumentsWidget'\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 navigation: [],\n\n routes: [],\n\n settings: [\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\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: 'What forms do we have?' },\n { label: 'Show me anamnesis templates' },\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: \"Show this client's documents\" },\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"]}
|