@open-mercato/ui 0.5.1-develop.2953.6647bb2c43 → 0.5.1-develop.2964.d5ac4a6ebb
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/.turbo/turbo-build.log +1 -1
- package/AGENTS.md +8 -0
- package/dist/backend/CrudForm.js +57 -29
- package/dist/backend/CrudForm.js.map +2 -2
- package/dist/backend/DataTable.js +32 -14
- package/dist/backend/DataTable.js.map +2 -2
- package/dist/backend/FilterOverlay.js +23 -17
- package/dist/backend/FilterOverlay.js.map +2 -2
- package/dist/backend/JsonBuilder.js +32 -18
- package/dist/backend/JsonBuilder.js.map +2 -2
- package/dist/backend/columns/ColumnChooserPanel.js +12 -13
- package/dist/backend/columns/ColumnChooserPanel.js.map +2 -2
- package/dist/backend/custom-fields/FieldDefinitionsEditor.js +71 -62
- package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +2 -2
- package/dist/backend/date-range/DateRangeSelect.js +11 -10
- package/dist/backend/date-range/DateRangeSelect.js.map +2 -2
- package/dist/backend/date-range/InlineDateRangeSelect.js +10 -22
- package/dist/backend/date-range/InlineDateRangeSelect.js.map +2 -2
- package/dist/backend/detail/ActivitiesSection.js +20 -12
- package/dist/backend/detail/ActivitiesSection.js.map +2 -2
- package/dist/backend/detail/AddressEditor.js +24 -7
- package/dist/backend/detail/AddressEditor.js.map +2 -2
- package/dist/backend/detail/InlineEditors.js +12 -6
- package/dist/backend/detail/InlineEditors.js.map +2 -2
- package/dist/backend/detail/NotesSection.js +20 -14
- package/dist/backend/detail/NotesSection.js.map +2 -2
- package/dist/backend/filters/AdvancedFilterBuilder.js +52 -24
- package/dist/backend/filters/AdvancedFilterBuilder.js.map +2 -2
- package/dist/backend/injection/InjectedField.js +12 -7
- package/dist/backend/injection/InjectedField.js.map +2 -2
- package/dist/backend/inputs/ComboboxInput.js.map +2 -2
- package/dist/backend/inputs/EventSelect.js +22 -6
- package/dist/backend/inputs/EventSelect.js.map +2 -2
- package/dist/backend/inputs/PhoneNumberField.js +2 -2
- package/dist/backend/inputs/PhoneNumberField.js.map +2 -2
- package/dist/backend/inputs/TimeInput.js +9 -10
- package/dist/backend/inputs/TimeInput.js.map +2 -2
- package/dist/backend/messages/message-compose-form-groups.js +12 -7
- package/dist/backend/messages/message-compose-form-groups.js.map +2 -2
- package/dist/backend/messages/useMessageCompose.js +7 -1
- package/dist/backend/messages/useMessageCompose.js.map +2 -2
- package/dist/frontend/LanguageSwitcher.js +19 -14
- package/dist/frontend/LanguageSwitcher.js.map +2 -2
- package/dist/index.js +5 -0
- package/dist/index.js.map +2 -2
- package/dist/primitives/checkbox-field.js +17 -5
- package/dist/primitives/checkbox-field.js.map +2 -2
- package/dist/primitives/input.js +71 -14
- package/dist/primitives/input.js.map +2 -2
- package/dist/primitives/radio-field.js +74 -0
- package/dist/primitives/radio-field.js.map +7 -0
- package/dist/primitives/radio.js +37 -0
- package/dist/primitives/radio.js.map +7 -0
- package/dist/primitives/select.js +155 -0
- package/dist/primitives/select.js.map +7 -0
- package/dist/primitives/switch-field.js +76 -0
- package/dist/primitives/switch-field.js.map +7 -0
- package/dist/primitives/switch.js +17 -3
- package/dist/primitives/switch.js.map +2 -2
- package/dist/primitives/textarea.js +48 -12
- package/dist/primitives/textarea.js.map +2 -2
- package/dist/primitives/tooltip.js +44 -15
- package/dist/primitives/tooltip.js.map +2 -2
- package/package.json +5 -3
- package/src/backend/CrudForm.tsx +104 -37
- package/src/backend/DataTable.tsx +38 -20
- package/src/backend/FilterOverlay.tsx +35 -21
- package/src/backend/JsonBuilder.tsx +38 -20
- package/src/backend/__tests__/FieldDefinitionsEditor.test.tsx +23 -6
- package/src/backend/columns/ColumnChooserPanel.tsx +9 -10
- package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +120 -87
- package/src/backend/date-range/DateRangeSelect.tsx +19 -12
- package/src/backend/date-range/InlineDateRangeSelect.tsx +16 -20
- package/src/backend/detail/ActivitiesSection.tsx +35 -23
- package/src/backend/detail/AddressEditor.tsx +30 -16
- package/src/backend/detail/InlineEditors.tsx +21 -11
- package/src/backend/detail/NotesSection.tsx +35 -25
- package/src/backend/filters/AdvancedFilterBuilder.tsx +60 -34
- package/src/backend/injection/InjectedField.tsx +21 -12
- package/src/backend/inputs/ComboboxInput.tsx +4 -0
- package/src/backend/inputs/EventSelect.tsx +30 -17
- package/src/backend/inputs/PhoneNumberField.tsx +2 -2
- package/src/backend/inputs/TimeInput.tsx +9 -10
- package/src/backend/messages/message-compose-form-groups.tsx +21 -12
- package/src/backend/messages/useMessageCompose.ts +20 -1
- package/src/frontend/LanguageSwitcher.tsx +20 -17
- package/src/index.ts +5 -0
- package/src/primitives/checkbox-field.tsx +10 -2
- package/src/primitives/input.tsx +73 -12
- package/src/primitives/radio-field.tsx +92 -0
- package/src/primitives/radio.tsx +42 -0
- package/src/primitives/select.tsx +200 -0
- package/src/primitives/switch-field.tsx +100 -0
- package/src/primitives/switch.tsx +17 -4
- package/src/primitives/textarea.tsx +67 -11
- package/src/primitives/tooltip.tsx +68 -24
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/backend/custom-fields/FieldDefinitionsEditor.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Cog, GripVertical, Languages, Pencil, Plus, Trash2, X } from 'lucide-react'\nimport { Button } from '../../primitives/button'\nimport { IconButton } from '../../primitives/icon-button'\nimport { CUSTOM_FIELD_KINDS } from '@open-mercato/shared/modules/entities/kinds'\nimport { FieldRegistry } from '../fields/registry'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport { useConfirmDialog } from '../confirm-dialog'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../../primitives/dialog'\nimport {\n normalizeCustomFieldOptions,\n type CustomFieldOptionDto,\n} from '@open-mercato/shared/modules/entities/options'\n\ntype FieldsetGroup = { code: string; title?: string; hint?: string }\ntype FieldsetConfig = { code: string; label: string; icon?: string; description?: string; groups?: FieldsetGroup[] }\n\nexport type FieldDefinition = {\n key: string\n kind: string\n configJson?: Record<string, unknown>\n isActive?: boolean\n}\n\nexport type FieldDefinitionError = { key?: string; kind?: string }\n\nexport type FieldDefinitionsEditorProps = {\n definitions: FieldDefinition[]\n errors?: Record<number, FieldDefinitionError>\n deletedKeys?: string[]\n kindOptions?: Array<{ value: string; label: string }>\n orderNotice?: { dirty: boolean; saving?: boolean; message?: string }\n infoNote?: React.ReactNode\n addButtonLabel?: string\n fieldsets?: FieldsetConfig[]\n activeFieldset?: string | null\n onActiveFieldsetChange?: (code: string | null) => void\n onFieldsetsChange?: (next: FieldsetConfig[]) => void\n onFieldsetCodeChange?: (previousCode: string, nextCode: string) => void\n onFieldsetRemoved?: (code: string) => void\n onAddField: () => void\n onRemoveField: (index: number) => void\n onDefinitionChange: (index: number, next: FieldDefinition) => void\n onRestoreField?: (key: string) => void\n onReorder?: (from: number, to: number) => void\n onTranslate?: (definition: FieldDefinition, index: number) => void\n listRef?: React.Ref<HTMLDivElement>\n listProps?: React.HTMLAttributes<HTMLDivElement>\n singleFieldsetPerRecord?: boolean\n onSingleFieldsetPerRecordChange?: (value: boolean) => void\n translate?: (key: string, fallback: string) => string\n}\n\nconst DEFAULT_KIND_OPTIONS = CUSTOM_FIELD_KINDS.map((k) => ({\n value: k,\n label: k.charAt(0).toUpperCase() + k.slice(1),\n}))\n\nconst FIELDSET_ICON_OPTIONS = [\n { value: 'layers', label: 'Layers' },\n { value: 'tag', label: 'Tag' },\n { value: 'sparkles', label: 'Sparkles' },\n { value: 'package', label: 'Package' },\n { value: 'shirt', label: 'Shirt' },\n { value: 'grid', label: 'Grid' },\n { value: 'shoppingBag', label: 'Shopping bag' },\n { value: 'shoppingCart', label: 'Shopping cart' },\n { value: 'store', label: 'Store' },\n { value: 'users', label: 'Users' },\n { value: 'briefcase', label: 'Briefcase' },\n { value: 'building', label: 'Building' },\n { value: 'bookOpen', label: 'Book open' },\n { value: 'bookmark', label: 'Bookmark' },\n { value: 'camera', label: 'Camera' },\n { value: 'car', label: 'Car' },\n { value: 'clock', label: 'Clock' },\n { value: 'cloud', label: 'Cloud' },\n { value: 'compass', label: 'Compass' },\n { value: 'creditCard', label: 'Credit card' },\n { value: 'database', label: 'Database' },\n { value: 'flame', label: 'Flame' },\n { value: 'gift', label: 'Gift' },\n { value: 'globe', label: 'Globe' },\n { value: 'heart', label: 'Heart' },\n { value: 'key', label: 'Key' },\n { value: 'map', label: 'Map' },\n { value: 'palette', label: 'Palette' },\n { value: 'shield', label: 'Shield' },\n { value: 'star', label: 'Star' },\n { value: 'truck', label: 'Truck' },\n { value: 'zap', label: 'Zap' },\n { value: 'coins', label: 'Coins' },\n]\n\nfunction slugifyFieldsetCode(value: string): string {\n return slugify(value, { replacement: '', allowedChars: '_-' })\n}\n\nfunction ensureUniqueFieldsetCode(base: string, existing: FieldsetConfig[]): string {\n const sanitizedBase = slugifyFieldsetCode(base) || 'fieldset'\n let candidate = sanitizedBase\n let counter = 1\n const existingCodes = new Set(existing.map((fs) => fs.code))\n while (existingCodes.has(candidate)) {\n counter += 1\n candidate = `${sanitizedBase}_${counter}`\n }\n return candidate\n}\n\nfunction normalizeGroupValue(raw: unknown): FieldsetGroup | null {\n if (!raw) return null\n if (typeof raw === 'string') {\n const code = raw.trim()\n return code ? { code } : null\n }\n if (typeof raw !== 'object') return null\n const entry = raw as Record<string, unknown>\n const code = typeof entry.code === 'string' ? entry.code.trim() : ''\n if (!code) return null\n const group: FieldsetGroup = { code }\n if (typeof entry.title === 'string' && entry.title.trim()) group.title = entry.title.trim()\n if (typeof entry.hint === 'string' && entry.hint.trim()) group.hint = entry.hint.trim()\n return group\n}\n\nexport function FieldDefinitionsEditor({\n definitions,\n errors,\n deletedKeys,\n kindOptions = DEFAULT_KIND_OPTIONS,\n orderNotice,\n infoNote = (\n <div className=\"text-xs text-muted-foreground mt-2\">\n Supported kinds: text, multiline, integer, float, boolean, select (with options/optionsUrl), currency (fixed currencies list), relation (with related entity and options URL).\n </div>\n ),\n addButtonLabel = 'Add Field',\n fieldsets = [],\n activeFieldset = null,\n onActiveFieldsetChange,\n onFieldsetsChange,\n onFieldsetCodeChange,\n onFieldsetRemoved,\n singleFieldsetPerRecord,\n onSingleFieldsetPerRecordChange,\n onAddField,\n onRemoveField,\n onDefinitionChange,\n onRestoreField,\n onReorder,\n onTranslate,\n listRef,\n listProps,\n translate,\n}: FieldDefinitionsEditorProps) {\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const dragIndex = React.useRef<number | null>(null)\n const hasFieldsets = fieldsets.length > 0\n const t = React.useCallback((key: string, fallback: string) => (translate ? translate(key, fallback) : fallback), [translate])\n const resolvedActiveFieldset = React.useMemo(() => {\n if (!hasFieldsets) return activeFieldset ?? null\n if (activeFieldset === null) return null\n return fieldsets.some((fs) => fs.code === activeFieldset) ? activeFieldset : (fieldsets[0]?.code ?? null)\n }, [activeFieldset, fieldsets, hasFieldsets])\n\n const filteredDefinitions = React.useMemo(\n () =>\n definitions\n .map((definition, index) => ({ definition, index }))\n .filter(({ definition }) => {\n if (!hasFieldsets) return true\n const assigned = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : undefined\n if (!resolvedActiveFieldset) return !assigned\n return assigned === resolvedActiveFieldset\n }),\n [definitions, hasFieldsets, resolvedActiveFieldset],\n )\n\n const activeFieldsetConfig = hasFieldsets && resolvedActiveFieldset\n ? fieldsets.find((fs) => fs.code === resolvedActiveFieldset) ?? null\n : null\n\n const handleActiveFieldsetChange = (value: string) => {\n if (!onActiveFieldsetChange) return\n onActiveFieldsetChange(value ? value : null)\n }\n\n const handleFieldsetPatch = (code: string, patch: Partial<FieldsetConfig>) => {\n if (!onFieldsetsChange) return\n const next = fieldsets.map((fs) => (fs.code === code ? { ...fs, ...patch } : fs))\n onFieldsetsChange(next)\n }\n\n const handleFieldsetCodeInput = (code: string, nextValue: string) => {\n if (!onFieldsetsChange) return\n const target = fieldsets.find((fs) => fs.code === code)\n if (!target) return\n const sanitized = slugifyFieldsetCode(nextValue)\n if (!sanitized) return\n const next = fieldsets.map((fs) => (fs.code === code ? { ...fs, code: sanitized } : fs))\n onFieldsetsChange(next)\n onFieldsetCodeChange?.(code, sanitized)\n onActiveFieldsetChange?.(sanitized)\n }\n\n const handleAddFieldset = () => {\n if (!onFieldsetsChange) return\n const code = ensureUniqueFieldsetCode(`fieldset_${fieldsets.length + 1}`, fieldsets)\n const nextFieldsets = [...fieldsets, { code, label: 'New fieldset', icon: 'layers' }]\n onFieldsetsChange(nextFieldsets)\n onActiveFieldsetChange?.(code)\n }\n\n const handleRemoveFieldset = async () => {\n if (!onFieldsetsChange) return\n if (!resolvedActiveFieldset) return\n const confirmed = await confirm({\n title: `Delete fieldset \"${resolvedActiveFieldset}\"?`,\n text: 'This will move its fields to Unassigned.',\n variant: 'destructive',\n })\n if (!confirmed) return\n const next = fieldsets.filter((fs) => fs.code !== resolvedActiveFieldset)\n onFieldsetsChange(next)\n onFieldsetRemoved?.(resolvedActiveFieldset)\n const fallback = next[0]?.code ?? null\n onActiveFieldsetChange?.(fallback)\n }\n\n const registerGroup = React.useCallback(\n (fieldsetCode: string, group: FieldsetGroup) => {\n if (!onFieldsetsChange || !fieldsetCode) return\n const next = fieldsets.map((fs) => {\n if (fs.code !== fieldsetCode) return fs\n const list = Array.isArray(fs.groups) ? fs.groups : []\n const existingIndex = list.findIndex((entry) => entry.code === group.code)\n if (existingIndex >= 0) {\n const updated = [...list]\n updated[existingIndex] = { ...list[existingIndex], ...group }\n return { ...fs, groups: updated }\n }\n return { ...fs, groups: [...list, group] }\n })\n onFieldsetsChange(next)\n },\n [fieldsets, onFieldsetsChange],\n )\n const removeGroup = React.useCallback(\n (fieldsetCode: string, groupCode: string) => {\n if (!onFieldsetsChange || !fieldsetCode || !groupCode) return\n const next = fieldsets.map((fs) => {\n if (fs.code !== fieldsetCode) return fs\n const list = Array.isArray(fs.groups) ? fs.groups : []\n return { ...fs, groups: list.filter((entry) => entry.code !== groupCode) }\n })\n onFieldsetsChange(next)\n },\n [fieldsets, onFieldsetsChange],\n )\n const availableGroups = activeFieldsetConfig?.groups ?? []\n const canToggleSingleFieldset = hasFieldsets && fieldsets.length > 1\n const singleFieldsetChecked = singleFieldsetPerRecord !== false\n\n const handleReorder = React.useCallback(\n (from: number, to: number) => {\n if (from === to) return\n onReorder?.(from, to)\n },\n [onReorder],\n )\n\n return (\n <div\n ref={listRef}\n className=\"space-y-3\"\n {...listProps}\n >\n {hasFieldsets ? (\n <div className=\"rounded border bg-card p-3 space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">Fieldset</label>\n <select\n className=\"border rounded px-2 py-1 text-sm\"\n value={resolvedActiveFieldset ?? ''}\n onChange={(event) => handleActiveFieldsetChange(event.target.value)}\n >\n <option value=\"\">Unassigned fields</option>\n {fieldsets.map((fs) => (\n <option key={fs.code} value={fs.code}>\n {fs.label || fs.code}\n </option>\n ))}\n </select>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleAddFieldset}\n className=\"text-xs\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRemoveFieldset}\n disabled={!resolvedActiveFieldset}\n className=\"text-xs\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" /> Delete\n </Button>\n </div>\n {resolvedActiveFieldset && activeFieldsetConfig ? (\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <div>\n <label className=\"text-xs\">Code</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm font-mono\"\n value={activeFieldsetConfig.code}\n onChange={(event) => handleFieldsetCodeInput(activeFieldsetConfig.code, event.target.value)}\n />\n </div>\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.label}\n onChange={(event) => handleFieldsetPatch(activeFieldsetConfig.code, { label: event.target.value })}\n />\n </div>\n <div>\n <label className=\"text-xs\">Icon</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.icon ?? ''}\n onChange={(event) =>\n handleFieldsetPatch(activeFieldsetConfig.code, {\n icon: event.target.value || undefined,\n })\n }\n >\n <option value=\"\">Default</option>\n {FIELDSET_ICON_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-xs\">Description</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.description ?? ''}\n onChange={(event) => handleFieldsetPatch(activeFieldsetConfig.code, { description: event.target.value })}\n />\n </div>\n </div>\n ) : null}\n <div className=\"flex items-center gap-2 text-xs\">\n <label className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n disabled={!canToggleSingleFieldset}\n checked={singleFieldsetChecked}\n onChange={(event) => onSingleFieldsetPerRecordChange?.(event.target.checked)}\n />\n Single fieldset per entity\n </label>\n {!canToggleSingleFieldset ? (\n <span className=\"text-muted-foreground\">(add at least two fieldsets to toggle)</span>\n ) : null}\n </div>\n </div>\n ) : (\n <div className=\"rounded border border-dashed bg-muted/30 p-4 text-sm text-muted-foreground flex flex-col gap-3\">\n <div>No fieldsets defined yet. Fieldsets let you group custom fields for different variants of the same entity (e.g., Fashion vs. Sport products).</div>\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleAddFieldset}\n >\n <Plus className=\"h-4 w-4\" />\n Add first fieldset\n </Button>\n </div>\n </div>\n )}\n {orderNotice?.dirty && (\n <div className=\"sticky top-0 z-sticky -mt-1 -mb-1\">\n <div className=\"inline-flex items-center gap-2 text-xs px-2 py-1 rounded border bg-amber-50 text-amber-800 shadow-sm\">\n {orderNotice?.saving ? 'Saving order\u2026' : (orderNotice?.message ?? 'Reordered \u2014 saving soon')}\n </div>\n </div>\n )}\n {filteredDefinitions.map(({ definition, index }) => {\n const assignedFieldset = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : null\n const groupOptions = assignedFieldset\n ? fieldsets.find((fs) => fs.code === assignedFieldset)?.groups ?? []\n : availableGroups\n return (\n <div\n key={definition.key || `def-${index}`}\n className=\"group\"\n draggable\n onDragStart={() => { dragIndex.current = index }}\n onDragOver={(event) => { event.preventDefault() }}\n onDrop={() => {\n const from = dragIndex.current\n if (from == null) return\n dragIndex.current = null\n handleReorder(from, index)\n }}\n onDragEnd={() => { dragIndex.current = null }}\n tabIndex={0}\n onKeyDown={(event) => {\n if (!event.altKey) return\n if (event.key === 'ArrowUp' || event.key === 'Up') {\n event.preventDefault()\n handleReorder(index, Math.max(0, index - 1))\n }\n if (event.key === 'ArrowDown' || event.key === 'Down') {\n event.preventDefault()\n handleReorder(index, Math.min(definitions.length - 1, index + 1))\n }\n }}\n >\n <FieldDefinitionCard\n definition={definition}\n error={errors?.[index]}\n kindOptions={kindOptions}\n onChange={(next) => onDefinitionChange(index, next)}\n onRemove={() => onRemoveField(index)}\n allowFieldsetSelection={hasFieldsets}\n fieldsets={fieldsets}\n activeFieldset={resolvedActiveFieldset}\n availableGroups={groupOptions}\n onRegisterGroup={registerGroup}\n onRemoveGroup={removeGroup}\n onTranslate={onTranslate ? () => onTranslate(definition, index) : undefined}\n translate={t}\n />\n </div>\n )})}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAddField}\n >\n <Plus className=\"h-4 w-4\" /> {addButtonLabel}\n </Button>\n {infoNote}\n {deletedKeys && deletedKeys.length > 0 && onRestoreField ? (\n <div className=\"text-xs text-muted-foreground mt-2\">\n Restore deleted fields:{' '}\n {deletedKeys.map((key, idx) => (\n <span key={key}>\n <Button\n variant=\"link\"\n className=\"h-auto p-0 text-blue-600\"\n onClick={() => onRestoreField(key)}\n >\n {key}\n </Button>\n {idx < deletedKeys.length - 1 ? ', ' : ''}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n {ConfirmDialogElement}\n </div>\n )\n}\n\ntype FieldDefinitionCardProps = {\n definition: FieldDefinition\n error?: FieldDefinitionError\n kindOptions: Array<{ value: string; label: string }>\n onChange: (next: FieldDefinition) => void\n onRemove: () => void\n allowFieldsetSelection?: boolean\n fieldsets?: FieldsetConfig[]\n activeFieldset?: string | null\n availableGroups?: FieldsetGroup[]\n onRegisterGroup?: (fieldsetCode: string, group: FieldsetGroup) => void\n onRemoveGroup?: (fieldsetCode: string, groupCode: string) => void\n onTranslate?: () => void\n translate?: (key: string, fallback: string) => string\n}\n\nconst FieldDefinitionCard = React.memo(function FieldDefinitionCard({\n definition,\n error,\n kindOptions,\n onChange,\n onRemove,\n allowFieldsetSelection = false,\n fieldsets = [],\n activeFieldset,\n availableGroups = [],\n onRegisterGroup,\n onRemoveGroup,\n onTranslate,\n translate,\n}: FieldDefinitionCardProps) {\n const [local, setLocal] = React.useState<FieldDefinition>(definition)\n const localRef = React.useRef<FieldDefinition>(definition)\n const [optionValueDraft, setOptionValueDraft] = React.useState('')\n const [optionLabelDraft, setOptionLabelDraft] = React.useState('')\n const [optionDialogOpen, setOptionDialogOpen] = React.useState(false)\n const [optionFormError, setOptionFormError] = React.useState<string | null>(null)\n const [groupDialogOpen, setGroupDialogOpen] = React.useState(false)\n const [groupDraft, setGroupDraft] = React.useState({ code: '', title: '', hint: '' })\n const [editingGroupCode, setEditingGroupCode] = React.useState<string | null>(null)\n const [groupError, setGroupError] = React.useState<string | null>(null)\n const currentFieldsetValue = React.useMemo(\n () => (typeof local.configJson?.fieldset === 'string' ? local.configJson.fieldset : ''),\n [local.configJson?.fieldset],\n )\n const t = React.useCallback((key: string, fallback: string) => (translate ? translate(key, fallback) : fallback), [translate])\n React.useEffect(() => {\n localRef.current = definition\n setLocal(definition)\n }, [definition.key])\n React.useEffect(() => {\n setOptionValueDraft('')\n setOptionLabelDraft('')\n setGroupDialogOpen(false)\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupError(null)\n }, [definition.key])\n React.useEffect(() => {\n if (!currentFieldsetValue) {\n setGroupDialogOpen(false)\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupError(null)\n }\n }, [currentFieldsetValue])\n const currentGroup = React.useMemo(() => normalizeGroupValue(local.configJson?.group), [local])\n const groupOptions = React.useMemo(() => {\n const list = Array.isArray(availableGroups) ? [...availableGroups] : []\n if (currentGroup && !list.some((entry) => entry.code === currentGroup.code)) {\n list.push(currentGroup)\n }\n return list\n }, [availableGroups, currentGroup])\n const resolvedOptions = React.useMemo<CustomFieldOptionDto[]>(\n () => normalizeCustomFieldOptions(local.configJson?.options),\n [local.configJson?.options],\n )\n\n const sanitize = (def: FieldDefinition): FieldDefinition => {\n if (!def.configJson || !Array.isArray(def.configJson.options)) return def\n const normalizedOptions = normalizeCustomFieldOptions(def.configJson.options)\n return {\n ...def,\n configJson: {\n ...def.configJson,\n options: normalizedOptions,\n },\n }\n }\n\n const replaceLocal = React.useCallback((next: FieldDefinition) => {\n localRef.current = next\n setLocal(next)\n return next\n }, [])\n\n const apply = (patch: Partial<FieldDefinition> | ((current: FieldDefinition) => Partial<FieldDefinition>), propagateNow = false) => {\n const current = localRef.current\n const resolvedPatch = typeof patch === 'function' ? patch(current) : patch\n const next = { ...current, ...resolvedPatch }\n const resolvedNext = propagateNow ? sanitize(next) : next\n replaceLocal(resolvedNext)\n if (propagateNow) {\n onChange(resolvedNext)\n }\n }\n\n const commit = () => {\n const sanitized = sanitize(localRef.current)\n replaceLocal(sanitized)\n onChange(sanitized)\n }\n\n const handleFieldsetSelect = (value: string) => {\n const nextConfig = { ...(localRef.current.configJson || {}) }\n if (value) nextConfig.fieldset = value\n else delete nextConfig.fieldset\n delete nextConfig.group\n const next = { ...localRef.current, configJson: nextConfig }\n replaceLocal(next)\n onChange(next)\n }\n\n const handleGroupSelect = (value: string) => {\n if (!currentFieldsetValue) return\n if (!value) {\n const nextConfig = { ...(local.configJson || {}) }\n delete nextConfig.group\n apply({ configJson: nextConfig }, true)\n return\n }\n const match = groupOptions.find((group) => group.code === value)\n const nextGroup = match ?? { code: value }\n const nextConfig = { ...(local.configJson || {}) }\n nextConfig.group = nextGroup\n apply({ configJson: nextConfig }, true)\n onRegisterGroup?.(currentFieldsetValue, nextGroup)\n }\n\n const handleOpenGroupDialog = (group?: FieldsetGroup) => {\n if (!currentFieldsetValue) return\n if (group) {\n setGroupDraft({\n code: group.code,\n title: group.title ?? '',\n hint: group.hint ?? '',\n })\n setEditingGroupCode(group.code)\n } else {\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n }\n setGroupError(null)\n setGroupDialogOpen(true)\n }\n\n const handleGroupDialogSubmit = () => {\n if (!currentFieldsetValue) return\n const code = slugifyFieldsetCode(groupDraft.code || '')\n if (!code) {\n setGroupError('Group code is required.')\n return\n }\n const group: FieldsetGroup = {\n code,\n title: groupDraft.title.trim() || undefined,\n hint: groupDraft.hint.trim() || undefined,\n }\n onRegisterGroup?.(currentFieldsetValue, group)\n const shouldAttachToField = !editingGroupCode || currentGroup?.code === editingGroupCode\n if (shouldAttachToField) {\n const nextConfig = { ...(local.configJson || {}) }\n nextConfig.group = group\n apply({ configJson: nextConfig }, true)\n }\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupDialogOpen(false)\n }\n\n const handleRemoveGroupEntry = (code: string) => {\n if (!currentFieldsetValue) return\n onRemoveGroup?.(currentFieldsetValue, code)\n if (currentGroup?.code === code) {\n handleGroupSelect('')\n }\n if (editingGroupCode === code) {\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n }\n }\n\n const handleEditGroupEntry = (group: FieldsetGroup) => {\n handleOpenGroupDialog(group)\n }\n\n const resetOptionDialog = () => {\n setOptionValueDraft('')\n setOptionLabelDraft('')\n setOptionFormError(null)\n }\n\n const handleOpenOptionDialog = () => {\n resetOptionDialog()\n setOptionDialogOpen(true)\n }\n\n const handleCloseOptionDialog = () => {\n resetOptionDialog()\n setOptionDialogOpen(false)\n }\n\n const handleAddOption = () => {\n const value = optionValueDraft.trim()\n const label = optionLabelDraft.trim()\n if (!value) {\n setOptionFormError('Value is required')\n return\n }\n setOptionFormError(null)\n const nextOptions = Array.isArray(local.configJson?.options) ? [...local.configJson!.options] : []\n nextOptions.push({ value, label: label || value })\n apply({ configJson: { ...(local.configJson || {}), options: nextOptions } }, true)\n handleCloseOptionDialog()\n }\n\n const handleRemoveOption = (index: number) => {\n const nextOptions = Array.isArray(local.configJson?.options) ? [...local.configJson!.options] : []\n nextOptions.splice(index, 1)\n apply({ configJson: { ...(local.configJson || {}), options: nextOptions } }, true)\n }\n\n return (\n <>\n <div className=\"rounded border p-3 bg-card transition-colors hover:border-muted-foreground/60\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center justify-center h-5 w-5 rounded hover:bg-muted cursor-grab active:cursor-grabbing\">\n <GripVertical className=\"h-4 w-4 opacity-70\" />\n </span>\n Drag to reorder\n </div>\n <div className=\"flex items-center gap-3\">\n <label className=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={local.isActive !== false} onChange={(event) => { apply({ isActive: event.target.checked }, true) }} /> Active\n </label>\n {onTranslate && (\n <IconButton variant=\"outline\" size=\"sm\" onClick={onTranslate} aria-label=\"Translate field\">\n <Languages className=\"h-4 w-4\" />\n </IconButton>\n )}\n <IconButton variant=\"outline\" size=\"sm\" onClick={onRemove} aria-label=\"Remove field\">\n <Trash2 className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-12 gap-3 items-center\">\n <div className=\"md:col-span-6\">\n <label className=\"text-xs\">Key</label>\n <input\n className={`rounded w-full px-2 py-1 text-sm font-mono ${error?.key ? 'border-red-500 border' : 'border'}`}\n placeholder=\"snake_case\"\n value={local.key}\n onChange={(event) => apply({ key: event.target.value })}\n onBlur={commit}\n />\n {error?.key ? <div className=\"text-xs text-red-600 mt-1\">{error.key}</div> : null}\n </div>\n <div className=\"md:col-span-6\">\n <label className=\"text-xs\">Kind</label>\n <select\n className={`rounded w-full px-2 py-1 text-sm ${error?.kind ? 'border-red-500 border' : 'border'}`}\n value={local.kind}\n onChange={(event) => { apply({ kind: event.target.value }, true) }}\n >\n {kindOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {error?.kind ? <div className=\"text-xs text-red-600 mt-1\">{error.kind}</div> : null}\n </div>\n </div>\n\n {allowFieldsetSelection ? (\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs\">Assign to fieldset</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={currentFieldsetValue}\n onChange={(event) => handleFieldsetSelect(event.target.value)}\n >\n <option value=\"\">Unassigned</option>\n {(fieldsets || []).map((fs) => (\n <option key={fs.code} value={fs.code}>\n {fs.label || fs.code}\n </option>\n ))}\n </select>\n </div>\n {currentFieldsetValue ? (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-xs\">Group</label>\n </div>\n <div className=\"flex items-center gap-2 mt-1\">\n <select\n className=\"flex-1 border rounded px-2 py-1 text-sm\"\n value={currentGroup?.code ?? ''}\n onChange={(event) => handleGroupSelect(event.target.value)}\n >\n <option value=\"\">No group</option>\n {groupOptions.map((group) => (\n <option key={group.code} value={group.code}>\n {group.title || group.code}\n </option>\n ))}\n </select>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground\"\n onClick={() => handleOpenGroupDialog()}\n aria-label=\"Create group\"\n >\n <Plus className=\"h-4 w-4\" />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground\"\n onClick={() => handleOpenGroupDialog()}\n aria-label=\"Edit groups\"\n >\n <Cog className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.label === 'string' ? local.configJson.label : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), label: event.target.value } })}\n onBlur={commit}\n />\n </div>\n <div>\n <label className=\"text-xs\">Description</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.description === 'string' ? local.configJson.description : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), description: event.target.value } })}\n onBlur={commit}\n />\n </div>\n\n {(local.kind === 'text' || local.kind === 'multiline') && (\n <>\n <div>\n <label className=\"text-xs\">Editor</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.editor === 'string' ? local.configJson.editor : ''}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), editor: event.target.value || undefined } }, true) }}\n >\n <option value=\"\">Default</option>\n <option value=\"markdown\">Markdown (UIW)</option>\n <option value=\"simpleMarkdown\">Simple Markdown</option>\n <option value=\"htmlRichText\">HTML Rich Text</option>\n </select>\n </div>\n {local.kind === 'text' && (\n <>\n <div className=\"md:col-span-2\">\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input type=\"checkbox\" checked={!!local.configJson?.multi} onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), multi: event.target.checked } }, true) }} /> Multiple\n </label>\n </div>\n {!!local.configJson?.multi && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Multi-select input style</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={local.configJson?.input === 'listbox' ? 'listbox' : 'default'}\n onChange={(event) => {\n const { value } = event.target\n const nextConfig = { ...(local.configJson || {}) }\n if (value === 'listbox') nextConfig.input = 'listbox'\n else delete nextConfig.input\n apply({ configJson: nextConfig }, true)\n }}\n >\n <option value=\"default\">Default</option>\n <option value=\"listbox\">Listbox (searchable)</option>\n </select>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {local.kind === 'select' && (\n <div className=\"md:col-span-6 space-y-3\">\n <label className=\"text-xs\">Options</label>\n <div className=\"space-y-2\">\n {resolvedOptions.length > 0 ? (\n resolvedOptions.map((option, idx) => (\n <div\n key={`${option.value}-${idx}`}\n className=\"flex items-center justify-between rounded border px-3 py-2 text-xs bg-muted\"\n >\n <div>\n <div className=\"font-medium text-foreground\">{option.label}</div>\n <div className=\"text-muted-foreground font-mono text-overline\">{option.value}</div>\n </div>\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n className=\"text-red-500 hover:text-red-700\"\n onClick={() => handleRemoveOption(idx)}\n aria-label=\"Remove option\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </IconButton>\n </div>\n ))\n ) : (\n <span className=\"text-xs text-muted-foreground\">No options defined.</span>\n )}\n </div>\n <div className=\"flex justify-end\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={handleOpenOptionDialog}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add option\n </Button>\n </div>\n </div>\n )}\n\n {(local.kind === 'select' || local.kind === 'relation') && (\n <>\n <div>\n <label className=\"text-xs\">Options URL</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"/api/...\"\n value={typeof local.configJson?.optionsUrl === 'string' ? local.configJson.optionsUrl : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), optionsUrl: event.target.value } })}\n onBlur={commit}\n />\n </div>\n {local.kind === 'relation' && (\n <div>\n <label className=\"text-xs\">Related Entity ID</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm font-mono\"\n placeholder=\"module:entity\"\n value={typeof local.configJson?.relatedEntityId === 'string' ? local.configJson.relatedEntityId : ''}\n onChange={(event) => {\n const relatedEntityId = event.target.value\n const defOptionsUrl = relatedEntityId\n ? `/api/entities/relations/options?entityId=${encodeURIComponent(relatedEntityId)}`\n : ''\n apply({\n configJson: {\n ...(local.configJson || {}),\n relatedEntityId,\n optionsUrl: local.configJson?.optionsUrl || defOptionsUrl,\n },\n })\n }}\n onBlur={commit}\n />\n </div>\n )}\n </>\n )}\n\n {local.kind === 'currency' && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Options source</label>\n <div className=\"rounded border bg-muted px-2 py-1 text-xs text-muted-foreground\">\n /api/currencies/options\n </div>\n </div>\n )}\n\n {(local.kind === 'integer' || local.kind === 'float') && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Units (optional)</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"kg, cm, etc.\"\n value={typeof local.configJson?.unit === 'string' ? local.configJson.unit : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), unit: event.target.value } })}\n onBlur={commit}\n />\n </div>\n )}\n </div>\n\n <div className=\"mt-3 pt-3 border-t\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"text-sm font-medium\">Validation rules</label>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => {\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n list.push({ rule: 'required', message: 'This field is required' } as any)\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add rule\n </Button>\n </div>\n <div className=\"space-y-2\">\n {(Array.isArray(local.configJson?.validation) ? local.configJson!.validation : []).map((rule: any, index: number) => (\n <div key={index} className=\"grid grid-cols-1 md:grid-cols-12 gap-2 items-center\">\n <div className=\"md:col-span-3\">\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={rule?.rule || 'required'}\n onChange={(event) => {\n const nextRule = event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, rule: nextRule, message: existing.message || rule?.message || '' }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <option value=\"required\">required</option>\n <option value=\"date\">date</option>\n <option value=\"integer\">integer</option>\n <option value=\"float\">float</option>\n <option value=\"lt\">lt</option>\n <option value=\"lte\">lte</option>\n <option value=\"gt\">gt</option>\n <option value=\"gte\">gte</option>\n <option value=\"eq\">eq</option>\n <option value=\"ne\">ne</option>\n <option value=\"regex\">regex</option>\n </select>\n </div>\n <div className=\"md:col-span-4\">\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder={rule?.rule === 'regex' ? 'Pattern (e.g. ^[a-z]+$)' : (['lt','lte','gt','gte'].includes(rule?.rule) ? 'Number' : '\u2014')}\n value={rule?.param ?? ''}\n onChange={(event) => {\n const value = ['lt','lte','gt','gte'].includes(rule?.rule) ? Number(event.target.value) : event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, ...rule, param: value }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n })\n }}\n onBlur={commit}\n disabled={rule?.rule === 'required' || rule?.rule === 'date' || rule?.rule === 'integer' || rule?.rule === 'float'}\n />\n </div>\n <div className=\"md:col-span-4\">\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"Error message\"\n value={rule?.message || ''}\n onChange={(event) => {\n const message = event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, ...rule, message }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n })\n }}\n onBlur={commit}\n />\n </div>\n <div className=\"md:col-span-1 flex justify-end\">\n <IconButton\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Remove rule\"\n onClick={() => {\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n list.splice(index, 1)\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <Trash2 className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n ))}\n {(!Array.isArray(local.configJson?.validation) || local.configJson!.validation.length === 0) && (\n <div className=\"text-xs text-muted-foreground\">No validation rules defined.</div>\n )}\n </div>\n </div>\n\n <div className=\"mt-3\">\n {(() => {\n const Editor = FieldRegistry.getDefEditor(local.kind)\n if (!Editor) return null\n return (\n <Editor\n def={{ key: local.key, kind: local.kind, configJson: local.configJson }}\n onChange={(patch) => apply({ configJson: { ...(local.configJson || {}), ...(patch || {}) } }, true)}\n />\n )\n })()}\n </div>\n\n {/* Default value control \u2014 shown for kinds without a dedicated FieldRegistry defEditor default section */}\n {(() => {\n // Dictionary kind handles defaults in its own defEditor; skip here\n if (local.kind === 'dictionary') return null\n // Relation and attachment kinds do not support defaults\n if (local.kind === 'relation' || local.kind === 'attachment') return null\n const currentDefault = local.configJson?.defaultValue\n if (local.kind === 'boolean') {\n const boolDefault = currentDefault === true ? 'true' : currentDefault === false ? 'false' : ''\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={boolDefault}\n onChange={(event) => {\n const raw = event.target.value\n const value = raw === 'true' ? true : raw === 'false' ? false : undefined\n apply({ configJson: { ...(local.configJson || {}), defaultValue: value } }, true)\n }}\n >\n <option value=\"\">{t('entities.customFields.fields.defaultValueNone', 'No default')}</option>\n <option value=\"true\">{t('entities.customFields.fields.defaultValueTrue', 'Checked (true)')}</option>\n <option value=\"false\">{t('entities.customFields.fields.defaultValueFalse', 'Unchecked (false)')}</option>\n </select>\n </div>\n )\n }\n // select with static options \u2014 picker\n if (local.kind === 'select' && !local.configJson?.multi) {\n const opts = normalizeCustomFieldOptions(local.configJson?.options || [])\n if (opts.length > 0) {\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof currentDefault === 'string' || typeof currentDefault === 'number' ? String(currentDefault) : ''}\n onChange={(event) => {\n const raw = event.target.value\n if (!raw) {\n apply({ configJson: { ...(local.configJson || {}), defaultValue: undefined } }, true)\n return\n }\n // Preserve the original option type (string or number) instead of coercing to string\n const matched = opts.find((o) => String(o.value) === raw)\n const typed = matched ? matched.value : raw\n apply({ configJson: { ...(local.configJson || {}), defaultValue: typed } }, true)\n }}\n >\n <option value=\"\">{t('entities.customFields.fields.defaultValueNone', 'No default')}</option>\n {opts.map((option) => (\n <option key={String(option.value)} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n )\n }\n }\n // Numeric kinds\n if (local.kind === 'integer' || local.kind === 'float') {\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <input\n type=\"number\"\n step={local.kind === 'integer' ? '1' : 'any'}\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof currentDefault === 'number' ? String(currentDefault) : ''}\n onChange={(event) => {\n const raw = event.target.value\n const parsed = raw === '' ? undefined : (local.kind === 'integer' ? parseInt(raw, 10) : parseFloat(raw))\n const value = parsed !== undefined && !isNaN(parsed) ? parsed : undefined\n apply({ configJson: { ...(local.configJson || {}), defaultValue: value } })\n }}\n onBlur={commit}\n placeholder={t('entities.customFields.fields.defaultValuePlaceholder', 'No default')}\n />\n </div>\n )\n }\n // Text-like kinds (text, multiline, date, datetime, currency)\n if (['text', 'multiline', 'date', 'datetime', 'currency'].includes(local.kind)) {\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof currentDefault === 'string' ? currentDefault : ''}\n onChange={(event) => {\n const value = event.target.value\n apply({ configJson: { ...(local.configJson || {}), defaultValue: value || undefined } })\n }}\n onBlur={commit}\n placeholder={t('entities.customFields.fields.defaultValuePlaceholder', 'No default')}\n />\n </div>\n )\n }\n return null\n })()}\n\n <div className=\"mt-3 pt-2 border-t flex flex-wrap items-center gap-4\">\n <span className=\"text-xs text-muted-foreground\">{t('entities.customFields.fields.visibility', 'Visibility:')}</span>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={local.configJson?.listVisible !== false}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), listVisible: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.listVisible', 'List')}\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={!!local.configJson?.filterable}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), filterable: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.filterable', 'Filter')}\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={local.configJson?.formEditable !== false}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), formEditable: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.formEditable', 'Form')}\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={!!local.configJson?.encrypted}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), encrypted: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.encrypted', 'Encrypted')}\n </label>\n </div>\n </div>\n <Dialog\n open={optionDialogOpen}\n onOpenChange={(open) => {\n setOptionDialogOpen(open)\n if (!open) resetOptionDialog()\n }}\n >\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Add option</DialogTitle>\n <DialogDescription>Provide the stored value and optional label shown to users.</DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div>\n <label className=\"text-xs\">Value</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm font-mono\"\n placeholder=\"unique_value\"\n value={optionValueDraft}\n onChange={(event) => {\n setOptionFormError(null)\n setOptionValueDraft(event.target.value)\n }}\n />\n {optionFormError ? <p className=\"mt-1 text-xs text-red-600\">{optionFormError}</p> : null}\n </div>\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n placeholder=\"Label shown to users (optional)\"\n value={optionLabelDraft}\n onChange={(event) => setOptionLabelDraft(event.target.value)}\n />\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={handleCloseOptionDialog}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleAddOption}>\n Add option\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog\n open={groupDialogOpen}\n onOpenChange={(open) => {\n setGroupDialogOpen(open)\n if (!open) {\n setGroupError(null)\n setEditingGroupCode(null)\n setGroupDraft({ code: '', title: '', hint: '' })\n }\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>{editingGroupCode ? 'Edit group' : 'New group'}</DialogTitle>\n <DialogDescription>\n {editingGroupCode ? 'Update the selected group for this fieldset.' : 'Add a reusable group for this fieldset.'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label className=\"text-xs font-medium\">Group code</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm font-mono disabled:cursor-not-allowed disabled:bg-muted/50 disabled:text-muted-foreground\"\n value={groupDraft.code}\n onChange={(event) => {\n setGroupDraft((prev) => ({ ...prev, code: event.target.value }))\n if (groupError) setGroupError(null)\n }}\n disabled={!!editingGroupCode}\n placeholder=\"e.g. buying_committee\"\n />\n {groupError ? <div className=\"text-xs text-red-600 mt-1\">{groupError}</div> : null}\n </div>\n <div>\n <label className=\"text-xs font-medium\">Label</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n value={groupDraft.title}\n onChange={(event) => setGroupDraft((prev) => ({ ...prev, title: event.target.value }))}\n placeholder=\"Buying committee\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium\">Hint</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n value={groupDraft.hint}\n onChange={(event) => setGroupDraft((prev) => ({ ...prev, hint: event.target.value }))}\n placeholder=\"Visible to merchandisers\"\n />\n </div>\n {currentFieldsetValue && groupOptions.length > 0 ? (\n <div>\n <div className=\"text-xs font-medium mb-1\">Existing groups</div>\n <div className=\"space-y-2 max-h-40 overflow-y-auto\">\n {groupOptions.map((group) => (\n <div key={group.code} className=\"flex items-center justify-between rounded border px-3 py-2 text-sm\">\n <div>\n <div className=\"font-medium\">{group.title || group.code}</div>\n <div className=\"text-xs text-muted-foreground font-mono\">{group.code}</div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => handleEditGroupEntry(group)}\n aria-label={`Edit ${group.code}`}\n >\n <Pencil className=\"h-4 w-4\" />\n </IconButton>\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n className=\"text-red-500 hover:text-red-600\"\n onClick={() => handleRemoveGroupEntry(group.code)}\n aria-label={`Delete ${group.code}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setGroupDialogOpen(false)}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleGroupDialogSubmit}>\n Save group\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n})\n\nFieldDefinitionCard.displayName = 'FieldDefinitionCard'\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Cog, GripVertical, Languages, Pencil, Plus, Trash2, X } from 'lucide-react'\nimport { Button } from '../../primitives/button'\nimport { IconButton } from '../../primitives/icon-button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../primitives/select'\nimport { CUSTOM_FIELD_KINDS } from '@open-mercato/shared/modules/entities/kinds'\nimport { FieldRegistry } from '../fields/registry'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport { useConfirmDialog } from '../confirm-dialog'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../../primitives/dialog'\nimport {\n normalizeCustomFieldOptions,\n type CustomFieldOptionDto,\n} from '@open-mercato/shared/modules/entities/options'\n\ntype FieldsetGroup = { code: string; title?: string; hint?: string }\ntype FieldsetConfig = { code: string; label: string; icon?: string; description?: string; groups?: FieldsetGroup[] }\n\nexport type FieldDefinition = {\n key: string\n kind: string\n configJson?: Record<string, unknown>\n isActive?: boolean\n}\n\nexport type FieldDefinitionError = { key?: string; kind?: string }\n\nexport type FieldDefinitionsEditorProps = {\n definitions: FieldDefinition[]\n errors?: Record<number, FieldDefinitionError>\n deletedKeys?: string[]\n kindOptions?: Array<{ value: string; label: string }>\n orderNotice?: { dirty: boolean; saving?: boolean; message?: string }\n infoNote?: React.ReactNode\n addButtonLabel?: string\n fieldsets?: FieldsetConfig[]\n activeFieldset?: string | null\n onActiveFieldsetChange?: (code: string | null) => void\n onFieldsetsChange?: (next: FieldsetConfig[]) => void\n onFieldsetCodeChange?: (previousCode: string, nextCode: string) => void\n onFieldsetRemoved?: (code: string) => void\n onAddField: () => void\n onRemoveField: (index: number) => void\n onDefinitionChange: (index: number, next: FieldDefinition) => void\n onRestoreField?: (key: string) => void\n onReorder?: (from: number, to: number) => void\n onTranslate?: (definition: FieldDefinition, index: number) => void\n listRef?: React.Ref<HTMLDivElement>\n listProps?: React.HTMLAttributes<HTMLDivElement>\n singleFieldsetPerRecord?: boolean\n onSingleFieldsetPerRecordChange?: (value: boolean) => void\n translate?: (key: string, fallback: string) => string\n}\n\nconst DEFAULT_KIND_OPTIONS = CUSTOM_FIELD_KINDS.map((k) => ({\n value: k,\n label: k.charAt(0).toUpperCase() + k.slice(1),\n}))\n\nconst FIELDSET_ICON_OPTIONS = [\n { value: 'layers', label: 'Layers' },\n { value: 'tag', label: 'Tag' },\n { value: 'sparkles', label: 'Sparkles' },\n { value: 'package', label: 'Package' },\n { value: 'shirt', label: 'Shirt' },\n { value: 'grid', label: 'Grid' },\n { value: 'shoppingBag', label: 'Shopping bag' },\n { value: 'shoppingCart', label: 'Shopping cart' },\n { value: 'store', label: 'Store' },\n { value: 'users', label: 'Users' },\n { value: 'briefcase', label: 'Briefcase' },\n { value: 'building', label: 'Building' },\n { value: 'bookOpen', label: 'Book open' },\n { value: 'bookmark', label: 'Bookmark' },\n { value: 'camera', label: 'Camera' },\n { value: 'car', label: 'Car' },\n { value: 'clock', label: 'Clock' },\n { value: 'cloud', label: 'Cloud' },\n { value: 'compass', label: 'Compass' },\n { value: 'creditCard', label: 'Credit card' },\n { value: 'database', label: 'Database' },\n { value: 'flame', label: 'Flame' },\n { value: 'gift', label: 'Gift' },\n { value: 'globe', label: 'Globe' },\n { value: 'heart', label: 'Heart' },\n { value: 'key', label: 'Key' },\n { value: 'map', label: 'Map' },\n { value: 'palette', label: 'Palette' },\n { value: 'shield', label: 'Shield' },\n { value: 'star', label: 'Star' },\n { value: 'truck', label: 'Truck' },\n { value: 'zap', label: 'Zap' },\n { value: 'coins', label: 'Coins' },\n]\n\nfunction slugifyFieldsetCode(value: string): string {\n return slugify(value, { replacement: '', allowedChars: '_-' })\n}\n\nfunction ensureUniqueFieldsetCode(base: string, existing: FieldsetConfig[]): string {\n const sanitizedBase = slugifyFieldsetCode(base) || 'fieldset'\n let candidate = sanitizedBase\n let counter = 1\n const existingCodes = new Set(existing.map((fs) => fs.code))\n while (existingCodes.has(candidate)) {\n counter += 1\n candidate = `${sanitizedBase}_${counter}`\n }\n return candidate\n}\n\nfunction normalizeGroupValue(raw: unknown): FieldsetGroup | null {\n if (!raw) return null\n if (typeof raw === 'string') {\n const code = raw.trim()\n return code ? { code } : null\n }\n if (typeof raw !== 'object') return null\n const entry = raw as Record<string, unknown>\n const code = typeof entry.code === 'string' ? entry.code.trim() : ''\n if (!code) return null\n const group: FieldsetGroup = { code }\n if (typeof entry.title === 'string' && entry.title.trim()) group.title = entry.title.trim()\n if (typeof entry.hint === 'string' && entry.hint.trim()) group.hint = entry.hint.trim()\n return group\n}\n\nexport function FieldDefinitionsEditor({\n definitions,\n errors,\n deletedKeys,\n kindOptions = DEFAULT_KIND_OPTIONS,\n orderNotice,\n infoNote = (\n <div className=\"text-xs text-muted-foreground mt-2\">\n Supported kinds: text, multiline, integer, float, boolean, select (with options/optionsUrl), currency (fixed currencies list), relation (with related entity and options URL).\n </div>\n ),\n addButtonLabel = 'Add Field',\n fieldsets = [],\n activeFieldset = null,\n onActiveFieldsetChange,\n onFieldsetsChange,\n onFieldsetCodeChange,\n onFieldsetRemoved,\n singleFieldsetPerRecord,\n onSingleFieldsetPerRecordChange,\n onAddField,\n onRemoveField,\n onDefinitionChange,\n onRestoreField,\n onReorder,\n onTranslate,\n listRef,\n listProps,\n translate,\n}: FieldDefinitionsEditorProps) {\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const dragIndex = React.useRef<number | null>(null)\n const hasFieldsets = fieldsets.length > 0\n const t = React.useCallback((key: string, fallback: string) => (translate ? translate(key, fallback) : fallback), [translate])\n const resolvedActiveFieldset = React.useMemo(() => {\n if (!hasFieldsets) return activeFieldset ?? null\n if (activeFieldset === null) return null\n return fieldsets.some((fs) => fs.code === activeFieldset) ? activeFieldset : (fieldsets[0]?.code ?? null)\n }, [activeFieldset, fieldsets, hasFieldsets])\n\n const filteredDefinitions = React.useMemo(\n () =>\n definitions\n .map((definition, index) => ({ definition, index }))\n .filter(({ definition }) => {\n if (!hasFieldsets) return true\n const assigned = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : undefined\n if (!resolvedActiveFieldset) return !assigned\n return assigned === resolvedActiveFieldset\n }),\n [definitions, hasFieldsets, resolvedActiveFieldset],\n )\n\n const activeFieldsetConfig = hasFieldsets && resolvedActiveFieldset\n ? fieldsets.find((fs) => fs.code === resolvedActiveFieldset) ?? null\n : null\n\n const handleActiveFieldsetChange = (value: string) => {\n if (!onActiveFieldsetChange) return\n onActiveFieldsetChange(value ? value : null)\n }\n\n const handleFieldsetPatch = (code: string, patch: Partial<FieldsetConfig>) => {\n if (!onFieldsetsChange) return\n const next = fieldsets.map((fs) => (fs.code === code ? { ...fs, ...patch } : fs))\n onFieldsetsChange(next)\n }\n\n const handleFieldsetCodeInput = (code: string, nextValue: string) => {\n if (!onFieldsetsChange) return\n const target = fieldsets.find((fs) => fs.code === code)\n if (!target) return\n const sanitized = slugifyFieldsetCode(nextValue)\n if (!sanitized) return\n const next = fieldsets.map((fs) => (fs.code === code ? { ...fs, code: sanitized } : fs))\n onFieldsetsChange(next)\n onFieldsetCodeChange?.(code, sanitized)\n onActiveFieldsetChange?.(sanitized)\n }\n\n const handleAddFieldset = () => {\n if (!onFieldsetsChange) return\n const code = ensureUniqueFieldsetCode(`fieldset_${fieldsets.length + 1}`, fieldsets)\n const nextFieldsets = [...fieldsets, { code, label: 'New fieldset', icon: 'layers' }]\n onFieldsetsChange(nextFieldsets)\n onActiveFieldsetChange?.(code)\n }\n\n const handleRemoveFieldset = async () => {\n if (!onFieldsetsChange) return\n if (!resolvedActiveFieldset) return\n const confirmed = await confirm({\n title: `Delete fieldset \"${resolvedActiveFieldset}\"?`,\n text: 'This will move its fields to Unassigned.',\n variant: 'destructive',\n })\n if (!confirmed) return\n const next = fieldsets.filter((fs) => fs.code !== resolvedActiveFieldset)\n onFieldsetsChange(next)\n onFieldsetRemoved?.(resolvedActiveFieldset)\n const fallback = next[0]?.code ?? null\n onActiveFieldsetChange?.(fallback)\n }\n\n const registerGroup = React.useCallback(\n (fieldsetCode: string, group: FieldsetGroup) => {\n if (!onFieldsetsChange || !fieldsetCode) return\n const next = fieldsets.map((fs) => {\n if (fs.code !== fieldsetCode) return fs\n const list = Array.isArray(fs.groups) ? fs.groups : []\n const existingIndex = list.findIndex((entry) => entry.code === group.code)\n if (existingIndex >= 0) {\n const updated = [...list]\n updated[existingIndex] = { ...list[existingIndex], ...group }\n return { ...fs, groups: updated }\n }\n return { ...fs, groups: [...list, group] }\n })\n onFieldsetsChange(next)\n },\n [fieldsets, onFieldsetsChange],\n )\n const removeGroup = React.useCallback(\n (fieldsetCode: string, groupCode: string) => {\n if (!onFieldsetsChange || !fieldsetCode || !groupCode) return\n const next = fieldsets.map((fs) => {\n if (fs.code !== fieldsetCode) return fs\n const list = Array.isArray(fs.groups) ? fs.groups : []\n return { ...fs, groups: list.filter((entry) => entry.code !== groupCode) }\n })\n onFieldsetsChange(next)\n },\n [fieldsets, onFieldsetsChange],\n )\n const availableGroups = activeFieldsetConfig?.groups ?? []\n const canToggleSingleFieldset = hasFieldsets && fieldsets.length > 1\n const singleFieldsetChecked = singleFieldsetPerRecord !== false\n\n const handleReorder = React.useCallback(\n (from: number, to: number) => {\n if (from === to) return\n onReorder?.(from, to)\n },\n [onReorder],\n )\n\n return (\n <div\n ref={listRef}\n className=\"space-y-3\"\n {...listProps}\n >\n {hasFieldsets ? (\n <div className=\"rounded border bg-card p-3 space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">Fieldset</label>\n <Select\n value={resolvedActiveFieldset || undefined}\n onValueChange={(value) => handleActiveFieldsetChange(value ?? '')}\n >\n <SelectTrigger size=\"sm\" className=\"w-auto min-w-[10rem]\">\n <SelectValue placeholder=\"Unassigned fields\" />\n </SelectTrigger>\n <SelectContent>\n {fieldsets.map((fs) => (\n <SelectItem key={fs.code} value={fs.code}>\n {fs.label || fs.code}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleAddFieldset}\n className=\"text-xs\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRemoveFieldset}\n disabled={!resolvedActiveFieldset}\n className=\"text-xs\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" /> Delete\n </Button>\n </div>\n {resolvedActiveFieldset && activeFieldsetConfig ? (\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <div>\n <label className=\"text-xs\">Code</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm font-mono\"\n value={activeFieldsetConfig.code}\n onChange={(event) => handleFieldsetCodeInput(activeFieldsetConfig.code, event.target.value)}\n />\n </div>\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.label}\n onChange={(event) => handleFieldsetPatch(activeFieldsetConfig.code, { label: event.target.value })}\n />\n </div>\n <div>\n <label className=\"text-xs\">Icon</label>\n <Select\n value={activeFieldsetConfig.icon || undefined}\n onValueChange={(value) =>\n handleFieldsetPatch(activeFieldsetConfig.code, {\n icon: value || undefined,\n })\n }\n >\n <SelectTrigger size=\"sm\">\n <SelectValue placeholder=\"Default\" />\n </SelectTrigger>\n <SelectContent>\n {FIELDSET_ICON_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label className=\"text-xs\">Description</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.description ?? ''}\n onChange={(event) => handleFieldsetPatch(activeFieldsetConfig.code, { description: event.target.value })}\n />\n </div>\n </div>\n ) : null}\n <div className=\"flex items-center gap-2 text-xs\">\n <label className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n disabled={!canToggleSingleFieldset}\n checked={singleFieldsetChecked}\n onChange={(event) => onSingleFieldsetPerRecordChange?.(event.target.checked)}\n />\n Single fieldset per entity\n </label>\n {!canToggleSingleFieldset ? (\n <span className=\"text-muted-foreground\">(add at least two fieldsets to toggle)</span>\n ) : null}\n </div>\n </div>\n ) : (\n <div className=\"rounded border border-dashed bg-muted/30 p-4 text-sm text-muted-foreground flex flex-col gap-3\">\n <div>No fieldsets defined yet. Fieldsets let you group custom fields for different variants of the same entity (e.g., Fashion vs. Sport products).</div>\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleAddFieldset}\n >\n <Plus className=\"h-4 w-4\" />\n Add first fieldset\n </Button>\n </div>\n </div>\n )}\n {orderNotice?.dirty && (\n <div className=\"sticky top-0 z-sticky -mt-1 -mb-1\">\n <div className=\"inline-flex items-center gap-2 text-xs px-2 py-1 rounded border bg-amber-50 text-amber-800 shadow-sm\">\n {orderNotice?.saving ? 'Saving order\u2026' : (orderNotice?.message ?? 'Reordered \u2014 saving soon')}\n </div>\n </div>\n )}\n {filteredDefinitions.map(({ definition, index }) => {\n const assignedFieldset = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : null\n const groupOptions = assignedFieldset\n ? fieldsets.find((fs) => fs.code === assignedFieldset)?.groups ?? []\n : availableGroups\n return (\n <div\n key={definition.key || `def-${index}`}\n className=\"group\"\n draggable\n onDragStart={() => { dragIndex.current = index }}\n onDragOver={(event) => { event.preventDefault() }}\n onDrop={() => {\n const from = dragIndex.current\n if (from == null) return\n dragIndex.current = null\n handleReorder(from, index)\n }}\n onDragEnd={() => { dragIndex.current = null }}\n tabIndex={0}\n onKeyDown={(event) => {\n if (!event.altKey) return\n if (event.key === 'ArrowUp' || event.key === 'Up') {\n event.preventDefault()\n handleReorder(index, Math.max(0, index - 1))\n }\n if (event.key === 'ArrowDown' || event.key === 'Down') {\n event.preventDefault()\n handleReorder(index, Math.min(definitions.length - 1, index + 1))\n }\n }}\n >\n <FieldDefinitionCard\n definition={definition}\n error={errors?.[index]}\n kindOptions={kindOptions}\n onChange={(next) => onDefinitionChange(index, next)}\n onRemove={() => onRemoveField(index)}\n allowFieldsetSelection={hasFieldsets}\n fieldsets={fieldsets}\n activeFieldset={resolvedActiveFieldset}\n availableGroups={groupOptions}\n onRegisterGroup={registerGroup}\n onRemoveGroup={removeGroup}\n onTranslate={onTranslate ? () => onTranslate(definition, index) : undefined}\n translate={t}\n />\n </div>\n )})}\n <div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAddField}\n >\n <Plus className=\"h-4 w-4\" /> {addButtonLabel}\n </Button>\n {infoNote}\n {deletedKeys && deletedKeys.length > 0 && onRestoreField ? (\n <div className=\"text-xs text-muted-foreground mt-2\">\n Restore deleted fields:{' '}\n {deletedKeys.map((key, idx) => (\n <span key={key}>\n <Button\n variant=\"link\"\n className=\"h-auto p-0 text-blue-600\"\n onClick={() => onRestoreField(key)}\n >\n {key}\n </Button>\n {idx < deletedKeys.length - 1 ? ', ' : ''}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n {ConfirmDialogElement}\n </div>\n )\n}\n\ntype FieldDefinitionCardProps = {\n definition: FieldDefinition\n error?: FieldDefinitionError\n kindOptions: Array<{ value: string; label: string }>\n onChange: (next: FieldDefinition) => void\n onRemove: () => void\n allowFieldsetSelection?: boolean\n fieldsets?: FieldsetConfig[]\n activeFieldset?: string | null\n availableGroups?: FieldsetGroup[]\n onRegisterGroup?: (fieldsetCode: string, group: FieldsetGroup) => void\n onRemoveGroup?: (fieldsetCode: string, groupCode: string) => void\n onTranslate?: () => void\n translate?: (key: string, fallback: string) => string\n}\n\nconst FieldDefinitionCard = React.memo(function FieldDefinitionCard({\n definition,\n error,\n kindOptions,\n onChange,\n onRemove,\n allowFieldsetSelection = false,\n fieldsets = [],\n activeFieldset,\n availableGroups = [],\n onRegisterGroup,\n onRemoveGroup,\n onTranslate,\n translate,\n}: FieldDefinitionCardProps) {\n const [local, setLocal] = React.useState<FieldDefinition>(definition)\n const localRef = React.useRef<FieldDefinition>(definition)\n const [optionValueDraft, setOptionValueDraft] = React.useState('')\n const [optionLabelDraft, setOptionLabelDraft] = React.useState('')\n const [optionDialogOpen, setOptionDialogOpen] = React.useState(false)\n const [optionFormError, setOptionFormError] = React.useState<string | null>(null)\n const [groupDialogOpen, setGroupDialogOpen] = React.useState(false)\n const [groupDraft, setGroupDraft] = React.useState({ code: '', title: '', hint: '' })\n const [editingGroupCode, setEditingGroupCode] = React.useState<string | null>(null)\n const [groupError, setGroupError] = React.useState<string | null>(null)\n const currentFieldsetValue = React.useMemo(\n () => (typeof local.configJson?.fieldset === 'string' ? local.configJson.fieldset : ''),\n [local.configJson?.fieldset],\n )\n const t = React.useCallback((key: string, fallback: string) => (translate ? translate(key, fallback) : fallback), [translate])\n React.useEffect(() => {\n localRef.current = definition\n setLocal(definition)\n }, [definition.key])\n React.useEffect(() => {\n setOptionValueDraft('')\n setOptionLabelDraft('')\n setGroupDialogOpen(false)\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupError(null)\n }, [definition.key])\n React.useEffect(() => {\n if (!currentFieldsetValue) {\n setGroupDialogOpen(false)\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupError(null)\n }\n }, [currentFieldsetValue])\n const currentGroup = React.useMemo(() => normalizeGroupValue(local.configJson?.group), [local])\n const groupOptions = React.useMemo(() => {\n const list = Array.isArray(availableGroups) ? [...availableGroups] : []\n if (currentGroup && !list.some((entry) => entry.code === currentGroup.code)) {\n list.push(currentGroup)\n }\n return list\n }, [availableGroups, currentGroup])\n const resolvedOptions = React.useMemo<CustomFieldOptionDto[]>(\n () => normalizeCustomFieldOptions(local.configJson?.options),\n [local.configJson?.options],\n )\n\n const sanitize = (def: FieldDefinition): FieldDefinition => {\n if (!def.configJson || !Array.isArray(def.configJson.options)) return def\n const normalizedOptions = normalizeCustomFieldOptions(def.configJson.options)\n return {\n ...def,\n configJson: {\n ...def.configJson,\n options: normalizedOptions,\n },\n }\n }\n\n const replaceLocal = React.useCallback((next: FieldDefinition) => {\n localRef.current = next\n setLocal(next)\n return next\n }, [])\n\n const apply = (patch: Partial<FieldDefinition> | ((current: FieldDefinition) => Partial<FieldDefinition>), propagateNow = false) => {\n const current = localRef.current\n const resolvedPatch = typeof patch === 'function' ? patch(current) : patch\n const next = { ...current, ...resolvedPatch }\n const resolvedNext = propagateNow ? sanitize(next) : next\n replaceLocal(resolvedNext)\n if (propagateNow) {\n onChange(resolvedNext)\n }\n }\n\n const commit = () => {\n const sanitized = sanitize(localRef.current)\n replaceLocal(sanitized)\n onChange(sanitized)\n }\n\n const handleFieldsetSelect = (value: string) => {\n const nextConfig = { ...(localRef.current.configJson || {}) }\n if (value) nextConfig.fieldset = value\n else delete nextConfig.fieldset\n delete nextConfig.group\n const next = { ...localRef.current, configJson: nextConfig }\n replaceLocal(next)\n onChange(next)\n }\n\n const handleGroupSelect = (value: string) => {\n if (!currentFieldsetValue) return\n if (!value) {\n const nextConfig = { ...(local.configJson || {}) }\n delete nextConfig.group\n apply({ configJson: nextConfig }, true)\n return\n }\n const match = groupOptions.find((group) => group.code === value)\n const nextGroup = match ?? { code: value }\n const nextConfig = { ...(local.configJson || {}) }\n nextConfig.group = nextGroup\n apply({ configJson: nextConfig }, true)\n onRegisterGroup?.(currentFieldsetValue, nextGroup)\n }\n\n const handleOpenGroupDialog = (group?: FieldsetGroup) => {\n if (!currentFieldsetValue) return\n if (group) {\n setGroupDraft({\n code: group.code,\n title: group.title ?? '',\n hint: group.hint ?? '',\n })\n setEditingGroupCode(group.code)\n } else {\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n }\n setGroupError(null)\n setGroupDialogOpen(true)\n }\n\n const handleGroupDialogSubmit = () => {\n if (!currentFieldsetValue) return\n const code = slugifyFieldsetCode(groupDraft.code || '')\n if (!code) {\n setGroupError('Group code is required.')\n return\n }\n const group: FieldsetGroup = {\n code,\n title: groupDraft.title.trim() || undefined,\n hint: groupDraft.hint.trim() || undefined,\n }\n onRegisterGroup?.(currentFieldsetValue, group)\n const shouldAttachToField = !editingGroupCode || currentGroup?.code === editingGroupCode\n if (shouldAttachToField) {\n const nextConfig = { ...(local.configJson || {}) }\n nextConfig.group = group\n apply({ configJson: nextConfig }, true)\n }\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupDialogOpen(false)\n }\n\n const handleRemoveGroupEntry = (code: string) => {\n if (!currentFieldsetValue) return\n onRemoveGroup?.(currentFieldsetValue, code)\n if (currentGroup?.code === code) {\n handleGroupSelect('')\n }\n if (editingGroupCode === code) {\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n }\n }\n\n const handleEditGroupEntry = (group: FieldsetGroup) => {\n handleOpenGroupDialog(group)\n }\n\n const resetOptionDialog = () => {\n setOptionValueDraft('')\n setOptionLabelDraft('')\n setOptionFormError(null)\n }\n\n const handleOpenOptionDialog = () => {\n resetOptionDialog()\n setOptionDialogOpen(true)\n }\n\n const handleCloseOptionDialog = () => {\n resetOptionDialog()\n setOptionDialogOpen(false)\n }\n\n const handleAddOption = () => {\n const value = optionValueDraft.trim()\n const label = optionLabelDraft.trim()\n if (!value) {\n setOptionFormError('Value is required')\n return\n }\n setOptionFormError(null)\n const nextOptions = Array.isArray(local.configJson?.options) ? [...local.configJson!.options] : []\n nextOptions.push({ value, label: label || value })\n apply({ configJson: { ...(local.configJson || {}), options: nextOptions } }, true)\n handleCloseOptionDialog()\n }\n\n const handleRemoveOption = (index: number) => {\n const nextOptions = Array.isArray(local.configJson?.options) ? [...local.configJson!.options] : []\n nextOptions.splice(index, 1)\n apply({ configJson: { ...(local.configJson || {}), options: nextOptions } }, true)\n }\n\n return (\n <>\n <div className=\"rounded border p-3 bg-card transition-colors hover:border-muted-foreground/60\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center justify-center h-5 w-5 rounded hover:bg-muted cursor-grab active:cursor-grabbing\">\n <GripVertical className=\"h-4 w-4 opacity-70\" />\n </span>\n Drag to reorder\n </div>\n <div className=\"flex items-center gap-3\">\n <label className=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={local.isActive !== false} onChange={(event) => { apply({ isActive: event.target.checked }, true) }} /> Active\n </label>\n {onTranslate && (\n <IconButton variant=\"outline\" size=\"sm\" onClick={onTranslate} aria-label=\"Translate field\">\n <Languages className=\"h-4 w-4\" />\n </IconButton>\n )}\n <IconButton variant=\"outline\" size=\"sm\" onClick={onRemove} aria-label=\"Remove field\">\n <Trash2 className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-12 gap-3 items-center\">\n <div className=\"md:col-span-6\">\n <label className=\"text-xs\">Key</label>\n <input\n className={`rounded w-full px-2 py-1 text-sm font-mono ${error?.key ? 'border-red-500 border' : 'border'}`}\n placeholder=\"snake_case\"\n value={local.key}\n onChange={(event) => apply({ key: event.target.value })}\n onBlur={commit}\n />\n {error?.key ? <div className=\"text-xs text-red-600 mt-1\">{error.key}</div> : null}\n </div>\n <div className=\"md:col-span-6\">\n <label className=\"text-xs\">Kind</label>\n <Select\n value={local.kind || undefined}\n onValueChange={(value) => { apply({ kind: value ?? '' }, true) }}\n >\n <SelectTrigger className={error?.kind ? 'border-destructive' : undefined}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {kindOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error?.kind ? <div className=\"text-xs text-red-600 mt-1\">{error.kind}</div> : null}\n </div>\n </div>\n\n {allowFieldsetSelection ? (\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs\">Assign to fieldset</label>\n <Select\n value={currentFieldsetValue || undefined}\n onValueChange={(value) => handleFieldsetSelect(value ?? '')}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Unassigned\" />\n </SelectTrigger>\n <SelectContent>\n {(fieldsets || []).map((fs) => (\n <SelectItem key={fs.code} value={fs.code}>\n {fs.label || fs.code}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n {currentFieldsetValue ? (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-xs\">Group</label>\n </div>\n <div className=\"flex items-center gap-2 mt-1\">\n <Select\n value={currentGroup?.code || undefined}\n onValueChange={(value) => handleGroupSelect(value ?? '')}\n >\n <SelectTrigger className=\"flex-1\">\n <SelectValue placeholder=\"No group\" />\n </SelectTrigger>\n <SelectContent>\n {groupOptions.map((group) => (\n <SelectItem key={group.code} value={group.code}>\n {group.title || group.code}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground\"\n onClick={() => handleOpenGroupDialog()}\n aria-label=\"Create group\"\n >\n <Plus className=\"h-4 w-4\" />\n </IconButton>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground\"\n onClick={() => handleOpenGroupDialog()}\n aria-label=\"Edit groups\"\n >\n <Cog className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.label === 'string' ? local.configJson.label : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), label: event.target.value } })}\n onBlur={commit}\n />\n </div>\n <div>\n <label className=\"text-xs\">Description</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.description === 'string' ? local.configJson.description : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), description: event.target.value } })}\n onBlur={commit}\n />\n </div>\n\n {(local.kind === 'text' || local.kind === 'multiline') && (\n <>\n <div>\n <label className=\"text-xs\">Editor</label>\n <Select\n value={typeof local.configJson?.editor === 'string' && local.configJson.editor ? local.configJson.editor : undefined}\n onValueChange={(value) => { apply({ configJson: { ...(local.configJson || {}), editor: value || undefined } }, true) }}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Default\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"markdown\">Markdown (UIW)</SelectItem>\n <SelectItem value=\"simpleMarkdown\">Simple Markdown</SelectItem>\n <SelectItem value=\"htmlRichText\">HTML Rich Text</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {local.kind === 'text' && (\n <>\n <div className=\"md:col-span-2\">\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input type=\"checkbox\" checked={!!local.configJson?.multi} onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), multi: event.target.checked } }, true) }} /> Multiple\n </label>\n </div>\n {!!local.configJson?.multi && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Multi-select input style</label>\n <Select\n value={local.configJson?.input === 'listbox' ? 'listbox' : 'default'}\n onValueChange={(value) => {\n const nextConfig = { ...(local.configJson || {}) }\n if (value === 'listbox') nextConfig.input = 'listbox'\n else delete nextConfig.input\n apply({ configJson: nextConfig }, true)\n }}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"default\">Default</SelectItem>\n <SelectItem value=\"listbox\">Listbox (searchable)</SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {local.kind === 'select' && (\n <div className=\"md:col-span-6 space-y-3\">\n <label className=\"text-xs\">Options</label>\n <div className=\"space-y-2\">\n {resolvedOptions.length > 0 ? (\n resolvedOptions.map((option, idx) => (\n <div\n key={`${option.value}-${idx}`}\n className=\"flex items-center justify-between rounded border px-3 py-2 text-xs bg-muted\"\n >\n <div>\n <div className=\"font-medium text-foreground\">{option.label}</div>\n <div className=\"text-muted-foreground font-mono text-overline\">{option.value}</div>\n </div>\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n className=\"text-red-500 hover:text-red-700\"\n onClick={() => handleRemoveOption(idx)}\n aria-label=\"Remove option\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </IconButton>\n </div>\n ))\n ) : (\n <span className=\"text-xs text-muted-foreground\">No options defined.</span>\n )}\n </div>\n <div className=\"flex justify-end\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={handleOpenOptionDialog}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add option\n </Button>\n </div>\n </div>\n )}\n\n {(local.kind === 'select' || local.kind === 'relation') && (\n <>\n <div>\n <label className=\"text-xs\">Options URL</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"/api/...\"\n value={typeof local.configJson?.optionsUrl === 'string' ? local.configJson.optionsUrl : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), optionsUrl: event.target.value } })}\n onBlur={commit}\n />\n </div>\n {local.kind === 'relation' && (\n <div>\n <label className=\"text-xs\">Related Entity ID</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm font-mono\"\n placeholder=\"module:entity\"\n value={typeof local.configJson?.relatedEntityId === 'string' ? local.configJson.relatedEntityId : ''}\n onChange={(event) => {\n const relatedEntityId = event.target.value\n const defOptionsUrl = relatedEntityId\n ? `/api/entities/relations/options?entityId=${encodeURIComponent(relatedEntityId)}`\n : ''\n apply({\n configJson: {\n ...(local.configJson || {}),\n relatedEntityId,\n optionsUrl: local.configJson?.optionsUrl || defOptionsUrl,\n },\n })\n }}\n onBlur={commit}\n />\n </div>\n )}\n </>\n )}\n\n {local.kind === 'currency' && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Options source</label>\n <div className=\"rounded border bg-muted px-2 py-1 text-xs text-muted-foreground\">\n /api/currencies/options\n </div>\n </div>\n )}\n\n {(local.kind === 'integer' || local.kind === 'float') && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Units (optional)</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"kg, cm, etc.\"\n value={typeof local.configJson?.unit === 'string' ? local.configJson.unit : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), unit: event.target.value } })}\n onBlur={commit}\n />\n </div>\n )}\n </div>\n\n <div className=\"mt-3 pt-3 border-t\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"text-sm font-medium\">Validation rules</label>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => {\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n list.push({ rule: 'required', message: 'This field is required' } as any)\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add rule\n </Button>\n </div>\n <div className=\"space-y-2\">\n {(Array.isArray(local.configJson?.validation) ? local.configJson!.validation : []).map((rule: any, index: number) => (\n <div key={index} className=\"grid grid-cols-1 md:grid-cols-12 gap-2 items-center\">\n <div className=\"md:col-span-3\">\n <Select\n value={rule?.rule || 'required'}\n onValueChange={(value) => {\n const nextRule = value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, rule: nextRule, message: existing.message || rule?.message || '' }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"required\">required</SelectItem>\n <SelectItem value=\"date\">date</SelectItem>\n <SelectItem value=\"integer\">integer</SelectItem>\n <SelectItem value=\"float\">float</SelectItem>\n <SelectItem value=\"lt\">lt</SelectItem>\n <SelectItem value=\"lte\">lte</SelectItem>\n <SelectItem value=\"gt\">gt</SelectItem>\n <SelectItem value=\"gte\">gte</SelectItem>\n <SelectItem value=\"eq\">eq</SelectItem>\n <SelectItem value=\"ne\">ne</SelectItem>\n <SelectItem value=\"regex\">regex</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"md:col-span-4\">\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder={rule?.rule === 'regex' ? 'Pattern (e.g. ^[a-z]+$)' : (['lt','lte','gt','gte'].includes(rule?.rule) ? 'Number' : '\u2014')}\n value={rule?.param ?? ''}\n onChange={(event) => {\n const value = ['lt','lte','gt','gte'].includes(rule?.rule) ? Number(event.target.value) : event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, ...rule, param: value }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n })\n }}\n onBlur={commit}\n disabled={rule?.rule === 'required' || rule?.rule === 'date' || rule?.rule === 'integer' || rule?.rule === 'float'}\n />\n </div>\n <div className=\"md:col-span-4\">\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"Error message\"\n value={rule?.message || ''}\n onChange={(event) => {\n const message = event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, ...rule, message }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n })\n }}\n onBlur={commit}\n />\n </div>\n <div className=\"md:col-span-1 flex justify-end\">\n <IconButton\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Remove rule\"\n onClick={() => {\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n list.splice(index, 1)\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <Trash2 className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n ))}\n {(!Array.isArray(local.configJson?.validation) || local.configJson!.validation.length === 0) && (\n <div className=\"text-xs text-muted-foreground\">No validation rules defined.</div>\n )}\n </div>\n </div>\n\n <div className=\"mt-3\">\n {(() => {\n const Editor = FieldRegistry.getDefEditor(local.kind)\n if (!Editor) return null\n return (\n <Editor\n def={{ key: local.key, kind: local.kind, configJson: local.configJson }}\n onChange={(patch) => apply({ configJson: { ...(local.configJson || {}), ...(patch || {}) } }, true)}\n />\n )\n })()}\n </div>\n\n {/* Default value control \u2014 shown for kinds without a dedicated FieldRegistry defEditor default section */}\n {(() => {\n // Dictionary kind handles defaults in its own defEditor; skip here\n if (local.kind === 'dictionary') return null\n // Relation and attachment kinds do not support defaults\n if (local.kind === 'relation' || local.kind === 'attachment') return null\n const currentDefault = local.configJson?.defaultValue\n if (local.kind === 'boolean') {\n const boolDefault = currentDefault === true ? 'true' : currentDefault === false ? 'false' : ''\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={boolDefault}\n onChange={(event) => {\n const raw = event.target.value\n const value = raw === 'true' ? true : raw === 'false' ? false : undefined\n apply({ configJson: { ...(local.configJson || {}), defaultValue: value } }, true)\n }}\n >\n <option value=\"\">{t('entities.customFields.fields.defaultValueNone', 'No default')}</option>\n <option value=\"true\">{t('entities.customFields.fields.defaultValueTrue', 'Checked (true)')}</option>\n <option value=\"false\">{t('entities.customFields.fields.defaultValueFalse', 'Unchecked (false)')}</option>\n </select>\n </div>\n )\n }\n // select with static options \u2014 picker\n if (local.kind === 'select' && !local.configJson?.multi) {\n const opts = normalizeCustomFieldOptions(local.configJson?.options || [])\n if (opts.length > 0) {\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof currentDefault === 'string' || typeof currentDefault === 'number' ? String(currentDefault) : ''}\n onChange={(event) => {\n const raw = event.target.value\n if (!raw) {\n apply({ configJson: { ...(local.configJson || {}), defaultValue: undefined } }, true)\n return\n }\n // Preserve the original option type (string or number) instead of coercing to string\n const matched = opts.find((o) => String(o.value) === raw)\n const typed = matched ? matched.value : raw\n apply({ configJson: { ...(local.configJson || {}), defaultValue: typed } }, true)\n }}\n >\n <option value=\"\">{t('entities.customFields.fields.defaultValueNone', 'No default')}</option>\n {opts.map((option) => (\n <option key={String(option.value)} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n )\n }\n }\n // Numeric kinds\n if (local.kind === 'integer' || local.kind === 'float') {\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <input\n type=\"number\"\n step={local.kind === 'integer' ? '1' : 'any'}\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof currentDefault === 'number' ? String(currentDefault) : ''}\n onChange={(event) => {\n const raw = event.target.value\n const parsed = raw === '' ? undefined : (local.kind === 'integer' ? parseInt(raw, 10) : parseFloat(raw))\n const value = parsed !== undefined && !isNaN(parsed) ? parsed : undefined\n apply({ configJson: { ...(local.configJson || {}), defaultValue: value } })\n }}\n onBlur={commit}\n placeholder={t('entities.customFields.fields.defaultValuePlaceholder', 'No default')}\n />\n </div>\n )\n }\n // Text-like kinds (text, multiline, date, datetime, currency)\n if (['text', 'multiline', 'date', 'datetime', 'currency'].includes(local.kind)) {\n return (\n <div className=\"mt-3\">\n <label className=\"text-xs\">{t('entities.customFields.fields.defaultValue', 'Default value')}</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof currentDefault === 'string' ? currentDefault : ''}\n onChange={(event) => {\n const value = event.target.value\n apply({ configJson: { ...(local.configJson || {}), defaultValue: value || undefined } })\n }}\n onBlur={commit}\n placeholder={t('entities.customFields.fields.defaultValuePlaceholder', 'No default')}\n />\n </div>\n )\n }\n return null\n })()}\n\n <div className=\"mt-3 pt-2 border-t flex flex-wrap items-center gap-4\">\n <span className=\"text-xs text-muted-foreground\">{t('entities.customFields.fields.visibility', 'Visibility:')}</span>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={local.configJson?.listVisible !== false}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), listVisible: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.listVisible', 'List')}\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={!!local.configJson?.filterable}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), filterable: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.filterable', 'Filter')}\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={local.configJson?.formEditable !== false}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), formEditable: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.formEditable', 'Form')}\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={!!local.configJson?.encrypted}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), encrypted: event.target.checked } }, true) }}\n />\n {t('entities.customFields.fields.encrypted', 'Encrypted')}\n </label>\n </div>\n </div>\n <Dialog\n open={optionDialogOpen}\n onOpenChange={(open) => {\n setOptionDialogOpen(open)\n if (!open) resetOptionDialog()\n }}\n >\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Add option</DialogTitle>\n <DialogDescription>Provide the stored value and optional label shown to users.</DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div>\n <label className=\"text-xs\">Value</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm font-mono\"\n placeholder=\"unique_value\"\n value={optionValueDraft}\n onChange={(event) => {\n setOptionFormError(null)\n setOptionValueDraft(event.target.value)\n }}\n />\n {optionFormError ? <p className=\"mt-1 text-xs text-red-600\">{optionFormError}</p> : null}\n </div>\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n placeholder=\"Label shown to users (optional)\"\n value={optionLabelDraft}\n onChange={(event) => setOptionLabelDraft(event.target.value)}\n />\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={handleCloseOptionDialog}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleAddOption}>\n Add option\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog\n open={groupDialogOpen}\n onOpenChange={(open) => {\n setGroupDialogOpen(open)\n if (!open) {\n setGroupError(null)\n setEditingGroupCode(null)\n setGroupDraft({ code: '', title: '', hint: '' })\n }\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>{editingGroupCode ? 'Edit group' : 'New group'}</DialogTitle>\n <DialogDescription>\n {editingGroupCode ? 'Update the selected group for this fieldset.' : 'Add a reusable group for this fieldset.'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label className=\"text-xs font-medium\">Group code</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm font-mono disabled:cursor-not-allowed disabled:bg-muted/50 disabled:text-muted-foreground\"\n value={groupDraft.code}\n onChange={(event) => {\n setGroupDraft((prev) => ({ ...prev, code: event.target.value }))\n if (groupError) setGroupError(null)\n }}\n disabled={!!editingGroupCode}\n placeholder=\"e.g. buying_committee\"\n />\n {groupError ? <div className=\"text-xs text-red-600 mt-1\">{groupError}</div> : null}\n </div>\n <div>\n <label className=\"text-xs font-medium\">Label</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n value={groupDraft.title}\n onChange={(event) => setGroupDraft((prev) => ({ ...prev, title: event.target.value }))}\n placeholder=\"Buying committee\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium\">Hint</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n value={groupDraft.hint}\n onChange={(event) => setGroupDraft((prev) => ({ ...prev, hint: event.target.value }))}\n placeholder=\"Visible to merchandisers\"\n />\n </div>\n {currentFieldsetValue && groupOptions.length > 0 ? (\n <div>\n <div className=\"text-xs font-medium mb-1\">Existing groups</div>\n <div className=\"space-y-2 max-h-40 overflow-y-auto\">\n {groupOptions.map((group) => (\n <div key={group.code} className=\"flex items-center justify-between rounded border px-3 py-2 text-sm\">\n <div>\n <div className=\"font-medium\">{group.title || group.code}</div>\n <div className=\"text-xs text-muted-foreground font-mono\">{group.code}</div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => handleEditGroupEntry(group)}\n aria-label={`Edit ${group.code}`}\n >\n <Pencil className=\"h-4 w-4\" />\n </IconButton>\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n className=\"text-red-500 hover:text-red-600\"\n onClick={() => handleRemoveGroupEntry(group.code)}\n aria-label={`Delete ${group.code}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </IconButton>\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setGroupDialogOpen(false)}>\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleGroupDialogSubmit}>\n Save group\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n})\n\nFieldDefinitionCard.displayName = 'FieldDefinitionCard'\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["code", "FieldDefinitionCard", "nextConfig"]
|
|
7
7
|
}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
4
|
+
import {
|
|
5
|
+
Select,
|
|
6
|
+
SelectContent,
|
|
7
|
+
SelectItem,
|
|
8
|
+
SelectTrigger,
|
|
9
|
+
SelectValue
|
|
10
|
+
} from "../../primitives/select.js";
|
|
4
11
|
import { DATE_RANGE_OPTIONS } from "./dateRanges.js";
|
|
5
12
|
function DateRangeSelect({
|
|
6
13
|
value,
|
|
@@ -19,16 +26,10 @@ function DateRangeSelect({
|
|
|
19
26
|
children: label
|
|
20
27
|
}
|
|
21
28
|
),
|
|
22
|
-
/* @__PURE__ */
|
|
23
|
-
"
|
|
24
|
-
{
|
|
25
|
-
|
|
26
|
-
className: "w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
27
|
-
value,
|
|
28
|
-
onChange: (e) => onChange(e.target.value),
|
|
29
|
-
children: DATE_RANGE_OPTIONS.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: t(option.labelKey, option.value.replace(/_/g, " ")) }, option.value))
|
|
30
|
-
}
|
|
31
|
-
)
|
|
29
|
+
/* @__PURE__ */ jsxs(Select, { value, onValueChange: (next) => onChange(next), children: [
|
|
30
|
+
/* @__PURE__ */ jsx(SelectTrigger, { id, size: "sm", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
31
|
+
/* @__PURE__ */ jsx(SelectContent, { children: DATE_RANGE_OPTIONS.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: t(option.labelKey, option.value.replace(/_/g, " ")) }, option.value)) })
|
|
32
|
+
] })
|
|
32
33
|
] });
|
|
33
34
|
}
|
|
34
35
|
var DateRangeSelect_default = DateRangeSelect;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/backend/date-range/DateRangeSelect.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { DATE_RANGE_OPTIONS, type DateRangePreset } from './dateRanges'\n\nexport type DateRangeSelectProps = {\n value: DateRangePreset\n onChange: (value: DateRangePreset) => void\n id?: string\n label?: string\n className?: string\n}\n\nexport function DateRangeSelect({\n value,\n onChange,\n id = 'date-range-select',\n label,\n className = '',\n}: DateRangeSelectProps) {\n const t = useT()\n\n return (\n <div className={`space-y-1.5 ${className}`}>\n {label && (\n <label\n htmlFor={id}\n className=\"text-xs font-semibold uppercase text-muted-foreground\"\n >\n {label}\n </label>\n )}\n <
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../primitives/select'\nimport { DATE_RANGE_OPTIONS, type DateRangePreset } from './dateRanges'\n\nexport type DateRangeSelectProps = {\n value: DateRangePreset\n onChange: (value: DateRangePreset) => void\n id?: string\n label?: string\n className?: string\n}\n\nexport function DateRangeSelect({\n value,\n onChange,\n id = 'date-range-select',\n label,\n className = '',\n}: DateRangeSelectProps) {\n const t = useT()\n\n return (\n <div className={`space-y-1.5 ${className}`}>\n {label && (\n <label\n htmlFor={id}\n className=\"text-xs font-semibold uppercase text-muted-foreground\"\n >\n {label}\n </label>\n )}\n <Select value={value} onValueChange={(next) => onChange(next as DateRangePreset)}>\n <SelectTrigger id={id} size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DATE_RANGE_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {t(option.labelKey, option.value.replace(/_/g, ' '))}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n\nexport default DateRangeSelect\n"],
|
|
5
|
+
"mappings": ";AAiCQ,cAOF,YAPE;AA9BR,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAAgD;AAUlD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,KAAK;AAAA,EACL;AAAA,EACA,YAAY;AACd,GAAyB;AACvB,QAAM,IAAI,KAAK;AAEf,SACE,qBAAC,SAAI,WAAW,eAAe,SAAS,IACrC;AAAA,aACC;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAU;AAAA,QAET;AAAA;AAAA,IACH;AAAA,IAEF,qBAAC,UAAO,OAAc,eAAe,CAAC,SAAS,SAAS,IAAuB,GAC7E;AAAA,0BAAC,iBAAc,IAAQ,MAAK,MAC1B,8BAAC,eAAY,GACf;AAAA,MACA,oBAAC,iBACE,6BAAmB,IAAI,CAAC,WACvB,oBAAC,cAA8B,OAAO,OAAO,OAC1C,YAAE,OAAO,UAAU,OAAO,MAAM,QAAQ,MAAM,GAAG,CAAC,KADpC,OAAO,KAExB,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,IAAO,0BAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
4
|
+
import {
|
|
5
|
+
Select,
|
|
6
|
+
SelectContent,
|
|
7
|
+
SelectItem,
|
|
8
|
+
SelectTrigger,
|
|
9
|
+
SelectValue
|
|
10
|
+
} from "../../primitives/select.js";
|
|
4
11
|
import { DATE_RANGE_OPTIONS } from "./dateRanges.js";
|
|
5
12
|
function InlineDateRangeSelect({
|
|
6
13
|
value,
|
|
@@ -10,28 +17,9 @@ function InlineDateRangeSelect({
|
|
|
10
17
|
const t = useT();
|
|
11
18
|
const currentOption = DATE_RANGE_OPTIONS.find((opt) => opt.value === value);
|
|
12
19
|
const displayLabel = currentOption ? t(currentOption.labelKey, currentOption.value.replace(/_/g, " ")) : value.replace(/_/g, " ");
|
|
13
|
-
return /* @__PURE__ */ jsxs(
|
|
14
|
-
/* @__PURE__ */ jsx(
|
|
15
|
-
|
|
16
|
-
{
|
|
17
|
-
className: "appearance-none rounded-md border border-border bg-background px-2 py-0.5 pr-6 text-xs text-foreground hover:border-primary/50 focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring cursor-pointer",
|
|
18
|
-
value,
|
|
19
|
-
onChange: (e) => onChange(e.target.value),
|
|
20
|
-
title: displayLabel,
|
|
21
|
-
children: DATE_RANGE_OPTIONS.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: t(option.labelKey, option.value.replace(/_/g, " ")) }, option.value))
|
|
22
|
-
}
|
|
23
|
-
),
|
|
24
|
-
/* @__PURE__ */ jsx(
|
|
25
|
-
"svg",
|
|
26
|
-
{
|
|
27
|
-
className: "pointer-events-none absolute right-1.5 h-3 w-3 text-muted-foreground",
|
|
28
|
-
fill: "none",
|
|
29
|
-
viewBox: "0 0 24 24",
|
|
30
|
-
stroke: "currentColor",
|
|
31
|
-
strokeWidth: 2,
|
|
32
|
-
children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
|
|
33
|
-
}
|
|
34
|
-
)
|
|
20
|
+
return /* @__PURE__ */ jsxs(Select, { value, onValueChange: (next) => onChange(next), children: [
|
|
21
|
+
/* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className, title: displayLabel, children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
22
|
+
/* @__PURE__ */ jsx(SelectContent, { children: DATE_RANGE_OPTIONS.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: t(option.labelKey, option.value.replace(/_/g, " ")) }, option.value)) })
|
|
35
23
|
] });
|
|
36
24
|
}
|
|
37
25
|
var InlineDateRangeSelect_default = InlineDateRangeSelect;
|