@fayz-ai/plugin-forms 0.1.5 → 0.2.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/DocumentFormDialog.tsx","../src/components/FormViewer.tsx","../src/document-types.ts","../src/components/AddDocumentDropdown.tsx","../src/components/PersonDocumentsWidget.tsx","../src/index.ts"],"names":["now","useTranslation","useState","useCallback","React","jsx","jsxs","FileText","ImageIcon","useEffect","Badge","Trash2","Button","STATUS_COLORS","ArrowLeft","Pencil","useRef","Plus","Paperclip","FileTextIcon","PersonDocumentsWidget"],"mappings":"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","file":"index.js","sourcesContent":["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} 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 // ── 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. Defaults to undefined → Supabase RLS scopes by session.\nlet currentTenantId: string | undefined\nexport function setFormsTenantId(id: string | undefined): void { currentTenantId = id }\nexport function getFormsTenantId(): string | undefined { return currentTenantId }\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} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\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\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('frm_templates')\n .select('*', { count: 'exact' })\n .eq('tenant_id', getTenantId())\n .eq('is_current', true)\n .eq('is_deleted', false)\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('frm_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('frm_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('frm_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('frm_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('frm_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('frm_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('frm_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 // ── Documents (saas_core.documents + frm_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 saas_core.documents\n const { data: coreDoc, error: coreError } = await getClient()\n .from('frm_core_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('frm_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('frm_core_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('frm_core_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('frm_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('frm_core_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('frm_document_files')\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('frm_document_files')\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('frm_document_files')\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} from './types'\n\nexport interface CustomFormsState {\n // Templates\n templates: FormTemplate[]\n templatesTotal: number\n templatesLoading: boolean\n templatesError: string | null\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 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\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 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\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\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\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\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\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\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 { 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}\n\nexport interface CustomFormsLabels {\n pageTitle: string\n settingsLabel: 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 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, Trash2, 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 { 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\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 const handleDelete = useCallback(async (template: FormTemplate) => {\n if (!window.confirm(t('customForms.deleteTemplateConfirm'))) return\n await store.getState().deleteTemplate(template.id)\n }, [store, t])\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 <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 </div>\n\n {/* Empty state */}\n {!loading && templates.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 <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 </CardContent>\n </Card>\n )}\n\n {/* Template list */}\n {templates.length > 0 && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {templates.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(); handleDelete(template) }}\n className=\"p-1.5 rounded-md hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\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 </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 { useTranslation } from '@fayz-ai/core'\nimport type { PluginRegistryDef } from '@fayz-ai/core'\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 registries?: PluginRegistryDef[]\n}\n\nexport function CustomFormsSettingsTab({ config, provider, store, registries }: CustomFormsSettingsTabProps) {\n const t = useTranslation()\n const [builderTemplateId, setBuilderTemplateId] = useState<string | null>(null)\n\n const handleNew = useCallback(() => {\n setBuilderTemplateId('__new__')\n }, [])\n\n const handleEdit = useCallback((template: FormTemplate) => {\n setBuilderTemplateId(template.id)\n }, [])\n\n const handleBackFromBuilder = useCallback(() => {\n setBuilderTemplateId(null)\n // Re-fetch templates to reflect any saves\n store.getState().fetchTemplates()\n }, [store])\n\n // Sync from hash on mount\n React.useEffect(() => {\n function checkHash() {\n const hash = window.location.hash.slice(1) || '/'\n const builderMatch = hash.match(/\\/settings\\/custom_forms\\/templates\\/(.+)/)\n if (builderMatch && builderMatch[1] !== 'new') {\n setBuilderTemplateId(builderMatch[1])\n } else if (builderMatch && builderMatch[1] === 'new') {\n setBuilderTemplateId('__new__')\n }\n }\n checkHash()\n }, [])\n\n // Templates tab content — either list or builder\n const templatesContent = 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 return (\n <div style={{ padding: '24px' }}>\n <div style={{ marginBottom: '16px' }}>\n <h1 style={{ fontSize: '20px', fontWeight: 600, margin: 0 }}>{t('customForms.settingsTitle')}</h1>\n <p style={{ color: 'var(--muted-foreground, #6b7280)', margin: '4px 0 0', fontSize: '14px' }}>\n {t('customForms.settingsSubtitle')}\n </p>\n </div>\n {templatesContent}\n </div>\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, Trash2, 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 setDocuments(result.data)\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 const handleDelete = useCallback(async (doc: FormDocument) => {\n if (!window.confirm(t('customForms.deleteDocumentConfirm'))) return\n await provider.deleteDocument(doc.id)\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(); handleDelete(doc) }}\n className=\"p-1.5 rounded-md hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ArrowLeft, Save, Loader2 } from 'lucide-react'\nimport { Button, useSaveBar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormTemplate, FormDocument } from '../types'\nimport { FormRenderer } from './FormRenderer'\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 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 provider,\n store,\n onSaved,\n onBack,\n}: DocumentFormDialogProps) {\n const t = useTranslation()\n const [template, setTemplate] = useState<FormTemplate | null>(initialTemplate)\n const [data, setData] = useState<Record<string, unknown>>(existingDocument?.data ?? {})\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 const handleSave = useCallback(\n async (status: 'draft' | 'completed') => {\n if (!template) 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 }\n onSaved()\n } finally {\n setSaving(false)\n }\n },\n [template, existingDocument, data, personId, personName, store, onSaved],\n )\n\n // Dirty detection — snapshot editable field values once template is ready\n const snapshot = React.useRef<string | null>(null)\n useEffect(() => {\n if (template && snapshot.current === null) snapshot.current = JSON.stringify(data)\n }, [template])\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 return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"h-5 w-5 border-2 border-primary border-t-transparent animate-spin rounded-full\" />\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} &middot; </span>}\n {new Date().toLocaleDateString()}\n </p>\n </div>\n </div>\n\n {/* Form fields */}\n <div className=\"rounded-xl border p-4\">\n <FormRenderer\n schema={template.schema}\n data={data}\n onChange={setData}\n />\n </div>\n\n {/* Secondary action — primary \"Save & Complete\" lives in the floating SaveBar */}\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => handleSave('draft')} disabled={saving}>\n {saving ? <Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" /> : <Save className=\"h-3.5 w-3.5 mr-1.5\" />}\n {t('customForms.saveAsDraft')}\n </Button>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { ArrowLeft, Pencil, Badge as BadgeIcon } 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'\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 if (!template) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"h-5 w-5 border-2 border-primary border-t-transparent animate-spin rounded-full\" />\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 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 {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 <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 </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 '../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 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 '../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 [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 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 }, [store, item.id])\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 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 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 React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\nimport { createMockFormsProvider } from './data/mock'\nimport { createSupabaseFormsProvider } from './data/supabase'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\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 './document-types'\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 './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\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: 'frm_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 SettingsComponent: React.FC = () =>\n React.createElement(CustomFormsSettingsTab, { config, provider, store, registries: formRegistries })\n SettingsComponent.displayName = 'CustomFormsSettingsTab'\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\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: formRegistries,\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 ],\n\n locales: customFormsLocales,\n }\n}\n"]}
1
+ {"version":3,"sources":["../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/DocumentFormDialog.tsx","../src/components/FormViewer.tsx","../src/document-types.ts","../src/components/AddDocumentDropdown.tsx","../src/components/PersonDocumentsWidget.tsx","../src/index.ts"],"names":["now","useState","useCallback","React","jsx","FileText","ImageIcon","useTranslation","useEffect","jsxs","Badge","Trash2","Button","STATUS_COLORS","ArrowLeft","Pencil","useRef","Plus","Paperclip","FileTextIcon","PersonDocumentsWidget"],"mappings":"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","file":"index.js","sourcesContent":["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} 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 // ── 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. Defaults to undefined → Supabase RLS scopes by session.\nlet currentTenantId: string | undefined\nexport function setFormsTenantId(id: string | undefined): void { currentTenantId = id }\nexport function getFormsTenantId(): string | undefined { return currentTenantId }\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} from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\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\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('frm_templates')\n .select('*', { count: 'exact' })\n .eq('tenant_id', getTenantId())\n .eq('is_current', true)\n .eq('is_deleted', false)\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('frm_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('frm_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('frm_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('frm_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('frm_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('frm_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('frm_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 // ── Documents (saas_core.documents + frm_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 saas_core.documents\n const { data: coreDoc, error: coreError } = await getClient()\n .from('frm_core_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('frm_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('frm_core_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('frm_core_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('frm_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('frm_core_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('frm_document_files')\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('frm_document_files')\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('frm_document_files')\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} from './types'\n\nexport interface CustomFormsState {\n // Templates\n templates: FormTemplate[]\n templatesTotal: number\n templatesLoading: boolean\n templatesError: string | null\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 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\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 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\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\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\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\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\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\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, Trash2, 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 { 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\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 const handleDelete = useCallback(async (template: FormTemplate) => {\n if (!window.confirm(t('customForms.deleteTemplateConfirm'))) return\n await store.getState().deleteTemplate(template.id)\n }, [store, t])\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 <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 </div>\n\n {/* Empty state */}\n {!loading && templates.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 <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 </CardContent>\n </Card>\n )}\n\n {/* Template list */}\n {templates.length > 0 && (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {templates.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(); handleDelete(template) }}\n className=\"p-1.5 rounded-md hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\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 </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\nexport function CustomFormsSettingsTab({ config, provider, store }: CustomFormsSettingsTabProps) {\n const [builderTemplateId, setBuilderTemplateId] = useState<string | null>(null)\n\n const handleNew = useCallback(() => {\n setBuilderTemplateId('__new__')\n }, [])\n\n const handleEdit = useCallback((template: FormTemplate) => {\n setBuilderTemplateId(template.id)\n }, [])\n\n const handleBackFromBuilder = useCallback(() => {\n setBuilderTemplateId(null)\n // Re-fetch templates to reflect any saves\n store.getState().fetchTemplates()\n }, [store])\n\n // Sync from hash on mount\n React.useEffect(() => {\n function checkHash() {\n const hash = window.location.hash.slice(1) || '/'\n const builderMatch = hash.match(/\\/settings\\/custom_forms\\/templates\\/(.+)/)\n if (builderMatch && builderMatch[1] !== 'new') {\n setBuilderTemplateId(builderMatch[1])\n } else if (builderMatch && builderMatch[1] === 'new') {\n setBuilderTemplateId('__new__')\n }\n }\n checkHash()\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, Trash2, 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 setDocuments(result.data)\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 const handleDelete = useCallback(async (doc: FormDocument) => {\n if (!window.confirm(t('customForms.deleteDocumentConfirm'))) return\n await provider.deleteDocument(doc.id)\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(); handleDelete(doc) }}\n className=\"p-1.5 rounded-md hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ArrowLeft, Save, Loader2 } from 'lucide-react'\nimport { Button, useSaveBar } from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsStore } from '../store'\nimport type { FormTemplate, FormDocument } from '../types'\nimport { FormRenderer } from './FormRenderer'\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 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 provider,\n store,\n onSaved,\n onBack,\n}: DocumentFormDialogProps) {\n const t = useTranslation()\n const [template, setTemplate] = useState<FormTemplate | null>(initialTemplate)\n const [data, setData] = useState<Record<string, unknown>>(existingDocument?.data ?? {})\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 const handleSave = useCallback(\n async (status: 'draft' | 'completed') => {\n if (!template) 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 }\n onSaved()\n } finally {\n setSaving(false)\n }\n },\n [template, existingDocument, data, personId, personName, store, onSaved],\n )\n\n // Dirty detection — snapshot editable field values once template is ready\n const snapshot = React.useRef<string | null>(null)\n useEffect(() => {\n if (template && snapshot.current === null) snapshot.current = JSON.stringify(data)\n }, [template])\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 return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"h-5 w-5 border-2 border-primary border-t-transparent animate-spin rounded-full\" />\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} &middot; </span>}\n {new Date().toLocaleDateString()}\n </p>\n </div>\n </div>\n\n {/* Form fields */}\n <div className=\"rounded-xl border p-4\">\n <FormRenderer\n schema={template.schema}\n data={data}\n onChange={setData}\n />\n </div>\n\n {/* Secondary action — primary \"Save & Complete\" lives in the floating SaveBar */}\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => handleSave('draft')} disabled={saving}>\n {saving ? <Loader2 className=\"h-3.5 w-3.5 mr-1.5 animate-spin\" /> : <Save className=\"h-3.5 w-3.5 mr-1.5\" />}\n {t('customForms.saveAsDraft')}\n </Button>\n </div>\n </div>\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { ArrowLeft, Pencil, Badge as BadgeIcon } 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'\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 if (!template) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"h-5 w-5 border-2 border-primary border-t-transparent animate-spin rounded-full\" />\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 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 {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 <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 </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 '../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 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 '../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 [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 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 }, [store, item.id])\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 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 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 React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport type { CustomFormsDataProvider } from './data/types'\nimport { createMockFormsProvider } from './data/mock'\nimport { createSupabaseFormsProvider } from './data/supabase'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { PluginSettingsPanel } from '@fayz-ai/saas'\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 './document-types'\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 './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\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: 'frm_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\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 ],\n\n locales: customFormsLocales,\n }\n}\n"]}