@open-mercato/ui 0.4.9-develop-d1d38e26fb → 0.4.9-develop-fefbbe0979

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.
@@ -2541,10 +2541,10 @@ const FieldControl = React.memo(
2541
2541
  onChange: (next) => fieldSetValue(next),
2542
2542
  placeholder,
2543
2543
  autoFocus: autoFocusField,
2544
- suggestions: options.map((opt) => opt.label),
2544
+ suggestions: options.map((opt) => ({ value: opt.value, label: opt.label })),
2545
2545
  loadSuggestions: typeof builtin?.loadOptions === "function" ? async (query) => {
2546
2546
  const opts = await loadFieldOptions(field, query);
2547
- return opts.map((opt) => opt.label);
2547
+ return opts.map((opt) => ({ value: opt.value, label: opt.label }));
2548
2548
  } : void 0
2549
2549
  }
2550
2550
  ),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/backend/CrudForm.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { z } from 'zod'\nimport { useRouter } from 'next/navigation'\nimport { DataLoader } from '../primitives/DataLoader'\nimport { flash } from './FlashMessages'\nimport dynamic from 'next/dynamic'\nimport remarkGfm from 'remark-gfm'\nimport { FormHeader } from './forms/FormHeader'\nimport { FormFooter } from './forms/FormFooter'\nimport { Button } from '../primitives/button'\nimport { IconButton } from '../primitives/icon-button'\nimport {\n Settings,\n Layers,\n Tag,\n Sparkles,\n Package,\n Shirt,\n Grid,\n ShoppingBag,\n ShoppingCart,\n Store,\n Users,\n Briefcase,\n Building,\n BookOpen,\n Bookmark,\n Camera,\n Car,\n Clock,\n Cloud,\n Compass,\n CreditCard,\n Database,\n Flame,\n Gift,\n Globe,\n Heart,\n Info,\n Key,\n Map as MapIcon,\n Palette,\n Shield,\n Star,\n Truck,\n Zap,\n Coins,\n} from 'lucide-react'\nimport { loadGeneratedFieldRegistrations } from './fields/registry'\nimport type { CustomFieldDefDto, CustomFieldDefinitionsPayload, CustomFieldsetDto } from './utils/customFieldDefs'\nimport { buildFormFieldsFromCustomFields, buildFormFieldFromCustomFieldDef } from './utils/customFieldForms'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { TagsInput } from './inputs/TagsInput'\nimport { ComboboxInput } from './inputs/ComboboxInput'\nimport { format, parseISO } from 'date-fns'\nimport type { Locale } from 'date-fns'\nimport { DateTimePicker } from './inputs/DateTimePicker'\nimport { TimePicker } from './inputs/TimePicker'\nimport { DatePicker } from './inputs/DatePicker'\nimport { mapCrudServerErrorToFormErrors, parseServerMessage } from './utils/serverErrors'\nimport { withScopedApiRequestHeaders } from './utils/apiCall'\nimport type { CustomFieldDefLike } from '@open-mercato/shared/modules/entities/validation'\nimport type { MDEditorProps as UiWMDEditorProps } from '@uiw/react-md-editor'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../primitives/dialog'\nimport { FieldDefinitionsManager, type FieldDefinitionsManagerHandle } from './custom-fields/FieldDefinitionsManager'\nimport { useConfirmDialog } from './confirm-dialog'\nimport { useInjectionSpotEvents, InjectionSpot, useInjectionWidgets } from './injection/InjectionSpot'\nimport { dispatchBackendMutationError } from './injection/mutationEvents'\nimport { VersionHistoryAction } from './version-history/VersionHistoryAction'\nimport { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'\nimport { useInjectionDataWidgets } from './injection/useInjectionDataWidgets'\nimport { InjectedField } from './injection/InjectedField'\nimport type { InjectionFieldDefinition, FieldContext } from '@open-mercato/shared/modules/widgets/injection'\nimport { evaluateInjectedVisibility } from './injection/visibility-utils'\nimport { ComponentReplacementHandles } from '@open-mercato/shared/modules/widgets/component-registry'\n\n// Stable empty options array to avoid creating a new [] every render\nconst EMPTY_OPTIONS: CrudFieldOption[] = []\nconst FOCUSABLE_SELECTOR =\n '[data-crud-focus-target], input:not([type=\"hidden\"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\nconst CRUDFORM_EXTENDED_EVENTS_ENABLED = parseBooleanWithDefault(\n process.env.NEXT_PUBLIC_OM_CRUDFORM_EXTENDED_EVENTS_ENABLED,\n true,\n)\n\nexport type CrudFieldBase = {\n id: string\n label: string\n placeholder?: string\n description?: React.ReactNode // inline field-level help\n required?: boolean\n layout?: 'full' | 'half' | 'third'\n disabled?: boolean\n readOnly?: boolean\n}\n\nexport type CrudFieldOption = { value: string; label: string }\n\nexport type CrudBuiltinField = CrudFieldBase & {\n type:\n | 'text'\n | 'password'\n | 'textarea'\n | 'checkbox'\n | 'select'\n | 'number'\n | 'date'\n | 'datepicker'\n | 'datetime-local'\n | 'datetime'\n | 'time'\n | 'tags'\n | 'richtext'\n | 'relation'\n | 'combobox'\n placeholder?: string\n options?: CrudFieldOption[]\n multiple?: boolean\n listbox?: boolean\n // for relation/select style fields; if provided, options are loaded on mount\n loadOptions?: (query?: string) => Promise<CrudFieldOption[]>\n // when type === 'richtext', choose editor implementation\n editor?: 'simple' | 'uiw' | 'html'\n // for text fields; provides datalist suggestions while allowing free-text input\n suggestions?: string[]\n // for combobox fields; allow custom values or restrict to suggestions only\n allowCustomValues?: boolean\n // for datetime/time fields\n minuteStep?: number\n minDate?: Date\n maxDate?: Date\n displayFormat?: string\n closeOnSelect?: boolean\n locale?: Locale\n}\n\nexport type CrudCustomFieldRenderProps = {\n id: string\n value: unknown\n error?: string\n autoFocus?: boolean\n disabled?: boolean\n values?: Record<string, unknown>\n setValue: (value: unknown) => void\n // Optional helper to update other form values from within a custom field\n setFormValue?: (id: string, value: unknown) => void\n // Optional context for advanced custom inputs\n entityId?: string\n recordId?: string\n}\n\nexport type CrudCustomField = CrudFieldBase & {\n type: 'custom'\n component: (props: CrudCustomFieldRenderProps) => React.ReactNode\n}\n\nexport type CrudField = CrudBuiltinField | CrudCustomField\n\ntype CrudFormValues<TValues extends Record<string, unknown>> = Partial<TValues> & Record<string, unknown>\n\nexport type CrudFormProps<TValues extends Record<string, unknown>> = {\n schema?: z.ZodType<TValues>\n fields: CrudField[]\n initialValues?: Partial<TValues>\n submitLabel?: string\n submitIcon?: React.ComponentType<{ className?: string }>\n formId?: string\n customFieldsLoadingMessage?: string\n cancelHref?: string\n successRedirect?: string\n deleteRedirect?: string\n onSubmit?: (values: TValues) => Promise<void> | void\n onDelete?: () => Promise<void> | void\n // When true, shows Delete button whenever onDelete is provided, even without an id\n deleteVisible?: boolean\n // Legacy field-only grid toggle. Use `groups` for advanced layout.\n twoColumn?: boolean\n title?: string\n backHref?: string\n // Optional extra action buttons rendered next to Delete/Cancel/Save\n // Useful for custom links like \"Show Records\" etc.\n extraActions?: React.ReactNode\n /** When provided, shows a Version History clock icon in the header that opens a side panel. */\n versionHistory?: {\n resourceKind: string\n resourceId: string\n canUndoRedo?: boolean\n autoCheckAcl?: boolean\n }\n // When provided, CrudForm will fetch custom field definitions and append\n // form-editable custom fields automatically to the provided `fields`.\n entityId?: string\n entityIds?: string[]\n // Optional grouped layout rendered in two responsive columns (1 on mobile).\n groups?: CrudFormGroup[]\n // Loading state for the entire form (e.g., when loading record data)\n isLoading?: boolean\n loadingMessage?: string\n // User-defined entity mode: all fields are custom, use bare keys (no cf_)\n customEntity?: boolean\n // Embedded mode hides outer chrome; useful for inline sections\n embedded?: boolean\n // Hide the footer action bar (Save/Cancel/Delete) when embedding in a custom layout\n hideFooterActions?: boolean\n // Optional custom content injected between the header actions and the form body\n contentHeader?: React.ReactNode\n // Optional mapping of entityId -> form value key storing the selected fieldset code\n customFieldsetBindings?: Record<string, { valueKey: string }>\n // Optional injection spot ID for widget injection\n injectionSpotId?: string\n replacementHandle?: string\n}\n\n// Group-level custom component context\nexport type CrudFormGroupComponentProps = {\n values: Record<string, unknown>\n setValue: (id: string, v: unknown) => void\n errors: Record<string, string>\n}\n\n// Special group kind for automatic Custom Fields section\nexport type CrudFormGroup = {\n id: string\n title?: string\n column?: 1 | 2\n description?: string\n // Either list field ids, inline field configs, or mix of both\n fields?: (CrudField | string)[]\n // Inject a custom component into the group card\n component?: (ctx: CrudFormGroupComponentProps) => React.ReactNode\n // When kind === 'customFields', the group renders form-editable custom fields\n kind?: 'customFields'\n // When true, render component output inline without wrapping group chrome\n bare?: boolean\n}\n\nfunction readByDotPath(source: Record<string, unknown> | undefined, path: string): unknown {\n if (!source || !path) return undefined\n if (Object.prototype.hasOwnProperty.call(source, path)) return source[path]\n const segments = path.split('.').filter(Boolean)\n let current: unknown = source\n for (const segment of segments) {\n if (!current || typeof current !== 'object' || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nconst FIELDSET_ICON_COMPONENTS: Record<string, React.ComponentType<{ className?: string }>> = {\n layers: Layers,\n tag: Tag,\n sparkles: Sparkles,\n package: Package,\n shirt: Shirt,\n grid: Grid,\n shoppingBag: ShoppingBag,\n shoppingCart: ShoppingCart,\n store: Store,\n users: Users,\n briefcase: Briefcase,\n building: Building,\n bookOpen: BookOpen,\n bookmark: Bookmark,\n camera: Camera,\n car: Car,\n clock: Clock,\n cloud: Cloud,\n compass: Compass,\n creditCard: CreditCard,\n database: Database,\n flame: Flame,\n gift: Gift,\n globe: Globe,\n heart: Heart,\n key: Key,\n map: MapIcon,\n palette: Palette,\n shield: Shield,\n star: Star,\n truck: Truck,\n zap: Zap,\n coins: Coins,\n}\n\ntype CustomFieldGroupLayout = {\n code: string | null\n label?: string\n hint?: string\n fields: CrudField[]\n}\n\ntype CustomFieldSectionLayout = {\n entityId: string\n fieldsetCode: string | null\n fieldset?: CustomFieldsetDto\n title: string\n description?: string\n groups: CustomFieldGroupLayout[]\n}\n\ntype CustomFieldEntityLayout = {\n entityId: string\n sections: CustomFieldSectionLayout[]\n availableFieldsets: CustomFieldsetDto[]\n singleFieldsetPerRecord: boolean\n hasFieldsets: boolean\n activeFieldset: string | null\n}\n\nexport function CrudForm<TValues extends Record<string, unknown>>({\n schema,\n fields,\n initialValues,\n submitLabel,\n submitIcon,\n formId: providedFormId,\n customFieldsLoadingMessage,\n cancelHref,\n successRedirect,\n deleteRedirect,\n onSubmit,\n onDelete,\n deleteVisible,\n twoColumn = false,\n title,\n backHref,\n entityId,\n entityIds,\n groups,\n isLoading = false,\n loadingMessage,\n customEntity = false,\n embedded = false,\n hideFooterActions = false,\n extraActions,\n versionHistory,\n contentHeader,\n customFieldsetBindings,\n injectionSpotId,\n replacementHandle,\n}: CrudFormProps<TValues>) {\n // Ensure module field components are registered (client-side)\n React.useEffect(() => { loadGeneratedFieldRegistrations().catch(() => {}) }, [])\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const router = useRouter()\n const t = useT()\n const resolvedSubmitLabel = submitLabel ?? t('ui.forms.actions.save')\n const resolvedLoadingMessage = loadingMessage ?? t('ui.forms.loading')\n const resolvedCustomFieldsLoadingMessage = customFieldsLoadingMessage ?? resolvedLoadingMessage\n const cancelLabel = t('ui.forms.actions.cancel')\n const deleteLabel = t('ui.forms.actions.delete')\n const savingLabel = t('ui.forms.status.saving')\n const backLabel = t('ui.navigation.back')\n const customFieldsLabel = t('entities.customFields.title')\n const fieldsetSelectorLabel = t('entities.customFields.fieldsetSelectorLabel', 'Fieldset')\n const emptyFieldsetMessage = t('entities.customFields.emptyFieldset', 'No fields defined for this fieldset.')\n const defaultFieldsetLabel = t('entities.customFields.defaultFieldset', 'Default')\n const manageFieldsetLabel = t('entities.customFields.manageFieldset', 'Manage fields')\n const fieldsetDialogTitle = t('entities.customFields.manageDialogTitle', 'Edit custom fields')\n const fieldsetDialogUnavailable = t('entities.customFields.manageDialogUnavailable', 'Field definitions page is unavailable.')\n const deleteConfirmMessage = t('ui.forms.confirmDelete')\n const deleteSuccessMessage = t('ui.forms.flash.deleteSuccess')\n const deleteErrorMessage = t('ui.forms.flash.deleteError')\n const saveErrorMessage = t('ui.forms.flash.saveError')\n const internalFormId = React.useId()\n const formId = providedFormId ?? internalFormId\n const [values, setValues] = React.useState<CrudFormValues<TValues>>(\n () => ({ ...(initialValues ?? {}) } as CrudFormValues<TValues>)\n )\n const valuesRef = React.useRef(values)\n const [errors, setErrors] = React.useState<Record<string, string>>({})\n const [pending, setPending] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const [dynamicOptions, setDynamicOptions] = React.useState<Record<string, CrudFieldOption[]>>({})\n const [cfDefinitions, setCfDefinitions] = React.useState<CustomFieldDefDto[]>([])\n const [cfMetadata, setCfMetadata] = React.useState<CustomFieldDefinitionsPayload | null>(null)\n const [cfFieldsetSelections, setCfFieldsetSelections] = React.useState<Record<string, string | null>>({})\n const [isLoadingCustomFields, setIsLoadingCustomFields] = React.useState(false)\n const [customFieldDefsVersion, setCustomFieldDefsVersion] = React.useState(0)\n const [fieldsetEditorTarget, setFieldsetEditorTarget] = React.useState<{ entityId: string; fieldsetCode: string | null; view: 'entity' | 'fieldset' } | null>(null)\n const [isInDialog, setIsInDialog] = React.useState(false)\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n const fieldsetManagerRef = React.useRef<FieldDefinitionsManagerHandle | null>(null)\n const resolvedEntityIds = React.useMemo(() => {\n if (Array.isArray(entityIds) && entityIds.length) {\n const dedup = new Set<string>()\n const list: string[] = []\n entityIds.forEach((id) => {\n const trimmed = typeof id === 'string' ? id.trim() : ''\n if (!trimmed || dedup.has(trimmed)) return\n dedup.add(trimmed)\n list.push(trimmed)\n })\n return list\n }\n if (typeof entityId === 'string' && entityId.trim().length > 0) {\n return [entityId.trim()]\n }\n return []\n }, [entityId, entityIds])\n const primaryEntityId = resolvedEntityIds.length ? resolvedEntityIds[0] : null\n\n // Injection spot events for widget lifecycle management\n const resolvedInjectionSpotId = React.useMemo(() => {\n if (injectionSpotId) return injectionSpotId\n if (resolvedEntityIds.length) {\n const normalized = resolvedEntityIds[0].replace(/[:]+/g, '.')\n return `crud-form:${normalized}`\n }\n return undefined\n }, [injectionSpotId, resolvedEntityIds])\n const resolvedReplacementHandle = React.useMemo(() => {\n if (replacementHandle) return replacementHandle\n if (resolvedEntityIds.length) return ComponentReplacementHandles.crudForm(resolvedEntityIds[0].replace(/[:]+/g, '.'))\n return ComponentReplacementHandles.crudForm('unknown')\n }, [replacementHandle, resolvedEntityIds])\n const headerInjectionSpotId = resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:header` : undefined\n \n const recordId = React.useMemo(() => {\n const raw = values.id\n if (typeof raw === 'string') return raw\n if (typeof raw === 'number') return String(raw)\n return undefined\n }, [values])\n const fallbackRecordId = recordId || (\n versionHistory?.resourceId === undefined || versionHistory.resourceId === null\n ? undefined\n : String(versionHistory.resourceId).trim() || undefined\n )\n\n const operation = recordId ? 'update' : 'create'\n const injectionContext = React.useMemo(() => ({\n formId,\n entityId: primaryEntityId,\n resourceKind: versionHistory?.resourceKind,\n resourceId: recordId ?? versionHistory?.resourceId,\n recordId: fallbackRecordId,\n isLoading,\n pending,\n operation,\n }), [formId, primaryEntityId, versionHistory?.resourceKind, versionHistory?.resourceId, recordId, fallbackRecordId, isLoading, pending, operation])\n const injectionContextRef = React.useRef(injectionContext)\n React.useEffect(() => {\n injectionContextRef.current = injectionContext\n }, [injectionContext])\n React.useEffect(() => {\n valuesRef.current = values\n }, [values])\n \n const { widgets: injectionWidgets } = useInjectionWidgets(resolvedInjectionSpotId, {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const { widgets: injectedFieldWidgets } = useInjectionDataWidgets(\n resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:fields` : '__disabled__:fields'\n )\n \n const { triggerEvent: triggerInjectionEvent } = useInjectionSpotEvents(resolvedInjectionSpotId ?? '', injectionWidgets)\n const extendedInjectionEventsEnabled = CRUDFORM_EXTENDED_EVENTS_ENABLED && Boolean(resolvedInjectionSpotId)\n\n const transformValidationErrors = React.useCallback(\n async (fieldErrors: Record<string, string>): Promise<Record<string, string>> => {\n if (!extendedInjectionEventsEnabled || !Object.keys(fieldErrors).length) return fieldErrors\n try {\n const result = await triggerInjectionEvent(\n 'transformValidation',\n fieldErrors as unknown as TValues,\n injectionContextRef.current,\n { originalData: valuesRef.current as TValues },\n )\n const transformed = result.data\n if (!transformed || typeof transformed !== 'object' || Array.isArray(transformed)) return fieldErrors\n return Object.fromEntries(\n Object.entries(transformed as Record<string, unknown>).map(([key, value]) => [key, String(value)]),\n )\n } catch (err) {\n console.error('[CrudForm] Error in transformValidation:', err)\n return fieldErrors\n }\n },\n [extendedInjectionEventsEnabled, triggerInjectionEvent],\n )\n\n const translateValidationMessage = React.useCallback(\n (message: string | null | undefined): string => {\n if (typeof message !== 'string') return ''\n const trimmed = message.trim()\n if (!trimmed) return ''\n return t(trimmed, trimmed)\n },\n [t],\n )\n\n const translateValidationErrors = React.useCallback(\n (fieldErrors: Record<string, string>): Record<string, string> =>\n Object.fromEntries(\n Object.entries(fieldErrors).map(([fieldId, message]) => [fieldId, translateValidationMessage(message)]),\n ),\n [translateValidationMessage],\n )\n\n const canNavigateTo = React.useCallback(\n async (target: string): Promise<boolean> => {\n if (!extendedInjectionEventsEnabled) return true\n try {\n const result = await triggerInjectionEvent(\n 'onBeforeNavigate',\n valuesRef.current as TValues,\n injectionContextRef.current,\n { target },\n )\n if (!result.ok) {\n flash(result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return false\n }\n return true\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return false\n }\n },\n [extendedInjectionEventsEnabled, t, triggerInjectionEvent],\n )\n\n const navigateWithGuard = React.useCallback(\n async (target: string) => {\n if (!target) return\n const allowed = await canNavigateTo(target)\n if (allowed) router.push(target)\n },\n [canNavigateTo, router],\n )\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof window === 'undefined') return\n const handleEvent = (event: Event) => {\n const customEvent = event as CustomEvent<unknown>\n void triggerInjectionEvent('onAppEvent', valuesRef.current as TValues, injectionContextRef.current, {\n appEvent: customEvent.detail,\n }).catch((err) => {\n console.error('[CrudForm] Error in onAppEvent:', err)\n })\n }\n window.addEventListener('om:event', handleEvent as EventListener)\n return () => {\n window.removeEventListener('om:event', handleEvent as EventListener)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof document === 'undefined') return\n const emitVisibility = () => {\n void triggerInjectionEvent('onVisibilityChange', valuesRef.current as TValues, injectionContextRef.current, {\n visible: document.visibilityState === 'visible',\n }).catch((err) => {\n console.error('[CrudForm] Error in onVisibilityChange:', err)\n })\n }\n document.addEventListener('visibilitychange', emitVisibility)\n emitVisibility()\n return () => {\n document.removeEventListener('visibilitychange', emitVisibility)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled) return\n const root = rootRef.current\n if (!root || typeof window === 'undefined') return\n const handleClickCapture = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (event.button !== 0) return\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return\n const targetElement = event.target instanceof Element ? event.target : null\n const linkElement = targetElement?.closest('a[href]')\n if (!(linkElement instanceof HTMLAnchorElement)) return\n if (!root.contains(linkElement)) return\n if (linkElement.target && linkElement.target !== '_self') return\n const rawHref = linkElement.getAttribute('href')\n if (!rawHref || rawHref.startsWith('#')) return\n let target = rawHref\n if (rawHref.startsWith('http://') || rawHref.startsWith('https://')) {\n try {\n const parsed = new URL(rawHref)\n if (parsed.origin !== window.location.origin) return\n target = `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n return\n }\n } else if (!rawHref.startsWith('/')) {\n return\n }\n event.preventDefault()\n void navigateWithGuard(target)\n }\n root.addEventListener('click', handleClickCapture, true)\n return () => {\n root.removeEventListener('click', handleClickCapture, true)\n }\n }, [extendedInjectionEventsEnabled, navigateWithGuard])\n \n React.useEffect(() => {\n const root = rootRef.current\n if (!root) return\n setIsInDialog(Boolean(root.closest('[data-dialog-content]')))\n }, [])\n const dialogFooterClass = isInDialog\n ? 'sticky bottom-0 left-0 right-0 z-20 -mx-6 px-6 bg-card border-t border-border/70 py-2 sm:-mx-6 sm:px-6'\n : ''\n const dialogFormPadding = isInDialog ? 'pb-4' : ''\n\n const buildCustomFieldsManageHref = React.useCallback(\n (targetEntityId: string | null) => {\n if (!targetEntityId) return null\n try {\n const encoded = encodeURIComponent(targetEntityId)\n return customEntity ? `/backend/entities/user/${encoded}` : `/backend/entities/system/${encoded}`\n } catch {\n return null\n }\n },\n [customEntity],\n )\n\n const refreshCustomFieldDefinitions = React.useCallback(() => {\n setCustomFieldDefsVersion((prev) => prev + 1)\n }, [])\n\n // Unified delete handler with confirmation\n const handleDelete = React.useCallback(async () => {\n if (!onDelete) return\n const deletePayload = values as TValues\n try {\n const confirmed = await confirm({\n title: deleteConfirmMessage,\n variant: 'destructive',\n })\n if (!confirmed) return\n\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeDelete', deletePayload, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n setPending(true)\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n if (injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0) {\n await withScopedApiRequestHeaders(injectionRequestHeaders, async () => {\n await onDelete()\n })\n } else {\n await onDelete()\n }\n\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterDelete:', err)\n }\n }\n try { flash(deleteSuccessMessage, 'success') } catch {}\n // Redirect if requested by caller\n if (typeof deleteRedirect === 'string' && deleteRedirect) {\n await navigateWithGuard(deleteRedirect)\n }\n } catch (err) {\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDeleteError', deletePayload, injectionContext, { error: err })\n } catch (hookError) {\n console.error('[CrudForm] Error in onDeleteError:', hookError)\n }\n }\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const message = err instanceof Error && err.message ? err.message : deleteErrorMessage\n try { flash(message, 'error') } catch {}\n } finally {\n setPending(false)\n }\n }, [\n confirm,\n deleteConfirmMessage,\n deleteErrorMessage,\n deleteRedirect,\n deleteSuccessMessage,\n formId,\n injectionContext,\n onDelete,\n resolvedInjectionSpotId,\n navigateWithGuard,\n t,\n transformValidationErrors,\n triggerInjectionEvent,\n values,\n ])\n \n // Determine whether this form is creating a new record (no `id` yet)\n const isNewRecord = React.useMemo(() => {\n const rawId = values.id\n if (rawId === undefined || rawId === null) return true\n return typeof rawId === 'string' ? rawId.trim().length === 0 : false\n }, [values])\n const showDelete = Boolean(onDelete) && (typeof deleteVisible === 'boolean' ? deleteVisible : !isNewRecord)\n const versionHistoryEnabled = Boolean(versionHistory?.resourceId && String(versionHistory.resourceId).trim().length > 0)\n const versionHistoryAction = (\n <VersionHistoryAction\n config={versionHistoryEnabled ? versionHistory! : null}\n t={t}\n canUndoRedo={versionHistory?.canUndoRedo}\n autoCheckAcl={versionHistory?.autoCheckAcl}\n />\n )\n const headerInjectionAction = headerInjectionSpotId ? (\n <InjectionSpot\n spotId={headerInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ) : null\n const headerExtraActions = versionHistoryEnabled || headerInjectionAction || extraActions ? (\n <>\n {versionHistoryEnabled ? versionHistoryAction : null}\n {headerInjectionAction}\n {extraActions}\n </>\n ) : undefined\n\n // Auto-append custom fields for this entityId\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n if (!resolvedEntityIds.length) { \n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n return \n }\n \n setIsLoadingCustomFields(true)\n try {\n const mod = await import('./utils/customFieldForms')\n const { definitions, metadata } = await mod.fetchCustomFieldFormStructure(resolvedEntityIds, undefined, { bareIds: customEntity })\n if (!cancelled) {\n setCfDefinitions(definitions)\n setCfMetadata(metadata)\n setCfFieldsetSelections((prev) => {\n const next: Record<string, string | null> = {}\n let changed = false\n resolvedEntityIds.forEach((entityId) => {\n const existing = prev[entityId]\n const fieldsets = metadata.fieldsetsByEntity?.[entityId] ?? []\n const defaultSelection = fieldsets[0]?.code ?? null\n const value = existing !== undefined ? existing : defaultSelection\n next[entityId] = value\n if (existing !== value) changed = true\n })\n if (Object.keys(prev).length !== Object.keys(next).length) changed = true\n return changed ? next : prev\n })\n setIsLoadingCustomFields(false)\n }\n } catch {\n if (!cancelled) {\n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n }\n }\n }\n load()\n return () => { cancelled = true }\n }, [resolvedEntityIds, customEntity, customFieldDefsVersion])\n\n React.useEffect(() => {\n if (!customFieldsetBindings) return\n setCfFieldsetSelections((prev) => {\n let changed = false\n const next = { ...prev }\n resolvedEntityIds.forEach((entityId) => {\n const binding = customFieldsetBindings[entityId]\n if (!binding) return\n const raw = values[binding.valueKey]\n if (typeof raw === 'string' && raw.trim().length > 0) {\n const normalized = raw.trim()\n if (next[entityId] !== normalized) {\n next[entityId] = normalized\n changed = true\n }\n }\n })\n return changed ? next : prev\n })\n }, [customFieldsetBindings, resolvedEntityIds, values])\n\n const fieldsetsByEntity = cfMetadata?.fieldsetsByEntity ?? {}\n const entitySettings = cfMetadata?.entitySettings ?? {}\n\n const { cfFields, customFieldLayout } = React.useMemo(() => {\n if (!cfDefinitions.length) return { cfFields: [], customFieldLayout: [] as CustomFieldEntityLayout[] }\n const aggregated: CrudField[] = []\n const layout: CustomFieldEntityLayout[] = []\n const defsByEntity = new globalThis.Map<string, CustomFieldDefDto[]>()\n cfDefinitions.forEach((def) => {\n const entityId = typeof def.entityId === 'string' && def.entityId.trim().length\n ? def.entityId.trim()\n : resolvedEntityIds[0]\n if (!entityId) return\n const bucket = defsByEntity.get(entityId) ?? []\n bucket.push(def)\n defsByEntity.set(entityId, bucket)\n })\n\n const buildSection = (\n entityId: string,\n fieldsetCode: string | null,\n defList: CustomFieldDefDto[],\n fieldset?: CustomFieldsetDto,\n ): CustomFieldSectionLayout | null => {\n if (!defList.length) return null\n const groupsMap = new globalThis.Map<string, CustomFieldGroupLayout>()\n const order: string[] = []\n const fieldsetGroupMap = new globalThis.Map<string, { title?: string; hint?: string; code: string }>()\n if (Array.isArray(fieldset?.groups)) {\n fieldset.groups.forEach((group) => {\n if (!group?.code) return\n fieldsetGroupMap.set(group.code, { code: group.code, title: group.title, hint: group.hint })\n })\n }\n const sortedDefs = [...defList].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n const ensureBucket = (code: string | null, def: CustomFieldDefDto): CustomFieldGroupLayout => {\n const key = code ?? '__default__'\n let bucket = groupsMap.get(key)\n if (!bucket) {\n const fallbackMeta = code ? fieldsetGroupMap.get(code) : undefined\n const directMeta = code ? def.group : undefined\n const label =\n code === null\n ? undefined\n : directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || code\n const hint = directMeta?.hint || fallbackMeta?.hint\n bucket = { code, label, hint, fields: [] }\n groupsMap.set(key, bucket)\n order.push(key)\n } else if (code && !bucket.label) {\n const fallbackMeta = fieldsetGroupMap.get(code)\n const directMeta = def.group ?? undefined\n bucket.label = directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || bucket.label\n bucket.hint = directMeta?.hint || fallbackMeta?.hint || bucket.hint\n }\n return bucket\n }\n sortedDefs.forEach((definition) => {\n const field = buildFormFieldFromCustomFieldDef(definition, { bareIds: customEntity })\n if (!field) return\n aggregated.push(field)\n const bucket = ensureBucket(definition.group?.code ?? null, definition)\n bucket.fields.push(field)\n })\n const groups = order\n .map((key) => groupsMap.get(key)!)\n .filter((group) => group.fields.length > 0)\n if (!groups.length) return null\n return {\n entityId,\n fieldsetCode,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups,\n }\n }\n\n const entityIds = resolvedEntityIds.length ? resolvedEntityIds : Array.from(defsByEntity.keys())\n entityIds.forEach((entityId) => {\n const defsForEntity = defsByEntity.get(entityId) ?? []\n if (!defsForEntity.length) return\n const availableFieldsets = fieldsetsByEntity[entityId] ?? []\n const hasFieldsets = availableFieldsets.length > 0\n const singleFieldsetPerRecord =\n entitySettings[entityId]?.singleFieldsetPerRecord !== false\n const defsByFieldset = new globalThis.Map<string | null, CustomFieldDefDto[]>()\n defsForEntity.forEach((def) => {\n const memberships = Array.isArray(def.fieldsets)\n ? def.fieldsets\n .filter((entry): entry is string => typeof entry === 'string')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n : []\n if (memberships.length > 0) {\n memberships.forEach((code) => {\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n return\n }\n const code = typeof def.fieldset === 'string' && def.fieldset.trim().length > 0 ? def.fieldset.trim() : null\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n const sections: CustomFieldSectionLayout[] = []\n\n const createEmptySection = (code: string | null): CustomFieldSectionLayout => {\n const fieldset = code ? availableFieldsets.find((fs) => fs.code === code) : undefined\n return {\n entityId,\n fieldsetCode: code,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups: [],\n }\n }\n\n if (!hasFieldsets) {\n const fallbackDefs =\n defsByFieldset.get(null) ?? Array.from(defsByFieldset.values()).flat()\n const section = buildSection(entityId, null, fallbackDefs, undefined)\n if (section) sections.push(section)\n } else if (singleFieldsetPerRecord) {\n const availableCodes = availableFieldsets.map((fs) => fs.code)\n const activeFieldset =\n cfFieldsetSelections[entityId] && availableCodes.includes(cfFieldsetSelections[entityId]!)\n ? cfFieldsetSelections[entityId]\n : availableFieldsets[0]?.code ?? null\n const targetDefs = activeFieldset ? defsByFieldset.get(activeFieldset) ?? [] : defsByFieldset.get(null) ?? []\n const targetSection = activeFieldset\n ? buildSection(\n entityId,\n activeFieldset,\n targetDefs,\n availableFieldsets.find((fs) => fs.code === activeFieldset),\n )\n : buildSection(entityId, null, targetDefs, undefined)\n if (targetSection) {\n sections.push(targetSection)\n } else if (activeFieldset) {\n sections.push(createEmptySection(activeFieldset))\n }\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length && activeFieldset) {\n const generalSection = buildSection(entityId, null, unassigned, undefined)\n if (generalSection) sections.push(generalSection)\n }\n } else {\n availableFieldsets.forEach((fieldset) => {\n const list = defsByFieldset.get(fieldset.code) ?? []\n const section = buildSection(entityId, fieldset.code, list, fieldset)\n if (section) sections.push(section)\n })\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length) {\n const section = buildSection(entityId, null, unassigned, undefined)\n if (section) sections.push(section)\n }\n }\n\n if (!sections.length && hasFieldsets) {\n const fallbackCode = availableFieldsets[0]?.code ?? null\n sections.push(createEmptySection(fallbackCode))\n }\n\n layout.push({\n entityId,\n sections,\n availableFieldsets,\n singleFieldsetPerRecord,\n hasFieldsets,\n activeFieldset: cfFieldsetSelections[entityId] ?? availableFieldsets[0]?.code ?? null,\n })\n })\n\n return { cfFields: aggregated, customFieldLayout: layout }\n }, [\n cfDefinitions,\n cfFieldsetSelections,\n customEntity,\n customFieldsLabel,\n entitySettings,\n fieldsetsByEntity,\n resolvedEntityIds,\n ])\n\n const injectedFieldDefinitions = React.useMemo<InjectionFieldDefinition[]>(() => {\n const definitions: InjectionFieldDefinition[] = []\n for (const widget of injectedFieldWidgets) {\n if (!('fields' in widget)) continue\n for (const field of widget.fields ?? []) {\n definitions.push(field as InjectionFieldDefinition)\n }\n }\n return definitions\n }, [injectedFieldWidgets])\n\n const injectedFieldContext = React.useMemo<FieldContext>(() => {\n const recordValues = values as Record<string, unknown>\n const organizationId = typeof recordValues.organizationId === 'string' ? recordValues.organizationId : null\n const tenantId = typeof recordValues.tenantId === 'string' ? recordValues.tenantId : null\n const userId = typeof recordValues.userId === 'string' ? recordValues.userId : null\n return {\n organizationId,\n tenantId,\n userId,\n record: recordValues,\n }\n }, [values])\n\n const hiddenInjectedFieldIds = React.useMemo(() => {\n const hidden = new Set<string>()\n for (const definition of injectedFieldDefinitions) {\n if (!evaluateInjectedVisibility(definition.visibleWhen, values as Record<string, unknown>, injectedFieldContext)) {\n hidden.add(definition.id)\n }\n }\n return hidden\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n const injectedFieldIdSet = React.useMemo(\n () => new Set(injectedFieldDefinitions.map((definition) => definition.id)),\n [injectedFieldDefinitions],\n )\n\n const injectedCrudFields = React.useMemo<CrudField[]>(() => {\n return injectedFieldDefinitions.map((definition) => ({\n id: definition.id,\n label: definition.label,\n type: 'custom',\n readOnly: definition.readOnly,\n component: ({ value, setValue, values: formValues }) => (\n <InjectedField\n field={definition}\n value={value}\n onChange={(_, nextValue) => setValue(nextValue)}\n context={injectedFieldContext}\n formData={(formValues ?? values) as Record<string, unknown>}\n />\n ),\n }))\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n\n const allFields = React.useMemo(() => {\n const base = [...fields, ...injectedCrudFields]\n\n if (groups) {\n const provided = new Set(base.map(f => f.id))\n for (const group of groups) {\n if (!group.fields) continue\n for (const entry of group.fields) {\n if (typeof entry === 'string') continue\n if (!provided.has(entry.id)) {\n provided.add(entry.id)\n base.push(entry)\n }\n }\n }\n }\n if (!cfFields.length) return base\n const provided = new Set(base.map(f => f.id))\n const extras = cfFields.filter(f => !provided.has(f.id))\n return [...base, ...extras]\n }, [fields, injectedCrudFields, cfFields, groups])\n\n const fieldById = React.useMemo(() => {\n return new globalThis.Map(allFields.map((f) => [f.id, f]))\n }, [allFields])\n\n const allFieldsRef = React.useRef(allFields)\n allFieldsRef.current = allFields\n\n const dynamicOptionLoaderKey = React.useMemo(() => {\n return allFields\n .filter(f => f.type !== 'custom' && typeof (f as CrudBuiltinField).loadOptions === 'function')\n .map(f => f.id)\n .join('\\0')\n }, [allFields])\n\n const injectionGroupCards = React.useMemo<CrudFormGroup[]>(() => {\n if (!injectionWidgets || injectionWidgets.length === 0) return []\n const pairs = injectionWidgets\n .filter((widget) => (widget.placement?.kind ?? 'stack') === 'group')\n .map((widget) => {\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const group: CrudFormGroup = {\n id: `widget:${widget.widgetId}`,\n title: widget.placement?.groupLabel ?? widget.module.metadata.title,\n description: widget.placement?.groupDescription ?? widget.module.metadata.description,\n column: widget.placement?.column === 2 ? 2 : 1,\n component: () => (\n <widget.module.Widget\n context={injectionContext}\n data={values as unknown as CrudFormValues<TValues>}\n onDataChange={(next) => setValues(next as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ),\n }\n return { group, priority }\n })\n pairs.sort((a, b) => b.priority - a.priority)\n return pairs.map((p) => p.group)\n }, [injectionWidgets, injectionContext, pending, setValues, values])\n \n const groupsWithInjectedFields = React.useMemo(() => {\n if (!groups || groups.length === 0 || injectedFieldDefinitions.length === 0) return groups\n const cloned = groups.map((group) => ({ ...group, fields: [...(group.fields ?? [])] }))\n const fallbackIndex = cloned.length - 1\n for (const definition of injectedFieldDefinitions) {\n const targetIndex = cloned.findIndex((group) => group.id === definition.group)\n const index = targetIndex >= 0 ? targetIndex : fallbackIndex\n if (targetIndex < 0 && process.env.NODE_ENV !== 'production') {\n console.warn(`[CrudForm] Injected field \"${definition.id}\" targets group \"${definition.group}\" which does not exist. Appended to last group.`)\n }\n if (index < 0) continue\n const fieldEntries = cloned[index].fields ?? []\n if (!fieldEntries.some((entry) => typeof entry === 'string' && entry === definition.id)) {\n fieldEntries.push(definition.id)\n }\n cloned[index].fields = fieldEntries\n }\n return cloned\n }, [groups, injectedFieldDefinitions])\n\n const shouldAutoGroup = (!groupsWithInjectedFields || groupsWithInjectedFields.length === 0) && injectionGroupCards.length > 0\n const resolvedGroupsForLayout = React.useMemo(() => {\n const baseGroups = groupsWithInjectedFields && groupsWithInjectedFields.length ? groupsWithInjectedFields : []\n const autoGroup = shouldAutoGroup ? [{ id: '__auto-fields__', fields: allFields }] as CrudFormGroup[] : []\n return [...(baseGroups.length ? baseGroups : autoGroup), ...injectionGroupCards]\n }, [allFields, groupsWithInjectedFields, injectionGroupCards, shouldAutoGroup])\n const useGroupedLayout = resolvedGroupsForLayout.length > 0\n const stackedInjectionWidgets = React.useMemo(\n () => (injectionWidgets ?? []).filter((widget) => (widget.placement?.kind ?? 'stack') === 'stack'),\n [injectionWidgets],\n )\n\n const resolveGroupFields = React.useCallback((g: CrudFormGroup): CrudField[] => {\n if (g.kind === 'customFields') {\n return cfFields\n }\n\n const src = g.fields || []\n const result: CrudField[] = []\n\n for (const item of src) {\n if (typeof item === 'string') {\n const found = fieldById.get(item)\n if (found) result.push(found)\n } else if (item) {\n result.push(item as CrudField)\n }\n }\n\n return result\n }, [cfFields, fieldById])\n\n const customFieldsManageHref = React.useMemo(() => buildCustomFieldsManageHref(primaryEntityId), [buildCustomFieldsManageHref, primaryEntityId])\n\n const customFieldsEmptyState = React.useMemo(() => {\n const text = t('entities.customFields.empty')\n const action = t('entities.customFields.addFirst')\n return (\n <div className=\"rounded-md border border-dashed border-muted-foreground/50 bg-muted/10 px-3 py-4 text-sm text-muted-foreground\">\n <span>{text} </span>\n {customFieldsManageHref ? (\n <Link href={customFieldsManageHref} className=\"font-medium text-primary hover:underline\">\n {action}\n </Link>\n ) : (\n <span className=\"font-medium text-foreground\">{action}</span>\n )}\n </div>\n )\n }, [customFieldsManageHref, t])\n\n const firstFieldId = React.useMemo(() => {\n if (useGroupedLayout) {\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n\n for (const g of resolvedGroupsForLayout) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n\n const scan = (list: CrudFormGroup[]) => {\n for (const group of list) {\n const resolved = resolveGroupFields(group)\n for (const field of resolved) {\n if (field?.id && !field.disabled) return field.id\n }\n }\n return null as string | null\n }\n\n const fromCol1 = scan(col1)\n if (fromCol1) return fromCol1\n const fromCol2 = scan(col2)\n if (fromCol2) return fromCol2\n }\n\n for (const field of allFields) {\n if (field?.id && !field.disabled) return field.id\n }\n return null\n }, [allFields, resolveGroupFields, resolvedGroupsForLayout, useGroupedLayout])\n\n const requestSubmit = React.useCallback(() => {\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId) as HTMLFormElement | null\n form?.requestSubmit()\n }, [formId])\n\n const lastFocusedFieldRef = React.useRef<string | null>(null)\n const lastErrorFieldRef = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n\n if (isLoading || isLoadingCustomFields) {\n lastFocusedFieldRef.current = null\n return\n }\n\n if (!firstFieldId) return\n if (lastFocusedFieldRef.current === firstFieldId) return\n\n const run = () => {\n const form = document.getElementById(formId)\n if (!form) return\n\n // Do not steal focus if the user is already interacting with any element inside the form\n const active = typeof document !== 'undefined' ? (document.activeElement as HTMLElement | null) : null\n if (active && form.contains(active)) {\n return\n }\n\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${firstFieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(FOCUSABLE_SELECTOR)\n\n if (target && typeof target.focus === 'function') {\n target.focus()\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastFocusedFieldRef.current = firstFieldId\n }\n }\n\n const frame =\n typeof window.requestAnimationFrame === 'function'\n ? window.requestAnimationFrame(run)\n : window.setTimeout(run, 0)\n\n return () => {\n if (typeof window === 'undefined') return\n if (typeof window.cancelAnimationFrame === 'function') {\n window.cancelAnimationFrame(frame as number)\n } else {\n window.clearTimeout(frame as number)\n }\n }\n }, [firstFieldId, formId, isLoading, isLoadingCustomFields])\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n const entries = Object.entries(errors)\n if (!entries.length) {\n lastErrorFieldRef.current = null\n return\n }\n const [fieldId] = entries[0]\n if (!fieldId || lastErrorFieldRef.current === fieldId) return\n\n const form = document.getElementById(formId)\n if (!form) return\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${fieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(`[name=\"${fieldId}\"]`) ??\n container ??\n null\n\n if (target && typeof target.focus === 'function') {\n target.focus()\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastErrorFieldRef.current = fieldId\n }\n }, [errors, formId])\n\n const setValue = React.useCallback((id: string, nextValue: unknown) => {\n let nextData: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n if (Object.is(prev[id], nextValue)) return prev\n nextData = { ...prev, [id]: nextValue } as CrudFormValues<TValues>\n return nextData\n })\n if (!nextData || !extendedInjectionEventsEnabled) return\n void triggerInjectionEvent('onFieldChange', nextData as TValues, injectionContextRef.current, {\n fieldId: id,\n fieldValue: nextValue,\n }).then((result) => {\n if (!result.ok) return\n const change = result.fieldChange\n if (!change) return\n const updates: Record<string, unknown> = { ...(change.sideEffects ?? {}) }\n if (change.value !== undefined) {\n updates[id] = change.value\n }\n if (Object.keys(updates).length > 0) {\n setValues((prev) => {\n let changed = false\n const next = { ...prev } as Record<string, unknown>\n for (const [key, value] of Object.entries(updates)) {\n if (Object.is(next[key], value)) continue\n next[key] = value\n changed = true\n }\n return changed ? (next as CrudFormValues<TValues>) : prev\n })\n }\n for (const message of change.messages ?? []) {\n flash(message.text, message.severity)\n }\n }).catch((err) => {\n console.error('[CrudForm] Error in onFieldChange:', err)\n })\n }, [extendedInjectionEventsEnabled, flash, triggerInjectionEvent])\n\n const handleFieldsetSelectionChange = React.useCallback(\n (entityId: string, nextCode: string | null) => {\n setCfFieldsetSelections((prev) => ({ ...prev, [entityId]: nextCode }))\n const bindingKey = customFieldsetBindings?.[entityId]?.valueKey\n if (bindingKey) {\n setValue(bindingKey, nextCode ?? undefined)\n }\n },\n [customFieldsetBindings, setValue],\n )\n\n const handleOpenFieldsetEditor = React.useCallback(\n (entityId: string, fieldsetCode: string | null, view: 'entity' | 'fieldset' = 'entity') => {\n const href = buildCustomFieldsManageHref(entityId)\n if (!href) return\n setFieldsetEditorTarget({ entityId, fieldsetCode, view })\n },\n [buildCustomFieldsManageHref],\n )\n\n const initialValuesSnapshotRef = React.useRef<string | undefined>(undefined)\n React.useEffect(() => {\n if (!initialValues) return\n const snapshot = JSON.stringify(initialValues)\n if (initialValuesSnapshotRef.current === snapshot) return\n initialValuesSnapshotRef.current = snapshot\n let mergedValues: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n const merged = { ...prev, ...initialValues } as CrudFormValues<TValues>\n for (const definition of injectedFieldDefinitions) {\n if (merged[definition.id] !== undefined) continue\n const extracted = readByDotPath(initialValues as Record<string, unknown>, definition.id)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[definition.id] = extracted\n }\n }\n mergedValues = merged\n return mergedValues\n })\n if (!extendedInjectionEventsEnabled || !mergedValues) return\n let cancelled = false\n const run = async () => {\n try {\n const result = await triggerInjectionEvent(\n 'transformDisplayData',\n mergedValues as TValues,\n injectionContextRef.current,\n )\n const transformed = result.data\n if (cancelled || !transformed) return\n setValues(transformed as CrudFormValues<TValues>)\n } catch (err) {\n console.error('[CrudForm] Error in transformDisplayData:', err)\n }\n }\n void run()\n return () => {\n cancelled = true\n }\n }, [extendedInjectionEventsEnabled, initialValues, injectedFieldDefinitions, triggerInjectionEvent])\n\n const buildFieldsetEditorHref = React.useCallback(\n (includeViewParam: boolean) => {\n if (!fieldsetEditorTarget) return null\n const base = buildCustomFieldsManageHref(fieldsetEditorTarget.entityId)\n if (!base) return null\n const params: string[] = []\n if (fieldsetEditorTarget.fieldsetCode) {\n params.push(`fieldset=${encodeURIComponent(fieldsetEditorTarget.fieldsetCode)}`)\n }\n if (includeViewParam && fieldsetEditorTarget.view === 'fieldset') {\n params.push('view=fieldset')\n }\n if (!params.length) return base\n const connector = base.includes('?') ? '&' : '?'\n return `${base}${connector}${params.join('&')}`\n },\n [buildCustomFieldsManageHref, fieldsetEditorTarget],\n )\n\n const fieldsetEditorFullHref = React.useMemo(() => buildFieldsetEditorHref(false), [buildFieldsetEditorHref])\n\n const handleFieldsetDialogSave = React.useCallback(() => {\n if (!fieldsetManagerRef.current) return\n void fieldsetManagerRef.current.submit()\n }, [])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setFormError(null)\n setErrors({})\n\n const requiredMessage = t('ui.forms.errors.required')\n const highlightedMessage = t('ui.forms.errors.highlighted')\n\n // Make sure inputs that commit on blur flush their local state before submit.\n try {\n if (typeof document !== 'undefined') {\n const activeElement = document.activeElement\n if (activeElement instanceof HTMLElement) {\n activeElement.blur()\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n }\n }\n } catch {\n // ignore focus cleanup errors\n }\n\n // Basic required-field validation when no zod schema is provided\n const requiredErrors: Record<string, string> = {}\n for (const field of allFields) {\n if (!field.required) continue\n if (field.disabled) continue\n if (hiddenInjectedFieldIds.has(field.id)) continue\n const v = values[field.id]\n const isArray = Array.isArray(v)\n const isString = typeof v === 'string'\n const empty =\n v === undefined ||\n v === null ||\n (isString && v.trim() === '') ||\n (isArray && v.length === 0) ||\n (field.type === 'checkbox' && v !== true)\n if (empty) requiredErrors[field.id] = requiredMessage\n }\n if (Object.keys(requiredErrors).length) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Required field errors prevented submit', requiredErrors)\n }\n const transformedErrors = await transformValidationErrors(requiredErrors)\n setErrors(transformedErrors)\n flash(highlightedMessage, 'error')\n return\n }\n\n // Custom fields validation via definitions (rules)\n if (resolvedEntityIds.length) {\n try {\n const mod = await import('./utils/customFieldDefs')\n const defs = await mod.fetchCustomFieldDefs(resolvedEntityIds)\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n // Build values keyed by def.key for validation\n const cfValues: Record<string, unknown> = {}\n if (customEntity) {\n for (const def of defs) {\n if (Object.prototype.hasOwnProperty.call(values, def.key)) {\n cfValues[def.key] = values[def.key]\n }\n }\n } else {\n for (const [k, v] of Object.entries(values)) {\n if (k.startsWith('cf_')) cfValues[k.replace(/^cf_/, '')] = v\n }\n }\n const defsForValidation = defs as unknown as CustomFieldDefLike[]\n const result = validateValuesAgainstDefs(cfValues, defsForValidation)\n if (!result.ok) {\n if (customEntity) {\n const mapped: Record<string, string> = {}\n for (const [ek, ev] of Object.entries(result.fieldErrors)) mapped[ek.replace(/^cf_/, '')] = String(ev)\n const transformedErrors = await transformValidationErrors(mapped)\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n } else {\n const transformedErrors = await transformValidationErrors(\n Object.fromEntries(\n Object.entries(result.fieldErrors).map(([key, value]) => [key, String(value)]),\n ),\n )\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n }\n flash(highlightedMessage, 'error')\n return\n }\n } catch {\n // ignore validation errors if helper not available\n }\n }\n\n const widgetValues = { ...(values as Record<string, unknown>) }\n for (const hiddenId of hiddenInjectedFieldIds) {\n delete widgetValues[hiddenId]\n }\n const coreValues = { ...widgetValues }\n for (const injectedId of injectedFieldIdSet) {\n delete coreValues[injectedId]\n }\n\n let parsedValues: TValues\n if (schema) {\n const res = schema.safeParse(coreValues)\n if (!res.success) {\n const fieldErrors: Record<string, string> = {}\n res.error.issues.forEach((issue) => {\n if (issue.path && issue.path.length) fieldErrors[String(issue.path[0])] = issue.message\n })\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Schema validation failed', res.error.issues)\n }\n const transformedErrors = await transformValidationErrors(fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n flash(highlightedMessage, 'error')\n return\n }\n parsedValues = res.data\n } else {\n parsedValues = coreValues as TValues\n }\n let submitValues = widgetValues as TValues\n let coreSubmitValues = parsedValues\n if (extendedInjectionEventsEnabled) {\n try {\n const result = await triggerInjectionEvent('transformFormData', submitValues, injectionContext)\n if (result.data) {\n submitValues = result.data as TValues\n const projectedCoreValues = { ...(result.data as Record<string, unknown>) }\n for (const injectedId of injectedFieldIdSet) {\n delete projectedCoreValues[injectedId]\n }\n coreSubmitValues = schema ? schema.parse(projectedCoreValues) : (projectedCoreValues as TValues)\n if (result.applyToForm) {\n setValues(result.data as CrudFormValues<TValues>)\n }\n }\n } catch (err) {\n console.error('[CrudForm] Error in transformFormData:', err)\n }\n }\n\n // Trigger onBeforeSave event for injection widgets\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeSave', submitValues, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n setPending(false)\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n\n setPending(true)\n \n // Trigger onSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n \n try {\n if (injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0) {\n await withScopedApiRequestHeaders(injectionRequestHeaders, async () => {\n await onSubmit?.(coreSubmitValues)\n })\n } else {\n await onSubmit?.(coreSubmitValues)\n }\n \n // Trigger onAfterSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterSave:', err)\n }\n }\n \n if (successRedirect) await navigateWithGuard(successRedirect)\n } catch (err: unknown) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const { message: helperMessage, fieldErrors: serverFieldErrors } = mapCrudServerErrorToFormErrors(err, { customEntity })\n const combinedFieldErrors = serverFieldErrors ?? {}\n const hasFieldErrors = Object.keys(combinedFieldErrors).length > 0\n const firstFieldMessage = hasFieldErrors\n ? (() => {\n const firstKey = Object.keys(combinedFieldErrors)[0]\n if (!firstKey) return null\n const value = combinedFieldErrors[firstKey]\n if (typeof value !== 'string' || !value.trim().length) return null\n return translateValidationMessage(value)\n })()\n : null\n if (hasFieldErrors) {\n const transformedErrors = await transformValidationErrors(combinedFieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Submission failed with field errors', transformedErrors)\n }\n }\n\n let displayMessage = typeof helperMessage === 'string' && helperMessage.trim() ? helperMessage.trim() : ''\n if (hasFieldErrors) {\n const lowered = displayMessage.toLowerCase()\n const highlightedLower = highlightedMessage.toLowerCase()\n if (!displayMessage || lowered === 'invalid input' || lowered === highlightedLower) {\n displayMessage = firstFieldMessage ?? highlightedMessage\n }\n }\n if (!displayMessage && err instanceof Error && typeof err.message === 'string' && err.message.trim()) {\n displayMessage = err.message.trim()\n }\n if (!displayMessage) {\n displayMessage = hasFieldErrors ? highlightedMessage : saveErrorMessage\n }\n displayMessage = parseServerMessage(displayMessage)\n flash(displayMessage, 'error')\n setFormError(displayMessage)\n } finally {\n setPending(false)\n }\n }\n\n // Stable key prevents infinite re-render loop (see #814) \u2014 do not depend on allFields directly.\n React.useEffect(() => {\n let cancelled = false\n const loadAll = async () => {\n const loaders = allFieldsRef.current\n .filter(\n (f): f is CrudBuiltinField & { loadOptions: NonNullable<CrudBuiltinField['loadOptions']> } =>\n f.type !== 'custom' && typeof f.loadOptions === 'function'\n )\n .map(async (f) => {\n try {\n const opts = await f.loadOptions()\n if (!cancelled) setDynamicOptions((prev) => ({ ...prev, [f.id]: opts }))\n } catch {\n // ignore\n }\n })\n await Promise.all(loaders)\n }\n loadAll()\n return () => {\n cancelled = true\n }\n }, [dynamicOptionLoaderKey])\n\n const loadFieldOptions = React.useCallback(async (field: CrudField, query?: string): Promise<CrudFieldOption[]> => {\n if (!('type' in field) || field.type === 'custom') return EMPTY_OPTIONS\n const builtin = field as CrudBuiltinField\n const loader = builtin.loadOptions\n if (typeof loader === 'function') {\n if (query === undefined && Array.isArray(dynamicOptions[field.id])) return dynamicOptions[field.id]\n try {\n const fetched = await loader(query)\n if (query === undefined) {\n setDynamicOptions((prev) => ({\n ...prev,\n [field.id]: fetched,\n }))\n }\n return fetched\n } catch {\n return builtin.options ?? EMPTY_OPTIONS\n }\n }\n return dynamicOptions[field.id] || builtin.options || EMPTY_OPTIONS\n }, [dynamicOptions])\n\n const fieldOptionsById = React.useMemo(() => {\n const map = new globalThis.Map<string, CrudFieldOption[]>()\n for (const f of allFields) {\n if (!('type' in f) || f.type === 'custom') continue\n const builtin = f as CrudBuiltinField\n const staticOptions = builtin.options ?? EMPTY_OPTIONS\n const dynamic = dynamicOptions[f.id]\n if (dynamic && dynamic.length) {\n const merged: CrudFieldOption[] = []\n const seen = new Set<string>()\n for (const opt of staticOptions) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n for (const opt of dynamic) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n map.set(f.id, merged)\n } else if (staticOptions.length) {\n map.set(f.id, staticOptions)\n } else if (dynamic) {\n map.set(f.id, dynamic)\n }\n }\n return map\n }, [allFields, dynamicOptions])\n\n // no auto-focus; let the browser/user manage focus\n\n const usesResponsiveLayout = allFields.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const grid = twoColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : usesResponsiveLayout\n ? 'grid grid-cols-1 gap-4 md:grid-cols-6'\n : 'grid grid-cols-1 gap-4'\n\n // Helper to render a list of field configs\n const resolveLayoutClass = (layout?: CrudFieldBase['layout']) => {\n switch (layout) {\n case 'half':\n return 'md:col-span-3'\n case 'third':\n return 'md:col-span-2'\n default:\n return 'md:col-span-6'\n }\n }\n\n const renderFields = (fieldList: CrudField[]) => {\n const usesResponsive = fieldList.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const gridClass = usesResponsive ? 'grid grid-cols-1 gap-4 md:grid-cols-6' : 'grid grid-cols-1 gap-4'\n return (\n <div className={gridClass}>\n {fieldList.map((f) => {\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsive ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={values[f.id]}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n />\n )\n })}\n </div>\n )\n }\n\n const renderCustomFieldsContent = React.useCallback((): React.ReactNode[] => {\n if (!customFieldLayout.length) {\n return [\n <div key=\"custom-fields-empty\" className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n ]\n }\n\n const nodes: React.ReactNode[] = []\n const multipleEntities = customFieldLayout.length > 1\n\n customFieldLayout.forEach((entityLayout) => {\n const manageHref = buildCustomFieldsManageHref(entityLayout.entityId)\n const showSelector =\n entityLayout.hasFieldsets &&\n entityLayout.singleFieldsetPerRecord &&\n entityLayout.availableFieldsets.length > 0\n\n if (multipleEntities) {\n nodes.push(\n <div\n key={`custom-fields-entity-${entityLayout.entityId}`}\n className=\"px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {entityLayout.entityId}\n </div>,\n )\n }\n\n if (showSelector) {\n nodes.push(\n <div key={`custom-fields-selector-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <label className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {fieldsetSelectorLabel}\n </label>\n <select\n className=\"h-9 rounded border pl-3 pr-8 text-sm\"\n value={entityLayout.activeFieldset ?? ''}\n onChange={(event) =>\n handleFieldsetSelectionChange(\n entityLayout.entityId,\n event.target.value || null,\n )}\n >\n <option value=\"\">{defaultFieldsetLabel}</option>\n {entityLayout.availableFieldsets.map((fs) => (\n <option key={fs.code} value={fs.code}>\n {fs.label}\n </option>\n ))}\n </select>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() =>\n handleOpenFieldsetEditor(entityLayout.entityId, entityLayout.activeFieldset ?? null, 'fieldset')}\n disabled={!manageHref}\n title={manageFieldsetLabel}\n >\n <Settings className=\"size-4\" />\n </IconButton>\n </div>\n </div>,\n )\n }\n\n if (entityLayout.sections.length) {\n entityLayout.sections.forEach((section) => {\n const FieldsetIcon = section.fieldset?.icon\n ? FIELDSET_ICON_COMPONENTS[section.fieldset.icon]\n : null\n const sectionKey = `${entityLayout.entityId}:${section.fieldsetCode ?? 'default'}`\n const manageDisabled = !manageHref\n nodes.push(\n <div key={sectionKey} className=\"rounded-lg border bg-card p-4 space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2\">\n {FieldsetIcon ? (\n <FieldsetIcon className=\"size-5 text-muted-foreground\" />\n ) : null}\n <div>\n <div className=\"text-sm font-medium\">{section.title}</div>\n {section.description ? (\n <div className=\"text-xs text-muted-foreground\">\n {section.description}\n </div>\n ) : null}\n </div>\n </div>\n <Button\n variant=\"muted\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => handleOpenFieldsetEditor(entityLayout.entityId, section.fieldsetCode, 'fieldset')}\n disabled={manageDisabled}\n >\n <Settings className=\"size-4\" />\n {manageFieldsetLabel}\n </Button>\n </div>\n {section.groups.map((group) => {\n const groupKey = `${section.fieldsetCode ?? 'default'}:${group.code ?? 'default'}`\n return (\n <div key={groupKey} className=\"space-y-2\">\n {group.label ? (\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n ) : null}\n {renderFields(group.fields)}\n </div>\n )\n })}\n {!section.groups.length ? (\n <div className=\"text-xs text-muted-foreground\">{emptyFieldsetMessage}</div>\n ) : null}\n </div>,\n )\n })\n } else {\n nodes.push(\n <div key={`custom-fields-empty-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n )\n }\n })\n\n return nodes\n }, [\n buildCustomFieldsManageHref,\n customFieldLayout,\n customFieldsEmptyState,\n defaultFieldsetLabel,\n emptyFieldsetMessage,\n fieldsetSelectorLabel,\n handleFieldsetSelectionChange,\n handleOpenFieldsetEditor,\n manageFieldsetLabel,\n renderFields,\n ])\n\n const fieldsetManagerDialog = (\n <Dialog open={fieldsetEditorTarget !== null} onOpenChange={(open) => { if (!open) setFieldsetEditorTarget(null) }}>\n <DialogContent\n className=\"max-w-5xl w-full\"\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n handleFieldsetDialogSave()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{fieldsetDialogTitle}</DialogTitle>\n </DialogHeader>\n {fieldsetEditorTarget ? (\n <FieldDefinitionsManager\n ref={fieldsetManagerRef}\n entityId={fieldsetEditorTarget.entityId}\n initialFieldset={fieldsetEditorTarget.fieldsetCode}\n fullEditorHref={fieldsetEditorFullHref ?? undefined}\n onSaved={refreshCustomFieldDefinitions}\n onClose={() => setFieldsetEditorTarget(null)}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground px-4 text-center\">\n {fieldsetDialogUnavailable}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n\n // If groups are provided, render the two-column grouped layout\n if (useGroupedLayout) {\n\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n for (const g of resolvedGroupsForLayout) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n\n const renderGroupedCards = (items: CrudFormGroup[]) => {\n const nodes: React.ReactNode[] = []\n for (const g of items) {\n const isCustomFieldsGroup = g.kind === 'customFields'\n if (isCustomFieldsGroup) {\n if (isLoadingCustomFields) {\n nodes.push(\n <div key={`${g.id}-loading`} className=\"rounded-lg border bg-card p-4\">\n <DataLoader\n isLoading\n loadingMessage={resolvedCustomFieldsLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n <div />\n </DataLoader>\n </div>,\n )\n continue\n }\n if (g.component) {\n nodes.push(\n <div key={`${g.id}-component`} className=\"rounded-lg border bg-card px-4 py-3\">\n {g.component({ values, setValue, errors })}\n </div>,\n )\n }\n const renderedSections = renderCustomFieldsContent()\n if (renderedSections.length) nodes.push(...renderedSections)\n continue\n }\n\n const componentNode = g.component ? g.component({ values, setValue, errors }) : null\n if (g.bare) {\n if (componentNode) {\n nodes.push(<React.Fragment key={g.id}>{componentNode}</React.Fragment>)\n }\n continue\n }\n const groupFields = resolveGroupFields(g)\n nodes.push(\n <div key={g.id} className=\"rounded-lg border bg-card px-4 py-3 space-y-3\">\n {g.title ? (\n <div className=\"text-sm font-medium\">{t(g.title, g.title)}</div>\n ) : null}\n {g.description ? <div className=\"text-xs text-muted-foreground\">{t(g.description, g.description)}</div> : null}\n {componentNode ? (\n <div>{componentNode}</div>\n ) : null}\n <DataLoader\n isLoading={false}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n {groupFields.length > 0 ? renderFields(groupFields) : <div className=\"min-h-[1px]\" />}\n </DataLoader>\n </div>,\n )\n }\n return nodes\n }\n\n const col1Content = renderGroupedCards(col1)\n const col2Content = renderGroupedCards(col2)\n const hasSecondaryColumn = col2Content.length > 0\n\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n <form id={formId} onSubmit={handleSubmit} className={`space-y-4 ${dialogFormPadding}`}>\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div\n className={hasSecondaryColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : 'grid grid-cols-1 gap-4'}\n >\n <div className=\"space-y-3\">{col1Content}</div>\n {hasSecondaryColumn ? <div className=\"space-y-3\">{col2Content}</div> : null}\n </div>\n {formError ? <div className=\"text-sm text-red-600\">{formError}</div> : null}\n {hideFooterActions ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon }\n }}\n />\n )}\n </form>\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n }\n\n // Default single-card layout (compatible with previous API)\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n <div>\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={`${embedded ? 'space-y-4' : 'rounded-lg border bg-card p-4 space-y-4'} ${dialogFormPadding}`}\n >\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div className={grid}>\n {allFields.map((f) => {\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsiveLayout ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={values[f.id]}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n />\n )\n })}\n </div>\n {formError ? <div className=\"text-sm text-red-600\">{formError}</div> : null}\n {hideFooterActions ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n )}\n </form>\n </div>\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n}\n\nfunction RelationSelect({\n value,\n onChange,\n options,\n placeholder,\n autoFocus,\n}: {\n value: string\n onChange: (v: string) => void\n options: CrudFieldOption[]\n placeholder?: string\n autoFocus?: boolean\n}) {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [query, options])\n\n return (\n <div className=\"space-y-1\">\n <input\n ref={inputRef}\n className=\"w-full h-9 rounded border px-2 text-sm\"\n placeholder={placeholder || t('ui.forms.listbox.searchPlaceholder', 'Search...')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"max-h-40 overflow-auto rounded border\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-full justify-start rounded-none font-normal\"\n onClick={() => onChange('')}\n >\n \u2014\n </Button>\n {filtered.map((opt) => (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n className={`w-full justify-start rounded-none font-normal ${\n value === opt.value ? 'bg-muted' : ''\n }`}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </Button>\n ))}\n </div>\n </div>\n )\n}\n// Local-buffer text input to avoid focus loss when parent re-renders\nfunction TextInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n disabled,\n suggestions,\n inputType = 'text',\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n disabled?: boolean\n suggestions?: string[]\n inputType?: 'text' | 'password'\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n const userTypingRef = React.useRef(false)\n const datalistId = React.useId()\n\n React.useEffect(() => {\n // Sync from props whenever the input is unfocused or the user hasn't typed yet.\n if (!isFocusedRef.current || !userTypingRef.current) {\n setLocal(value)\n }\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return\n const next = e.target.value\n userTypingRef.current = true\n setLocal(next)\n onChange(next)\n }, [disabled, onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onChange(local)\n onSubmit?.()\n }\n }, [disabled, local, onChange, onSubmit])\n\n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n\n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n userTypingRef.current = false\n onChange(local)\n }, [local, onChange])\n\n return (\n <>\n <input\n type={inputType}\n className=\"w-full h-9 rounded border px-2 text-sm\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n spellCheck={false}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n disabled={disabled}\n list={suggestions && suggestions.length > 0 ? datalistId : undefined}\n />\n {suggestions && suggestions.length > 0 && (\n <datalist id={datalistId}>\n {suggestions.map((suggestion) => (\n <option key={suggestion} value={suggestion} />\n ))}\n </datalist>\n )}\n </>\n )\n}\n\n// Local-buffer number input to avoid focus loss when parent re-renders\nfunction NumberInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n}: {\n value: number | string | null | undefined\n onChange: (v: number | undefined) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n}) {\n const [local, setLocal] = React.useState<string>(value !== undefined && value !== null ? String(value) : '')\n const isFocusedRef = React.useRef(false)\n \n React.useEffect(() => {\n // Only sync from props when not focused to avoid caret jumps\n if (!isFocusedRef.current) {\n setLocal(value !== undefined && value !== null ? String(value) : '')\n }\n }, [value])\n \n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value\n setLocal(next)\n const numValue = next === '' ? undefined : Number(next)\n onChange(numValue)\n }, [onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n onSubmit?.()\n }\n }, [local, onChange, onSubmit])\n \n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n \n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n }, [local, onChange])\n \n return (\n <input\n type=\"number\"\n className=\"w-full h-9 rounded border px-2 text-sm\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Local-buffer textarea to avoid form-wide re-renders while typing\nfunction TextAreaInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!isFocusedRef.current) setLocal(value)\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value\n setLocal(next)\n onChange(next)\n }, [onChange])\n\n const handleFocus = React.useCallback(() => { isFocusedRef.current = true }, [])\n const handleBlur = React.useCallback(() => { isFocusedRef.current = false; onChange(local) }, [local, onChange])\n\n return (\n <textarea\n className=\"w-full rounded border px-2 py-2 min-h-[80px] sm:min-h-[120px] text-sm\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Markdown editor using @uiw/react-md-editor (client-only)\ntype MDProps = { value?: string; onChange: (md: string) => void }\nconst MDEditor = dynamic(async () => {\n const mod = await import('@uiw/react-md-editor')\n return mod.default\n}, { ssr: false }) as React.ComponentType<UiWMDEditorProps>\nconst MarkdownEditor = React.memo(function MarkdownEditor({ value = '', onChange }: MDProps) {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const [local, setLocal] = React.useState<string>(value)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!typingRef.current) setLocal(value)\n }, [value])\n\n const handleChange = React.useCallback((v?: string) => {\n typingRef.current = true\n setLocal(v ?? '')\n }, [])\n\n const commit = React.useCallback(() => {\n if (!typingRef.current) return\n typingRef.current = false\n onChange(local)\n requestAnimationFrame(() => {\n const ta = containerRef.current?.querySelector('textarea') as HTMLTextAreaElement | null\n ta?.focus()\n })\n }, [local, onChange])\n\n return (\n <div ref={containerRef} data-color-mode=\"light\" className=\"w-full\" onBlur={() => commit()}>\n <MDEditor\n value={local}\n height={220}\n onChange={handleChange}\n previewOptions={{ remarkPlugins: [remarkGfm] }}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\n// HTML Rich Text editor (contentEditable) with shortcuts; returns HTML string\ntype HtmlRTProps = { value?: string; onChange: (html: string) => void }\nconst HtmlRichTextEditor = React.memo(function HtmlRichTextEditor({ value = '', onChange }: HtmlRTProps) {\n const t = useT()\n const boldLabel = t('ui.forms.richtext.bold')\n const italicLabel = t('ui.forms.richtext.italic')\n const underlineLabel = t('ui.forms.richtext.underline')\n const listLabel = t('ui.forms.richtext.list')\n const heading3Label = t('ui.forms.richtext.heading3')\n const linkLabel = t('ui.forms.richtext.link')\n const linkUrlPrompt = t('ui.forms.richtext.linkUrlPrompt')\n const ref = React.useRef<HTMLDivElement | null>(null)\n const applyingExternal = React.useRef(false)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n const el = ref.current\n if (!el) return\n const current = el.innerHTML\n if (!typingRef.current && current !== value) {\n applyingExternal.current = true\n el.innerHTML = value || ''\n requestAnimationFrame(() => { applyingExternal.current = false })\n }\n }, [value])\n\n const exec = (cmd: string, arg?: string) => {\n const el = ref.current\n if (!el) return\n el.focus()\n try {\n document.execCommand(cmd, false, arg)\n } catch {\n // ignore execCommand failures\n }\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const isMod = e.metaKey || e.ctrlKey\n if (!isMod) return\n const k = e.key.toLowerCase()\n if (k === 'b') { e.preventDefault(); exec('bold') }\n if (k === 'i') { e.preventDefault(); exec('italic') }\n if (k === 'u') { e.preventDefault(); exec('underline') }\n }\n\n return (\n <div className=\"w-full rounded border\">\n <div className=\"flex items-center gap-1 px-2 py-1 border-b\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('bold')}>{boldLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('italic')}>{italicLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('underline')}>{underlineLabel}</Button>\n <span className=\"mx-2 text-muted-foreground\">|</span>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('insertUnorderedList')}>\u2022 {listLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('formatBlock', '<h3>')}>{heading3Label}</Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-0.5 text-xs\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const url = window.prompt(linkUrlPrompt)?.trim()\n if (url) exec('createLink', url)\n }}\n >{linkLabel}</Button>\n </div>\n <div\n ref={ref}\n className=\"w-full px-2 py-2 min-h-[100px] sm:min-h-[160px] focus:outline-none prose prose-sm max-w-none\"\n contentEditable\n suppressContentEditableWarning\n onKeyDown={onKeyDown}\n onInput={() => { if (!applyingExternal.current) typingRef.current = true }}\n onBlur={() => {\n const el = ref.current\n if (!el) return\n typingRef.current = false\n onChange(el.innerHTML)\n }}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\n// Very simple markdown editor with Bold/Italic/Underline + shortcuts.\ntype SimpleMDProps = { value?: string; onChange: (md: string) => void }\nconst SimpleMarkdownEditor = React.memo(function SimpleMarkdownEditor({ value = '', onChange }: SimpleMDProps) {\n const t = useT()\n const boldLabel = t('ui.forms.richtext.bold')\n const italicLabel = t('ui.forms.richtext.italic')\n const underlineLabel = t('ui.forms.richtext.underline')\n const markdownPlaceholder = t('ui.forms.richtext.placeholder')\n const sampleText = t('ui.forms.richtext.sampleText')\n const taRef = React.useRef<HTMLTextAreaElement | null>(null)\n const [local, setLocal] = React.useState<string>(value)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!typingRef.current) setLocal(value)\n }, [value])\n\n const wrap = (before: string, after: string = before) => {\n const el = taRef.current\n if (!el) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n const sel = value.slice(start, end) || sampleText\n const next = value.slice(0, start) + before + sel + after + value.slice(end)\n onChange(next)\n queueMicrotask(() => {\n const caret = start + before.length + sel.length + after.length\n el.focus()\n el.setSelectionRange(caret, caret)\n })\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n const isMod = e.metaKey || e.ctrlKey\n if (!isMod) return\n const key = e.key.toLowerCase()\n if (key === 'b') { e.preventDefault(); wrap('**') }\n if (key === 'i') { e.preventDefault(); wrap('_') }\n if (key === 'u') { e.preventDefault(); wrap('__') }\n }\n\n return (\n <div className=\"w-full rounded border\">\n <div className=\"flex items-center gap-1 px-2 py-1 border-b\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('**')}>{boldLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('_')}>{italicLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('__')}>{underlineLabel}</Button>\n </div>\n <textarea\n ref={taRef}\n className=\"w-full min-h-[100px] sm:min-h-[160px] resize-y px-2 py-2 font-mono text-sm outline-none\"\n spellCheck={false}\n value={local}\n onChange={(e) => { typingRef.current = true; setLocal(e.target.value) }}\n onBlur={() => { if (typingRef.current) { typingRef.current = false; onChange(local) } }}\n onKeyDown={onKeyDown}\n placeholder={markdownPlaceholder}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\ntype FieldControlProps = {\n field: CrudField\n value: unknown\n error?: string\n options: CrudFieldOption[]\n setValue: (id: string, v: unknown) => void\n values: Record<string, unknown>\n loadFieldOptions: (field: CrudField, query?: string) => Promise<CrudFieldOption[]>\n autoFocus: boolean\n onSubmitRequest: () => void\n wrapperClassName?: string\n entityIdForField?: string\n recordId?: string\n}\n\ntype ListboxMultiSelectProps = {\n options: CrudFieldOption[]\n placeholder?: string\n value: string[]\n onChange: (vals: string[]) => void\n autoFocus?: boolean\n}\n\nconst ListboxMultiSelect = React.memo(function ListboxMultiSelect({\n options,\n placeholder,\n value,\n onChange,\n autoFocus,\n}: ListboxMultiSelectProps) {\n const t = useT()\n const searchPlaceholder = placeholder || t('ui.forms.listbox.searchPlaceholder')\n const noMatchesLabel = t('ui.forms.listbox.noMatches')\n const [query, setQuery] = React.useState('')\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [options, query])\n const toggle = React.useCallback(\n (val: string) => {\n const set = new Set(value)\n if (set.has(val)) set.delete(val)\n else set.add(val)\n onChange(Array.from(set))\n },\n [value, onChange]\n )\n return (\n <div className=\"w-full\">\n <input\n className=\"mb-2 w-full h-8 rounded border px-2 text-sm\"\n placeholder={searchPlaceholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"rounded border max-h-48 overflow-auto divide-y\">\n {filtered.map((opt) => {\n const isSel = value.includes(opt.value)\n return (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => toggle(opt.value)}\n className={`w-full justify-start rounded-none font-normal px-3 py-2 ${isSel ? 'bg-muted' : ''}`}\n >\n <span className=\"inline-flex items-center gap-2\">\n <input type=\"checkbox\" className=\"size-4\" readOnly checked={isSel} />\n <span>{opt.label}</span>\n </span>\n </Button>\n )\n })}\n {!filtered.length ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">{noMatchesLabel}</div>\n ) : null}\n </div>\n </div>\n )\n})\n\nconst FieldControl = React.memo(function FieldControlImpl({\n field,\n value,\n error,\n options,\n setValue,\n values,\n loadFieldOptions,\n autoFocus,\n onSubmitRequest,\n wrapperClassName,\n entityIdForField,\n recordId,\n}: FieldControlProps) {\n const t = useT()\n const fieldSetValue = React.useCallback(\n (nextValue: unknown) => setValue(field.id, nextValue),\n [setValue, field.id]\n )\n const setFormValue = React.useCallback(\n (targetId: string, nextValue: unknown) => setValue(targetId, nextValue),\n [setValue],\n )\n const builtin = field.type === 'custom' ? null : field\n const hasLoader = typeof builtin?.loadOptions === 'function'\n const disabled = Boolean(field.disabled)\n const readOnly = Boolean(field.readOnly)\n const autoFocusField = autoFocus && !disabled\n\n React.useEffect(() => {\n if (!hasLoader || field.type === 'custom') return\n loadFieldOptions(field).catch(() => {})\n }, [field, hasLoader, loadFieldOptions])\n\n const placeholder = builtin?.placeholder\n const rootClassName = wrapperClassName ? `space-y-1 ${wrapperClassName}` : 'space-y-1'\n\n return (\n <div className={rootClassName} data-crud-field-id={field.id}>\n {field.type !== 'checkbox' && field.label.trim().length > 0 ? (\n <label className=\"block text-sm font-medium\">\n {field.label}\n {field.required ? <span className=\"text-red-600\"> *</span> : null}\n </label>\n ) : null}\n {field.type === 'text' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n suggestions={field.type === 'text' ? field.suggestions : undefined}\n />\n )}\n {field.type === 'password' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n inputType=\"password\"\n />\n )}\n {field.type === 'number' && (\n <NumberInput\n value={typeof value === 'number' || typeof value === 'string' ? value : null}\n placeholder={placeholder}\n onChange={fieldSetValue}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n />\n )}\n {field.type === 'date' && (\n <input\n type=\"date\"\n className=\"w-full h-9 rounded border px-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => setValue(field.id, e.target.value || undefined)}\n autoFocus={autoFocusField}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n )}\n {field.type === 'datetime-local' && (\n <input\n type=\"datetime-local\"\n className=\"w-full h-9 rounded border px-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => setValue(field.id, e.target.value || undefined)}\n autoFocus={autoFocusField}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n )}\n {field.type === 'datepicker' && (\n <DatePicker\n value={typeof value === 'string' && value ? parseISO(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, 'yyyy-MM-dd') : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n closeOnSelect={builtin?.closeOnSelect}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datetime' && (\n <DateTimePicker\n value={typeof value === 'string' && value ? new Date(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? date.toISOString() : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'time' && (\n <TimePicker\n value={typeof value === 'string' ? value : null}\n onChange={(time) => setValue(field.id, time ?? undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n />\n )}\n {field.type === 'textarea' && (\n <TextAreaInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'richtext' && builtin?.editor === 'simple' && (\n <SimpleMarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && builtin?.editor === 'html' && (\n <HtmlRichTextEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && (!builtin?.editor || (builtin.editor !== 'simple' && builtin.editor !== 'html')) && (\n <MarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'tags' && (\n <TagsInput\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suggestions={options.map((opt) => opt.label)}\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => opt.label)\n }\n : undefined\n }\n />\n )}\n {field.type === 'combobox' && (\n <ComboboxInput\n value={typeof value === 'string' ? value : String(value ?? '')}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suggestions={\n builtin?.suggestions\n ? builtin.suggestions\n : options.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n allowCustomValues={builtin?.allowCustomValues ?? true}\n disabled={disabled}\n />\n )}\n {field.type === 'checkbox' && (\n <label className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n className=\"size-4\"\n checked={value === true}\n onChange={(e) => setValue(field.id, e.target.checked)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n )}\n {field.type === 'select' && !builtin?.multiple && (\n <select\n className=\"w-full h-9 rounded border pl-3 pr-8 text-sm\"\n value={\n Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n }\n onChange={(e) => setValue(field.id, e.target.value || undefined)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n >\n <option value=\"\">{t('ui.forms.select.emptyOption', '\u2014')}</option>\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox === true && (\n <ListboxMultiSelect\n options={options}\n placeholder={placeholder}\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(vals) => setValue(field.id, vals)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox !== true && (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((opt) => {\n const arr = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n const checked = arr.includes(opt.value)\n return (\n <label key={opt.value} className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n className=\"size-4\"\n checked={checked}\n onChange={(e) => {\n const next = new Set(arr)\n if (e.target.checked) {\n next.add(opt.value)\n } else {\n next.delete(opt.value)\n }\n setValue(field.id, Array.from(next))\n }}\n disabled={disabled}\n />\n <span className=\"text-sm\">{opt.label}</span>\n </label>\n )\n })}\n </div>\n )}\n {field.type === 'relation' && (\n <RelationSelect\n options={options}\n placeholder={placeholder}\n value={\n Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n }\n onChange={(selected) => setValue(field.id, selected)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'custom' && (\n <>\n {field.component({\n id: field.id,\n value,\n error,\n setValue: fieldSetValue,\n setFormValue,\n values,\n entityId: entityIdForField,\n recordId,\n autoFocus,\n disabled,\n })}\n </>\n )}\n {field.description ? (\n <div className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <div>{field.description}</div>\n </div>\n ) : null}\n {error ? <div className=\"text-xs text-red-600\">{error}</div> : null}\n </div>\n )\n},\n(prev, next) =>\n prev.field.id === next.field.id &&\n prev.field.type === next.field.type &&\n prev.field.label === next.field.label &&\n prev.field.description === next.field.description &&\n prev.field.required === next.field.required &&\n prev.value === next.value &&\n prev.error === next.error &&\n prev.options === next.options &&\n prev.loadFieldOptions === next.loadFieldOptions &&\n prev.autoFocus === next.autoFocus &&\n prev.onSubmitRequest === next.onSubmitRequest &&\n prev.wrapperClassName === next.wrapperClassName &&\n prev.entityIdForField === next.entityIdForField &&\n prev.recordId === next.recordId &&\n (prev.field.type !== 'custom' ||\n (prev.values === next.values &&\n prev.field.component === (next.field as CrudCustomField).component))\n)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { z } from 'zod'\nimport { useRouter } from 'next/navigation'\nimport { DataLoader } from '../primitives/DataLoader'\nimport { flash } from './FlashMessages'\nimport dynamic from 'next/dynamic'\nimport remarkGfm from 'remark-gfm'\nimport { FormHeader } from './forms/FormHeader'\nimport { FormFooter } from './forms/FormFooter'\nimport { Button } from '../primitives/button'\nimport { IconButton } from '../primitives/icon-button'\nimport {\n Settings,\n Layers,\n Tag,\n Sparkles,\n Package,\n Shirt,\n Grid,\n ShoppingBag,\n ShoppingCart,\n Store,\n Users,\n Briefcase,\n Building,\n BookOpen,\n Bookmark,\n Camera,\n Car,\n Clock,\n Cloud,\n Compass,\n CreditCard,\n Database,\n Flame,\n Gift,\n Globe,\n Heart,\n Info,\n Key,\n Map as MapIcon,\n Palette,\n Shield,\n Star,\n Truck,\n Zap,\n Coins,\n} from 'lucide-react'\nimport { loadGeneratedFieldRegistrations } from './fields/registry'\nimport type { CustomFieldDefDto, CustomFieldDefinitionsPayload, CustomFieldsetDto } from './utils/customFieldDefs'\nimport { buildFormFieldsFromCustomFields, buildFormFieldFromCustomFieldDef } from './utils/customFieldForms'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { TagsInput } from './inputs/TagsInput'\nimport { ComboboxInput } from './inputs/ComboboxInput'\nimport { format, parseISO } from 'date-fns'\nimport type { Locale } from 'date-fns'\nimport { DateTimePicker } from './inputs/DateTimePicker'\nimport { TimePicker } from './inputs/TimePicker'\nimport { DatePicker } from './inputs/DatePicker'\nimport { mapCrudServerErrorToFormErrors, parseServerMessage } from './utils/serverErrors'\nimport { withScopedApiRequestHeaders } from './utils/apiCall'\nimport type { CustomFieldDefLike } from '@open-mercato/shared/modules/entities/validation'\nimport type { MDEditorProps as UiWMDEditorProps } from '@uiw/react-md-editor'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '../primitives/dialog'\nimport { FieldDefinitionsManager, type FieldDefinitionsManagerHandle } from './custom-fields/FieldDefinitionsManager'\nimport { useConfirmDialog } from './confirm-dialog'\nimport { useInjectionSpotEvents, InjectionSpot, useInjectionWidgets } from './injection/InjectionSpot'\nimport { dispatchBackendMutationError } from './injection/mutationEvents'\nimport { VersionHistoryAction } from './version-history/VersionHistoryAction'\nimport { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'\nimport { useInjectionDataWidgets } from './injection/useInjectionDataWidgets'\nimport { InjectedField } from './injection/InjectedField'\nimport type { InjectionFieldDefinition, FieldContext } from '@open-mercato/shared/modules/widgets/injection'\nimport { evaluateInjectedVisibility } from './injection/visibility-utils'\nimport { ComponentReplacementHandles } from '@open-mercato/shared/modules/widgets/component-registry'\n\n// Stable empty options array to avoid creating a new [] every render\nconst EMPTY_OPTIONS: CrudFieldOption[] = []\nconst FOCUSABLE_SELECTOR =\n '[data-crud-focus-target], input:not([type=\"hidden\"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\nconst CRUDFORM_EXTENDED_EVENTS_ENABLED = parseBooleanWithDefault(\n process.env.NEXT_PUBLIC_OM_CRUDFORM_EXTENDED_EVENTS_ENABLED,\n true,\n)\n\nexport type CrudFieldBase = {\n id: string\n label: string\n placeholder?: string\n description?: React.ReactNode // inline field-level help\n required?: boolean\n layout?: 'full' | 'half' | 'third'\n disabled?: boolean\n readOnly?: boolean\n}\n\nexport type CrudFieldOption = { value: string; label: string }\n\nexport type CrudBuiltinField = CrudFieldBase & {\n type:\n | 'text'\n | 'password'\n | 'textarea'\n | 'checkbox'\n | 'select'\n | 'number'\n | 'date'\n | 'datepicker'\n | 'datetime-local'\n | 'datetime'\n | 'time'\n | 'tags'\n | 'richtext'\n | 'relation'\n | 'combobox'\n placeholder?: string\n options?: CrudFieldOption[]\n multiple?: boolean\n listbox?: boolean\n // for relation/select style fields; if provided, options are loaded on mount\n loadOptions?: (query?: string) => Promise<CrudFieldOption[]>\n // when type === 'richtext', choose editor implementation\n editor?: 'simple' | 'uiw' | 'html'\n // for text fields; provides datalist suggestions while allowing free-text input\n suggestions?: string[]\n // for combobox fields; allow custom values or restrict to suggestions only\n allowCustomValues?: boolean\n // for datetime/time fields\n minuteStep?: number\n minDate?: Date\n maxDate?: Date\n displayFormat?: string\n closeOnSelect?: boolean\n locale?: Locale\n}\n\nexport type CrudCustomFieldRenderProps = {\n id: string\n value: unknown\n error?: string\n autoFocus?: boolean\n disabled?: boolean\n values?: Record<string, unknown>\n setValue: (value: unknown) => void\n // Optional helper to update other form values from within a custom field\n setFormValue?: (id: string, value: unknown) => void\n // Optional context for advanced custom inputs\n entityId?: string\n recordId?: string\n}\n\nexport type CrudCustomField = CrudFieldBase & {\n type: 'custom'\n component: (props: CrudCustomFieldRenderProps) => React.ReactNode\n}\n\nexport type CrudField = CrudBuiltinField | CrudCustomField\n\ntype CrudFormValues<TValues extends Record<string, unknown>> = Partial<TValues> & Record<string, unknown>\n\nexport type CrudFormProps<TValues extends Record<string, unknown>> = {\n schema?: z.ZodType<TValues>\n fields: CrudField[]\n initialValues?: Partial<TValues>\n submitLabel?: string\n submitIcon?: React.ComponentType<{ className?: string }>\n formId?: string\n customFieldsLoadingMessage?: string\n cancelHref?: string\n successRedirect?: string\n deleteRedirect?: string\n onSubmit?: (values: TValues) => Promise<void> | void\n onDelete?: () => Promise<void> | void\n // When true, shows Delete button whenever onDelete is provided, even without an id\n deleteVisible?: boolean\n // Legacy field-only grid toggle. Use `groups` for advanced layout.\n twoColumn?: boolean\n title?: string\n backHref?: string\n // Optional extra action buttons rendered next to Delete/Cancel/Save\n // Useful for custom links like \"Show Records\" etc.\n extraActions?: React.ReactNode\n /** When provided, shows a Version History clock icon in the header that opens a side panel. */\n versionHistory?: {\n resourceKind: string\n resourceId: string\n canUndoRedo?: boolean\n autoCheckAcl?: boolean\n }\n // When provided, CrudForm will fetch custom field definitions and append\n // form-editable custom fields automatically to the provided `fields`.\n entityId?: string\n entityIds?: string[]\n // Optional grouped layout rendered in two responsive columns (1 on mobile).\n groups?: CrudFormGroup[]\n // Loading state for the entire form (e.g., when loading record data)\n isLoading?: boolean\n loadingMessage?: string\n // User-defined entity mode: all fields are custom, use bare keys (no cf_)\n customEntity?: boolean\n // Embedded mode hides outer chrome; useful for inline sections\n embedded?: boolean\n // Hide the footer action bar (Save/Cancel/Delete) when embedding in a custom layout\n hideFooterActions?: boolean\n // Optional custom content injected between the header actions and the form body\n contentHeader?: React.ReactNode\n // Optional mapping of entityId -> form value key storing the selected fieldset code\n customFieldsetBindings?: Record<string, { valueKey: string }>\n // Optional injection spot ID for widget injection\n injectionSpotId?: string\n replacementHandle?: string\n}\n\n// Group-level custom component context\nexport type CrudFormGroupComponentProps = {\n values: Record<string, unknown>\n setValue: (id: string, v: unknown) => void\n errors: Record<string, string>\n}\n\n// Special group kind for automatic Custom Fields section\nexport type CrudFormGroup = {\n id: string\n title?: string\n column?: 1 | 2\n description?: string\n // Either list field ids, inline field configs, or mix of both\n fields?: (CrudField | string)[]\n // Inject a custom component into the group card\n component?: (ctx: CrudFormGroupComponentProps) => React.ReactNode\n // When kind === 'customFields', the group renders form-editable custom fields\n kind?: 'customFields'\n // When true, render component output inline without wrapping group chrome\n bare?: boolean\n}\n\nfunction readByDotPath(source: Record<string, unknown> | undefined, path: string): unknown {\n if (!source || !path) return undefined\n if (Object.prototype.hasOwnProperty.call(source, path)) return source[path]\n const segments = path.split('.').filter(Boolean)\n let current: unknown = source\n for (const segment of segments) {\n if (!current || typeof current !== 'object' || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[segment]\n }\n return current\n}\n\nconst FIELDSET_ICON_COMPONENTS: Record<string, React.ComponentType<{ className?: string }>> = {\n layers: Layers,\n tag: Tag,\n sparkles: Sparkles,\n package: Package,\n shirt: Shirt,\n grid: Grid,\n shoppingBag: ShoppingBag,\n shoppingCart: ShoppingCart,\n store: Store,\n users: Users,\n briefcase: Briefcase,\n building: Building,\n bookOpen: BookOpen,\n bookmark: Bookmark,\n camera: Camera,\n car: Car,\n clock: Clock,\n cloud: Cloud,\n compass: Compass,\n creditCard: CreditCard,\n database: Database,\n flame: Flame,\n gift: Gift,\n globe: Globe,\n heart: Heart,\n key: Key,\n map: MapIcon,\n palette: Palette,\n shield: Shield,\n star: Star,\n truck: Truck,\n zap: Zap,\n coins: Coins,\n}\n\ntype CustomFieldGroupLayout = {\n code: string | null\n label?: string\n hint?: string\n fields: CrudField[]\n}\n\ntype CustomFieldSectionLayout = {\n entityId: string\n fieldsetCode: string | null\n fieldset?: CustomFieldsetDto\n title: string\n description?: string\n groups: CustomFieldGroupLayout[]\n}\n\ntype CustomFieldEntityLayout = {\n entityId: string\n sections: CustomFieldSectionLayout[]\n availableFieldsets: CustomFieldsetDto[]\n singleFieldsetPerRecord: boolean\n hasFieldsets: boolean\n activeFieldset: string | null\n}\n\nexport function CrudForm<TValues extends Record<string, unknown>>({\n schema,\n fields,\n initialValues,\n submitLabel,\n submitIcon,\n formId: providedFormId,\n customFieldsLoadingMessage,\n cancelHref,\n successRedirect,\n deleteRedirect,\n onSubmit,\n onDelete,\n deleteVisible,\n twoColumn = false,\n title,\n backHref,\n entityId,\n entityIds,\n groups,\n isLoading = false,\n loadingMessage,\n customEntity = false,\n embedded = false,\n hideFooterActions = false,\n extraActions,\n versionHistory,\n contentHeader,\n customFieldsetBindings,\n injectionSpotId,\n replacementHandle,\n}: CrudFormProps<TValues>) {\n // Ensure module field components are registered (client-side)\n React.useEffect(() => { loadGeneratedFieldRegistrations().catch(() => {}) }, [])\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const router = useRouter()\n const t = useT()\n const resolvedSubmitLabel = submitLabel ?? t('ui.forms.actions.save')\n const resolvedLoadingMessage = loadingMessage ?? t('ui.forms.loading')\n const resolvedCustomFieldsLoadingMessage = customFieldsLoadingMessage ?? resolvedLoadingMessage\n const cancelLabel = t('ui.forms.actions.cancel')\n const deleteLabel = t('ui.forms.actions.delete')\n const savingLabel = t('ui.forms.status.saving')\n const backLabel = t('ui.navigation.back')\n const customFieldsLabel = t('entities.customFields.title')\n const fieldsetSelectorLabel = t('entities.customFields.fieldsetSelectorLabel', 'Fieldset')\n const emptyFieldsetMessage = t('entities.customFields.emptyFieldset', 'No fields defined for this fieldset.')\n const defaultFieldsetLabel = t('entities.customFields.defaultFieldset', 'Default')\n const manageFieldsetLabel = t('entities.customFields.manageFieldset', 'Manage fields')\n const fieldsetDialogTitle = t('entities.customFields.manageDialogTitle', 'Edit custom fields')\n const fieldsetDialogUnavailable = t('entities.customFields.manageDialogUnavailable', 'Field definitions page is unavailable.')\n const deleteConfirmMessage = t('ui.forms.confirmDelete')\n const deleteSuccessMessage = t('ui.forms.flash.deleteSuccess')\n const deleteErrorMessage = t('ui.forms.flash.deleteError')\n const saveErrorMessage = t('ui.forms.flash.saveError')\n const internalFormId = React.useId()\n const formId = providedFormId ?? internalFormId\n const [values, setValues] = React.useState<CrudFormValues<TValues>>(\n () => ({ ...(initialValues ?? {}) } as CrudFormValues<TValues>)\n )\n const valuesRef = React.useRef(values)\n const [errors, setErrors] = React.useState<Record<string, string>>({})\n const [pending, setPending] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const [dynamicOptions, setDynamicOptions] = React.useState<Record<string, CrudFieldOption[]>>({})\n const [cfDefinitions, setCfDefinitions] = React.useState<CustomFieldDefDto[]>([])\n const [cfMetadata, setCfMetadata] = React.useState<CustomFieldDefinitionsPayload | null>(null)\n const [cfFieldsetSelections, setCfFieldsetSelections] = React.useState<Record<string, string | null>>({})\n const [isLoadingCustomFields, setIsLoadingCustomFields] = React.useState(false)\n const [customFieldDefsVersion, setCustomFieldDefsVersion] = React.useState(0)\n const [fieldsetEditorTarget, setFieldsetEditorTarget] = React.useState<{ entityId: string; fieldsetCode: string | null; view: 'entity' | 'fieldset' } | null>(null)\n const [isInDialog, setIsInDialog] = React.useState(false)\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n const fieldsetManagerRef = React.useRef<FieldDefinitionsManagerHandle | null>(null)\n const resolvedEntityIds = React.useMemo(() => {\n if (Array.isArray(entityIds) && entityIds.length) {\n const dedup = new Set<string>()\n const list: string[] = []\n entityIds.forEach((id) => {\n const trimmed = typeof id === 'string' ? id.trim() : ''\n if (!trimmed || dedup.has(trimmed)) return\n dedup.add(trimmed)\n list.push(trimmed)\n })\n return list\n }\n if (typeof entityId === 'string' && entityId.trim().length > 0) {\n return [entityId.trim()]\n }\n return []\n }, [entityId, entityIds])\n const primaryEntityId = resolvedEntityIds.length ? resolvedEntityIds[0] : null\n\n // Injection spot events for widget lifecycle management\n const resolvedInjectionSpotId = React.useMemo(() => {\n if (injectionSpotId) return injectionSpotId\n if (resolvedEntityIds.length) {\n const normalized = resolvedEntityIds[0].replace(/[:]+/g, '.')\n return `crud-form:${normalized}`\n }\n return undefined\n }, [injectionSpotId, resolvedEntityIds])\n const resolvedReplacementHandle = React.useMemo(() => {\n if (replacementHandle) return replacementHandle\n if (resolvedEntityIds.length) return ComponentReplacementHandles.crudForm(resolvedEntityIds[0].replace(/[:]+/g, '.'))\n return ComponentReplacementHandles.crudForm('unknown')\n }, [replacementHandle, resolvedEntityIds])\n const headerInjectionSpotId = resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:header` : undefined\n \n const recordId = React.useMemo(() => {\n const raw = values.id\n if (typeof raw === 'string') return raw\n if (typeof raw === 'number') return String(raw)\n return undefined\n }, [values])\n const fallbackRecordId = recordId || (\n versionHistory?.resourceId === undefined || versionHistory.resourceId === null\n ? undefined\n : String(versionHistory.resourceId).trim() || undefined\n )\n\n const operation = recordId ? 'update' : 'create'\n const injectionContext = React.useMemo(() => ({\n formId,\n entityId: primaryEntityId,\n resourceKind: versionHistory?.resourceKind,\n resourceId: recordId ?? versionHistory?.resourceId,\n recordId: fallbackRecordId,\n isLoading,\n pending,\n operation,\n }), [formId, primaryEntityId, versionHistory?.resourceKind, versionHistory?.resourceId, recordId, fallbackRecordId, isLoading, pending, operation])\n const injectionContextRef = React.useRef(injectionContext)\n React.useEffect(() => {\n injectionContextRef.current = injectionContext\n }, [injectionContext])\n React.useEffect(() => {\n valuesRef.current = values\n }, [values])\n \n const { widgets: injectionWidgets } = useInjectionWidgets(resolvedInjectionSpotId, {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const { widgets: injectedFieldWidgets } = useInjectionDataWidgets(\n resolvedInjectionSpotId ? `${resolvedInjectionSpotId}:fields` : '__disabled__:fields'\n )\n \n const { triggerEvent: triggerInjectionEvent } = useInjectionSpotEvents(resolvedInjectionSpotId ?? '', injectionWidgets)\n const extendedInjectionEventsEnabled = CRUDFORM_EXTENDED_EVENTS_ENABLED && Boolean(resolvedInjectionSpotId)\n\n const transformValidationErrors = React.useCallback(\n async (fieldErrors: Record<string, string>): Promise<Record<string, string>> => {\n if (!extendedInjectionEventsEnabled || !Object.keys(fieldErrors).length) return fieldErrors\n try {\n const result = await triggerInjectionEvent(\n 'transformValidation',\n fieldErrors as unknown as TValues,\n injectionContextRef.current,\n { originalData: valuesRef.current as TValues },\n )\n const transformed = result.data\n if (!transformed || typeof transformed !== 'object' || Array.isArray(transformed)) return fieldErrors\n return Object.fromEntries(\n Object.entries(transformed as Record<string, unknown>).map(([key, value]) => [key, String(value)]),\n )\n } catch (err) {\n console.error('[CrudForm] Error in transformValidation:', err)\n return fieldErrors\n }\n },\n [extendedInjectionEventsEnabled, triggerInjectionEvent],\n )\n\n const translateValidationMessage = React.useCallback(\n (message: string | null | undefined): string => {\n if (typeof message !== 'string') return ''\n const trimmed = message.trim()\n if (!trimmed) return ''\n return t(trimmed, trimmed)\n },\n [t],\n )\n\n const translateValidationErrors = React.useCallback(\n (fieldErrors: Record<string, string>): Record<string, string> =>\n Object.fromEntries(\n Object.entries(fieldErrors).map(([fieldId, message]) => [fieldId, translateValidationMessage(message)]),\n ),\n [translateValidationMessage],\n )\n\n const canNavigateTo = React.useCallback(\n async (target: string): Promise<boolean> => {\n if (!extendedInjectionEventsEnabled) return true\n try {\n const result = await triggerInjectionEvent(\n 'onBeforeNavigate',\n valuesRef.current as TValues,\n injectionContextRef.current,\n { target },\n )\n if (!result.ok) {\n flash(result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return false\n }\n return true\n } catch (err) {\n const message = err instanceof Error && err.message ? err.message : t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return false\n }\n },\n [extendedInjectionEventsEnabled, t, triggerInjectionEvent],\n )\n\n const navigateWithGuard = React.useCallback(\n async (target: string) => {\n if (!target) return\n const allowed = await canNavigateTo(target)\n if (allowed) router.push(target)\n },\n [canNavigateTo, router],\n )\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof window === 'undefined') return\n const handleEvent = (event: Event) => {\n const customEvent = event as CustomEvent<unknown>\n void triggerInjectionEvent('onAppEvent', valuesRef.current as TValues, injectionContextRef.current, {\n appEvent: customEvent.detail,\n }).catch((err) => {\n console.error('[CrudForm] Error in onAppEvent:', err)\n })\n }\n window.addEventListener('om:event', handleEvent as EventListener)\n return () => {\n window.removeEventListener('om:event', handleEvent as EventListener)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled || typeof document === 'undefined') return\n const emitVisibility = () => {\n void triggerInjectionEvent('onVisibilityChange', valuesRef.current as TValues, injectionContextRef.current, {\n visible: document.visibilityState === 'visible',\n }).catch((err) => {\n console.error('[CrudForm] Error in onVisibilityChange:', err)\n })\n }\n document.addEventListener('visibilitychange', emitVisibility)\n emitVisibility()\n return () => {\n document.removeEventListener('visibilitychange', emitVisibility)\n }\n }, [extendedInjectionEventsEnabled, triggerInjectionEvent])\n\n React.useEffect(() => {\n if (!extendedInjectionEventsEnabled) return\n const root = rootRef.current\n if (!root || typeof window === 'undefined') return\n const handleClickCapture = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (event.button !== 0) return\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return\n const targetElement = event.target instanceof Element ? event.target : null\n const linkElement = targetElement?.closest('a[href]')\n if (!(linkElement instanceof HTMLAnchorElement)) return\n if (!root.contains(linkElement)) return\n if (linkElement.target && linkElement.target !== '_self') return\n const rawHref = linkElement.getAttribute('href')\n if (!rawHref || rawHref.startsWith('#')) return\n let target = rawHref\n if (rawHref.startsWith('http://') || rawHref.startsWith('https://')) {\n try {\n const parsed = new URL(rawHref)\n if (parsed.origin !== window.location.origin) return\n target = `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n return\n }\n } else if (!rawHref.startsWith('/')) {\n return\n }\n event.preventDefault()\n void navigateWithGuard(target)\n }\n root.addEventListener('click', handleClickCapture, true)\n return () => {\n root.removeEventListener('click', handleClickCapture, true)\n }\n }, [extendedInjectionEventsEnabled, navigateWithGuard])\n \n React.useEffect(() => {\n const root = rootRef.current\n if (!root) return\n setIsInDialog(Boolean(root.closest('[data-dialog-content]')))\n }, [])\n const dialogFooterClass = isInDialog\n ? 'sticky bottom-0 left-0 right-0 z-20 -mx-6 px-6 bg-card border-t border-border/70 py-2 sm:-mx-6 sm:px-6'\n : ''\n const dialogFormPadding = isInDialog ? 'pb-4' : ''\n\n const buildCustomFieldsManageHref = React.useCallback(\n (targetEntityId: string | null) => {\n if (!targetEntityId) return null\n try {\n const encoded = encodeURIComponent(targetEntityId)\n return customEntity ? `/backend/entities/user/${encoded}` : `/backend/entities/system/${encoded}`\n } catch {\n return null\n }\n },\n [customEntity],\n )\n\n const refreshCustomFieldDefinitions = React.useCallback(() => {\n setCustomFieldDefsVersion((prev) => prev + 1)\n }, [])\n\n // Unified delete handler with confirmation\n const handleDelete = React.useCallback(async () => {\n if (!onDelete) return\n const deletePayload = values as TValues\n try {\n const confirmed = await confirm({\n title: deleteConfirmMessage,\n variant: 'destructive',\n })\n if (!confirmed) return\n\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeDelete', deletePayload, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n setPending(true)\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onDelete:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n return\n }\n }\n\n if (injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0) {\n await withScopedApiRequestHeaders(injectionRequestHeaders, async () => {\n await onDelete()\n })\n } else {\n await onDelete()\n }\n\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterDelete', deletePayload, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterDelete:', err)\n }\n }\n try { flash(deleteSuccessMessage, 'success') } catch {}\n // Redirect if requested by caller\n if (typeof deleteRedirect === 'string' && deleteRedirect) {\n await navigateWithGuard(deleteRedirect)\n }\n } catch (err) {\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onDeleteError', deletePayload, injectionContext, { error: err })\n } catch (hookError) {\n console.error('[CrudForm] Error in onDeleteError:', hookError)\n }\n }\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const message = err instanceof Error && err.message ? err.message : deleteErrorMessage\n try { flash(message, 'error') } catch {}\n } finally {\n setPending(false)\n }\n }, [\n confirm,\n deleteConfirmMessage,\n deleteErrorMessage,\n deleteRedirect,\n deleteSuccessMessage,\n formId,\n injectionContext,\n onDelete,\n resolvedInjectionSpotId,\n navigateWithGuard,\n t,\n transformValidationErrors,\n triggerInjectionEvent,\n values,\n ])\n \n // Determine whether this form is creating a new record (no `id` yet)\n const isNewRecord = React.useMemo(() => {\n const rawId = values.id\n if (rawId === undefined || rawId === null) return true\n return typeof rawId === 'string' ? rawId.trim().length === 0 : false\n }, [values])\n const showDelete = Boolean(onDelete) && (typeof deleteVisible === 'boolean' ? deleteVisible : !isNewRecord)\n const versionHistoryEnabled = Boolean(versionHistory?.resourceId && String(versionHistory.resourceId).trim().length > 0)\n const versionHistoryAction = (\n <VersionHistoryAction\n config={versionHistoryEnabled ? versionHistory! : null}\n t={t}\n canUndoRedo={versionHistory?.canUndoRedo}\n autoCheckAcl={versionHistory?.autoCheckAcl}\n />\n )\n const headerInjectionAction = headerInjectionSpotId ? (\n <InjectionSpot\n spotId={headerInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ) : null\n const headerExtraActions = versionHistoryEnabled || headerInjectionAction || extraActions ? (\n <>\n {versionHistoryEnabled ? versionHistoryAction : null}\n {headerInjectionAction}\n {extraActions}\n </>\n ) : undefined\n\n // Auto-append custom fields for this entityId\n React.useEffect(() => {\n let cancelled = false\n async function load() {\n if (!resolvedEntityIds.length) { \n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n return \n }\n \n setIsLoadingCustomFields(true)\n try {\n const mod = await import('./utils/customFieldForms')\n const { definitions, metadata } = await mod.fetchCustomFieldFormStructure(resolvedEntityIds, undefined, { bareIds: customEntity })\n if (!cancelled) {\n setCfDefinitions(definitions)\n setCfMetadata(metadata)\n setCfFieldsetSelections((prev) => {\n const next: Record<string, string | null> = {}\n let changed = false\n resolvedEntityIds.forEach((entityId) => {\n const existing = prev[entityId]\n const fieldsets = metadata.fieldsetsByEntity?.[entityId] ?? []\n const defaultSelection = fieldsets[0]?.code ?? null\n const value = existing !== undefined ? existing : defaultSelection\n next[entityId] = value\n if (existing !== value) changed = true\n })\n if (Object.keys(prev).length !== Object.keys(next).length) changed = true\n return changed ? next : prev\n })\n setIsLoadingCustomFields(false)\n }\n } catch {\n if (!cancelled) {\n setCfDefinitions([])\n setCfMetadata(null)\n setIsLoadingCustomFields(false)\n }\n }\n }\n load()\n return () => { cancelled = true }\n }, [resolvedEntityIds, customEntity, customFieldDefsVersion])\n\n React.useEffect(() => {\n if (!customFieldsetBindings) return\n setCfFieldsetSelections((prev) => {\n let changed = false\n const next = { ...prev }\n resolvedEntityIds.forEach((entityId) => {\n const binding = customFieldsetBindings[entityId]\n if (!binding) return\n const raw = values[binding.valueKey]\n if (typeof raw === 'string' && raw.trim().length > 0) {\n const normalized = raw.trim()\n if (next[entityId] !== normalized) {\n next[entityId] = normalized\n changed = true\n }\n }\n })\n return changed ? next : prev\n })\n }, [customFieldsetBindings, resolvedEntityIds, values])\n\n const fieldsetsByEntity = cfMetadata?.fieldsetsByEntity ?? {}\n const entitySettings = cfMetadata?.entitySettings ?? {}\n\n const { cfFields, customFieldLayout } = React.useMemo(() => {\n if (!cfDefinitions.length) return { cfFields: [], customFieldLayout: [] as CustomFieldEntityLayout[] }\n const aggregated: CrudField[] = []\n const layout: CustomFieldEntityLayout[] = []\n const defsByEntity = new globalThis.Map<string, CustomFieldDefDto[]>()\n cfDefinitions.forEach((def) => {\n const entityId = typeof def.entityId === 'string' && def.entityId.trim().length\n ? def.entityId.trim()\n : resolvedEntityIds[0]\n if (!entityId) return\n const bucket = defsByEntity.get(entityId) ?? []\n bucket.push(def)\n defsByEntity.set(entityId, bucket)\n })\n\n const buildSection = (\n entityId: string,\n fieldsetCode: string | null,\n defList: CustomFieldDefDto[],\n fieldset?: CustomFieldsetDto,\n ): CustomFieldSectionLayout | null => {\n if (!defList.length) return null\n const groupsMap = new globalThis.Map<string, CustomFieldGroupLayout>()\n const order: string[] = []\n const fieldsetGroupMap = new globalThis.Map<string, { title?: string; hint?: string; code: string }>()\n if (Array.isArray(fieldset?.groups)) {\n fieldset.groups.forEach((group) => {\n if (!group?.code) return\n fieldsetGroupMap.set(group.code, { code: group.code, title: group.title, hint: group.hint })\n })\n }\n const sortedDefs = [...defList].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n const ensureBucket = (code: string | null, def: CustomFieldDefDto): CustomFieldGroupLayout => {\n const key = code ?? '__default__'\n let bucket = groupsMap.get(key)\n if (!bucket) {\n const fallbackMeta = code ? fieldsetGroupMap.get(code) : undefined\n const directMeta = code ? def.group : undefined\n const label =\n code === null\n ? undefined\n : directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || code\n const hint = directMeta?.hint || fallbackMeta?.hint\n bucket = { code, label, hint, fields: [] }\n groupsMap.set(key, bucket)\n order.push(key)\n } else if (code && !bucket.label) {\n const fallbackMeta = fieldsetGroupMap.get(code)\n const directMeta = def.group ?? undefined\n bucket.label = directMeta?.title || fallbackMeta?.title || directMeta?.code || fallbackMeta?.code || bucket.label\n bucket.hint = directMeta?.hint || fallbackMeta?.hint || bucket.hint\n }\n return bucket\n }\n sortedDefs.forEach((definition) => {\n const field = buildFormFieldFromCustomFieldDef(definition, { bareIds: customEntity })\n if (!field) return\n aggregated.push(field)\n const bucket = ensureBucket(definition.group?.code ?? null, definition)\n bucket.fields.push(field)\n })\n const groups = order\n .map((key) => groupsMap.get(key)!)\n .filter((group) => group.fields.length > 0)\n if (!groups.length) return null\n return {\n entityId,\n fieldsetCode,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups,\n }\n }\n\n const entityIds = resolvedEntityIds.length ? resolvedEntityIds : Array.from(defsByEntity.keys())\n entityIds.forEach((entityId) => {\n const defsForEntity = defsByEntity.get(entityId) ?? []\n if (!defsForEntity.length) return\n const availableFieldsets = fieldsetsByEntity[entityId] ?? []\n const hasFieldsets = availableFieldsets.length > 0\n const singleFieldsetPerRecord =\n entitySettings[entityId]?.singleFieldsetPerRecord !== false\n const defsByFieldset = new globalThis.Map<string | null, CustomFieldDefDto[]>()\n defsForEntity.forEach((def) => {\n const memberships = Array.isArray(def.fieldsets)\n ? def.fieldsets\n .filter((entry): entry is string => typeof entry === 'string')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n : []\n if (memberships.length > 0) {\n memberships.forEach((code) => {\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n return\n }\n const code = typeof def.fieldset === 'string' && def.fieldset.trim().length > 0 ? def.fieldset.trim() : null\n const bucket = defsByFieldset.get(code) ?? []\n bucket.push(def)\n defsByFieldset.set(code, bucket)\n })\n const sections: CustomFieldSectionLayout[] = []\n\n const createEmptySection = (code: string | null): CustomFieldSectionLayout => {\n const fieldset = code ? availableFieldsets.find((fs) => fs.code === code) : undefined\n return {\n entityId,\n fieldsetCode: code,\n fieldset,\n title: fieldset?.label ?? customFieldsLabel,\n description: fieldset?.description,\n groups: [],\n }\n }\n\n if (!hasFieldsets) {\n const fallbackDefs =\n defsByFieldset.get(null) ?? Array.from(defsByFieldset.values()).flat()\n const section = buildSection(entityId, null, fallbackDefs, undefined)\n if (section) sections.push(section)\n } else if (singleFieldsetPerRecord) {\n const availableCodes = availableFieldsets.map((fs) => fs.code)\n const activeFieldset =\n cfFieldsetSelections[entityId] && availableCodes.includes(cfFieldsetSelections[entityId]!)\n ? cfFieldsetSelections[entityId]\n : availableFieldsets[0]?.code ?? null\n const targetDefs = activeFieldset ? defsByFieldset.get(activeFieldset) ?? [] : defsByFieldset.get(null) ?? []\n const targetSection = activeFieldset\n ? buildSection(\n entityId,\n activeFieldset,\n targetDefs,\n availableFieldsets.find((fs) => fs.code === activeFieldset),\n )\n : buildSection(entityId, null, targetDefs, undefined)\n if (targetSection) {\n sections.push(targetSection)\n } else if (activeFieldset) {\n sections.push(createEmptySection(activeFieldset))\n }\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length && activeFieldset) {\n const generalSection = buildSection(entityId, null, unassigned, undefined)\n if (generalSection) sections.push(generalSection)\n }\n } else {\n availableFieldsets.forEach((fieldset) => {\n const list = defsByFieldset.get(fieldset.code) ?? []\n const section = buildSection(entityId, fieldset.code, list, fieldset)\n if (section) sections.push(section)\n })\n const unassigned = defsByFieldset.get(null)\n if (unassigned?.length) {\n const section = buildSection(entityId, null, unassigned, undefined)\n if (section) sections.push(section)\n }\n }\n\n if (!sections.length && hasFieldsets) {\n const fallbackCode = availableFieldsets[0]?.code ?? null\n sections.push(createEmptySection(fallbackCode))\n }\n\n layout.push({\n entityId,\n sections,\n availableFieldsets,\n singleFieldsetPerRecord,\n hasFieldsets,\n activeFieldset: cfFieldsetSelections[entityId] ?? availableFieldsets[0]?.code ?? null,\n })\n })\n\n return { cfFields: aggregated, customFieldLayout: layout }\n }, [\n cfDefinitions,\n cfFieldsetSelections,\n customEntity,\n customFieldsLabel,\n entitySettings,\n fieldsetsByEntity,\n resolvedEntityIds,\n ])\n\n const injectedFieldDefinitions = React.useMemo<InjectionFieldDefinition[]>(() => {\n const definitions: InjectionFieldDefinition[] = []\n for (const widget of injectedFieldWidgets) {\n if (!('fields' in widget)) continue\n for (const field of widget.fields ?? []) {\n definitions.push(field as InjectionFieldDefinition)\n }\n }\n return definitions\n }, [injectedFieldWidgets])\n\n const injectedFieldContext = React.useMemo<FieldContext>(() => {\n const recordValues = values as Record<string, unknown>\n const organizationId = typeof recordValues.organizationId === 'string' ? recordValues.organizationId : null\n const tenantId = typeof recordValues.tenantId === 'string' ? recordValues.tenantId : null\n const userId = typeof recordValues.userId === 'string' ? recordValues.userId : null\n return {\n organizationId,\n tenantId,\n userId,\n record: recordValues,\n }\n }, [values])\n\n const hiddenInjectedFieldIds = React.useMemo(() => {\n const hidden = new Set<string>()\n for (const definition of injectedFieldDefinitions) {\n if (!evaluateInjectedVisibility(definition.visibleWhen, values as Record<string, unknown>, injectedFieldContext)) {\n hidden.add(definition.id)\n }\n }\n return hidden\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n const injectedFieldIdSet = React.useMemo(\n () => new Set(injectedFieldDefinitions.map((definition) => definition.id)),\n [injectedFieldDefinitions],\n )\n\n const injectedCrudFields = React.useMemo<CrudField[]>(() => {\n return injectedFieldDefinitions.map((definition) => ({\n id: definition.id,\n label: definition.label,\n type: 'custom',\n readOnly: definition.readOnly,\n component: ({ value, setValue, values: formValues }) => (\n <InjectedField\n field={definition}\n value={value}\n onChange={(_, nextValue) => setValue(nextValue)}\n context={injectedFieldContext}\n formData={(formValues ?? values) as Record<string, unknown>}\n />\n ),\n }))\n }, [injectedFieldContext, injectedFieldDefinitions, values])\n\n const allFields = React.useMemo(() => {\n const base = [...fields, ...injectedCrudFields]\n\n if (groups) {\n const provided = new Set(base.map(f => f.id))\n for (const group of groups) {\n if (!group.fields) continue\n for (const entry of group.fields) {\n if (typeof entry === 'string') continue\n if (!provided.has(entry.id)) {\n provided.add(entry.id)\n base.push(entry)\n }\n }\n }\n }\n if (!cfFields.length) return base\n const provided = new Set(base.map(f => f.id))\n const extras = cfFields.filter(f => !provided.has(f.id))\n return [...base, ...extras]\n }, [fields, injectedCrudFields, cfFields, groups])\n\n const fieldById = React.useMemo(() => {\n return new globalThis.Map(allFields.map((f) => [f.id, f]))\n }, [allFields])\n\n const allFieldsRef = React.useRef(allFields)\n allFieldsRef.current = allFields\n\n const dynamicOptionLoaderKey = React.useMemo(() => {\n return allFields\n .filter(f => f.type !== 'custom' && typeof (f as CrudBuiltinField).loadOptions === 'function')\n .map(f => f.id)\n .join('\\0')\n }, [allFields])\n\n const injectionGroupCards = React.useMemo<CrudFormGroup[]>(() => {\n if (!injectionWidgets || injectionWidgets.length === 0) return []\n const pairs = injectionWidgets\n .filter((widget) => (widget.placement?.kind ?? 'stack') === 'group')\n .map((widget) => {\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const group: CrudFormGroup = {\n id: `widget:${widget.widgetId}`,\n title: widget.placement?.groupLabel ?? widget.module.metadata.title,\n description: widget.placement?.groupDescription ?? widget.module.metadata.description,\n column: widget.placement?.column === 2 ? 2 : 1,\n component: () => (\n <widget.module.Widget\n context={injectionContext}\n data={values as unknown as CrudFormValues<TValues>}\n onDataChange={(next) => setValues(next as CrudFormValues<TValues>)}\n disabled={pending}\n />\n ),\n }\n return { group, priority }\n })\n pairs.sort((a, b) => b.priority - a.priority)\n return pairs.map((p) => p.group)\n }, [injectionWidgets, injectionContext, pending, setValues, values])\n \n const groupsWithInjectedFields = React.useMemo(() => {\n if (!groups || groups.length === 0 || injectedFieldDefinitions.length === 0) return groups\n const cloned = groups.map((group) => ({ ...group, fields: [...(group.fields ?? [])] }))\n const fallbackIndex = cloned.length - 1\n for (const definition of injectedFieldDefinitions) {\n const targetIndex = cloned.findIndex((group) => group.id === definition.group)\n const index = targetIndex >= 0 ? targetIndex : fallbackIndex\n if (targetIndex < 0 && process.env.NODE_ENV !== 'production') {\n console.warn(`[CrudForm] Injected field \"${definition.id}\" targets group \"${definition.group}\" which does not exist. Appended to last group.`)\n }\n if (index < 0) continue\n const fieldEntries = cloned[index].fields ?? []\n if (!fieldEntries.some((entry) => typeof entry === 'string' && entry === definition.id)) {\n fieldEntries.push(definition.id)\n }\n cloned[index].fields = fieldEntries\n }\n return cloned\n }, [groups, injectedFieldDefinitions])\n\n const shouldAutoGroup = (!groupsWithInjectedFields || groupsWithInjectedFields.length === 0) && injectionGroupCards.length > 0\n const resolvedGroupsForLayout = React.useMemo(() => {\n const baseGroups = groupsWithInjectedFields && groupsWithInjectedFields.length ? groupsWithInjectedFields : []\n const autoGroup = shouldAutoGroup ? [{ id: '__auto-fields__', fields: allFields }] as CrudFormGroup[] : []\n return [...(baseGroups.length ? baseGroups : autoGroup), ...injectionGroupCards]\n }, [allFields, groupsWithInjectedFields, injectionGroupCards, shouldAutoGroup])\n const useGroupedLayout = resolvedGroupsForLayout.length > 0\n const stackedInjectionWidgets = React.useMemo(\n () => (injectionWidgets ?? []).filter((widget) => (widget.placement?.kind ?? 'stack') === 'stack'),\n [injectionWidgets],\n )\n\n const resolveGroupFields = React.useCallback((g: CrudFormGroup): CrudField[] => {\n if (g.kind === 'customFields') {\n return cfFields\n }\n\n const src = g.fields || []\n const result: CrudField[] = []\n\n for (const item of src) {\n if (typeof item === 'string') {\n const found = fieldById.get(item)\n if (found) result.push(found)\n } else if (item) {\n result.push(item as CrudField)\n }\n }\n\n return result\n }, [cfFields, fieldById])\n\n const customFieldsManageHref = React.useMemo(() => buildCustomFieldsManageHref(primaryEntityId), [buildCustomFieldsManageHref, primaryEntityId])\n\n const customFieldsEmptyState = React.useMemo(() => {\n const text = t('entities.customFields.empty')\n const action = t('entities.customFields.addFirst')\n return (\n <div className=\"rounded-md border border-dashed border-muted-foreground/50 bg-muted/10 px-3 py-4 text-sm text-muted-foreground\">\n <span>{text} </span>\n {customFieldsManageHref ? (\n <Link href={customFieldsManageHref} className=\"font-medium text-primary hover:underline\">\n {action}\n </Link>\n ) : (\n <span className=\"font-medium text-foreground\">{action}</span>\n )}\n </div>\n )\n }, [customFieldsManageHref, t])\n\n const firstFieldId = React.useMemo(() => {\n if (useGroupedLayout) {\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n\n for (const g of resolvedGroupsForLayout) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n\n const scan = (list: CrudFormGroup[]) => {\n for (const group of list) {\n const resolved = resolveGroupFields(group)\n for (const field of resolved) {\n if (field?.id && !field.disabled) return field.id\n }\n }\n return null as string | null\n }\n\n const fromCol1 = scan(col1)\n if (fromCol1) return fromCol1\n const fromCol2 = scan(col2)\n if (fromCol2) return fromCol2\n }\n\n for (const field of allFields) {\n if (field?.id && !field.disabled) return field.id\n }\n return null\n }, [allFields, resolveGroupFields, resolvedGroupsForLayout, useGroupedLayout])\n\n const requestSubmit = React.useCallback(() => {\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId) as HTMLFormElement | null\n form?.requestSubmit()\n }, [formId])\n\n const lastFocusedFieldRef = React.useRef<string | null>(null)\n const lastErrorFieldRef = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n\n if (isLoading || isLoadingCustomFields) {\n lastFocusedFieldRef.current = null\n return\n }\n\n if (!firstFieldId) return\n if (lastFocusedFieldRef.current === firstFieldId) return\n\n const run = () => {\n const form = document.getElementById(formId)\n if (!form) return\n\n // Do not steal focus if the user is already interacting with any element inside the form\n const active = typeof document !== 'undefined' ? (document.activeElement as HTMLElement | null) : null\n if (active && form.contains(active)) {\n return\n }\n\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${firstFieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(FOCUSABLE_SELECTOR)\n\n if (target && typeof target.focus === 'function') {\n target.focus()\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastFocusedFieldRef.current = firstFieldId\n }\n }\n\n const frame =\n typeof window.requestAnimationFrame === 'function'\n ? window.requestAnimationFrame(run)\n : window.setTimeout(run, 0)\n\n return () => {\n if (typeof window === 'undefined') return\n if (typeof window.cancelAnimationFrame === 'function') {\n window.cancelAnimationFrame(frame as number)\n } else {\n window.clearTimeout(frame as number)\n }\n }\n }, [firstFieldId, formId, isLoading, isLoadingCustomFields])\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n const entries = Object.entries(errors)\n if (!entries.length) {\n lastErrorFieldRef.current = null\n return\n }\n const [fieldId] = entries[0]\n if (!fieldId || lastErrorFieldRef.current === fieldId) return\n\n const form = document.getElementById(formId)\n if (!form) return\n const container = form.querySelector<HTMLElement>(`[data-crud-field-id=\"${fieldId}\"]`)\n const target =\n container?.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ??\n form.querySelector<HTMLElement>(`[name=\"${fieldId}\"]`) ??\n container ??\n null\n\n if (target && typeof target.focus === 'function') {\n target.focus()\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n try {\n target.select()\n } catch {}\n }\n lastErrorFieldRef.current = fieldId\n }\n }, [errors, formId])\n\n const setValue = React.useCallback((id: string, nextValue: unknown) => {\n let nextData: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n if (Object.is(prev[id], nextValue)) return prev\n nextData = { ...prev, [id]: nextValue } as CrudFormValues<TValues>\n return nextData\n })\n if (!nextData || !extendedInjectionEventsEnabled) return\n void triggerInjectionEvent('onFieldChange', nextData as TValues, injectionContextRef.current, {\n fieldId: id,\n fieldValue: nextValue,\n }).then((result) => {\n if (!result.ok) return\n const change = result.fieldChange\n if (!change) return\n const updates: Record<string, unknown> = { ...(change.sideEffects ?? {}) }\n if (change.value !== undefined) {\n updates[id] = change.value\n }\n if (Object.keys(updates).length > 0) {\n setValues((prev) => {\n let changed = false\n const next = { ...prev } as Record<string, unknown>\n for (const [key, value] of Object.entries(updates)) {\n if (Object.is(next[key], value)) continue\n next[key] = value\n changed = true\n }\n return changed ? (next as CrudFormValues<TValues>) : prev\n })\n }\n for (const message of change.messages ?? []) {\n flash(message.text, message.severity)\n }\n }).catch((err) => {\n console.error('[CrudForm] Error in onFieldChange:', err)\n })\n }, [extendedInjectionEventsEnabled, flash, triggerInjectionEvent])\n\n const handleFieldsetSelectionChange = React.useCallback(\n (entityId: string, nextCode: string | null) => {\n setCfFieldsetSelections((prev) => ({ ...prev, [entityId]: nextCode }))\n const bindingKey = customFieldsetBindings?.[entityId]?.valueKey\n if (bindingKey) {\n setValue(bindingKey, nextCode ?? undefined)\n }\n },\n [customFieldsetBindings, setValue],\n )\n\n const handleOpenFieldsetEditor = React.useCallback(\n (entityId: string, fieldsetCode: string | null, view: 'entity' | 'fieldset' = 'entity') => {\n const href = buildCustomFieldsManageHref(entityId)\n if (!href) return\n setFieldsetEditorTarget({ entityId, fieldsetCode, view })\n },\n [buildCustomFieldsManageHref],\n )\n\n const initialValuesSnapshotRef = React.useRef<string | undefined>(undefined)\n React.useEffect(() => {\n if (!initialValues) return\n const snapshot = JSON.stringify(initialValues)\n if (initialValuesSnapshotRef.current === snapshot) return\n initialValuesSnapshotRef.current = snapshot\n let mergedValues: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n const merged = { ...prev, ...initialValues } as CrudFormValues<TValues>\n for (const definition of injectedFieldDefinitions) {\n if (merged[definition.id] !== undefined) continue\n const extracted = readByDotPath(initialValues as Record<string, unknown>, definition.id)\n if (extracted !== undefined) {\n ;(merged as Record<string, unknown>)[definition.id] = extracted\n }\n }\n mergedValues = merged\n return mergedValues\n })\n if (!extendedInjectionEventsEnabled || !mergedValues) return\n let cancelled = false\n const run = async () => {\n try {\n const result = await triggerInjectionEvent(\n 'transformDisplayData',\n mergedValues as TValues,\n injectionContextRef.current,\n )\n const transformed = result.data\n if (cancelled || !transformed) return\n setValues(transformed as CrudFormValues<TValues>)\n } catch (err) {\n console.error('[CrudForm] Error in transformDisplayData:', err)\n }\n }\n void run()\n return () => {\n cancelled = true\n }\n }, [extendedInjectionEventsEnabled, initialValues, injectedFieldDefinitions, triggerInjectionEvent])\n\n const buildFieldsetEditorHref = React.useCallback(\n (includeViewParam: boolean) => {\n if (!fieldsetEditorTarget) return null\n const base = buildCustomFieldsManageHref(fieldsetEditorTarget.entityId)\n if (!base) return null\n const params: string[] = []\n if (fieldsetEditorTarget.fieldsetCode) {\n params.push(`fieldset=${encodeURIComponent(fieldsetEditorTarget.fieldsetCode)}`)\n }\n if (includeViewParam && fieldsetEditorTarget.view === 'fieldset') {\n params.push('view=fieldset')\n }\n if (!params.length) return base\n const connector = base.includes('?') ? '&' : '?'\n return `${base}${connector}${params.join('&')}`\n },\n [buildCustomFieldsManageHref, fieldsetEditorTarget],\n )\n\n const fieldsetEditorFullHref = React.useMemo(() => buildFieldsetEditorHref(false), [buildFieldsetEditorHref])\n\n const handleFieldsetDialogSave = React.useCallback(() => {\n if (!fieldsetManagerRef.current) return\n void fieldsetManagerRef.current.submit()\n }, [])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setFormError(null)\n setErrors({})\n\n const requiredMessage = t('ui.forms.errors.required')\n const highlightedMessage = t('ui.forms.errors.highlighted')\n\n // Make sure inputs that commit on blur flush their local state before submit.\n try {\n if (typeof document !== 'undefined') {\n const activeElement = document.activeElement\n if (activeElement instanceof HTMLElement) {\n activeElement.blur()\n await new Promise<void>((resolve) => setTimeout(resolve, 0))\n }\n }\n } catch {\n // ignore focus cleanup errors\n }\n\n // Basic required-field validation when no zod schema is provided\n const requiredErrors: Record<string, string> = {}\n for (const field of allFields) {\n if (!field.required) continue\n if (field.disabled) continue\n if (hiddenInjectedFieldIds.has(field.id)) continue\n const v = values[field.id]\n const isArray = Array.isArray(v)\n const isString = typeof v === 'string'\n const empty =\n v === undefined ||\n v === null ||\n (isString && v.trim() === '') ||\n (isArray && v.length === 0) ||\n (field.type === 'checkbox' && v !== true)\n if (empty) requiredErrors[field.id] = requiredMessage\n }\n if (Object.keys(requiredErrors).length) {\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Required field errors prevented submit', requiredErrors)\n }\n const transformedErrors = await transformValidationErrors(requiredErrors)\n setErrors(transformedErrors)\n flash(highlightedMessage, 'error')\n return\n }\n\n // Custom fields validation via definitions (rules)\n if (resolvedEntityIds.length) {\n try {\n const mod = await import('./utils/customFieldDefs')\n const defs = await mod.fetchCustomFieldDefs(resolvedEntityIds)\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n // Build values keyed by def.key for validation\n const cfValues: Record<string, unknown> = {}\n if (customEntity) {\n for (const def of defs) {\n if (Object.prototype.hasOwnProperty.call(values, def.key)) {\n cfValues[def.key] = values[def.key]\n }\n }\n } else {\n for (const [k, v] of Object.entries(values)) {\n if (k.startsWith('cf_')) cfValues[k.replace(/^cf_/, '')] = v\n }\n }\n const defsForValidation = defs as unknown as CustomFieldDefLike[]\n const result = validateValuesAgainstDefs(cfValues, defsForValidation)\n if (!result.ok) {\n if (customEntity) {\n const mapped: Record<string, string> = {}\n for (const [ek, ev] of Object.entries(result.fieldErrors)) mapped[ek.replace(/^cf_/, '')] = String(ev)\n const transformedErrors = await transformValidationErrors(mapped)\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n } else {\n const transformedErrors = await transformValidationErrors(\n Object.fromEntries(\n Object.entries(result.fieldErrors).map(([key, value]) => [key, String(value)]),\n ),\n )\n setErrors((prev) => ({ ...prev, ...translateValidationErrors(transformedErrors) }))\n }\n flash(highlightedMessage, 'error')\n return\n }\n } catch {\n // ignore validation errors if helper not available\n }\n }\n\n const widgetValues = { ...(values as Record<string, unknown>) }\n for (const hiddenId of hiddenInjectedFieldIds) {\n delete widgetValues[hiddenId]\n }\n const coreValues = { ...widgetValues }\n for (const injectedId of injectedFieldIdSet) {\n delete coreValues[injectedId]\n }\n\n let parsedValues: TValues\n if (schema) {\n const res = schema.safeParse(coreValues)\n if (!res.success) {\n const fieldErrors: Record<string, string> = {}\n res.error.issues.forEach((issue) => {\n if (issue.path && issue.path.length) fieldErrors[String(issue.path[0])] = issue.message\n })\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Schema validation failed', res.error.issues)\n }\n const transformedErrors = await transformValidationErrors(fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n flash(highlightedMessage, 'error')\n return\n }\n parsedValues = res.data\n } else {\n parsedValues = coreValues as TValues\n }\n let submitValues = widgetValues as TValues\n let coreSubmitValues = parsedValues\n if (extendedInjectionEventsEnabled) {\n try {\n const result = await triggerInjectionEvent('transformFormData', submitValues, injectionContext)\n if (result.data) {\n submitValues = result.data as TValues\n const projectedCoreValues = { ...(result.data as Record<string, unknown>) }\n for (const injectedId of injectedFieldIdSet) {\n delete projectedCoreValues[injectedId]\n }\n coreSubmitValues = schema ? schema.parse(projectedCoreValues) : (projectedCoreValues as TValues)\n if (result.applyToForm) {\n setValues(result.data as CrudFormValues<TValues>)\n }\n }\n } catch (err) {\n console.error('[CrudForm] Error in transformFormData:', err)\n }\n }\n\n // Trigger onBeforeSave event for injection widgets\n let injectionRequestHeaders: Record<string, string> | undefined\n if (resolvedInjectionSpotId) {\n try {\n const result = await triggerInjectionEvent('onBeforeSave', submitValues, injectionContext)\n if (!result.ok) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: result.details ?? result,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: result.details ?? result,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n if (result.fieldErrors && Object.keys(result.fieldErrors).length) {\n const transformedErrors = await transformValidationErrors(result.fieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n }\n const message = result.message || t('ui.forms.flash.saveBlocked', 'Save blocked by validation')\n flash(message, 'error')\n setPending(false)\n return\n }\n injectionRequestHeaders = result.requestHeaders\n } catch (err) {\n console.error('[CrudForm] Error in onBeforeSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n\n setPending(true)\n \n // Trigger onSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onSave:', err)\n flash(t('ui.forms.flash.saveBlocked', 'Save blocked by validation'), 'error')\n setPending(false)\n return\n }\n }\n \n try {\n if (injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0) {\n await withScopedApiRequestHeaders(injectionRequestHeaders, async () => {\n await onSubmit?.(coreSubmitValues)\n })\n } else {\n await onSubmit?.(coreSubmitValues)\n }\n \n // Trigger onAfterSave event for injection widgets\n if (resolvedInjectionSpotId) {\n try {\n await triggerInjectionEvent('onAfterSave', submitValues, injectionContext)\n } catch (err) {\n console.error('[CrudForm] Error in onAfterSave:', err)\n }\n }\n \n if (successRedirect) await navigateWithGuard(successRedirect)\n } catch (err: unknown) {\n try {\n if (typeof window !== 'undefined') {\n dispatchBackendMutationError({\n contextId: formId,\n formId,\n error: err,\n })\n window.dispatchEvent(new CustomEvent('om:crud-save-error', {\n detail: {\n formId,\n error: err,\n },\n }))\n }\n } catch {\n // ignore event dispatch failures\n }\n const { message: helperMessage, fieldErrors: serverFieldErrors } = mapCrudServerErrorToFormErrors(err, { customEntity })\n const combinedFieldErrors = serverFieldErrors ?? {}\n const hasFieldErrors = Object.keys(combinedFieldErrors).length > 0\n const firstFieldMessage = hasFieldErrors\n ? (() => {\n const firstKey = Object.keys(combinedFieldErrors)[0]\n if (!firstKey) return null\n const value = combinedFieldErrors[firstKey]\n if (typeof value !== 'string' || !value.trim().length) return null\n return translateValidationMessage(value)\n })()\n : null\n if (hasFieldErrors) {\n const transformedErrors = await transformValidationErrors(combinedFieldErrors)\n setErrors(translateValidationErrors(transformedErrors))\n if (process.env.NODE_ENV !== 'production') {\n console.debug('[crud-form] Submission failed with field errors', transformedErrors)\n }\n }\n\n let displayMessage = typeof helperMessage === 'string' && helperMessage.trim() ? helperMessage.trim() : ''\n if (hasFieldErrors) {\n const lowered = displayMessage.toLowerCase()\n const highlightedLower = highlightedMessage.toLowerCase()\n if (!displayMessage || lowered === 'invalid input' || lowered === highlightedLower) {\n displayMessage = firstFieldMessage ?? highlightedMessage\n }\n }\n if (!displayMessage && err instanceof Error && typeof err.message === 'string' && err.message.trim()) {\n displayMessage = err.message.trim()\n }\n if (!displayMessage) {\n displayMessage = hasFieldErrors ? highlightedMessage : saveErrorMessage\n }\n displayMessage = parseServerMessage(displayMessage)\n flash(displayMessage, 'error')\n setFormError(displayMessage)\n } finally {\n setPending(false)\n }\n }\n\n // Stable key prevents infinite re-render loop (see #814) \u2014 do not depend on allFields directly.\n React.useEffect(() => {\n let cancelled = false\n const loadAll = async () => {\n const loaders = allFieldsRef.current\n .filter(\n (f): f is CrudBuiltinField & { loadOptions: NonNullable<CrudBuiltinField['loadOptions']> } =>\n f.type !== 'custom' && typeof f.loadOptions === 'function'\n )\n .map(async (f) => {\n try {\n const opts = await f.loadOptions()\n if (!cancelled) setDynamicOptions((prev) => ({ ...prev, [f.id]: opts }))\n } catch {\n // ignore\n }\n })\n await Promise.all(loaders)\n }\n loadAll()\n return () => {\n cancelled = true\n }\n }, [dynamicOptionLoaderKey])\n\n const loadFieldOptions = React.useCallback(async (field: CrudField, query?: string): Promise<CrudFieldOption[]> => {\n if (!('type' in field) || field.type === 'custom') return EMPTY_OPTIONS\n const builtin = field as CrudBuiltinField\n const loader = builtin.loadOptions\n if (typeof loader === 'function') {\n if (query === undefined && Array.isArray(dynamicOptions[field.id])) return dynamicOptions[field.id]\n try {\n const fetched = await loader(query)\n if (query === undefined) {\n setDynamicOptions((prev) => ({\n ...prev,\n [field.id]: fetched,\n }))\n }\n return fetched\n } catch {\n return builtin.options ?? EMPTY_OPTIONS\n }\n }\n return dynamicOptions[field.id] || builtin.options || EMPTY_OPTIONS\n }, [dynamicOptions])\n\n const fieldOptionsById = React.useMemo(() => {\n const map = new globalThis.Map<string, CrudFieldOption[]>()\n for (const f of allFields) {\n if (!('type' in f) || f.type === 'custom') continue\n const builtin = f as CrudBuiltinField\n const staticOptions = builtin.options ?? EMPTY_OPTIONS\n const dynamic = dynamicOptions[f.id]\n if (dynamic && dynamic.length) {\n const merged: CrudFieldOption[] = []\n const seen = new Set<string>()\n for (const opt of staticOptions) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n for (const opt of dynamic) {\n if (seen.has(opt.value)) continue\n seen.add(opt.value)\n merged.push(opt)\n }\n map.set(f.id, merged)\n } else if (staticOptions.length) {\n map.set(f.id, staticOptions)\n } else if (dynamic) {\n map.set(f.id, dynamic)\n }\n }\n return map\n }, [allFields, dynamicOptions])\n\n // no auto-focus; let the browser/user manage focus\n\n const usesResponsiveLayout = allFields.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const grid = twoColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : usesResponsiveLayout\n ? 'grid grid-cols-1 gap-4 md:grid-cols-6'\n : 'grid grid-cols-1 gap-4'\n\n // Helper to render a list of field configs\n const resolveLayoutClass = (layout?: CrudFieldBase['layout']) => {\n switch (layout) {\n case 'half':\n return 'md:col-span-3'\n case 'third':\n return 'md:col-span-2'\n default:\n return 'md:col-span-6'\n }\n }\n\n const renderFields = (fieldList: CrudField[]) => {\n const usesResponsive = fieldList.some(\n (field) => field.layout === 'half' || field.layout === 'third'\n )\n const gridClass = usesResponsive ? 'grid grid-cols-1 gap-4 md:grid-cols-6' : 'grid grid-cols-1 gap-4'\n return (\n <div className={gridClass}>\n {fieldList.map((f) => {\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsive ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={values[f.id]}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n />\n )\n })}\n </div>\n )\n }\n\n const renderCustomFieldsContent = React.useCallback((): React.ReactNode[] => {\n if (!customFieldLayout.length) {\n return [\n <div key=\"custom-fields-empty\" className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n ]\n }\n\n const nodes: React.ReactNode[] = []\n const multipleEntities = customFieldLayout.length > 1\n\n customFieldLayout.forEach((entityLayout) => {\n const manageHref = buildCustomFieldsManageHref(entityLayout.entityId)\n const showSelector =\n entityLayout.hasFieldsets &&\n entityLayout.singleFieldsetPerRecord &&\n entityLayout.availableFieldsets.length > 0\n\n if (multipleEntities) {\n nodes.push(\n <div\n key={`custom-fields-entity-${entityLayout.entityId}`}\n className=\"px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {entityLayout.entityId}\n </div>,\n )\n }\n\n if (showSelector) {\n nodes.push(\n <div key={`custom-fields-selector-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <label className=\"text-xs uppercase tracking-wide text-muted-foreground\">\n {fieldsetSelectorLabel}\n </label>\n <select\n className=\"h-9 rounded border pl-3 pr-8 text-sm\"\n value={entityLayout.activeFieldset ?? ''}\n onChange={(event) =>\n handleFieldsetSelectionChange(\n entityLayout.entityId,\n event.target.value || null,\n )}\n >\n <option value=\"\">{defaultFieldsetLabel}</option>\n {entityLayout.availableFieldsets.map((fs) => (\n <option key={fs.code} value={fs.code}>\n {fs.label}\n </option>\n ))}\n </select>\n <IconButton\n variant=\"outline\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() =>\n handleOpenFieldsetEditor(entityLayout.entityId, entityLayout.activeFieldset ?? null, 'fieldset')}\n disabled={!manageHref}\n title={manageFieldsetLabel}\n >\n <Settings className=\"size-4\" />\n </IconButton>\n </div>\n </div>,\n )\n }\n\n if (entityLayout.sections.length) {\n entityLayout.sections.forEach((section) => {\n const FieldsetIcon = section.fieldset?.icon\n ? FIELDSET_ICON_COMPONENTS[section.fieldset.icon]\n : null\n const sectionKey = `${entityLayout.entityId}:${section.fieldsetCode ?? 'default'}`\n const manageDisabled = !manageHref\n nodes.push(\n <div key={sectionKey} className=\"rounded-lg border bg-card p-4 space-y-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-2\">\n {FieldsetIcon ? (\n <FieldsetIcon className=\"size-5 text-muted-foreground\" />\n ) : null}\n <div>\n <div className=\"text-sm font-medium\">{section.title}</div>\n {section.description ? (\n <div className=\"text-xs text-muted-foreground\">\n {section.description}\n </div>\n ) : null}\n </div>\n </div>\n <Button\n variant=\"muted\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => handleOpenFieldsetEditor(entityLayout.entityId, section.fieldsetCode, 'fieldset')}\n disabled={manageDisabled}\n >\n <Settings className=\"size-4\" />\n {manageFieldsetLabel}\n </Button>\n </div>\n {section.groups.map((group) => {\n const groupKey = `${section.fieldsetCode ?? 'default'}:${group.code ?? 'default'}`\n return (\n <div key={groupKey} className=\"space-y-2\">\n {group.label ? (\n <div>\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n ) : null}\n {renderFields(group.fields)}\n </div>\n )\n })}\n {!section.groups.length ? (\n <div className=\"text-xs text-muted-foreground\">{emptyFieldsetMessage}</div>\n ) : null}\n </div>,\n )\n })\n } else {\n nodes.push(\n <div key={`custom-fields-empty-${entityLayout.entityId}`} className=\"rounded-lg border bg-card p-4\">\n {customFieldsEmptyState}\n </div>,\n )\n }\n })\n\n return nodes\n }, [\n buildCustomFieldsManageHref,\n customFieldLayout,\n customFieldsEmptyState,\n defaultFieldsetLabel,\n emptyFieldsetMessage,\n fieldsetSelectorLabel,\n handleFieldsetSelectionChange,\n handleOpenFieldsetEditor,\n manageFieldsetLabel,\n renderFields,\n ])\n\n const fieldsetManagerDialog = (\n <Dialog open={fieldsetEditorTarget !== null} onOpenChange={(open) => { if (!open) setFieldsetEditorTarget(null) }}>\n <DialogContent\n className=\"max-w-5xl w-full\"\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n handleFieldsetDialogSave()\n }\n }}\n >\n <DialogHeader>\n <DialogTitle>{fieldsetDialogTitle}</DialogTitle>\n </DialogHeader>\n {fieldsetEditorTarget ? (\n <FieldDefinitionsManager\n ref={fieldsetManagerRef}\n entityId={fieldsetEditorTarget.entityId}\n initialFieldset={fieldsetEditorTarget.fieldsetCode}\n fullEditorHref={fieldsetEditorFullHref ?? undefined}\n onSaved={refreshCustomFieldDefinitions}\n onClose={() => setFieldsetEditorTarget(null)}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground px-4 text-center\">\n {fieldsetDialogUnavailable}\n </div>\n )}\n </DialogContent>\n </Dialog>\n )\n\n // If groups are provided, render the two-column grouped layout\n if (useGroupedLayout) {\n\n const col1: CrudFormGroup[] = []\n const col2: CrudFormGroup[] = []\n for (const g of resolvedGroupsForLayout) {\n if ((g.column ?? 1) === 2) col2.push(g)\n else col1.push(g)\n }\n\n const renderGroupedCards = (items: CrudFormGroup[]) => {\n const nodes: React.ReactNode[] = []\n for (const g of items) {\n const isCustomFieldsGroup = g.kind === 'customFields'\n if (isCustomFieldsGroup) {\n if (isLoadingCustomFields) {\n nodes.push(\n <div key={`${g.id}-loading`} className=\"rounded-lg border bg-card p-4\">\n <DataLoader\n isLoading\n loadingMessage={resolvedCustomFieldsLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n <div />\n </DataLoader>\n </div>,\n )\n continue\n }\n if (g.component) {\n nodes.push(\n <div key={`${g.id}-component`} className=\"rounded-lg border bg-card px-4 py-3\">\n {g.component({ values, setValue, errors })}\n </div>,\n )\n }\n const renderedSections = renderCustomFieldsContent()\n if (renderedSections.length) nodes.push(...renderedSections)\n continue\n }\n\n const componentNode = g.component ? g.component({ values, setValue, errors }) : null\n if (g.bare) {\n if (componentNode) {\n nodes.push(<React.Fragment key={g.id}>{componentNode}</React.Fragment>)\n }\n continue\n }\n const groupFields = resolveGroupFields(g)\n nodes.push(\n <div key={g.id} className=\"rounded-lg border bg-card px-4 py-3 space-y-3\">\n {g.title ? (\n <div className=\"text-sm font-medium\">{t(g.title, g.title)}</div>\n ) : null}\n {g.description ? <div className=\"text-xs text-muted-foreground\">{t(g.description, g.description)}</div> : null}\n {componentNode ? (\n <div>{componentNode}</div>\n ) : null}\n <DataLoader\n isLoading={false}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className=\"min-h-[1px]\"\n >\n {groupFields.length > 0 ? renderFields(groupFields) : <div className=\"min-h-[1px]\" />}\n </DataLoader>\n </div>,\n )\n }\n return nodes\n }\n\n const col1Content = renderGroupedCards(col1)\n const col2Content = renderGroupedCards(col2)\n const hasSecondaryColumn = col2Content.length > 0\n\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n <form id={formId} onSubmit={handleSubmit} className={`space-y-4 ${dialogFormPadding}`}>\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div\n className={hasSecondaryColumn\n ? 'grid grid-cols-1 lg:grid-cols-[7fr_3fr] gap-4'\n : 'grid grid-cols-1 gap-4'}\n >\n <div className=\"space-y-3\">{col1Content}</div>\n {hasSecondaryColumn ? <div className=\"space-y-3\">{col2Content}</div> : null}\n </div>\n {formError ? <div className=\"text-sm text-red-600\">{formError}</div> : null}\n {hideFooterActions ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon }\n }}\n />\n )}\n </form>\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n }\n\n // Default single-card layout (compatible with previous API)\n return (\n <div className=\"space-y-4\" ref={rootRef} data-component-handle={resolvedReplacementHandle}>\n {!embedded ? (\n <FormHeader\n mode=\"edit\"\n backHref={backHref}\n backLabel={backLabel}\n title={title}\n actions={{\n extraActions: headerExtraActions,\n showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: { formId, pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n ) : headerExtraActions ? (\n <div className=\"flex justify-end gap-2 mb-2\">{headerExtraActions}</div>\n ) : null}\n {contentHeader}\n <DataLoader\n isLoading={isLoading}\n loadingMessage={resolvedLoadingMessage}\n spinnerSize=\"md\"\n className={embedded ? 'min-h-[1px]' : 'min-h-[400px]'}\n >\n <div>\n <form\n id={formId}\n onSubmit={handleSubmit}\n className={`${embedded ? 'space-y-4' : 'rounded-lg border bg-card p-4 space-y-4'} ${dialogFormPadding}`}\n >\n {resolvedInjectionSpotId ? (\n <InjectionSpot\n spotId={resolvedInjectionSpotId}\n context={injectionContext}\n data={values}\n onDataChange={(newData) => setValues(newData as CrudFormValues<TValues>)}\n disabled={pending}\n widgetsOverride={stackedInjectionWidgets}\n />\n ) : null}\n <div className={grid}>\n {allFields.map((f) => {\n const layout = f.layout ?? 'full'\n const wrapperClassName = usesResponsiveLayout ? resolveLayoutClass(layout) : undefined\n return (\n <FieldControl\n key={f.id}\n field={f}\n value={values[f.id]}\n error={errors[f.id]}\n options={fieldOptionsById.get(f.id) || EMPTY_OPTIONS}\n setValue={setValue}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={Boolean(firstFieldId && f.id === firstFieldId)}\n onSubmitRequest={requestSubmit}\n wrapperClassName={wrapperClassName}\n entityIdForField={primaryEntityId ?? undefined}\n recordId={recordId}\n />\n )\n })}\n </div>\n {formError ? <div className=\"text-sm text-red-600\">{formError}</div> : null}\n {hideFooterActions ? null : (\n <FormFooter\n embedded={embedded}\n className={dialogFooterClass}\n actions={{\n extraActions,\n showDelete: !embedded && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref: !embedded ? cancelHref : undefined,\n cancelLabel,\n submit: { pending: pending, label: resolvedSubmitLabel, pendingLabel: savingLabel, icon: submitIcon },\n }}\n />\n )}\n </form>\n </div>\n </DataLoader>\n {fieldsetManagerDialog}\n {ConfirmDialogElement}\n </div>\n )\n}\n\nfunction RelationSelect({\n value,\n onChange,\n options,\n placeholder,\n autoFocus,\n}: {\n value: string\n onChange: (v: string) => void\n options: CrudFieldOption[]\n placeholder?: string\n autoFocus?: boolean\n}) {\n const t = useT()\n const [query, setQuery] = React.useState('')\n const inputRef = React.useRef<HTMLInputElement | null>(null)\n\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [query, options])\n\n return (\n <div className=\"space-y-1\">\n <input\n ref={inputRef}\n className=\"w-full h-9 rounded border px-2 text-sm\"\n placeholder={placeholder || t('ui.forms.listbox.searchPlaceholder', 'Search...')}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"max-h-40 overflow-auto rounded border\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-full justify-start rounded-none font-normal\"\n onClick={() => onChange('')}\n >\n \u2014\n </Button>\n {filtered.map((opt) => (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n className={`w-full justify-start rounded-none font-normal ${\n value === opt.value ? 'bg-muted' : ''\n }`}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </Button>\n ))}\n </div>\n </div>\n )\n}\n// Local-buffer text input to avoid focus loss when parent re-renders\nfunction TextInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n disabled,\n suggestions,\n inputType = 'text',\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n disabled?: boolean\n suggestions?: string[]\n inputType?: 'text' | 'password'\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n const userTypingRef = React.useRef(false)\n const datalistId = React.useId()\n\n React.useEffect(() => {\n // Sync from props whenever the input is unfocused or the user hasn't typed yet.\n if (!isFocusedRef.current || !userTypingRef.current) {\n setLocal(value)\n }\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return\n const next = e.target.value\n userTypingRef.current = true\n setLocal(next)\n onChange(next)\n }, [disabled, onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onChange(local)\n onSubmit?.()\n }\n }, [disabled, local, onChange, onSubmit])\n\n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n\n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n userTypingRef.current = false\n onChange(local)\n }, [local, onChange])\n\n return (\n <>\n <input\n type={inputType}\n className=\"w-full h-9 rounded border px-2 text-sm\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n spellCheck={false}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n disabled={disabled}\n list={suggestions && suggestions.length > 0 ? datalistId : undefined}\n />\n {suggestions && suggestions.length > 0 && (\n <datalist id={datalistId}>\n {suggestions.map((suggestion) => (\n <option key={suggestion} value={suggestion} />\n ))}\n </datalist>\n )}\n </>\n )\n}\n\n// Local-buffer number input to avoid focus loss when parent re-renders\nfunction NumberInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n onSubmit,\n}: {\n value: number | string | null | undefined\n onChange: (v: number | undefined) => void\n placeholder?: string\n autoFocus?: boolean\n onSubmit?: () => void\n}) {\n const [local, setLocal] = React.useState<string>(value !== undefined && value !== null ? String(value) : '')\n const isFocusedRef = React.useRef(false)\n \n React.useEffect(() => {\n // Only sync from props when not focused to avoid caret jumps\n if (!isFocusedRef.current) {\n setLocal(value !== undefined && value !== null ? String(value) : '')\n }\n }, [value])\n \n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value\n setLocal(next)\n const numValue = next === '' ? undefined : Number(next)\n onChange(numValue)\n }, [onChange])\n\n const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n onSubmit?.()\n }\n }, [local, onChange, onSubmit])\n \n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n \n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n }, [local, onChange])\n \n return (\n <input\n type=\"number\"\n className=\"w-full h-9 rounded border px-2 text-sm\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Local-buffer textarea to avoid form-wide re-renders while typing\nfunction TextAreaInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n autoFocus?: boolean\n}) {\n const [local, setLocal] = React.useState<string>(value)\n const isFocusedRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!isFocusedRef.current) setLocal(value)\n }, [value])\n\n const handleChange = React.useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value\n setLocal(next)\n onChange(next)\n }, [onChange])\n\n const handleFocus = React.useCallback(() => { isFocusedRef.current = true }, [])\n const handleBlur = React.useCallback(() => { isFocusedRef.current = false; onChange(local) }, [local, onChange])\n\n return (\n <textarea\n className=\"w-full rounded border px-2 py-2 min-h-[80px] sm:min-h-[120px] text-sm\"\n placeholder={placeholder}\n value={local}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n )\n}\n\n// Markdown editor using @uiw/react-md-editor (client-only)\ntype MDProps = { value?: string; onChange: (md: string) => void }\nconst MDEditor = dynamic(async () => {\n const mod = await import('@uiw/react-md-editor')\n return mod.default\n}, { ssr: false }) as React.ComponentType<UiWMDEditorProps>\nconst MarkdownEditor = React.memo(function MarkdownEditor({ value = '', onChange }: MDProps) {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const [local, setLocal] = React.useState<string>(value)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!typingRef.current) setLocal(value)\n }, [value])\n\n const handleChange = React.useCallback((v?: string) => {\n typingRef.current = true\n setLocal(v ?? '')\n }, [])\n\n const commit = React.useCallback(() => {\n if (!typingRef.current) return\n typingRef.current = false\n onChange(local)\n requestAnimationFrame(() => {\n const ta = containerRef.current?.querySelector('textarea') as HTMLTextAreaElement | null\n ta?.focus()\n })\n }, [local, onChange])\n\n return (\n <div ref={containerRef} data-color-mode=\"light\" className=\"w-full\" onBlur={() => commit()}>\n <MDEditor\n value={local}\n height={220}\n onChange={handleChange}\n previewOptions={{ remarkPlugins: [remarkGfm] }}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\n// HTML Rich Text editor (contentEditable) with shortcuts; returns HTML string\ntype HtmlRTProps = { value?: string; onChange: (html: string) => void }\nconst HtmlRichTextEditor = React.memo(function HtmlRichTextEditor({ value = '', onChange }: HtmlRTProps) {\n const t = useT()\n const boldLabel = t('ui.forms.richtext.bold')\n const italicLabel = t('ui.forms.richtext.italic')\n const underlineLabel = t('ui.forms.richtext.underline')\n const listLabel = t('ui.forms.richtext.list')\n const heading3Label = t('ui.forms.richtext.heading3')\n const linkLabel = t('ui.forms.richtext.link')\n const linkUrlPrompt = t('ui.forms.richtext.linkUrlPrompt')\n const ref = React.useRef<HTMLDivElement | null>(null)\n const applyingExternal = React.useRef(false)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n const el = ref.current\n if (!el) return\n const current = el.innerHTML\n if (!typingRef.current && current !== value) {\n applyingExternal.current = true\n el.innerHTML = value || ''\n requestAnimationFrame(() => { applyingExternal.current = false })\n }\n }, [value])\n\n const exec = (cmd: string, arg?: string) => {\n const el = ref.current\n if (!el) return\n el.focus()\n try {\n document.execCommand(cmd, false, arg)\n } catch {\n // ignore execCommand failures\n }\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const isMod = e.metaKey || e.ctrlKey\n if (!isMod) return\n const k = e.key.toLowerCase()\n if (k === 'b') { e.preventDefault(); exec('bold') }\n if (k === 'i') { e.preventDefault(); exec('italic') }\n if (k === 'u') { e.preventDefault(); exec('underline') }\n }\n\n return (\n <div className=\"w-full rounded border\">\n <div className=\"flex items-center gap-1 px-2 py-1 border-b\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('bold')}>{boldLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('italic')}>{italicLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('underline')}>{underlineLabel}</Button>\n <span className=\"mx-2 text-muted-foreground\">|</span>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('insertUnorderedList')}>\u2022 {listLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => exec('formatBlock', '<h3>')}>{heading3Label}</Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto px-2 py-0.5 text-xs\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const url = window.prompt(linkUrlPrompt)?.trim()\n if (url) exec('createLink', url)\n }}\n >{linkLabel}</Button>\n </div>\n <div\n ref={ref}\n className=\"w-full px-2 py-2 min-h-[100px] sm:min-h-[160px] focus:outline-none prose prose-sm max-w-none\"\n contentEditable\n suppressContentEditableWarning\n onKeyDown={onKeyDown}\n onInput={() => { if (!applyingExternal.current) typingRef.current = true }}\n onBlur={() => {\n const el = ref.current\n if (!el) return\n typingRef.current = false\n onChange(el.innerHTML)\n }}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\n// Very simple markdown editor with Bold/Italic/Underline + shortcuts.\ntype SimpleMDProps = { value?: string; onChange: (md: string) => void }\nconst SimpleMarkdownEditor = React.memo(function SimpleMarkdownEditor({ value = '', onChange }: SimpleMDProps) {\n const t = useT()\n const boldLabel = t('ui.forms.richtext.bold')\n const italicLabel = t('ui.forms.richtext.italic')\n const underlineLabel = t('ui.forms.richtext.underline')\n const markdownPlaceholder = t('ui.forms.richtext.placeholder')\n const sampleText = t('ui.forms.richtext.sampleText')\n const taRef = React.useRef<HTMLTextAreaElement | null>(null)\n const [local, setLocal] = React.useState<string>(value)\n const typingRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!typingRef.current) setLocal(value)\n }, [value])\n\n const wrap = (before: string, after: string = before) => {\n const el = taRef.current\n if (!el) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n const sel = value.slice(start, end) || sampleText\n const next = value.slice(0, start) + before + sel + after + value.slice(end)\n onChange(next)\n queueMicrotask(() => {\n const caret = start + before.length + sel.length + after.length\n el.focus()\n el.setSelectionRange(caret, caret)\n })\n }\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n const isMod = e.metaKey || e.ctrlKey\n if (!isMod) return\n const key = e.key.toLowerCase()\n if (key === 'b') { e.preventDefault(); wrap('**') }\n if (key === 'i') { e.preventDefault(); wrap('_') }\n if (key === 'u') { e.preventDefault(); wrap('__') }\n }\n\n return (\n <div className=\"w-full rounded border\">\n <div className=\"flex items-center gap-1 px-2 py-1 border-b\">\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('**')}>{boldLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('_')}>{italicLabel}</Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-auto px-2 py-0.5 text-xs\" onMouseDown={(e) => e.preventDefault()} onClick={() => wrap('__')}>{underlineLabel}</Button>\n </div>\n <textarea\n ref={taRef}\n className=\"w-full min-h-[100px] sm:min-h-[160px] resize-y px-2 py-2 font-mono text-sm outline-none\"\n spellCheck={false}\n value={local}\n onChange={(e) => { typingRef.current = true; setLocal(e.target.value) }}\n onBlur={() => { if (typingRef.current) { typingRef.current = false; onChange(local) } }}\n onKeyDown={onKeyDown}\n placeholder={markdownPlaceholder}\n />\n </div>\n )\n}, (prev, next) => prev.value === next.value)\n\ntype FieldControlProps = {\n field: CrudField\n value: unknown\n error?: string\n options: CrudFieldOption[]\n setValue: (id: string, v: unknown) => void\n values: Record<string, unknown>\n loadFieldOptions: (field: CrudField, query?: string) => Promise<CrudFieldOption[]>\n autoFocus: boolean\n onSubmitRequest: () => void\n wrapperClassName?: string\n entityIdForField?: string\n recordId?: string\n}\n\ntype ListboxMultiSelectProps = {\n options: CrudFieldOption[]\n placeholder?: string\n value: string[]\n onChange: (vals: string[]) => void\n autoFocus?: boolean\n}\n\nconst ListboxMultiSelect = React.memo(function ListboxMultiSelect({\n options,\n placeholder,\n value,\n onChange,\n autoFocus,\n}: ListboxMultiSelectProps) {\n const t = useT()\n const searchPlaceholder = placeholder || t('ui.forms.listbox.searchPlaceholder')\n const noMatchesLabel = t('ui.forms.listbox.noMatches')\n const [query, setQuery] = React.useState('')\n const filtered = React.useMemo(() => {\n const q = query.toLowerCase().trim()\n if (!q) return options\n return options.filter((o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q))\n }, [options, query])\n const toggle = React.useCallback(\n (val: string) => {\n const set = new Set(value)\n if (set.has(val)) set.delete(val)\n else set.add(val)\n onChange(Array.from(set))\n },\n [value, onChange]\n )\n return (\n <div className=\"w-full\">\n <input\n className=\"mb-2 w-full h-8 rounded border px-2 text-sm\"\n placeholder={searchPlaceholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus={autoFocus}\n data-crud-focus-target=\"\"\n />\n <div className=\"rounded border max-h-48 overflow-auto divide-y\">\n {filtered.map((opt) => {\n const isSel = value.includes(opt.value)\n return (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => toggle(opt.value)}\n className={`w-full justify-start rounded-none font-normal px-3 py-2 ${isSel ? 'bg-muted' : ''}`}\n >\n <span className=\"inline-flex items-center gap-2\">\n <input type=\"checkbox\" className=\"size-4\" readOnly checked={isSel} />\n <span>{opt.label}</span>\n </span>\n </Button>\n )\n })}\n {!filtered.length ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">{noMatchesLabel}</div>\n ) : null}\n </div>\n </div>\n )\n})\n\nconst FieldControl = React.memo(function FieldControlImpl({\n field,\n value,\n error,\n options,\n setValue,\n values,\n loadFieldOptions,\n autoFocus,\n onSubmitRequest,\n wrapperClassName,\n entityIdForField,\n recordId,\n}: FieldControlProps) {\n const t = useT()\n const fieldSetValue = React.useCallback(\n (nextValue: unknown) => setValue(field.id, nextValue),\n [setValue, field.id]\n )\n const setFormValue = React.useCallback(\n (targetId: string, nextValue: unknown) => setValue(targetId, nextValue),\n [setValue],\n )\n const builtin = field.type === 'custom' ? null : field\n const hasLoader = typeof builtin?.loadOptions === 'function'\n const disabled = Boolean(field.disabled)\n const readOnly = Boolean(field.readOnly)\n const autoFocusField = autoFocus && !disabled\n\n React.useEffect(() => {\n if (!hasLoader || field.type === 'custom') return\n loadFieldOptions(field).catch(() => {})\n }, [field, hasLoader, loadFieldOptions])\n\n const placeholder = builtin?.placeholder\n const rootClassName = wrapperClassName ? `space-y-1 ${wrapperClassName}` : 'space-y-1'\n\n return (\n <div className={rootClassName} data-crud-field-id={field.id}>\n {field.type !== 'checkbox' && field.label.trim().length > 0 ? (\n <label className=\"block text-sm font-medium\">\n {field.label}\n {field.required ? <span className=\"text-red-600\"> *</span> : null}\n </label>\n ) : null}\n {field.type === 'text' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n suggestions={field.type === 'text' ? field.suggestions : undefined}\n />\n )}\n {field.type === 'password' && (\n <TextInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n disabled={disabled}\n inputType=\"password\"\n />\n )}\n {field.type === 'number' && (\n <NumberInput\n value={typeof value === 'number' || typeof value === 'string' ? value : null}\n placeholder={placeholder}\n onChange={fieldSetValue}\n autoFocus={autoFocusField}\n onSubmit={onSubmitRequest}\n />\n )}\n {field.type === 'date' && (\n <input\n type=\"date\"\n className=\"w-full h-9 rounded border px-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => setValue(field.id, e.target.value || undefined)}\n autoFocus={autoFocusField}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n )}\n {field.type === 'datetime-local' && (\n <input\n type=\"datetime-local\"\n className=\"w-full h-9 rounded border px-2 text-sm\"\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => setValue(field.id, e.target.value || undefined)}\n autoFocus={autoFocusField}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n )}\n {field.type === 'datepicker' && (\n <DatePicker\n value={typeof value === 'string' && value ? parseISO(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? format(date, 'yyyy-MM-dd') : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n closeOnSelect={builtin?.closeOnSelect}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'datetime' && (\n <DateTimePicker\n value={typeof value === 'string' && value ? new Date(value) : value instanceof Date ? value : null}\n onChange={(date) => setValue(field.id, date ? date.toISOString() : undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n minDate={builtin?.minDate}\n maxDate={builtin?.maxDate}\n displayFormat={builtin?.displayFormat}\n locale={builtin?.locale}\n />\n )}\n {field.type === 'time' && (\n <TimePicker\n value={typeof value === 'string' ? value : null}\n onChange={(time) => setValue(field.id, time ?? undefined)}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n minuteStep={builtin?.minuteStep}\n />\n )}\n {field.type === 'textarea' && (\n <TextAreaInput\n value={value == null ? '' : String(value)}\n placeholder={placeholder}\n onChange={(next) => fieldSetValue(next)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'richtext' && builtin?.editor === 'simple' && (\n <SimpleMarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && builtin?.editor === 'html' && (\n <HtmlRichTextEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'richtext' && (!builtin?.editor || (builtin.editor !== 'simple' && builtin.editor !== 'html')) && (\n <MarkdownEditor value={String(value ?? '')} onChange={fieldSetValue} />\n )}\n {field.type === 'tags' && (\n <TagsInput\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suggestions={options.map((opt) => ({ value: opt.value, label: opt.label }))}\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n />\n )}\n {field.type === 'combobox' && (\n <ComboboxInput\n value={typeof value === 'string' ? value : String(value ?? '')}\n onChange={(next) => fieldSetValue(next)}\n placeholder={placeholder}\n autoFocus={autoFocusField}\n suggestions={\n builtin?.suggestions\n ? builtin.suggestions\n : options.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n loadSuggestions={\n typeof builtin?.loadOptions === 'function'\n ? async (query?: string) => {\n const opts = await loadFieldOptions(field, query)\n return opts.map((opt) => ({ value: opt.value, label: opt.label }))\n }\n : undefined\n }\n allowCustomValues={builtin?.allowCustomValues ?? true}\n disabled={disabled}\n />\n )}\n {field.type === 'checkbox' && (\n <label className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n className=\"size-4\"\n checked={value === true}\n onChange={(e) => setValue(field.id, e.target.checked)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n <span className=\"text-sm\">{field.label}</span>\n </label>\n )}\n {field.type === 'select' && !builtin?.multiple && (\n <select\n className=\"w-full h-9 rounded border pl-3 pr-8 text-sm\"\n value={\n Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n }\n onChange={(e) => setValue(field.id, e.target.value || undefined)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n >\n <option value=\"\">{t('ui.forms.select.emptyOption', '\u2014')}</option>\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox === true && (\n <ListboxMultiSelect\n options={options}\n placeholder={placeholder}\n value={Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []}\n onChange={(vals) => setValue(field.id, vals)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'select' && builtin?.multiple && builtin.listbox !== true && (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((opt) => {\n const arr = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n const checked = arr.includes(opt.value)\n return (\n <label key={opt.value} className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n className=\"size-4\"\n checked={checked}\n onChange={(e) => {\n const next = new Set(arr)\n if (e.target.checked) {\n next.add(opt.value)\n } else {\n next.delete(opt.value)\n }\n setValue(field.id, Array.from(next))\n }}\n disabled={disabled}\n />\n <span className=\"text-sm\">{opt.label}</span>\n </label>\n )\n })}\n </div>\n )}\n {field.type === 'relation' && (\n <RelationSelect\n options={options}\n placeholder={placeholder}\n value={\n Array.isArray(value)\n ? String(value[0] ?? '')\n : value == null\n ? ''\n : String(value)\n }\n onChange={(selected) => setValue(field.id, selected)}\n autoFocus={autoFocusField}\n />\n )}\n {field.type === 'custom' && (\n <>\n {field.component({\n id: field.id,\n value,\n error,\n setValue: fieldSetValue,\n setFormValue,\n values,\n entityId: entityIdForField,\n recordId,\n autoFocus,\n disabled,\n })}\n </>\n )}\n {field.description ? (\n <div className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <div>{field.description}</div>\n </div>\n ) : null}\n {error ? <div className=\"text-xs text-red-600\">{error}</div> : null}\n </div>\n )\n},\n(prev, next) =>\n prev.field.id === next.field.id &&\n prev.field.type === next.field.type &&\n prev.field.label === next.field.label &&\n prev.field.description === next.field.description &&\n prev.field.required === next.field.required &&\n prev.value === next.value &&\n prev.error === next.error &&\n prev.options === next.options &&\n prev.loadFieldOptions === next.loadFieldOptions &&\n prev.autoFocus === next.autoFocus &&\n prev.onSubmitRequest === next.onSubmitRequest &&\n prev.wrapperClassName === next.wrapperClassName &&\n prev.entityIdForField === next.entityIdForField &&\n prev.recordId === next.recordId &&\n (prev.field.type !== 'custom' ||\n (prev.values === next.values &&\n prev.field.component === (next.field as CrudCustomField).component))\n)\n"],
