@fayz-ai/plugin-forms 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FormBuilder-JCNHXQXT.js → FormBuilder-YHJHF6HZ.js} +3 -3
- package/dist/{FormBuilder-JCNHXQXT.js.map → FormBuilder-YHJHF6HZ.js.map} +1 -1
- package/dist/{chunk-JCAWSDX6.js → chunk-RBLXIKWB.js} +220 -7
- package/dist/chunk-RBLXIKWB.js.map +1 -0
- package/dist/components/DocumentFormDialog.d.ts.map +1 -1
- package/dist/components/DocumentSkeleton.d.ts +21 -0
- package/dist/components/DocumentSkeleton.d.ts.map +1 -0
- package/dist/components/FormRenderer.d.ts.map +1 -1
- package/dist/components/FormViewer.d.ts.map +1 -1
- package/dist/data/mock.d.ts.map +1 -1
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/data/types.d.ts +4 -1
- package/dist/data/types.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +173 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/html-text.d.ts +21 -0
- package/dist/lib/html-text.d.ts.map +1 -0
- package/dist/lib/print.d.ts.map +1 -1
- package/dist/lib/timeline-source.d.ts +10 -0
- package/dist/lib/timeline-source.d.ts.map +1 -0
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/store.d.ts +5 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/views/TemplateListView.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/chunk-JCAWSDX6.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FORM_BUILDER_INSTRUCTIONS, FormRenderer, buildPrintHtml, PERSON_FIELD_OPTIONS } from './chunk-
|
|
1
|
+
import { FORM_BUILDER_INSTRUCTIONS, FormRenderer, buildPrintHtml, PERSON_FIELD_OPTIONS } from './chunk-RBLXIKWB.js';
|
|
2
2
|
import React2, { useState, useEffect, useCallback } from 'react';
|
|
3
3
|
import { useSensors, useSensor, PointerSensor, DndContext, pointerWithin, DragOverlay, useDroppable, useDraggable } from '@dnd-kit/core';
|
|
4
4
|
import { arrayMove, SortableContext, verticalListSortingStrategy, useSortable } from '@dnd-kit/sortable';
|
|
@@ -716,5 +716,5 @@ function FormBuilder({ templateId, store, provider, config, onBack }) {
|
|
|
716
716
|
}
|
|
717
717
|
|
|
718
718
|
export { FormBuilder };
|
|
719
|
-
//# sourceMappingURL=FormBuilder-
|
|
720
|
-
//# sourceMappingURL=FormBuilder-
|
|
719
|
+
//# sourceMappingURL=FormBuilder-YHJHF6HZ.js.map
|
|
720
|
+
//# sourceMappingURL=FormBuilder-YHJHF6HZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/FieldPalette.tsx","../src/components/BuilderField.tsx","../src/components/BuilderCanvas.tsx","../src/components/FieldConfigDialog.tsx","../src/components/FormBuilder.tsx"],"names":["useTranslation","jsxs","jsx","useState","useEffect","React","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button"],"mappings":"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","file":"FormBuilder-JCNHXQXT.js","sourcesContent":["import React from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n Heading, Type, AlignLeft, FileEdit, CalendarDays,\n ChevronDown, CircleDot, Tags, CheckSquare,\n Image, GalleryHorizontalEnd, Receipt,\n} from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldType } from '../types'\n\nexport interface FieldTypeItem {\n type: FormFieldType\n icon: React.ElementType\n}\n\nexport const DEFAULT_COL_SPAN: Record<string, number> = {\n title: 12,\n memo: 12,\n richtext: 12,\n gallery: 12,\n budget: 12,\n image: 6,\n text: 6,\n date: 4,\n select: 6,\n radio: 6,\n tags: 8,\n checkbox: 4,\n}\n\nexport const FIELD_TYPES: FieldTypeItem[] = [\n { type: 'title', icon: Heading },\n { type: 'text', icon: Type },\n { type: 'memo', icon: AlignLeft },\n { type: 'richtext', icon: FileEdit },\n { type: 'date', icon: CalendarDays },\n { type: 'select', icon: ChevronDown },\n { type: 'radio', icon: CircleDot },\n { type: 'tags', icon: Tags },\n { type: 'checkbox', icon: CheckSquare },\n { type: 'image', icon: Image },\n { type: 'gallery', icon: GalleryHorizontalEnd },\n { type: 'budget', icon: Receipt },\n]\n\nfunction DraggableFieldType({ item }: { item: FieldTypeItem }) {\n const t = useTranslation()\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: `palette-${item.type}`,\n data: { source: 'palette', fieldType: item.type },\n })\n\n const Icon = item.icon\n\n return (\n <button\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg border bg-card text-sm font-medium transition-all hover:shadow-sm hover:border-primary/30 cursor-grab active:cursor-grabbing ${isDragging ? 'opacity-30' : ''}`}\n >\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"truncate\">{t(`customForms.fieldType.${item.type}`)}</span>\n </button>\n )\n}\n\nexport function FieldPalette() {\n const t = useTranslation()\n\n return (\n <div className=\"w-44 shrink-0 space-y-1.5\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground px-1 mb-2\">\n {t('customForms.builder.fields')}\n </p>\n {FIELD_TYPES.map((item) => (\n <DraggableFieldType key={item.type} item={item} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\n\ninterface BuilderFieldProps {\n field: FormFieldDef\n onSelect: (field: FormFieldDef) => void\n onRemove: (fieldId: string) => void\n isSelected: boolean\n}\n\nexport function BuilderField({ field, onSelect, onRemove, isSelected }: BuilderFieldProps) {\n const t = useTranslation()\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: field.id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n gridColumn: `span ${field.colSpan}`,\n opacity: isDragging ? 0.5 : 1,\n }\n\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`group relative flex items-start gap-2 rounded-lg border-2 bg-card p-3 transition-colors cursor-pointer ${\n isSelected\n ? 'border-primary ring-1 ring-primary/20'\n : 'border-border hover:border-primary/30'\n }`}\n onClick={() => onSelect(field)}\n >\n {/* Drag handle */}\n <button\n {...attributes}\n {...listeners}\n className=\"mt-0.5 cursor-grab active:cursor-grabbing text-muted-foreground/50 hover:text-muted-foreground\"\n onClick={(e) => e.stopPropagation()}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />}\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t(`customForms.fieldType.${field.type}`)}\n </span>\n </div>\n <p className=\"text-sm font-medium mt-0.5 truncate\">{field.label}</p>\n {field.required && (\n <span className=\"text-[10px] text-destructive\">*</span>\n )}\n </div>\n\n {/* Remove button */}\n <button\n onClick={(e) => { e.stopPropagation(); onRemove(field.id) }}\n className=\"absolute top-1.5 right-1.5 p-1 rounded-md opacity-0 group-hover:opacity-100 hover:bg-destructive/10 transition-opacity\"\n >\n <X className=\"h-3 w-3 text-destructive\" />\n </button>\n </div>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef, FormFieldType } from '../types'\nimport { BuilderField } from './BuilderField'\nimport { FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\n\ninterface BuilderCanvasProps {\n fields: FormFieldDef[]\n selectedFieldId: string | null\n onSelectField: (field: FormFieldDef) => void\n onRemoveField: (fieldId: string) => void\n draggingFieldType: FormFieldType | null\n}\n\nfunction DropPreview({ fieldType }: { fieldType: FormFieldType }) {\n const t = useTranslation()\n const def = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!def) return null\n const Icon = def.icon\n\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border-2 border-dashed border-primary/40 bg-primary/5 p-3\"\n style={{ gridColumn: `span ${DEFAULT_COL_SPAN[fieldType] ?? 12}` }}\n >\n <Icon className=\"h-4 w-4 text-primary/50\" />\n <span className=\"text-sm text-primary/50 font-medium\">\n {t(`customForms.fieldType.${fieldType}`)}\n </span>\n </div>\n )\n}\n\nexport function BuilderCanvas({\n fields,\n selectedFieldId,\n onSelectField,\n onRemoveField,\n draggingFieldType,\n}: BuilderCanvasProps) {\n const t = useTranslation()\n const { setNodeRef, isOver } = useDroppable({ id: 'builder-canvas' })\n\n const sortedFields = [...fields].sort((a, b) => a.row - b.row || a.col - b.col)\n const showPreview = isOver && draggingFieldType !== null\n\n return (\n <div\n ref={setNodeRef}\n className={`flex-1 min-h-[400px] rounded-xl border-2 border-dashed p-4 transition-colors ${\n isOver ? 'border-primary/50 bg-primary/5' : 'border-border bg-muted/20'\n }`}\n style={{\n backgroundImage:\n 'repeating-linear-gradient(90deg, transparent, transparent calc(8.333% - 1px), hsl(var(--border) / 0.3) calc(8.333% - 1px), hsl(var(--border) / 0.3) 8.333%)',\n backgroundSize: '100% 100%',\n }}\n >\n {fields.length === 0 && !showPreview && (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n {t('customForms.builder.emptyCanvas')}\n </div>\n )}\n\n <SortableContext items={sortedFields.map((f) => f.id)} strategy={verticalListSortingStrategy}>\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: 'repeat(12, 1fr)' }}\n >\n {sortedFields.map((field) => (\n <BuilderField\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={onSelectField}\n onRemove={onRemoveField}\n />\n ))}\n\n {showPreview && <DropPreview fieldType={draggingFieldType!} />}\n </div>\n </SortableContext>\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n SheetFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\nimport { PERSON_FIELD_OPTIONS } from '../lib/person-fields'\n\n/** Field types that can be auto-filled from a person record. */\nconst MAPPABLE_TYPES = ['text', 'memo', 'richtext', 'date']\nconst MAP_NONE = '__none__'\n\nconst SIZE_OPTIONS = [\n { span: 3, label: '1/4' },\n { span: 4, label: '1/3' },\n { span: 6, label: '1/2' },\n { span: 8, label: '2/3' },\n { span: 9, label: '3/4' },\n { span: 12, label: 'Full' },\n]\n\ninterface FieldConfigDrawerProps {\n field: FormFieldDef | null\n onSave: (updated: FormFieldDef) => void\n /** Live update without closing — used for visual changes like colSpan */\n onUpdate?: (updated: FormFieldDef) => void\n onClose: () => void\n}\n\nexport function FieldConfigDrawer({ field, onSave, onUpdate, onClose }: FieldConfigDrawerProps) {\n const t = useTranslation()\n const [label, setLabel] = useState('')\n const [placeholder, setPlaceholder] = useState('')\n const [required, setRequired] = useState(false)\n const [colSpan, setColSpan] = useState(12)\n const [options, setOptions] = useState<Array<{ label: string; value: string }>>([])\n const [map, setMap] = useState<string>('')\n\n // Sync state when field changes\n useEffect(() => {\n if (!field) return\n setLabel(field.label)\n setPlaceholder(field.placeholder ?? '')\n setRequired(field.required ?? false)\n setColSpan(field.colSpan)\n setOptions(field.options ?? [])\n setMap(field.map ?? '')\n }, [field?.id])\n\n if (!field) return null\n\n const hasOptions = ['select', 'radio', 'tags'].includes(field.type)\n const canMap = MAPPABLE_TYPES.includes(field.type)\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n const handleSave = () => {\n onSave({\n ...field,\n label,\n placeholder: placeholder || undefined,\n required,\n colSpan: Math.max(1, Math.min(12, colSpan)),\n options: hasOptions ? options.filter((o) => o.label.trim()) : field.options,\n map: canMap && map ? map : undefined,\n })\n }\n\n const addOption = () => {\n setOptions([...options, { label: '', value: '' }])\n }\n\n const updateOption = (index: number, newLabel: string) => {\n const updated = [...options]\n updated[index] = { label: newLabel, value: newLabel.toLowerCase().replace(/\\s+/g, '_') }\n setOptions(updated)\n }\n\n const removeOption = (index: number) => {\n setOptions(options.filter((_, i) => i !== index))\n }\n\n return (\n <Sheet open={!!field} onOpenChange={(open) => { if (!open) onClose() }}>\n <SheetContent className=\"w-80 sm:w-96\" overlay=\"none\">\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2 text-sm\">\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground\" />}\n {t(`customForms.fieldType.${field.type}`)}\n </SheetTitle>\n </SheetHeader>\n\n <SheetBody className=\"space-y-4 py-4\">\n {/* Label */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldLabel')}</label>\n <Input\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n className=\"h-9 text-sm\"\n autoFocus\n />\n </div>\n\n {/* Placeholder */}\n {!['title', 'checkbox', 'image', 'gallery'].includes(field.type) && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldPlaceholder')}</label>\n <Input\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n className=\"h-9 text-sm\"\n />\n </div>\n )}\n\n {/* Column span — visual skeleton selector */}\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.colSpan')}</label>\n <div className=\"grid grid-cols-3 gap-2\">\n {SIZE_OPTIONS.map((opt) => (\n <button\n key={opt.span}\n onClick={() => {\n setColSpan(opt.span)\n if (onUpdate && field) {\n onUpdate({ ...field, colSpan: opt.span })\n }\n }}\n className={`group relative rounded-lg border-2 p-2 transition-all ${\n colSpan === opt.span\n ? 'border-primary bg-primary/5'\n : 'border-border hover:border-primary/30'\n }`}\n >\n {/* Mini 12-col skeleton preview */}\n <div className=\"flex gap-px h-3 mb-1.5\">\n <div\n className={`rounded-sm ${colSpan === opt.span ? 'bg-primary/60' : 'bg-muted-foreground/30 group-hover:bg-primary/30'}`}\n style={{ width: `${(opt.span / 12) * 100}%` }}\n />\n {opt.span < 12 && (\n <div\n className=\"rounded-sm bg-muted/60\"\n style={{ width: `${((12 - opt.span) / 12) * 100}%` }}\n />\n )}\n </div>\n <span className={`text-[10px] font-medium ${colSpan === opt.span ? 'text-primary' : 'text-muted-foreground'}`}>\n {opt.label}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Required */}\n {field.type !== 'title' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={required}\n onChange={(e) => setRequired(e.target.checked)}\n className=\"rounded border-input accent-primary\"\n />\n <span className=\"text-sm\">{t('customForms.builder.fieldRequired')}</span>\n </label>\n )}\n\n {/* Auto-fill from person record */}\n {canMap && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.mapToPerson')}</label>\n <Select\n value={map || MAP_NONE}\n onValueChange={(v) => setMap(v === MAP_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={MAP_NONE}>{t('customForms.builder.mapNone')}</SelectItem>\n {PERSON_FIELD_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {t(opt.labelKey)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[10px] text-muted-foreground\">{t('customForms.builder.mapHint')}</p>\n </div>\n )}\n\n {/* Options */}\n {hasOptions && (\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldOptions')}</label>\n {options.map((opt, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <Input\n value={opt.label}\n onChange={(e) => updateOption(i, e.target.value)}\n placeholder={`Option ${i + 1}`}\n className=\"h-8 text-sm flex-1\"\n />\n <button onClick={() => removeOption(i)} className=\"p-1 hover:bg-destructive/10 rounded\">\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addOption} className=\"h-8 text-xs w-full\">\n <Plus className=\"h-3 w-3 mr-1\" />\n {t('customForms.builder.addOption')}\n </Button>\n </div>\n )}\n </SheetBody>\n\n <SheetFooter className=\"pt-4 border-t\">\n <Button size=\"sm\" onClick={handleSave} className=\"w-full\">\n OK\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport { arrayMove } from '@dnd-kit/sortable'\nimport { snapCenterToCursor } from '@dnd-kit/modifiers'\nimport { ArrowLeft, Eye, Pencil, Printer } from 'lucide-react'\nimport { Button, useSaveBar, toast } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit, useAgentSurface, type AgentSurfaceContribution } from '@fayz-ai/admin'\nimport type { CustomFormsStore } from '../store'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormFieldDef, FormSchema, TemplateCategory } from '../types'\nimport { FieldPalette, FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\nimport { BuilderCanvas } from './BuilderCanvas'\nimport { FieldConfigDrawer } from './FieldConfigDialog'\nimport { createPortal } from 'react-dom'\nimport { FormRenderer } from './FormRenderer'\nimport { buildPrintHtml } from '../lib/print'\nimport { FORM_BUILDER_INSTRUCTIONS } from '../lib/agent-tools'\n\nconst TEMPLATE_CATEGORIES: TemplateCategory[] = ['anamnesis', 'evolution', 'report', 'contract', 'general']\n\ninterface FormBuilderProps {\n templateId?: string\n store: CustomFormsStore\n provider: CustomFormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}\n\nexport function FormBuilder({ templateId, store, provider, config, onBack }: FormBuilderProps) {\n const t = useTranslation()\n const guardTemplates = useLimitGuard('form_templates')\n\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [category, setCategory] = useState<TemplateCategory>('general')\n const [fields, setFields] = useState<FormFieldDef[]>([])\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [previewMode, setPreviewMode] = useState<'editor' | 'print'>('editor')\n const [previewData, setPreviewData] = useState<Record<string, unknown>>({})\n const [draggingFieldType, setDraggingFieldType] = useState<import('../types').FormFieldType | null>(null)\n const [templateName, setTemplateName] = useState<string | null>(null)\n\n // Load existing template\n useEffect(() => {\n if (!templateId) return\n let cancelled = false\n provider.getTemplateById(templateId).then((tpl) => {\n if (cancelled || !tpl) return\n setName(tpl.name)\n setTemplateName(tpl.name)\n setDescription(tpl.description ?? '')\n setCategory(tpl.category)\n setFields(tpl.schema.fields)\n })\n return () => { cancelled = true }\n }, [templateId, provider])\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n )\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const data = event.active.data.current\n if (data?.source === 'palette') {\n setDraggingFieldType(data.fieldType)\n }\n }, [])\n\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n setDraggingFieldType(null)\n const { active, over } = event\n\n // Dropped from palette onto canvas\n if (active.data.current?.source === 'palette' && over) {\n const fieldType = active.data.current.fieldType\n const typeDef = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!typeDef) return\n\n const newField: FormFieldDef = {\n id: crypto.randomUUID(),\n type: fieldType,\n label: t(`customForms.fieldType.${fieldType}`),\n col: 0,\n row: fields.length,\n colSpan: DEFAULT_COL_SPAN[fieldType] ?? 12,\n }\n\n if (['select', 'radio', 'tags'].includes(fieldType)) {\n newField.options = [\n { label: 'Option 1', value: 'option_1' },\n { label: 'Option 2', value: 'option_2' },\n ]\n }\n\n setFields((prev) => [...prev, newField])\n return\n }\n\n // Reorder within canvas\n if (active.id !== over?.id && over) {\n setFields((prev) => {\n const oldIndex = prev.findIndex((f) => f.id === active.id)\n const newIndex = prev.findIndex((f) => f.id === over.id)\n if (oldIndex === -1 || newIndex === -1) return prev\n const reordered = arrayMove(prev, oldIndex, newIndex)\n return reordered.map((f, i) => ({ ...f, row: i }))\n })\n }\n }, [fields, t])\n\n const handleSelectField = useCallback((field: FormFieldDef) => {\n setSelectedFieldId(field.id)\n }, [])\n\n const handleRemoveField = useCallback((fieldId: string) => {\n setFields((prev) => prev.filter((f) => f.id !== fieldId).map((f, i) => ({ ...f, row: i })))\n if (selectedFieldId === fieldId) setSelectedFieldId(null)\n }, [selectedFieldId])\n\n const handleFieldUpdate = useCallback((updated: FormFieldDef) => {\n setFields((prev) => prev.map((f) => (f.id === updated.id ? updated : f)))\n }, [])\n\n // --- Assistant surface: publish WHAT THE USER IS EDITING as context --------\n // The build action is the server-plane createOrUpdateForm tool (a pool RPC),\n // which works from any page. This surface only tells the model which template\n // is open and its current fields+ids, so \"add an allergies field to THIS\n // form\" resolves to the right templateId. No client-side mutation here.\n const surfaceStateRef = React.useRef({ templateId, name, description, category, fields })\n surfaceStateRef.current = { templateId, name, description, category, fields }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(\n () => ({\n id: 'custom_forms.builder',\n pluginId: 'custom_forms',\n instructions: FORM_BUILDER_INSTRUCTIONS,\n describe: () => {\n const o = surfaceStateRef.current\n return {\n title: `Construtor de formulário — ${o.name?.trim() || 'novo modelo'}`,\n state: {\n // Pass this as `templateId` to createOrUpdateForm when editing THIS\n // form. Null = an unsaved new form (create, then it gets an id).\n templateId: o.templateId ?? null,\n unsaved: !o.templateId,\n name: o.name ?? '',\n category: o.category ?? 'general',\n description: o.description ?? '',\n fieldCount: o.fields.length,\n fields: o.fields.map((f) => ({\n id: f.id,\n type: f.type,\n label: f.label,\n required: !!f.required,\n ...(f.options?.length ? { options: f.options.map((x) => x.label) } : {}),\n })),\n },\n }\n },\n }),\n [],\n )\n useAgentSurface(agentSurface)\n // ---------------------------------------------------------------------------\n\n const handleFieldConfigSave = useCallback((updated: FormFieldDef) => {\n handleFieldUpdate(updated)\n setSelectedFieldId(null)\n }, [handleFieldUpdate])\n\n const handleSave = useCallback(async () => {\n if (!name.trim()) { toast.error(t('common.formIncomplete')); return }\n // Plan quantity guard (client-side, before the provider call) — only on\n // create. Opens the global UpgradeModal and aborts when the cap is reached.\n if (!templateId && (await guardTemplates()) === 'blocked') return\n setSaving(true)\n try {\n const schema: FormSchema = { fields, layout: { columns: 12 } }\n\n if (templateId) {\n await store.getState().updateTemplate(templateId, { name, description, category, schema })\n } else {\n await store.getState().createTemplate({ name, description, category, schema })\n invalidateLimit('form_templates')\n }\n onBack()\n } finally {\n setSaving(false)\n }\n }, [templateId, name, description, category, fields, store, onBack, guardTemplates])\n\n // Dirty detection — snapshot editable fields once async load settles\n const currentFields = { name, description, category, fields }\n const snapshot = React.useRef<string | null>(null)\n const loaded = !templateId || templateName !== null\n useEffect(() => {\n if (loaded && snapshot.current === null) snapshot.current = JSON.stringify(currentFields)\n }, [loaded])\n const dirty = snapshot.current !== null && JSON.stringify(currentFields) !== snapshot.current\n\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onBack(),\n saveLabel: t('customForms.builder.save'),\n })\n\n const selectedField = selectedFieldId\n ? fields.find((f) => f.id === selectedFieldId) ?? null\n : null\n\n const isNew = !templateId\n const breadcrumbLabel = isNew\n ? t('customForms.newTemplate')\n : templateName ?? t('customForms.editTemplate')\n\n return (\n <div className=\"space-y-4\">\n {/* Breadcrumb */}\n <div className=\"flex items-center gap-1.5 text-sm\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('customForms.templates')}\n </button>\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"font-medium\">{breadcrumbLabel}</span>\n </div>\n\n {/* Form meta — card layout matching CRUD form */}\n <Card>\n <CardContent className=\"p-5 space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">\n {t('customForms.templateName')} <span className=\"text-destructive\">*</span>\n </label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('customForms.templateName')}\n className=\"h-9 text-sm\"\n autoFocus={isNew}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateCategory')}</label>\n <Select value={category} onValueChange={(v) => setCategory(v as TemplateCategory)}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TEMPLATE_CATEGORIES.map((cat) => (\n <SelectItem key={cat} value={cat}>\n {t(`customForms.category.${cat}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateDescription')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('customForms.templateDescription')}\n className=\"h-9 text-sm\"\n />\n </div>\n </CardContent>\n </Card>\n\n {/* Builder section header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{t('customForms.builder.fields')}</h3>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {t('customForms.builder.fieldCount', { count: String(fields.length) })}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n disabled={fields.length === 0}\n onClick={() => { setPreviewData({}); setPreviewMode('editor'); setShowPreview(true) }}\n >\n <Eye className=\"h-3.5 w-3.5 mr-1.5\" />\n Preview\n </Button>\n </div>\n </div>\n\n {/* Builder body — drag palette + canvas */}\n <DndContext sensors={sensors} collisionDetection={pointerWithin} onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div className=\"flex gap-4\">\n <FieldPalette />\n <BuilderCanvas\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={handleSelectField}\n onRemoveField={handleRemoveField}\n draggingFieldType={draggingFieldType}\n />\n </div>\n\n <DragOverlay dropAnimation={null} modifiers={[snapCenterToCursor]}>\n {draggingFieldType ? (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg border bg-card shadow-xl text-sm font-medium opacity-90 pointer-events-none\">\n {(() => {\n const def = FIELD_TYPES.find((ft) => ft.type === draggingFieldType)\n if (!def) return null\n const Icon = def.icon\n return (\n <>\n <Icon className=\"h-4 w-4 text-primary\" />\n {t(`customForms.fieldType.${draggingFieldType}`)}\n </>\n )\n })()}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {/* Field config drawer (right side) */}\n <FieldConfigDrawer\n field={selectedField}\n onSave={handleFieldConfigSave}\n onUpdate={handleFieldUpdate}\n onClose={() => setSelectedFieldId(null)}\n />\n\n {/* Preview — A4 paper overlay (portaled to body) */}\n {showPreview && createPortal(\n <div className=\"fixed inset-0 z-[100] flex items-start justify-center bg-black/60 overflow-y-auto py-10 px-4\" onClick={() => setShowPreview(false)}>\n <div\n className=\"relative w-full max-w-3xl bg-white rounded-modal shadow-lg\"\n style={{ minHeight: '80vh' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Toggle Editor ⟷ Impressão (centered) + close, on a sticky top bar. */}\n <div className=\"sticky top-0 z-10 flex items-center justify-center border-b bg-white/95 backdrop-blur px-4 py-2.5 rounded-t-modal\">\n <div className=\"inline-flex rounded-lg border p-0.5 text-xs\">\n <button\n onClick={() => setPreviewMode('editor')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'editor' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.editor')}\n </button>\n <button\n onClick={() => setPreviewMode('print')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'print' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Printer className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.print')}\n </button>\n </div>\n <button\n onClick={() => setShowPreview(false)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 flex h-8 w-8 items-center justify-center rounded-full text-neutral-400 hover:bg-neutral-100 hover:text-neutral-700 transition-colors\"\n >\n <span className=\"text-lg\">✕</span>\n </button>\n </div>\n\n {previewMode === 'editor' ? (\n /* Editor — fillable form (same renderer used on the person's ficha) */\n <div className=\"px-10 py-8 sm:px-14 sm:py-10 text-neutral-900\">\n <h1 className=\"text-2xl font-bold mb-1\">{name || t('customForms.newTemplate')}</h1>\n {description && <p className=\"text-sm text-neutral-500 mb-8\">{description}</p>}\n {!description && <div className=\"mb-8\" />}\n\n <FormRenderer\n schema={{ fields, layout: { columns: 12 } }}\n data={previewData}\n onChange={setPreviewData}\n />\n </div>\n ) : (\n /* Impressão — exact print/PDF output rendered in an isolated iframe */\n <iframe\n title=\"print-preview\"\n className=\"w-full rounded-b-modal\"\n style={{ height: '75vh', border: 'none' }}\n srcDoc={buildPrintHtml(\n { id: 'preview', name: name || t('customForms.newTemplate'), schema: { fields, layout: { columns: 12 } } } as any,\n { title: name || t('customForms.newTemplate'), createdAt: new Date().toISOString(), status: 'draft', data: previewData } as any,\n )}\n />\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/FieldPalette.tsx","../src/components/BuilderField.tsx","../src/components/BuilderCanvas.tsx","../src/components/FieldConfigDialog.tsx","../src/components/FormBuilder.tsx"],"names":["useTranslation","jsxs","jsx","useState","useEffect","React","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button"],"mappings":"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","file":"FormBuilder-YHJHF6HZ.js","sourcesContent":["import React from 'react'\nimport { useDraggable } from '@dnd-kit/core'\nimport {\n Heading, Type, AlignLeft, FileEdit, CalendarDays,\n ChevronDown, CircleDot, Tags, CheckSquare,\n Image, GalleryHorizontalEnd, Receipt,\n} from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldType } from '../types'\n\nexport interface FieldTypeItem {\n type: FormFieldType\n icon: React.ElementType\n}\n\nexport const DEFAULT_COL_SPAN: Record<string, number> = {\n title: 12,\n memo: 12,\n richtext: 12,\n gallery: 12,\n budget: 12,\n image: 6,\n text: 6,\n date: 4,\n select: 6,\n radio: 6,\n tags: 8,\n checkbox: 4,\n}\n\nexport const FIELD_TYPES: FieldTypeItem[] = [\n { type: 'title', icon: Heading },\n { type: 'text', icon: Type },\n { type: 'memo', icon: AlignLeft },\n { type: 'richtext', icon: FileEdit },\n { type: 'date', icon: CalendarDays },\n { type: 'select', icon: ChevronDown },\n { type: 'radio', icon: CircleDot },\n { type: 'tags', icon: Tags },\n { type: 'checkbox', icon: CheckSquare },\n { type: 'image', icon: Image },\n { type: 'gallery', icon: GalleryHorizontalEnd },\n { type: 'budget', icon: Receipt },\n]\n\nfunction DraggableFieldType({ item }: { item: FieldTypeItem }) {\n const t = useTranslation()\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: `palette-${item.type}`,\n data: { source: 'palette', fieldType: item.type },\n })\n\n const Icon = item.icon\n\n return (\n <button\n ref={setNodeRef}\n {...listeners}\n {...attributes}\n className={`flex items-center gap-2 w-full px-3 py-2 rounded-lg border bg-card text-sm font-medium transition-all hover:shadow-sm hover:border-primary/30 cursor-grab active:cursor-grabbing ${isDragging ? 'opacity-30' : ''}`}\n >\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"truncate\">{t(`customForms.fieldType.${item.type}`)}</span>\n </button>\n )\n}\n\nexport function FieldPalette() {\n const t = useTranslation()\n\n return (\n <div className=\"w-44 shrink-0 space-y-1.5\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground px-1 mb-2\">\n {t('customForms.builder.fields')}\n </p>\n {FIELD_TYPES.map((item) => (\n <DraggableFieldType key={item.type} item={item} />\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, X } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\n\ninterface BuilderFieldProps {\n field: FormFieldDef\n onSelect: (field: FormFieldDef) => void\n onRemove: (fieldId: string) => void\n isSelected: boolean\n}\n\nexport function BuilderField({ field, onSelect, onRemove, isSelected }: BuilderFieldProps) {\n const t = useTranslation()\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: field.id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n gridColumn: `span ${field.colSpan}`,\n opacity: isDragging ? 0.5 : 1,\n }\n\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`group relative flex items-start gap-2 rounded-lg border-2 bg-card p-3 transition-colors cursor-pointer ${\n isSelected\n ? 'border-primary ring-1 ring-primary/20'\n : 'border-border hover:border-primary/30'\n }`}\n onClick={() => onSelect(field)}\n >\n {/* Drag handle */}\n <button\n {...attributes}\n {...listeners}\n className=\"mt-0.5 cursor-grab active:cursor-grabbing text-muted-foreground/50 hover:text-muted-foreground\"\n onClick={(e) => e.stopPropagation()}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />}\n <span className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground\">\n {t(`customForms.fieldType.${field.type}`)}\n </span>\n </div>\n <p className=\"text-sm font-medium mt-0.5 truncate\">{field.label}</p>\n {field.required && (\n <span className=\"text-[10px] text-destructive\">*</span>\n )}\n </div>\n\n {/* Remove button */}\n <button\n onClick={(e) => { e.stopPropagation(); onRemove(field.id) }}\n className=\"absolute top-1.5 right-1.5 p-1 rounded-md opacity-0 group-hover:opacity-100 hover:bg-destructive/10 transition-opacity\"\n >\n <X className=\"h-3 w-3 text-destructive\" />\n </button>\n </div>\n )\n}\n","import React from 'react'\nimport { useDroppable } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef, FormFieldType } from '../types'\nimport { BuilderField } from './BuilderField'\nimport { FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\n\ninterface BuilderCanvasProps {\n fields: FormFieldDef[]\n selectedFieldId: string | null\n onSelectField: (field: FormFieldDef) => void\n onRemoveField: (fieldId: string) => void\n draggingFieldType: FormFieldType | null\n}\n\nfunction DropPreview({ fieldType }: { fieldType: FormFieldType }) {\n const t = useTranslation()\n const def = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!def) return null\n const Icon = def.icon\n\n return (\n <div\n className=\"flex items-center gap-2 rounded-lg border-2 border-dashed border-primary/40 bg-primary/5 p-3\"\n style={{ gridColumn: `span ${DEFAULT_COL_SPAN[fieldType] ?? 12}` }}\n >\n <Icon className=\"h-4 w-4 text-primary/50\" />\n <span className=\"text-sm text-primary/50 font-medium\">\n {t(`customForms.fieldType.${fieldType}`)}\n </span>\n </div>\n )\n}\n\nexport function BuilderCanvas({\n fields,\n selectedFieldId,\n onSelectField,\n onRemoveField,\n draggingFieldType,\n}: BuilderCanvasProps) {\n const t = useTranslation()\n const { setNodeRef, isOver } = useDroppable({ id: 'builder-canvas' })\n\n const sortedFields = [...fields].sort((a, b) => a.row - b.row || a.col - b.col)\n const showPreview = isOver && draggingFieldType !== null\n\n return (\n <div\n ref={setNodeRef}\n className={`flex-1 min-h-[400px] rounded-xl border-2 border-dashed p-4 transition-colors ${\n isOver ? 'border-primary/50 bg-primary/5' : 'border-border bg-muted/20'\n }`}\n style={{\n backgroundImage:\n 'repeating-linear-gradient(90deg, transparent, transparent calc(8.333% - 1px), hsl(var(--border) / 0.3) calc(8.333% - 1px), hsl(var(--border) / 0.3) 8.333%)',\n backgroundSize: '100% 100%',\n }}\n >\n {fields.length === 0 && !showPreview && (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n {t('customForms.builder.emptyCanvas')}\n </div>\n )}\n\n <SortableContext items={sortedFields.map((f) => f.id)} strategy={verticalListSortingStrategy}>\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: 'repeat(12, 1fr)' }}\n >\n {sortedFields.map((field) => (\n <BuilderField\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={onSelectField}\n onRemove={onRemoveField}\n />\n ))}\n\n {showPreview && <DropPreview fieldType={draggingFieldType!} />}\n </div>\n </SortableContext>\n </div>\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { Plus, Trash2 } from 'lucide-react'\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetBody,\n SheetFooter,\n} from '@fayz-ai/ui'\nimport { Button } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { FormFieldDef } from '../types'\nimport { FIELD_TYPES } from './FieldPalette'\nimport { PERSON_FIELD_OPTIONS } from '../lib/person-fields'\n\n/** Field types that can be auto-filled from a person record. */\nconst MAPPABLE_TYPES = ['text', 'memo', 'richtext', 'date']\nconst MAP_NONE = '__none__'\n\nconst SIZE_OPTIONS = [\n { span: 3, label: '1/4' },\n { span: 4, label: '1/3' },\n { span: 6, label: '1/2' },\n { span: 8, label: '2/3' },\n { span: 9, label: '3/4' },\n { span: 12, label: 'Full' },\n]\n\ninterface FieldConfigDrawerProps {\n field: FormFieldDef | null\n onSave: (updated: FormFieldDef) => void\n /** Live update without closing — used for visual changes like colSpan */\n onUpdate?: (updated: FormFieldDef) => void\n onClose: () => void\n}\n\nexport function FieldConfigDrawer({ field, onSave, onUpdate, onClose }: FieldConfigDrawerProps) {\n const t = useTranslation()\n const [label, setLabel] = useState('')\n const [placeholder, setPlaceholder] = useState('')\n const [required, setRequired] = useState(false)\n const [colSpan, setColSpan] = useState(12)\n const [options, setOptions] = useState<Array<{ label: string; value: string }>>([])\n const [map, setMap] = useState<string>('')\n\n // Sync state when field changes\n useEffect(() => {\n if (!field) return\n setLabel(field.label)\n setPlaceholder(field.placeholder ?? '')\n setRequired(field.required ?? false)\n setColSpan(field.colSpan)\n setOptions(field.options ?? [])\n setMap(field.map ?? '')\n }, [field?.id])\n\n if (!field) return null\n\n const hasOptions = ['select', 'radio', 'tags'].includes(field.type)\n const canMap = MAPPABLE_TYPES.includes(field.type)\n const fieldTypeDef = FIELD_TYPES.find((ft) => ft.type === field.type)\n const Icon = fieldTypeDef?.icon\n\n const handleSave = () => {\n onSave({\n ...field,\n label,\n placeholder: placeholder || undefined,\n required,\n colSpan: Math.max(1, Math.min(12, colSpan)),\n options: hasOptions ? options.filter((o) => o.label.trim()) : field.options,\n map: canMap && map ? map : undefined,\n })\n }\n\n const addOption = () => {\n setOptions([...options, { label: '', value: '' }])\n }\n\n const updateOption = (index: number, newLabel: string) => {\n const updated = [...options]\n updated[index] = { label: newLabel, value: newLabel.toLowerCase().replace(/\\s+/g, '_') }\n setOptions(updated)\n }\n\n const removeOption = (index: number) => {\n setOptions(options.filter((_, i) => i !== index))\n }\n\n return (\n <Sheet open={!!field} onOpenChange={(open) => { if (!open) onClose() }}>\n <SheetContent className=\"w-80 sm:w-96\" overlay=\"none\">\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2 text-sm\">\n {Icon && <Icon className=\"h-4 w-4 text-muted-foreground\" />}\n {t(`customForms.fieldType.${field.type}`)}\n </SheetTitle>\n </SheetHeader>\n\n <SheetBody className=\"space-y-4 py-4\">\n {/* Label */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldLabel')}</label>\n <Input\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n className=\"h-9 text-sm\"\n autoFocus\n />\n </div>\n\n {/* Placeholder */}\n {!['title', 'checkbox', 'image', 'gallery'].includes(field.type) && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldPlaceholder')}</label>\n <Input\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n className=\"h-9 text-sm\"\n />\n </div>\n )}\n\n {/* Column span — visual skeleton selector */}\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.colSpan')}</label>\n <div className=\"grid grid-cols-3 gap-2\">\n {SIZE_OPTIONS.map((opt) => (\n <button\n key={opt.span}\n onClick={() => {\n setColSpan(opt.span)\n if (onUpdate && field) {\n onUpdate({ ...field, colSpan: opt.span })\n }\n }}\n className={`group relative rounded-lg border-2 p-2 transition-all ${\n colSpan === opt.span\n ? 'border-primary bg-primary/5'\n : 'border-border hover:border-primary/30'\n }`}\n >\n {/* Mini 12-col skeleton preview */}\n <div className=\"flex gap-px h-3 mb-1.5\">\n <div\n className={`rounded-sm ${colSpan === opt.span ? 'bg-primary/60' : 'bg-muted-foreground/30 group-hover:bg-primary/30'}`}\n style={{ width: `${(opt.span / 12) * 100}%` }}\n />\n {opt.span < 12 && (\n <div\n className=\"rounded-sm bg-muted/60\"\n style={{ width: `${((12 - opt.span) / 12) * 100}%` }}\n />\n )}\n </div>\n <span className={`text-[10px] font-medium ${colSpan === opt.span ? 'text-primary' : 'text-muted-foreground'}`}>\n {opt.label}\n </span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Required */}\n {field.type !== 'title' && (\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={required}\n onChange={(e) => setRequired(e.target.checked)}\n className=\"rounded border-input accent-primary\"\n />\n <span className=\"text-sm\">{t('customForms.builder.fieldRequired')}</span>\n </label>\n )}\n\n {/* Auto-fill from person record */}\n {canMap && (\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.mapToPerson')}</label>\n <Select\n value={map || MAP_NONE}\n onValueChange={(v) => setMap(v === MAP_NONE ? '' : v)}\n >\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={MAP_NONE}>{t('customForms.builder.mapNone')}</SelectItem>\n {PERSON_FIELD_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {t(opt.labelKey)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[10px] text-muted-foreground\">{t('customForms.builder.mapHint')}</p>\n </div>\n )}\n\n {/* Options */}\n {hasOptions && (\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">{t('customForms.builder.fieldOptions')}</label>\n {options.map((opt, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n <Input\n value={opt.label}\n onChange={(e) => updateOption(i, e.target.value)}\n placeholder={`Option ${i + 1}`}\n className=\"h-8 text-sm flex-1\"\n />\n <button onClick={() => removeOption(i)} className=\"p-1 hover:bg-destructive/10 rounded\">\n <Trash2 className=\"h-3.5 w-3.5 text-destructive\" />\n </button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addOption} className=\"h-8 text-xs w-full\">\n <Plus className=\"h-3 w-3 mr-1\" />\n {t('customForms.builder.addOption')}\n </Button>\n </div>\n )}\n </SheetBody>\n\n <SheetFooter className=\"pt-4 border-t\">\n <Button size=\"sm\" onClick={handleSave} className=\"w-full\">\n OK\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport {\n DndContext,\n DragEndEvent,\n DragOverlay,\n DragStartEvent,\n PointerSensor,\n pointerWithin,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport { arrayMove } from '@dnd-kit/sortable'\nimport { snapCenterToCursor } from '@dnd-kit/modifiers'\nimport { ArrowLeft, Eye, Pencil, Printer } from 'lucide-react'\nimport { Button, useSaveBar, toast } from '@fayz-ai/ui'\nimport { Input } from '@fayz-ai/ui'\nimport { Card, CardContent } from '@fayz-ai/ui'\nimport { Badge } from '@fayz-ai/ui'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@fayz-ai/ui'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useLimitGuard, invalidateLimit, useAgentSurface, type AgentSurfaceContribution } from '@fayz-ai/admin'\nimport type { CustomFormsStore } from '../store'\nimport type { CustomFormsDataProvider } from '../data/types'\nimport type { CustomFormsConfig } from '../config'\nimport type { FormFieldDef, FormSchema, TemplateCategory } from '../types'\nimport { FieldPalette, FIELD_TYPES, DEFAULT_COL_SPAN } from './FieldPalette'\nimport { BuilderCanvas } from './BuilderCanvas'\nimport { FieldConfigDrawer } from './FieldConfigDialog'\nimport { createPortal } from 'react-dom'\nimport { FormRenderer } from './FormRenderer'\nimport { buildPrintHtml } from '../lib/print'\nimport { FORM_BUILDER_INSTRUCTIONS } from '../lib/agent-tools'\n\nconst TEMPLATE_CATEGORIES: TemplateCategory[] = ['anamnesis', 'evolution', 'report', 'contract', 'general']\n\ninterface FormBuilderProps {\n templateId?: string\n store: CustomFormsStore\n provider: CustomFormsDataProvider\n config: CustomFormsConfig\n onBack: () => void\n}\n\nexport function FormBuilder({ templateId, store, provider, config, onBack }: FormBuilderProps) {\n const t = useTranslation()\n const guardTemplates = useLimitGuard('form_templates')\n\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [category, setCategory] = useState<TemplateCategory>('general')\n const [fields, setFields] = useState<FormFieldDef[]>([])\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [previewMode, setPreviewMode] = useState<'editor' | 'print'>('editor')\n const [previewData, setPreviewData] = useState<Record<string, unknown>>({})\n const [draggingFieldType, setDraggingFieldType] = useState<import('../types').FormFieldType | null>(null)\n const [templateName, setTemplateName] = useState<string | null>(null)\n\n // Load existing template\n useEffect(() => {\n if (!templateId) return\n let cancelled = false\n provider.getTemplateById(templateId).then((tpl) => {\n if (cancelled || !tpl) return\n setName(tpl.name)\n setTemplateName(tpl.name)\n setDescription(tpl.description ?? '')\n setCategory(tpl.category)\n setFields(tpl.schema.fields)\n })\n return () => { cancelled = true }\n }, [templateId, provider])\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n )\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const data = event.active.data.current\n if (data?.source === 'palette') {\n setDraggingFieldType(data.fieldType)\n }\n }, [])\n\n const handleDragEnd = useCallback((event: DragEndEvent) => {\n setDraggingFieldType(null)\n const { active, over } = event\n\n // Dropped from palette onto canvas\n if (active.data.current?.source === 'palette' && over) {\n const fieldType = active.data.current.fieldType\n const typeDef = FIELD_TYPES.find((ft) => ft.type === fieldType)\n if (!typeDef) return\n\n const newField: FormFieldDef = {\n id: crypto.randomUUID(),\n type: fieldType,\n label: t(`customForms.fieldType.${fieldType}`),\n col: 0,\n row: fields.length,\n colSpan: DEFAULT_COL_SPAN[fieldType] ?? 12,\n }\n\n if (['select', 'radio', 'tags'].includes(fieldType)) {\n newField.options = [\n { label: 'Option 1', value: 'option_1' },\n { label: 'Option 2', value: 'option_2' },\n ]\n }\n\n setFields((prev) => [...prev, newField])\n return\n }\n\n // Reorder within canvas\n if (active.id !== over?.id && over) {\n setFields((prev) => {\n const oldIndex = prev.findIndex((f) => f.id === active.id)\n const newIndex = prev.findIndex((f) => f.id === over.id)\n if (oldIndex === -1 || newIndex === -1) return prev\n const reordered = arrayMove(prev, oldIndex, newIndex)\n return reordered.map((f, i) => ({ ...f, row: i }))\n })\n }\n }, [fields, t])\n\n const handleSelectField = useCallback((field: FormFieldDef) => {\n setSelectedFieldId(field.id)\n }, [])\n\n const handleRemoveField = useCallback((fieldId: string) => {\n setFields((prev) => prev.filter((f) => f.id !== fieldId).map((f, i) => ({ ...f, row: i })))\n if (selectedFieldId === fieldId) setSelectedFieldId(null)\n }, [selectedFieldId])\n\n const handleFieldUpdate = useCallback((updated: FormFieldDef) => {\n setFields((prev) => prev.map((f) => (f.id === updated.id ? updated : f)))\n }, [])\n\n // --- Assistant surface: publish WHAT THE USER IS EDITING as context --------\n // The build action is the server-plane createOrUpdateForm tool (a pool RPC),\n // which works from any page. This surface only tells the model which template\n // is open and its current fields+ids, so \"add an allergies field to THIS\n // form\" resolves to the right templateId. No client-side mutation here.\n const surfaceStateRef = React.useRef({ templateId, name, description, category, fields })\n surfaceStateRef.current = { templateId, name, description, category, fields }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(\n () => ({\n id: 'custom_forms.builder',\n pluginId: 'custom_forms',\n instructions: FORM_BUILDER_INSTRUCTIONS,\n describe: () => {\n const o = surfaceStateRef.current\n return {\n title: `Construtor de formulário — ${o.name?.trim() || 'novo modelo'}`,\n state: {\n // Pass this as `templateId` to createOrUpdateForm when editing THIS\n // form. Null = an unsaved new form (create, then it gets an id).\n templateId: o.templateId ?? null,\n unsaved: !o.templateId,\n name: o.name ?? '',\n category: o.category ?? 'general',\n description: o.description ?? '',\n fieldCount: o.fields.length,\n fields: o.fields.map((f) => ({\n id: f.id,\n type: f.type,\n label: f.label,\n required: !!f.required,\n ...(f.options?.length ? { options: f.options.map((x) => x.label) } : {}),\n })),\n },\n }\n },\n }),\n [],\n )\n useAgentSurface(agentSurface)\n // ---------------------------------------------------------------------------\n\n const handleFieldConfigSave = useCallback((updated: FormFieldDef) => {\n handleFieldUpdate(updated)\n setSelectedFieldId(null)\n }, [handleFieldUpdate])\n\n const handleSave = useCallback(async () => {\n if (!name.trim()) { toast.error(t('common.formIncomplete')); return }\n // Plan quantity guard (client-side, before the provider call) — only on\n // create. Opens the global UpgradeModal and aborts when the cap is reached.\n if (!templateId && (await guardTemplates()) === 'blocked') return\n setSaving(true)\n try {\n const schema: FormSchema = { fields, layout: { columns: 12 } }\n\n if (templateId) {\n await store.getState().updateTemplate(templateId, { name, description, category, schema })\n } else {\n await store.getState().createTemplate({ name, description, category, schema })\n invalidateLimit('form_templates')\n }\n onBack()\n } finally {\n setSaving(false)\n }\n }, [templateId, name, description, category, fields, store, onBack, guardTemplates])\n\n // Dirty detection — snapshot editable fields once async load settles\n const currentFields = { name, description, category, fields }\n const snapshot = React.useRef<string | null>(null)\n const loaded = !templateId || templateName !== null\n useEffect(() => {\n if (loaded && snapshot.current === null) snapshot.current = JSON.stringify(currentFields)\n }, [loaded])\n const dirty = snapshot.current !== null && JSON.stringify(currentFields) !== snapshot.current\n\n useSaveBar({\n dirty,\n saving,\n onSave: () => { void handleSave() },\n onDiscard: () => onBack(),\n saveLabel: t('customForms.builder.save'),\n })\n\n const selectedField = selectedFieldId\n ? fields.find((f) => f.id === selectedFieldId) ?? null\n : null\n\n const isNew = !templateId\n const breadcrumbLabel = isNew\n ? t('customForms.newTemplate')\n : templateName ?? t('customForms.editTemplate')\n\n return (\n <div className=\"space-y-4\">\n {/* Breadcrumb */}\n <div className=\"flex items-center gap-1.5 text-sm\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('customForms.templates')}\n </button>\n <span className=\"text-muted-foreground\">/</span>\n <span className=\"font-medium\">{breadcrumbLabel}</span>\n </div>\n\n {/* Form meta — card layout matching CRUD form */}\n <Card>\n <CardContent className=\"p-5 space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">\n {t('customForms.templateName')} <span className=\"text-destructive\">*</span>\n </label>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={t('customForms.templateName')}\n className=\"h-9 text-sm\"\n autoFocus={isNew}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateCategory')}</label>\n <Select value={category} onValueChange={(v) => setCategory(v as TemplateCategory)}>\n <SelectTrigger className=\"h-9 text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TEMPLATE_CATEGORIES.map((cat) => (\n <SelectItem key={cat} value={cat}>\n {t(`customForms.category.${cat}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('customForms.templateDescription')}</label>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('customForms.templateDescription')}\n className=\"h-9 text-sm\"\n />\n </div>\n </CardContent>\n </Card>\n\n {/* Builder section header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{t('customForms.builder.fields')}</h3>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {t('customForms.builder.fieldCount', { count: String(fields.length) })}\n </Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9\"\n disabled={fields.length === 0}\n onClick={() => { setPreviewData({}); setPreviewMode('editor'); setShowPreview(true) }}\n >\n <Eye className=\"h-3.5 w-3.5 mr-1.5\" />\n Preview\n </Button>\n </div>\n </div>\n\n {/* Builder body — drag palette + canvas */}\n <DndContext sensors={sensors} collisionDetection={pointerWithin} onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div className=\"flex gap-4\">\n <FieldPalette />\n <BuilderCanvas\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={handleSelectField}\n onRemoveField={handleRemoveField}\n draggingFieldType={draggingFieldType}\n />\n </div>\n\n <DragOverlay dropAnimation={null} modifiers={[snapCenterToCursor]}>\n {draggingFieldType ? (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg border bg-card shadow-xl text-sm font-medium opacity-90 pointer-events-none\">\n {(() => {\n const def = FIELD_TYPES.find((ft) => ft.type === draggingFieldType)\n if (!def) return null\n const Icon = def.icon\n return (\n <>\n <Icon className=\"h-4 w-4 text-primary\" />\n {t(`customForms.fieldType.${draggingFieldType}`)}\n </>\n )\n })()}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n\n {/* Field config drawer (right side) */}\n <FieldConfigDrawer\n field={selectedField}\n onSave={handleFieldConfigSave}\n onUpdate={handleFieldUpdate}\n onClose={() => setSelectedFieldId(null)}\n />\n\n {/* Preview — A4 paper overlay (portaled to body) */}\n {showPreview && createPortal(\n <div className=\"fixed inset-0 z-[100] flex items-start justify-center bg-black/60 overflow-y-auto py-10 px-4\" onClick={() => setShowPreview(false)}>\n <div\n className=\"relative w-full max-w-3xl bg-white rounded-modal shadow-lg\"\n style={{ minHeight: '80vh' }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Toggle Editor ⟷ Impressão (centered) + close, on a sticky top bar. */}\n <div className=\"sticky top-0 z-10 flex items-center justify-center border-b bg-white/95 backdrop-blur px-4 py-2.5 rounded-t-modal\">\n <div className=\"inline-flex rounded-lg border p-0.5 text-xs\">\n <button\n onClick={() => setPreviewMode('editor')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'editor' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.editor')}\n </button>\n <button\n onClick={() => setPreviewMode('print')}\n className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-md font-medium transition-colors ${previewMode === 'print' ? 'bg-neutral-900 text-white' : 'text-neutral-500 hover:text-neutral-800'}`}\n >\n <Printer className=\"h-3.5 w-3.5\" />\n {t('customForms.preview.print')}\n </button>\n </div>\n <button\n onClick={() => setShowPreview(false)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 flex h-8 w-8 items-center justify-center rounded-full text-neutral-400 hover:bg-neutral-100 hover:text-neutral-700 transition-colors\"\n >\n <span className=\"text-lg\">✕</span>\n </button>\n </div>\n\n {previewMode === 'editor' ? (\n /* Editor — fillable form (same renderer used on the person's ficha) */\n <div className=\"px-10 py-8 sm:px-14 sm:py-10 text-neutral-900\">\n <h1 className=\"text-2xl font-bold mb-1\">{name || t('customForms.newTemplate')}</h1>\n {description && <p className=\"text-sm text-neutral-500 mb-8\">{description}</p>}\n {!description && <div className=\"mb-8\" />}\n\n <FormRenderer\n schema={{ fields, layout: { columns: 12 } }}\n data={previewData}\n onChange={setPreviewData}\n />\n </div>\n ) : (\n /* Impressão — exact print/PDF output rendered in an isolated iframe */\n <iframe\n title=\"print-preview\"\n className=\"w-full rounded-b-modal\"\n style={{ height: '75vh', border: 'none' }}\n srcDoc={buildPrintHtml(\n { id: 'preview', name: name || t('customForms.newTemplate'), schema: { fields, layout: { columns: 12 } } } as any,\n { title: name || t('customForms.newTemplate'), createdAt: new Date().toISOString(), status: 'draft', data: previewData } as any,\n )}\n />\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n"]}
|
|
@@ -4,6 +4,199 @@ import { useTranslation } from '@fayz-ai/core';
|
|
|
4
4
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
// src/components/FormRenderer.tsx
|
|
7
|
+
|
|
8
|
+
// src/lib/html-text.ts
|
|
9
|
+
function looksLikeHtml(value) {
|
|
10
|
+
return /<\/?[a-z][^>]*>/i.test(value);
|
|
11
|
+
}
|
|
12
|
+
var BLOCKS = "p, div, li, tr, h1, h2, h3, h4, h5, h6, blockquote, section, article";
|
|
13
|
+
var NBSP = / /g;
|
|
14
|
+
function htmlToPlainText(value) {
|
|
15
|
+
if (!value) return "";
|
|
16
|
+
if (typeof document === "undefined") {
|
|
17
|
+
return value.replace(/<br\s*\/?>/gi, "\n").replace(/<\/(p|div|li|tr|h[1-6]|blockquote)>/gi, "\n").replace(/<[^>]*>/g, "").replace(/ /g, " ").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'").replace(/&/g, "&").replace(/\n{3,}/g, "\n\n").trim();
|
|
18
|
+
}
|
|
19
|
+
const el = document.createElement("div");
|
|
20
|
+
el.innerHTML = value;
|
|
21
|
+
for (const br of Array.from(el.querySelectorAll("br"))) {
|
|
22
|
+
br.replaceWith("\n");
|
|
23
|
+
}
|
|
24
|
+
for (const block of Array.from(el.querySelectorAll(BLOCKS))) {
|
|
25
|
+
block.append("\n");
|
|
26
|
+
}
|
|
27
|
+
return (el.textContent ?? "").replace(NBSP, " ").replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
28
|
+
}
|
|
29
|
+
var DROP_WITH_CONTENT = /* @__PURE__ */ new Set([
|
|
30
|
+
"script",
|
|
31
|
+
"style",
|
|
32
|
+
"iframe",
|
|
33
|
+
"object",
|
|
34
|
+
"embed",
|
|
35
|
+
"svg",
|
|
36
|
+
"math",
|
|
37
|
+
"link",
|
|
38
|
+
"meta",
|
|
39
|
+
"form",
|
|
40
|
+
"input",
|
|
41
|
+
"button",
|
|
42
|
+
"textarea",
|
|
43
|
+
"select",
|
|
44
|
+
"template",
|
|
45
|
+
"noscript"
|
|
46
|
+
]);
|
|
47
|
+
var ALLOWED_TAGS = /* @__PURE__ */ new Set([
|
|
48
|
+
"p",
|
|
49
|
+
"br",
|
|
50
|
+
"hr",
|
|
51
|
+
"div",
|
|
52
|
+
"span",
|
|
53
|
+
"b",
|
|
54
|
+
"strong",
|
|
55
|
+
"i",
|
|
56
|
+
"em",
|
|
57
|
+
"u",
|
|
58
|
+
"s",
|
|
59
|
+
"sub",
|
|
60
|
+
"sup",
|
|
61
|
+
"mark",
|
|
62
|
+
"small",
|
|
63
|
+
"ul",
|
|
64
|
+
"ol",
|
|
65
|
+
"li",
|
|
66
|
+
"blockquote",
|
|
67
|
+
"pre",
|
|
68
|
+
"code",
|
|
69
|
+
"h1",
|
|
70
|
+
"h2",
|
|
71
|
+
"h3",
|
|
72
|
+
"h4",
|
|
73
|
+
"h5",
|
|
74
|
+
"h6",
|
|
75
|
+
"table",
|
|
76
|
+
"thead",
|
|
77
|
+
"tbody",
|
|
78
|
+
"tfoot",
|
|
79
|
+
"tr",
|
|
80
|
+
"td",
|
|
81
|
+
"th",
|
|
82
|
+
"caption",
|
|
83
|
+
"a"
|
|
84
|
+
]);
|
|
85
|
+
var ALLOWED_ATTRS = {
|
|
86
|
+
a: /* @__PURE__ */ new Set(["href", "title"]),
|
|
87
|
+
td: /* @__PURE__ */ new Set(["colspan", "rowspan"]),
|
|
88
|
+
th: /* @__PURE__ */ new Set(["colspan", "rowspan"])
|
|
89
|
+
};
|
|
90
|
+
var SAFE_HREF = /^(https?:|mailto:|tel:)/i;
|
|
91
|
+
function cleanElement(el) {
|
|
92
|
+
for (const child of Array.from(el.children)) {
|
|
93
|
+
cleanElement(child);
|
|
94
|
+
}
|
|
95
|
+
const tag = el.tagName.toLowerCase();
|
|
96
|
+
if (DROP_WITH_CONTENT.has(tag)) {
|
|
97
|
+
el.remove();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
for (const attr of Array.from(el.attributes)) {
|
|
101
|
+
const name = attr.name.toLowerCase();
|
|
102
|
+
const allowed = ALLOWED_ATTRS[tag]?.has(name) ?? false;
|
|
103
|
+
if (!allowed) {
|
|
104
|
+
el.removeAttribute(attr.name);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (name === "href" && !SAFE_HREF.test(attr.value.trim())) {
|
|
108
|
+
el.removeAttribute(attr.name);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (!ALLOWED_TAGS.has(tag)) {
|
|
112
|
+
el.replaceWith(...Array.from(el.childNodes));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (tag === "a") {
|
|
116
|
+
if (!el.getAttribute("href")) {
|
|
117
|
+
el.replaceWith(...Array.from(el.childNodes));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
el.setAttribute("target", "_blank");
|
|
121
|
+
el.setAttribute("rel", "noopener noreferrer nofollow");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function sanitizeHtml(value) {
|
|
125
|
+
if (!value) return "";
|
|
126
|
+
if (typeof DOMParser === "undefined") return "";
|
|
127
|
+
const doc = new DOMParser().parseFromString(value, "text/html");
|
|
128
|
+
for (const child of Array.from(doc.body.children)) {
|
|
129
|
+
cleanElement(child);
|
|
130
|
+
}
|
|
131
|
+
return doc.body.innerHTML;
|
|
132
|
+
}
|
|
133
|
+
function fieldRichValue(value) {
|
|
134
|
+
if (typeof value !== "string" || !value) return { text: "" };
|
|
135
|
+
if (!looksLikeHtml(value)) return { text: value };
|
|
136
|
+
const html = sanitizeHtml(value);
|
|
137
|
+
return html ? { html } : { text: htmlToPlainText(value) };
|
|
138
|
+
}
|
|
139
|
+
var RICH_TEXT_CLASS = [
|
|
140
|
+
"space-y-2",
|
|
141
|
+
"[&_p]:leading-relaxed",
|
|
142
|
+
"[&_b]:font-semibold [&_strong]:font-semibold",
|
|
143
|
+
"[&_i]:italic [&_em]:italic",
|
|
144
|
+
"[&_u]:underline",
|
|
145
|
+
"[&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5 [&_li]:leading-relaxed",
|
|
146
|
+
"[&_blockquote]:border-l-2 [&_blockquote]:border-border [&_blockquote]:pl-3 [&_blockquote]:text-muted-foreground",
|
|
147
|
+
"[&_a]:text-primary [&_a]:underline",
|
|
148
|
+
"[&_h1]:font-semibold [&_h2]:font-semibold [&_h3]:font-semibold",
|
|
149
|
+
"[&_table]:w-full [&_td]:border [&_td]:border-border [&_td]:px-2 [&_td]:py-1",
|
|
150
|
+
"[&_th]:border [&_th]:border-border [&_th]:px-2 [&_th]:py-1 [&_th]:font-medium"
|
|
151
|
+
].join(" ");
|
|
152
|
+
function ReadField({ label, children }) {
|
|
153
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
|
|
154
|
+
label && /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-muted-foreground", children: label }),
|
|
155
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm text-foreground", children })
|
|
156
|
+
] });
|
|
157
|
+
}
|
|
158
|
+
function EmptyValue() {
|
|
159
|
+
return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/50", children: "\u2014" });
|
|
160
|
+
}
|
|
161
|
+
function optionLabel(field, value) {
|
|
162
|
+
if (value == null || value === "") return null;
|
|
163
|
+
const match = (field.options ?? []).find((o) => o.value === value);
|
|
164
|
+
return match?.label ?? String(value);
|
|
165
|
+
}
|
|
166
|
+
function ReadValue({ field, value }) {
|
|
167
|
+
switch (field.type) {
|
|
168
|
+
case "memo":
|
|
169
|
+
case "richtext": {
|
|
170
|
+
const rich = fieldRichValue(value);
|
|
171
|
+
return /* @__PURE__ */ jsx(ReadField, { label: field.label, children: "html" in rich ? /* @__PURE__ */ jsx("div", { className: RICH_TEXT_CLASS, dangerouslySetInnerHTML: { __html: rich.html } }) : rich.text ? /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap", children: rich.text }) : /* @__PURE__ */ jsx(EmptyValue, {}) });
|
|
172
|
+
}
|
|
173
|
+
case "date": {
|
|
174
|
+
const raw = typeof value === "string" ? value : "";
|
|
175
|
+
const date = raw ? new Date(raw) : null;
|
|
176
|
+
const text = date && !Number.isNaN(date.getTime()) ? raw.slice(0, 10).split("-").reverse().join("/") : raw;
|
|
177
|
+
return /* @__PURE__ */ jsx(ReadField, { label: field.label, children: text || /* @__PURE__ */ jsx(EmptyValue, {}) });
|
|
178
|
+
}
|
|
179
|
+
case "select":
|
|
180
|
+
case "radio": {
|
|
181
|
+
const label = optionLabel(field, value);
|
|
182
|
+
return /* @__PURE__ */ jsx(ReadField, { label: field.label, children: label ?? /* @__PURE__ */ jsx(EmptyValue, {}) });
|
|
183
|
+
}
|
|
184
|
+
case "tags": {
|
|
185
|
+
const selected = Array.isArray(value) ? value : [];
|
|
186
|
+
return /* @__PURE__ */ jsx(ReadField, { label: field.label, children: selected.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: selected.map((v) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: optionLabel(field, v) ?? v }, v)) }) : /* @__PURE__ */ jsx(EmptyValue, {}) });
|
|
187
|
+
}
|
|
188
|
+
case "checkbox":
|
|
189
|
+
return /* @__PURE__ */ jsxs(ReadField, { children: [
|
|
190
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: field.label }),
|
|
191
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: " \xB7 " }),
|
|
192
|
+
/* @__PURE__ */ jsx("span", { children: value ? "Sim" : "N\xE3o" })
|
|
193
|
+
] });
|
|
194
|
+
default: {
|
|
195
|
+
const text = value == null || value === "" ? null : String(value);
|
|
196
|
+
return /* @__PURE__ */ jsx(ReadField, { label: field.label, children: text ?? /* @__PURE__ */ jsx(EmptyValue, {}) });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
7
200
|
function FieldRenderer({
|
|
8
201
|
field,
|
|
9
202
|
value,
|
|
@@ -11,6 +204,9 @@ function FieldRenderer({
|
|
|
11
204
|
readOnly
|
|
12
205
|
}) {
|
|
13
206
|
useTranslation();
|
|
207
|
+
if (readOnly && field.type !== "title" && field.type !== "image" && field.type !== "gallery" && field.type !== "budget") {
|
|
208
|
+
return /* @__PURE__ */ jsx(ReadValue, { field, value });
|
|
209
|
+
}
|
|
14
210
|
switch (field.type) {
|
|
15
211
|
case "title":
|
|
16
212
|
return /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold pt-2 pb-1 border-b", children: field.label });
|
|
@@ -208,7 +404,7 @@ function formatDate(value) {
|
|
|
208
404
|
if (!m) return esc(value);
|
|
209
405
|
return `${m[3]}/${m[2]}/${m[1]}`;
|
|
210
406
|
}
|
|
211
|
-
function
|
|
407
|
+
function optionLabel2(field, value) {
|
|
212
408
|
const opt = (field.options ?? []).find((o) => o.value === value);
|
|
213
409
|
return esc(opt ? opt.label : value);
|
|
214
410
|
}
|
|
@@ -216,16 +412,19 @@ function renderValue(field, value) {
|
|
|
216
412
|
const empty = '<span class="empty">\u2014</span>';
|
|
217
413
|
switch (field.type) {
|
|
218
414
|
case "memo":
|
|
219
|
-
case "richtext":
|
|
220
|
-
|
|
415
|
+
case "richtext": {
|
|
416
|
+
const rich = fieldRichValue(value);
|
|
417
|
+
if ("html" in rich) return `<div class="long rich">${rich.html}</div>`;
|
|
418
|
+
return rich.text ? `<div class="long">${nl2br(rich.text)}</div>` : empty;
|
|
419
|
+
}
|
|
221
420
|
case "date":
|
|
222
421
|
return value ? formatDate(String(value)) : empty;
|
|
223
422
|
case "select":
|
|
224
423
|
case "radio":
|
|
225
|
-
return value ?
|
|
424
|
+
return value ? optionLabel2(field, value) : empty;
|
|
226
425
|
case "tags": {
|
|
227
426
|
const arr = Array.isArray(value) ? value : [];
|
|
228
|
-
return arr.length ? arr.map((v) =>
|
|
427
|
+
return arr.length ? arr.map((v) => optionLabel2(field, v)).join(", ") : empty;
|
|
229
428
|
}
|
|
230
429
|
case "checkbox":
|
|
231
430
|
return value ? "Sim" : "N\xE3o";
|
|
@@ -282,6 +481,20 @@ function buildPrintHtml(template, doc, opts = {}) {
|
|
|
282
481
|
.field .label { font-size: 9pt; text-transform: uppercase; letter-spacing: .04em; color: #666; margin-bottom: 2px; }
|
|
283
482
|
.field .value { font-size: 12pt; }
|
|
284
483
|
.field--long .value .long { white-space: normal; text-align: justify; }
|
|
484
|
+
/* Conteudo formatado (sanitizado em lib/html-text.ts). O HTML chega sem
|
|
485
|
+
class nenhuma, entao o estilo vem por tag. orphans/widows evitam que um
|
|
486
|
+
paragrafo deixe uma linha solta virando a pagina. */
|
|
487
|
+
.long.rich p { margin: 0 0 8px; orphans: 2; widows: 2; }
|
|
488
|
+
.long.rich p:last-child { margin-bottom: 0; }
|
|
489
|
+
.long.rich ul, .long.rich ol { margin: 0 0 8px; padding-left: 20px; }
|
|
490
|
+
.long.rich li { margin: 0 0 3px; }
|
|
491
|
+
.long.rich b, .long.rich strong { font-weight: 600; }
|
|
492
|
+
.long.rich blockquote { margin: 0 0 8px; padding-left: 10px; border-left: 2px solid #ccc; color: #444; }
|
|
493
|
+
.long.rich a { color: #111; text-decoration: underline; }
|
|
494
|
+
.long.rich table { width: 100%; border-collapse: collapse; margin: 0 0 8px; }
|
|
495
|
+
.long.rich td, .long.rich th { border: 1px solid #ccc; padding: 4px 6px; text-align: left; }
|
|
496
|
+
.long.rich h1, .long.rich h2, .long.rich h3,
|
|
497
|
+
.long.rich h4, .long.rich h5, .long.rich h6 { font-size: 12pt; font-weight: 600; margin: 10px 0 4px; }
|
|
285
498
|
.empty { color: #bbb; }
|
|
286
499
|
footer { margin-top: 40px; font-size: 9pt; color: #888; text-align: center; }
|
|
287
500
|
@media screen { body { background: #f3f3f3; } .page { background: #fff; max-width: 210mm; min-height: 297mm; padding: 20mm; box-shadow: 0 1px 8px rgba(0,0,0,.15); } }
|
|
@@ -434,5 +647,5 @@ function prefillFromPerson(schema, person, existing = {}) {
|
|
|
434
647
|
}
|
|
435
648
|
|
|
436
649
|
export { FORM_BUILDER_INSTRUCTIONS, FormRenderer, PERSON_FIELD_OPTIONS, buildPrintHtml, createOrUpdateFormTool, prefillFromPerson, printDocument };
|
|
437
|
-
//# sourceMappingURL=chunk-
|
|
438
|
-
//# sourceMappingURL=chunk-
|
|
650
|
+
//# sourceMappingURL=chunk-RBLXIKWB.js.map
|
|
651
|
+
//# sourceMappingURL=chunk-RBLXIKWB.js.map
|