@fayz-ai/plugin-forms 0.8.1 → 0.9.0-next.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/package.json +13 -11
- package/dist/FormBuilder-YB75LEEH.cjs +0 -726
- package/dist/FormBuilder-YB75LEEH.cjs.map +0 -1
- package/dist/chunk-QM2AF3DZ.cjs +0 -446
- package/dist/chunk-QM2AF3DZ.cjs.map +0 -1
- package/dist/index.cjs +0 -1717
- package/dist/index.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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":["Heading","Type","AlignLeft","FileEdit","CalendarDays","ChevronDown","CircleDot","Tags","CheckSquare","Image","GalleryHorizontalEnd","Receipt","useTranslation","useDraggable","jsxs","jsx","useSortable","CSS","GripVertical","X","useDroppable","SortableContext","verticalListSortingStrategy","useState","useEffect","Sheet","SheetContent","SheetHeader","SheetTitle","SheetBody","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","PERSON_FIELD_OPTIONS","Trash2","Button","Plus","SheetFooter","useLimitGuard","useSensors","useSensor","PointerSensor","useCallback","arrayMove","React","FORM_BUILDER_INSTRUCTIONS","useAgentSurface","toast","invalidateLimit","useSaveBar","ArrowLeft","Card","CardContent","Badge","Eye","DndContext","pointerWithin","DragOverlay","snapCenterToCursor","Fragment","createPortal","Pencil","Printer","FormRenderer","buildPrintHtml"],"mappings":"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","file":"FormBuilder-YB75LEEH.cjs","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/saas'\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 '../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"]}
|
package/dist/chunk-QM2AF3DZ.cjs
DELETED
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
var ui = require('@fayz-ai/ui');
|
|
5
|
-
var core = require('@fayz-ai/core');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
|
|
8
|
-
// src/components/FormRenderer.tsx
|
|
9
|
-
function FieldRenderer({
|
|
10
|
-
field,
|
|
11
|
-
value,
|
|
12
|
-
onChange,
|
|
13
|
-
readOnly
|
|
14
|
-
}) {
|
|
15
|
-
core.useTranslation();
|
|
16
|
-
switch (field.type) {
|
|
17
|
-
case "title":
|
|
18
|
-
return /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold pt-2 pb-1 border-b", children: field.label });
|
|
19
|
-
case "text":
|
|
20
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
21
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
22
|
-
field.label,
|
|
23
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
24
|
-
] }),
|
|
25
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
-
ui.Input,
|
|
27
|
-
{
|
|
28
|
-
value: value ?? "",
|
|
29
|
-
onChange: (e) => onChange(e.target.value),
|
|
30
|
-
placeholder: field.placeholder,
|
|
31
|
-
className: "h-9 text-sm",
|
|
32
|
-
readOnly
|
|
33
|
-
}
|
|
34
|
-
)
|
|
35
|
-
] });
|
|
36
|
-
case "memo":
|
|
37
|
-
case "richtext":
|
|
38
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
39
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
40
|
-
field.label,
|
|
41
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
42
|
-
] }),
|
|
43
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
44
|
-
"textarea",
|
|
45
|
-
{
|
|
46
|
-
value: value ?? "",
|
|
47
|
-
onChange: (e) => onChange(e.target.value),
|
|
48
|
-
placeholder: field.placeholder,
|
|
49
|
-
className: "flex w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 min-h-[100px]",
|
|
50
|
-
readOnly
|
|
51
|
-
}
|
|
52
|
-
)
|
|
53
|
-
] });
|
|
54
|
-
case "date":
|
|
55
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
56
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
57
|
-
field.label,
|
|
58
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
59
|
-
] }),
|
|
60
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
61
|
-
ui.Input,
|
|
62
|
-
{
|
|
63
|
-
type: "date",
|
|
64
|
-
value: value ?? "",
|
|
65
|
-
onChange: (e) => onChange(e.target.value),
|
|
66
|
-
className: "h-9 text-sm",
|
|
67
|
-
readOnly
|
|
68
|
-
}
|
|
69
|
-
)
|
|
70
|
-
] });
|
|
71
|
-
case "select":
|
|
72
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
73
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
74
|
-
field.label,
|
|
75
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
76
|
-
] }),
|
|
77
|
-
readOnly ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm py-1", children: value ?? "-" }) : /* @__PURE__ */ jsxRuntime.jsxs(ui.Select, { value: value ?? "", onValueChange: onChange, children: [
|
|
78
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectTrigger, { className: "h-9 text-sm", children: /* @__PURE__ */ jsxRuntime.jsx(ui.SelectValue, { placeholder: field.placeholder ?? "..." }) }),
|
|
79
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.SelectContent, { children: (field.options ?? []).map((opt) => /* @__PURE__ */ jsxRuntime.jsx(ui.SelectItem, { value: opt.value, children: opt.label }, opt.value)) })
|
|
80
|
-
] })
|
|
81
|
-
] });
|
|
82
|
-
case "radio":
|
|
83
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
84
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
85
|
-
field.label,
|
|
86
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
87
|
-
] }),
|
|
88
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: (field.options ?? []).map((opt) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer", children: [
|
|
89
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
90
|
-
"input",
|
|
91
|
-
{
|
|
92
|
-
type: "radio",
|
|
93
|
-
name: field.id,
|
|
94
|
-
value: opt.value,
|
|
95
|
-
checked: value === opt.value,
|
|
96
|
-
onChange: () => onChange(opt.value),
|
|
97
|
-
disabled: readOnly,
|
|
98
|
-
className: "text-primary"
|
|
99
|
-
}
|
|
100
|
-
),
|
|
101
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: opt.label })
|
|
102
|
-
] }, opt.value)) })
|
|
103
|
-
] });
|
|
104
|
-
case "tags": {
|
|
105
|
-
const selectedTags = Array.isArray(value) ? value : [];
|
|
106
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
107
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
108
|
-
field.label,
|
|
109
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
110
|
-
] }),
|
|
111
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: (field.options ?? []).map((opt) => {
|
|
112
|
-
const active = selectedTags.includes(opt.value);
|
|
113
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
114
|
-
ui.Badge,
|
|
115
|
-
{
|
|
116
|
-
variant: active ? "default" : "outline",
|
|
117
|
-
className: `cursor-pointer text-xs ${readOnly ? "pointer-events-none" : ""}`,
|
|
118
|
-
onClick: () => {
|
|
119
|
-
if (readOnly) return;
|
|
120
|
-
onChange(
|
|
121
|
-
active ? selectedTags.filter((t2) => t2 !== opt.value) : [...selectedTags, opt.value]
|
|
122
|
-
);
|
|
123
|
-
},
|
|
124
|
-
children: opt.label
|
|
125
|
-
},
|
|
126
|
-
opt.value
|
|
127
|
-
);
|
|
128
|
-
}) })
|
|
129
|
-
] });
|
|
130
|
-
}
|
|
131
|
-
case "checkbox":
|
|
132
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 cursor-pointer py-1", children: [
|
|
133
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
134
|
-
"input",
|
|
135
|
-
{
|
|
136
|
-
type: "checkbox",
|
|
137
|
-
checked: !!value,
|
|
138
|
-
onChange: (e) => onChange(e.target.checked),
|
|
139
|
-
disabled: readOnly,
|
|
140
|
-
className: "rounded border-input"
|
|
141
|
-
}
|
|
142
|
-
),
|
|
143
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-medium", children: [
|
|
144
|
-
field.label,
|
|
145
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
146
|
-
] })
|
|
147
|
-
] });
|
|
148
|
-
case "image":
|
|
149
|
-
case "gallery":
|
|
150
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
151
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
152
|
-
field.label,
|
|
153
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
154
|
-
] }),
|
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center rounded-lg border-2 border-dashed py-8 text-sm text-muted-foreground", children: [
|
|
156
|
-
field.type === "gallery" ? "Gallery upload" : "Image upload",
|
|
157
|
-
" \u2014 v2"
|
|
158
|
-
] })
|
|
159
|
-
] });
|
|
160
|
-
case "budget":
|
|
161
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
|
|
162
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-xs font-medium block", children: [
|
|
163
|
-
field.label,
|
|
164
|
-
field.required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive ml-0.5", children: "*" })
|
|
165
|
-
] }),
|
|
166
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center rounded-lg border-2 border-dashed py-8 text-sm text-muted-foreground", children: "Budget / line items \u2014 v2" })
|
|
167
|
-
] });
|
|
168
|
-
default:
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
function FormRenderer({ schema, data, onChange, readOnly }) {
|
|
173
|
-
const sortedFields = [...schema.fields].sort((a, b) => a.row - b.row || a.col - b.col);
|
|
174
|
-
const handleFieldChange = react.useCallback(
|
|
175
|
-
(fieldId, value) => {
|
|
176
|
-
onChange({ ...data, [fieldId]: value });
|
|
177
|
-
},
|
|
178
|
-
[data, onChange]
|
|
179
|
-
);
|
|
180
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
-
"div",
|
|
182
|
-
{
|
|
183
|
-
className: "grid gap-x-4 gap-y-3",
|
|
184
|
-
style: { gridTemplateColumns: "repeat(12, 1fr)" },
|
|
185
|
-
children: sortedFields.map((field) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: { gridColumn: `span ${field.colSpan}` }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
-
FieldRenderer,
|
|
187
|
-
{
|
|
188
|
-
field,
|
|
189
|
-
value: data[field.id],
|
|
190
|
-
onChange: (v) => handleFieldChange(field.id, v),
|
|
191
|
-
readOnly
|
|
192
|
-
}
|
|
193
|
-
) }, field.id))
|
|
194
|
-
}
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// src/lib/print.ts
|
|
199
|
-
function esc(value) {
|
|
200
|
-
return String(value ?? "").replace(
|
|
201
|
-
/[&<>"']/g,
|
|
202
|
-
(c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
function nl2br(value) {
|
|
206
|
-
return esc(value).replace(/\r?\n/g, "<br/>");
|
|
207
|
-
}
|
|
208
|
-
function formatDate(value) {
|
|
209
|
-
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(value);
|
|
210
|
-
if (!m) return esc(value);
|
|
211
|
-
return `${m[3]}/${m[2]}/${m[1]}`;
|
|
212
|
-
}
|
|
213
|
-
function optionLabel(field, value) {
|
|
214
|
-
const opt = (field.options ?? []).find((o) => o.value === value);
|
|
215
|
-
return esc(opt ? opt.label : value);
|
|
216
|
-
}
|
|
217
|
-
function renderValue(field, value) {
|
|
218
|
-
const empty = '<span class="empty">\u2014</span>';
|
|
219
|
-
switch (field.type) {
|
|
220
|
-
case "memo":
|
|
221
|
-
case "richtext":
|
|
222
|
-
return value ? `<div class="long">${nl2br(String(value))}</div>` : empty;
|
|
223
|
-
case "date":
|
|
224
|
-
return value ? formatDate(String(value)) : empty;
|
|
225
|
-
case "select":
|
|
226
|
-
case "radio":
|
|
227
|
-
return value ? optionLabel(field, value) : empty;
|
|
228
|
-
case "tags": {
|
|
229
|
-
const arr = Array.isArray(value) ? value : [];
|
|
230
|
-
return arr.length ? arr.map((v) => optionLabel(field, v)).join(", ") : empty;
|
|
231
|
-
}
|
|
232
|
-
case "checkbox":
|
|
233
|
-
return value ? "Sim" : "N\xE3o";
|
|
234
|
-
case "image":
|
|
235
|
-
case "gallery":
|
|
236
|
-
case "budget":
|
|
237
|
-
return "";
|
|
238
|
-
// not meaningful on a printed contract
|
|
239
|
-
default:
|
|
240
|
-
return value ? esc(value) : empty;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
function buildPrintHtml(template, doc, opts = {}) {
|
|
244
|
-
const heading = opts.heading ?? doc.title ?? template.name;
|
|
245
|
-
const subParts = [opts.subheading ?? doc.personName, new Date(doc.createdAt).toLocaleDateString()].filter(Boolean).map((s) => esc(s)).join(" · ");
|
|
246
|
-
const fields = [...template.schema.fields].sort((a, b) => a.row - b.row || a.col - b.col);
|
|
247
|
-
const clampSpan = (n) => Math.max(1, Math.min(12, Number(n) || 12));
|
|
248
|
-
const body = fields.map((field) => {
|
|
249
|
-
if (field.type === "title") {
|
|
250
|
-
return `<h2 class="section" style="grid-column: 1 / -1">${esc(field.label)}</h2>`;
|
|
251
|
-
}
|
|
252
|
-
const rendered = renderValue(field, doc.data[field.id]);
|
|
253
|
-
if (rendered === "") return "";
|
|
254
|
-
const isLong = field.type === "memo" || field.type === "richtext";
|
|
255
|
-
return `<div class="field${isLong ? " field--long" : ""}" style="grid-column: span ${clampSpan(field.colSpan)}">
|
|
256
|
-
<div class="label">${esc(field.label)}</div>
|
|
257
|
-
<div class="value">${rendered}</div>
|
|
258
|
-
</div>`;
|
|
259
|
-
}).join("\n");
|
|
260
|
-
return `<!doctype html>
|
|
261
|
-
<html lang="pt-BR">
|
|
262
|
-
<head>
|
|
263
|
-
<meta charset="utf-8"/>
|
|
264
|
-
<title>${esc(heading)}</title>
|
|
265
|
-
<style>
|
|
266
|
-
@page { size: A4; margin: 20mm; }
|
|
267
|
-
* { box-sizing: border-box; }
|
|
268
|
-
html, body { margin: 0; padding: 0; }
|
|
269
|
-
body {
|
|
270
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
|
271
|
-
color: #111; font-size: 12pt; line-height: 1.5;
|
|
272
|
-
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
|
273
|
-
}
|
|
274
|
-
.page { max-width: 170mm; margin: 0 auto; padding: 12mm 0; }
|
|
275
|
-
header { border-bottom: 2px solid #111; padding-bottom: 8px; margin-bottom: 20px; }
|
|
276
|
-
header h1 { font-size: 18pt; margin: 0 0 2px; }
|
|
277
|
-
header .sub { font-size: 10pt; color: #555; }
|
|
278
|
-
/* 12-column grid \u2014 mirrors the builder Preview (FormRenderer) so the print
|
|
279
|
-
keeps the authored column layout. */
|
|
280
|
-
.grid { display: grid; grid-template-columns: repeat(12, 1fr); column-gap: 16px; row-gap: 12px; align-items: start; }
|
|
281
|
-
h2.section { font-size: 13pt; margin: 22px 0 4px; padding-bottom: 3px; border-bottom: 1px solid #ccc; }
|
|
282
|
-
.grid > h2.section:first-child { margin-top: 4px; }
|
|
283
|
-
.field { margin: 0; min-width: 0; }
|
|
284
|
-
.field .label { font-size: 9pt; text-transform: uppercase; letter-spacing: .04em; color: #666; margin-bottom: 2px; }
|
|
285
|
-
.field .value { font-size: 12pt; }
|
|
286
|
-
.field--long .value .long { white-space: normal; text-align: justify; }
|
|
287
|
-
.empty { color: #bbb; }
|
|
288
|
-
footer { margin-top: 40px; font-size: 9pt; color: #888; text-align: center; }
|
|
289
|
-
@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); } }
|
|
290
|
-
</style>
|
|
291
|
-
</head>
|
|
292
|
-
<body>
|
|
293
|
-
<div class="page">
|
|
294
|
-
<header>
|
|
295
|
-
<h1>${esc(heading)}</h1>
|
|
296
|
-
${subParts ? `<div class="sub">${subParts}</div>` : ""}
|
|
297
|
-
</header>
|
|
298
|
-
<div class="grid">
|
|
299
|
-
${body}
|
|
300
|
-
</div>
|
|
301
|
-
</div>
|
|
302
|
-
</body>
|
|
303
|
-
</html>`;
|
|
304
|
-
}
|
|
305
|
-
function printHtml(html) {
|
|
306
|
-
if (typeof document === "undefined") return;
|
|
307
|
-
const iframe = document.createElement("iframe");
|
|
308
|
-
iframe.setAttribute("aria-hidden", "true");
|
|
309
|
-
iframe.style.position = "fixed";
|
|
310
|
-
iframe.style.right = "0";
|
|
311
|
-
iframe.style.bottom = "0";
|
|
312
|
-
iframe.style.width = "0";
|
|
313
|
-
iframe.style.height = "0";
|
|
314
|
-
iframe.style.border = "0";
|
|
315
|
-
document.body.appendChild(iframe);
|
|
316
|
-
const cleanup = () => {
|
|
317
|
-
setTimeout(() => {
|
|
318
|
-
if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
|
|
319
|
-
}, 1e3);
|
|
320
|
-
};
|
|
321
|
-
const win = iframe.contentWindow;
|
|
322
|
-
const idoc = iframe.contentDocument || win?.document;
|
|
323
|
-
if (!win || !idoc) {
|
|
324
|
-
cleanup();
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
idoc.open();
|
|
328
|
-
idoc.write(html);
|
|
329
|
-
idoc.close();
|
|
330
|
-
const doPrint = () => {
|
|
331
|
-
try {
|
|
332
|
-
win.focus();
|
|
333
|
-
win.print();
|
|
334
|
-
} finally {
|
|
335
|
-
cleanup();
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
if (idoc.readyState === "complete") {
|
|
339
|
-
setTimeout(doPrint, 50);
|
|
340
|
-
} else {
|
|
341
|
-
iframe.addEventListener("load", () => setTimeout(doPrint, 50), { once: true });
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
function printDocument(template, doc, opts) {
|
|
345
|
-
printHtml(buildPrintHtml(template, doc, opts));
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// src/agent-tools.ts
|
|
349
|
-
var CATEGORY_ENUM = ["anamnesis", "evolution", "report", "contract", "general"];
|
|
350
|
-
var FIELD_SHAPE = "A field object: { type, label, required?, placeholder?, options?[] }. type \u2208 title|text|memo|richtext|date|select|radio|tags|checkbox|image|gallery|budget (title = section heading, no input). options are plain strings, only for select/radio/tags.";
|
|
351
|
-
var createOrUpdateFormTool = {
|
|
352
|
-
id: "custom_forms.createOrUpdateForm",
|
|
353
|
-
name: "createOrUpdateForm",
|
|
354
|
-
description: "Creates or edits a form template (anamnese, contrato, ficha\u2026). Persisted server-side, so it works from ANY page \u2014 the user does NOT need the form builder open. Omit templateId to CREATE (name required); pass templateId to EDIT an existing form. Send the FULL desired field list in `fields` (replaces all fields), or `append_fields` to add to what already exists. Layout is automatic \u2014 never send positions. Understand the intent and propose a sensible field set in one call rather than asking field by field. The user confirms before it is saved.",
|
|
355
|
-
icon: "FileText",
|
|
356
|
-
mode: "persist",
|
|
357
|
-
limitKey: "form_templates",
|
|
358
|
-
permission: { feature: "custom_forms", action: "create" },
|
|
359
|
-
execution: { plane: "server", kind: "rpc", rpc: "agent_forms_upsert_template" },
|
|
360
|
-
category: "Forms",
|
|
361
|
-
suggestions: [
|
|
362
|
-
{ label: "Monte um formul\xE1rio de anamnese" },
|
|
363
|
-
{ label: "Adicione um campo de alergias neste formul\xE1rio" }
|
|
364
|
-
],
|
|
365
|
-
parameters: {
|
|
366
|
-
type: "object",
|
|
367
|
-
properties: {
|
|
368
|
-
templateId: {
|
|
369
|
-
type: "string",
|
|
370
|
-
description: "Existing form id to EDIT (from context or listFormTemplates). Omit to create a new form."
|
|
371
|
-
},
|
|
372
|
-
name: { type: "string", description: "Form name \u2014 required when creating." },
|
|
373
|
-
category: {
|
|
374
|
-
type: "string",
|
|
375
|
-
enum: [...CATEGORY_ENUM],
|
|
376
|
-
description: "anamnesis | evolution | report | contract | general"
|
|
377
|
-
},
|
|
378
|
-
description: { type: "string", description: "Optional short description of the form." },
|
|
379
|
-
fields: {
|
|
380
|
-
type: "array",
|
|
381
|
-
description: `The FULL desired field list \u2014 REPLACES every existing field. Each item: ${FIELD_SHAPE}`,
|
|
382
|
-
items: { type: "object", description: FIELD_SHAPE }
|
|
383
|
-
},
|
|
384
|
-
append_fields: {
|
|
385
|
-
type: "array",
|
|
386
|
-
description: `Fields to ADD to the existing form, keeping current ones. Use this for incremental edits instead of \`fields\`. Each item: ${FIELD_SHAPE}`,
|
|
387
|
-
items: { type: "object", description: FIELD_SHAPE }
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
};
|
|
392
|
-
var FORM_BUILDER_INSTRUCTIONS = [
|
|
393
|
-
"Voc\xEA est\xE1 na tela do CONSTRUTOR DE FORMUL\xC1RIOS. Para montar ou editar formul\xE1rios use a tool createOrUpdateForm (ela persiste no backend e funciona mesmo fora desta tela).",
|
|
394
|
-
"O formul\xE1rio aberto agora \u2014 id, nome, categoria e campos com seus ids \u2014 est\xE1 no JSON da tela em contexto.",
|
|
395
|
-
"Para EDITAR este formul\xE1rio, passe o templateId do contexto. Para adicionar campos mantendo os atuais, use append_fields; para redefinir tudo, use fields com a lista completa.",
|
|
396
|
-
"Ao criar do zero: entenda a inten\xE7\xE3o e proponha um conjunto de campos enxuto numa \xFAnica chamada (n\xE3o pergunte campo a campo). Depois confirme em uma frase o que foi montado.",
|
|
397
|
-
"Tipos de campo: title (cabe\xE7alho de se\xE7\xE3o, sem input), text, memo (multilinha), richtext, date, select, radio, tags, checkbox, image, gallery, budget. Layout \xE9 autom\xE1tico."
|
|
398
|
-
].join(" ");
|
|
399
|
-
|
|
400
|
-
// src/lib/person-fields.ts
|
|
401
|
-
var PERSON_FIELD_OPTIONS = [
|
|
402
|
-
{ value: "name", labelKey: "customForms.personField.name" },
|
|
403
|
-
{ value: "documentNumber", labelKey: "customForms.personField.documentNumber" },
|
|
404
|
-
{ value: "email", labelKey: "customForms.personField.email" },
|
|
405
|
-
{ value: "phone", labelKey: "customForms.personField.phone" },
|
|
406
|
-
{ value: "dateOfBirth", labelKey: "customForms.personField.dateOfBirth" },
|
|
407
|
-
{ value: "guardianName", labelKey: "customForms.personField.guardianName" },
|
|
408
|
-
{ value: "address", labelKey: "customForms.personField.address" },
|
|
409
|
-
{ value: "city", labelKey: "customForms.personField.city" },
|
|
410
|
-
{ value: "state", labelKey: "customForms.personField.state" }
|
|
411
|
-
];
|
|
412
|
-
var toSnake = (k) => k.replace(/[A-Z]/g, (m) => "_" + m.toLowerCase());
|
|
413
|
-
var toCamel = (k) => k.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
|
|
414
|
-
function resolvePersonValue(person, mapKey) {
|
|
415
|
-
if (!person || !mapKey) return void 0;
|
|
416
|
-
for (const key of [mapKey, toSnake(mapKey), toCamel(mapKey)]) {
|
|
417
|
-
const v = person[key];
|
|
418
|
-
if (v != null && v !== "") return v;
|
|
419
|
-
}
|
|
420
|
-
return void 0;
|
|
421
|
-
}
|
|
422
|
-
function prefillFromPerson(schema, person, existing = {}) {
|
|
423
|
-
const data = { ...existing };
|
|
424
|
-
if (!schema) return data;
|
|
425
|
-
for (const field of schema.fields) {
|
|
426
|
-
const current = data[field.id];
|
|
427
|
-
if (current != null && current !== "") continue;
|
|
428
|
-
const mapped = field.map ? resolvePersonValue(person, field.map) : void 0;
|
|
429
|
-
if (mapped != null) {
|
|
430
|
-
data[field.id] = mapped;
|
|
431
|
-
} else if (field.defaultValue != null) {
|
|
432
|
-
data[field.id] = field.defaultValue;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
return data;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
exports.FORM_BUILDER_INSTRUCTIONS = FORM_BUILDER_INSTRUCTIONS;
|
|
439
|
-
exports.FormRenderer = FormRenderer;
|
|
440
|
-
exports.PERSON_FIELD_OPTIONS = PERSON_FIELD_OPTIONS;
|
|
441
|
-
exports.buildPrintHtml = buildPrintHtml;
|
|
442
|
-
exports.createOrUpdateFormTool = createOrUpdateFormTool;
|
|
443
|
-
exports.prefillFromPerson = prefillFromPerson;
|
|
444
|
-
exports.printDocument = printDocument;
|
|
445
|
-
//# sourceMappingURL=chunk-QM2AF3DZ.cjs.map
|
|
446
|
-
//# sourceMappingURL=chunk-QM2AF3DZ.cjs.map
|