5
+ "mappings": "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",
6
6
  "names": ["entityId", "groups", "entityIds", "code", "bucket", "setValue", "provided", "dynamic", "MarkdownEditor", "HtmlRichTextEditor", "SimpleMarkdownEditor", "ListboxMultiSelect"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/ui",
3
- "version": "0.4.9-develop-d1d38e26fb",
3
+ "version": "0.4.9-develop-fefbbe0979",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -124,12 +124,12 @@
124
124
  "recharts": "^2.15.0"
125
125
  },
126
126
  "peerDependencies": {
127
- "@open-mercato/shared": "0.4.9-develop-d1d38e26fb",
127
+ "@open-mercato/shared": "0.4.9-develop-fefbbe0979",
128
128
  "react": ">=18.0.0",
129
129
  "react-dom": ">=18.0.0"
130
130
  },
131
131
  "devDependencies": {
132
- "@open-mercato/shared": "0.4.9-develop-d1d38e26fb",
132
+ "@open-mercato/shared": "0.4.9-develop-fefbbe0979",
133
133
  "@testing-library/dom": "^10.4.1",
134
134
  "@testing-library/jest-dom": "^6.9.1",
135
135
  "@testing-library/react": "^16.3.1",
@@ -2999,12 +2999,12 @@ const FieldControl = React.memo(function FieldControlImpl({
2999
2999
  onChange={(next) => fieldSetValue(next)}
3000
3000
  placeholder={placeholder}
3001
3001
  autoFocus={autoFocusField}
3002
- suggestions={options.map((opt) => opt.label)}
3002
+ suggestions={options.map((opt) => ({ value: opt.value, label: opt.label }))}
3003
3003
  loadSuggestions={
3004
3004
  typeof builtin?.loadOptions === 'function'
3005
3005
  ? async (query?: string) => {
3006
3006
  const opts = await loadFieldOptions(field, query)
3007
- return opts.map((opt) => opt.label)
3007
+ return opts.map((opt) => ({ value: opt.value, label: opt.label }))
3008
3008
  }
3009
3009
  : undefined
3010
3010
  }