@open-mercato/ui 0.4.2-canary-c02407ff85

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.
Files changed (319) hide show
  1. package/build.mjs +62 -0
  2. package/dist/backend/AppShell.js +902 -0
  3. package/dist/backend/AppShell.js.map +7 -0
  4. package/dist/backend/ConfirmDialog.js +17 -0
  5. package/dist/backend/ConfirmDialog.js.map +7 -0
  6. package/dist/backend/ContextHelp.js +31 -0
  7. package/dist/backend/ContextHelp.js.map +7 -0
  8. package/dist/backend/CrudForm.js +2028 -0
  9. package/dist/backend/CrudForm.js.map +7 -0
  10. package/dist/backend/DataTable.js +1363 -0
  11. package/dist/backend/DataTable.js.map +7 -0
  12. package/dist/backend/EmptyState.js +52 -0
  13. package/dist/backend/EmptyState.js.map +7 -0
  14. package/dist/backend/FilterBar.js +140 -0
  15. package/dist/backend/FilterBar.js.map +7 -0
  16. package/dist/backend/FilterOverlay.js +279 -0
  17. package/dist/backend/FilterOverlay.js.map +7 -0
  18. package/dist/backend/FlashMessages.js +66 -0
  19. package/dist/backend/FlashMessages.js.map +7 -0
  20. package/dist/backend/JsonBuilder.js +322 -0
  21. package/dist/backend/JsonBuilder.js.map +7 -0
  22. package/dist/backend/JsonDisplay.js +203 -0
  23. package/dist/backend/JsonDisplay.js.map +7 -0
  24. package/dist/backend/Page.js +27 -0
  25. package/dist/backend/Page.js.map +7 -0
  26. package/dist/backend/PerspectiveSidebar.js +282 -0
  27. package/dist/backend/PerspectiveSidebar.js.map +7 -0
  28. package/dist/backend/RowActions.js +148 -0
  29. package/dist/backend/RowActions.js.map +7 -0
  30. package/dist/backend/TruncatedCell.js +92 -0
  31. package/dist/backend/TruncatedCell.js.map +7 -0
  32. package/dist/backend/UserMenu.js +107 -0
  33. package/dist/backend/UserMenu.js.map +7 -0
  34. package/dist/backend/ValueIcons.js +34 -0
  35. package/dist/backend/ValueIcons.js.map +7 -0
  36. package/dist/backend/custom-fields/FieldDefinitionsEditor.js +1264 -0
  37. package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +7 -0
  38. package/dist/backend/custom-fields/FieldDefinitionsManager.js +332 -0
  39. package/dist/backend/custom-fields/FieldDefinitionsManager.js.map +7 -0
  40. package/dist/backend/dashboard/DashboardScreen.js +578 -0
  41. package/dist/backend/dashboard/DashboardScreen.js.map +7 -0
  42. package/dist/backend/dashboard/index.js +5 -0
  43. package/dist/backend/dashboard/index.js.map +7 -0
  44. package/dist/backend/dashboard/widgetRegistry.js +55 -0
  45. package/dist/backend/dashboard/widgetRegistry.js.map +7 -0
  46. package/dist/backend/detail/ActivitiesSection.js +962 -0
  47. package/dist/backend/detail/ActivitiesSection.js.map +7 -0
  48. package/dist/backend/detail/AddressEditor.js +413 -0
  49. package/dist/backend/detail/AddressEditor.js.map +7 -0
  50. package/dist/backend/detail/AddressTiles.js +437 -0
  51. package/dist/backend/detail/AddressTiles.js.map +7 -0
  52. package/dist/backend/detail/AddressesSection.js +264 -0
  53. package/dist/backend/detail/AddressesSection.js.map +7 -0
  54. package/dist/backend/detail/AttachmentDeleteDialog.js +41 -0
  55. package/dist/backend/detail/AttachmentDeleteDialog.js.map +7 -0
  56. package/dist/backend/detail/AttachmentMetadataDialog.js +517 -0
  57. package/dist/backend/detail/AttachmentMetadataDialog.js.map +7 -0
  58. package/dist/backend/detail/AttachmentsSection.js +367 -0
  59. package/dist/backend/detail/AttachmentsSection.js.map +7 -0
  60. package/dist/backend/detail/CustomDataSection.js +433 -0
  61. package/dist/backend/detail/CustomDataSection.js.map +7 -0
  62. package/dist/backend/detail/DetailFieldsSection.js +75 -0
  63. package/dist/backend/detail/DetailFieldsSection.js.map +7 -0
  64. package/dist/backend/detail/ErrorMessage.js +28 -0
  65. package/dist/backend/detail/ErrorMessage.js.map +7 -0
  66. package/dist/backend/detail/InlineEditors.js +681 -0
  67. package/dist/backend/detail/InlineEditors.js.map +7 -0
  68. package/dist/backend/detail/LoadingMessage.js +14 -0
  69. package/dist/backend/detail/LoadingMessage.js.map +7 -0
  70. package/dist/backend/detail/NotesSection.js +1032 -0
  71. package/dist/backend/detail/NotesSection.js.map +7 -0
  72. package/dist/backend/detail/TabEmptyState.js +25 -0
  73. package/dist/backend/detail/TabEmptyState.js.map +7 -0
  74. package/dist/backend/detail/TagsSection.js +254 -0
  75. package/dist/backend/detail/TagsSection.js.map +7 -0
  76. package/dist/backend/detail/addressFormat.js +77 -0
  77. package/dist/backend/detail/addressFormat.js.map +7 -0
  78. package/dist/backend/detail/index.js +34 -0
  79. package/dist/backend/detail/index.js.map +7 -0
  80. package/dist/backend/fields/registry.generated.js +8 -0
  81. package/dist/backend/fields/registry.generated.js.map +7 -0
  82. package/dist/backend/fields/registry.js +29 -0
  83. package/dist/backend/fields/registry.js.map +7 -0
  84. package/dist/backend/indexes/PartialIndexBanner.js +58 -0
  85. package/dist/backend/indexes/PartialIndexBanner.js.map +7 -0
  86. package/dist/backend/indexes/store.js +62 -0
  87. package/dist/backend/indexes/store.js.map +7 -0
  88. package/dist/backend/injection/InjectionSpot.js +179 -0
  89. package/dist/backend/injection/InjectionSpot.js.map +7 -0
  90. package/dist/backend/injection/PageInjectionBoundary.js +26 -0
  91. package/dist/backend/injection/PageInjectionBoundary.js.map +7 -0
  92. package/dist/backend/injection/helpers.js +26 -0
  93. package/dist/backend/injection/helpers.js.map +7 -0
  94. package/dist/backend/injection/widgetRegistry.js +55 -0
  95. package/dist/backend/injection/widgetRegistry.js.map +7 -0
  96. package/dist/backend/inputs/ComboboxInput.js +225 -0
  97. package/dist/backend/inputs/ComboboxInput.js.map +7 -0
  98. package/dist/backend/inputs/LookupSelect.js +191 -0
  99. package/dist/backend/inputs/LookupSelect.js.map +7 -0
  100. package/dist/backend/inputs/PhoneNumberField.js +100 -0
  101. package/dist/backend/inputs/PhoneNumberField.js.map +7 -0
  102. package/dist/backend/inputs/SwitchableMarkdownInput.js +92 -0
  103. package/dist/backend/inputs/SwitchableMarkdownInput.js.map +7 -0
  104. package/dist/backend/inputs/TagsInput.js +222 -0
  105. package/dist/backend/inputs/TagsInput.js.map +7 -0
  106. package/dist/backend/inputs/index.js +6 -0
  107. package/dist/backend/inputs/index.js.map +7 -0
  108. package/dist/backend/operations/LastOperationBanner.js +80 -0
  109. package/dist/backend/operations/LastOperationBanner.js.map +7 -0
  110. package/dist/backend/operations/store.js +183 -0
  111. package/dist/backend/operations/store.js.map +7 -0
  112. package/dist/backend/schedule/ScheduleAgenda.js +107 -0
  113. package/dist/backend/schedule/ScheduleAgenda.js.map +7 -0
  114. package/dist/backend/schedule/ScheduleGrid.js +107 -0
  115. package/dist/backend/schedule/ScheduleGrid.js.map +7 -0
  116. package/dist/backend/schedule/ScheduleToolbar.js +166 -0
  117. package/dist/backend/schedule/ScheduleToolbar.js.map +7 -0
  118. package/dist/backend/schedule/ScheduleView.js +165 -0
  119. package/dist/backend/schedule/ScheduleView.js.map +7 -0
  120. package/dist/backend/schedule/index.js +6 -0
  121. package/dist/backend/schedule/index.js.map +7 -0
  122. package/dist/backend/schedule/recurrence.js +83 -0
  123. package/dist/backend/schedule/recurrence.js.map +7 -0
  124. package/dist/backend/schedule/types.js +1 -0
  125. package/dist/backend/schedule/types.js.map +7 -0
  126. package/dist/backend/upgrades/UpgradeActionBanner.js +91 -0
  127. package/dist/backend/upgrades/UpgradeActionBanner.js.map +7 -0
  128. package/dist/backend/utils/api.js +127 -0
  129. package/dist/backend/utils/api.js.map +7 -0
  130. package/dist/backend/utils/apiCall.js +48 -0
  131. package/dist/backend/utils/apiCall.js.map +7 -0
  132. package/dist/backend/utils/crud.js +126 -0
  133. package/dist/backend/utils/crud.js.map +7 -0
  134. package/dist/backend/utils/customFieldColumns.js +56 -0
  135. package/dist/backend/utils/customFieldColumns.js.map +7 -0
  136. package/dist/backend/utils/customFieldDefs.js +143 -0
  137. package/dist/backend/utils/customFieldDefs.js.map +7 -0
  138. package/dist/backend/utils/customFieldFilters.js +126 -0
  139. package/dist/backend/utils/customFieldFilters.js.map +7 -0
  140. package/dist/backend/utils/customFieldForms.js +162 -0
  141. package/dist/backend/utils/customFieldForms.js.map +7 -0
  142. package/dist/backend/utils/customFieldValues.js +26 -0
  143. package/dist/backend/utils/customFieldValues.js.map +7 -0
  144. package/dist/backend/utils/flash.js +16 -0
  145. package/dist/backend/utils/flash.js.map +7 -0
  146. package/dist/backend/utils/nav.js +185 -0
  147. package/dist/backend/utils/nav.js.map +7 -0
  148. package/dist/backend/utils/serverErrors.js +230 -0
  149. package/dist/backend/utils/serverErrors.js.map +7 -0
  150. package/dist/frontend/AuthFooter.js +23 -0
  151. package/dist/frontend/AuthFooter.js.map +7 -0
  152. package/dist/frontend/LanguageSwitcher.js +57 -0
  153. package/dist/frontend/LanguageSwitcher.js.map +7 -0
  154. package/dist/frontend/Layout.js +14 -0
  155. package/dist/frontend/Layout.js.map +7 -0
  156. package/dist/index.js +32 -0
  157. package/dist/index.js.map +7 -0
  158. package/dist/primitives/DataLoader.js +67 -0
  159. package/dist/primitives/DataLoader.js.map +7 -0
  160. package/dist/primitives/ErrorNotice.js +20 -0
  161. package/dist/primitives/ErrorNotice.js.map +7 -0
  162. package/dist/primitives/alert.js +38 -0
  163. package/dist/primitives/alert.js.map +7 -0
  164. package/dist/primitives/badge.js +28 -0
  165. package/dist/primitives/badge.js.map +7 -0
  166. package/dist/primitives/button.js +44 -0
  167. package/dist/primitives/button.js.map +7 -0
  168. package/dist/primitives/card.js +91 -0
  169. package/dist/primitives/card.js.map +7 -0
  170. package/dist/primitives/checkbox.js +28 -0
  171. package/dist/primitives/checkbox.js.map +7 -0
  172. package/dist/primitives/dialog.js +90 -0
  173. package/dist/primitives/dialog.js.map +7 -0
  174. package/dist/primitives/input.js +22 -0
  175. package/dist/primitives/input.js.map +7 -0
  176. package/dist/primitives/label.js +21 -0
  177. package/dist/primitives/label.js.map +7 -0
  178. package/dist/primitives/separator.js +9 -0
  179. package/dist/primitives/separator.js.map +7 -0
  180. package/dist/primitives/spinner.js +24 -0
  181. package/dist/primitives/spinner.js.map +7 -0
  182. package/dist/primitives/switch.js +80 -0
  183. package/dist/primitives/switch.js.map +7 -0
  184. package/dist/primitives/table.js +29 -0
  185. package/dist/primitives/table.js.map +7 -0
  186. package/dist/primitives/tabs.js +87 -0
  187. package/dist/primitives/tabs.js.map +7 -0
  188. package/dist/primitives/textarea.js +21 -0
  189. package/dist/primitives/textarea.js.map +7 -0
  190. package/dist/primitives/tooltip.js +60 -0
  191. package/dist/primitives/tooltip.js.map +7 -0
  192. package/dist/theme/QueryProvider.js +44 -0
  193. package/dist/theme/QueryProvider.js.map +7 -0
  194. package/dist/theme/ThemeProvider.js +95 -0
  195. package/dist/theme/ThemeProvider.js.map +7 -0
  196. package/dist/theme/ThemeToggle.js +88 -0
  197. package/dist/theme/ThemeToggle.js.map +7 -0
  198. package/dist/theme/index.js +10 -0
  199. package/dist/theme/index.js.map +7 -0
  200. package/dist/types/react-big-calendar.d.js +1 -0
  201. package/dist/types/react-big-calendar.d.js.map +7 -0
  202. package/jest.config.cjs +23 -0
  203. package/jest.setup.ts +55 -0
  204. package/package.json +105 -0
  205. package/src/backend/AppShell.tsx +1096 -0
  206. package/src/backend/ConfirmDialog.tsx +19 -0
  207. package/src/backend/ContextHelp.tsx +38 -0
  208. package/src/backend/CrudForm.tsx +2503 -0
  209. package/src/backend/DataTable.tsx +1730 -0
  210. package/src/backend/EmptyState.tsx +65 -0
  211. package/src/backend/FilterBar.tsx +161 -0
  212. package/src/backend/FilterOverlay.tsx +328 -0
  213. package/src/backend/FlashMessages.tsx +82 -0
  214. package/src/backend/JsonBuilder.tsx +362 -0
  215. package/src/backend/JsonDisplay.tsx +254 -0
  216. package/src/backend/Page.tsx +30 -0
  217. package/src/backend/PerspectiveSidebar.tsx +337 -0
  218. package/src/backend/RowActions.tsx +151 -0
  219. package/src/backend/TruncatedCell.tsx +133 -0
  220. package/src/backend/UserMenu.tsx +118 -0
  221. package/src/backend/ValueIcons.tsx +48 -0
  222. package/src/backend/__tests__/AppShell.test.tsx +115 -0
  223. package/src/backend/__tests__/CrudForm.render.test.tsx +30 -0
  224. package/src/backend/__tests__/DataTable.render.test.tsx +48 -0
  225. package/src/backend/__tests__/custom-field-filters.test.ts +72 -0
  226. package/src/backend/__tests__/custom-field-forms.test.ts +54 -0
  227. package/src/backend/__tests__/serverErrors.test.ts +83 -0
  228. package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +1292 -0
  229. package/src/backend/custom-fields/FieldDefinitionsManager.tsx +381 -0
  230. package/src/backend/dashboard/DashboardScreen.tsx +684 -0
  231. package/src/backend/dashboard/__tests__/DashboardScreen.test.tsx +112 -0
  232. package/src/backend/dashboard/index.ts +1 -0
  233. package/src/backend/dashboard/widgetRegistry.ts +68 -0
  234. package/src/backend/detail/ActivitiesSection.tsx +1284 -0
  235. package/src/backend/detail/AddressEditor.tsx +472 -0
  236. package/src/backend/detail/AddressTiles.tsx +587 -0
  237. package/src/backend/detail/AddressesSection.tsx +346 -0
  238. package/src/backend/detail/AttachmentDeleteDialog.tsx +56 -0
  239. package/src/backend/detail/AttachmentMetadataDialog.tsx +672 -0
  240. package/src/backend/detail/AttachmentsSection.tsx +414 -0
  241. package/src/backend/detail/CustomDataSection.tsx +530 -0
  242. package/src/backend/detail/DetailFieldsSection.tsx +147 -0
  243. package/src/backend/detail/ErrorMessage.tsx +32 -0
  244. package/src/backend/detail/InlineEditors.tsx +877 -0
  245. package/src/backend/detail/LoadingMessage.tsx +14 -0
  246. package/src/backend/detail/NotesSection.tsx +1275 -0
  247. package/src/backend/detail/TabEmptyState.tsx +48 -0
  248. package/src/backend/detail/TagsSection.tsx +314 -0
  249. package/src/backend/detail/addressFormat.tsx +121 -0
  250. package/src/backend/detail/index.ts +44 -0
  251. package/src/backend/fields/registry.generated.ts +8 -0
  252. package/src/backend/fields/registry.ts +38 -0
  253. package/src/backend/indexes/PartialIndexBanner.tsx +68 -0
  254. package/src/backend/indexes/store.ts +88 -0
  255. package/src/backend/injection/InjectionSpot.tsx +236 -0
  256. package/src/backend/injection/PageInjectionBoundary.tsx +31 -0
  257. package/src/backend/injection/helpers.ts +35 -0
  258. package/src/backend/injection/widgetRegistry.ts +68 -0
  259. package/src/backend/inputs/ComboboxInput.tsx +269 -0
  260. package/src/backend/inputs/LookupSelect.tsx +247 -0
  261. package/src/backend/inputs/PhoneNumberField.tsx +129 -0
  262. package/src/backend/inputs/SwitchableMarkdownInput.tsx +128 -0
  263. package/src/backend/inputs/TagsInput.tsx +259 -0
  264. package/src/backend/inputs/index.ts +5 -0
  265. package/src/backend/operations/LastOperationBanner.tsx +85 -0
  266. package/src/backend/operations/__tests__/LastOperationBanner.test.tsx +99 -0
  267. package/src/backend/operations/store.ts +230 -0
  268. package/src/backend/schedule/ScheduleAgenda.tsx +136 -0
  269. package/src/backend/schedule/ScheduleGrid.tsx +136 -0
  270. package/src/backend/schedule/ScheduleToolbar.tsx +178 -0
  271. package/src/backend/schedule/ScheduleView.tsx +198 -0
  272. package/src/backend/schedule/index.ts +5 -0
  273. package/src/backend/schedule/recurrence.ts +99 -0
  274. package/src/backend/schedule/types.ts +26 -0
  275. package/src/backend/upgrades/UpgradeActionBanner.tsx +128 -0
  276. package/src/backend/utils/__tests__/apiCall.test.ts +109 -0
  277. package/src/backend/utils/__tests__/crud.test.ts +87 -0
  278. package/src/backend/utils/__tests__/customFieldDefs.test.ts +25 -0
  279. package/src/backend/utils/__tests__/customFieldValues.test.ts +35 -0
  280. package/src/backend/utils/api.ts +149 -0
  281. package/src/backend/utils/apiCall.ts +96 -0
  282. package/src/backend/utils/crud.ts +174 -0
  283. package/src/backend/utils/customFieldColumns.ts +71 -0
  284. package/src/backend/utils/customFieldDefs.ts +245 -0
  285. package/src/backend/utils/customFieldFilters.ts +145 -0
  286. package/src/backend/utils/customFieldForms.ts +196 -0
  287. package/src/backend/utils/customFieldValues.ts +41 -0
  288. package/src/backend/utils/flash.ts +17 -0
  289. package/src/backend/utils/nav.ts +238 -0
  290. package/src/backend/utils/serverErrors.ts +302 -0
  291. package/src/frontend/AuthFooter.tsx +29 -0
  292. package/src/frontend/LanguageSwitcher.tsx +66 -0
  293. package/src/frontend/Layout.tsx +13 -0
  294. package/src/index.ts +32 -0
  295. package/src/primitives/DataLoader.tsx +92 -0
  296. package/src/primitives/ErrorNotice.tsx +26 -0
  297. package/src/primitives/alert.tsx +52 -0
  298. package/src/primitives/badge.tsx +31 -0
  299. package/src/primitives/button.tsx +47 -0
  300. package/src/primitives/card.tsx +92 -0
  301. package/src/primitives/checkbox.tsx +28 -0
  302. package/src/primitives/dialog.tsx +110 -0
  303. package/src/primitives/input.tsx +20 -0
  304. package/src/primitives/label.tsx +18 -0
  305. package/src/primitives/separator.tsx +7 -0
  306. package/src/primitives/spinner.tsx +27 -0
  307. package/src/primitives/switch.tsx +86 -0
  308. package/src/primitives/table.tsx +27 -0
  309. package/src/primitives/tabs.tsx +128 -0
  310. package/src/primitives/textarea.tsx +20 -0
  311. package/src/primitives/tooltip.tsx +85 -0
  312. package/src/theme/QueryProvider.tsx +46 -0
  313. package/src/theme/ThemeProvider.tsx +120 -0
  314. package/src/theme/ThemeToggle.tsx +88 -0
  315. package/src/theme/index.ts +3 -0
  316. package/src/types/react-big-calendar.d.ts +16 -0
  317. package/tsconfig.build.json +11 -0
  318. package/tsconfig.json +9 -0
  319. package/watch.mjs +6 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/backend/custom-fields/FieldDefinitionsEditor.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Cog, GripVertical, Pencil, Plus, Trash2 } from 'lucide-react'\nimport { CUSTOM_FIELD_KINDS } from '@open-mercato/shared/modules/entities/kinds'\nimport { FieldRegistry } from '../fields/registry'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../../primitives/dialog'\nimport {\n normalizeCustomFieldOptions,\n type CustomFieldOptionDto,\n} from '@open-mercato/shared/modules/entities/options'\n\ntype FieldsetGroup = { code: string; title?: string; hint?: string }\ntype FieldsetConfig = { code: string; label: string; icon?: string; description?: string; groups?: FieldsetGroup[] }\n\nexport type FieldDefinition = {\n key: string\n kind: string\n configJson?: Record<string, unknown>\n isActive?: boolean\n}\n\nexport type FieldDefinitionError = { key?: string; kind?: string }\n\nexport type FieldDefinitionsEditorProps = {\n definitions: FieldDefinition[]\n errors?: Record<number, FieldDefinitionError>\n deletedKeys?: string[]\n kindOptions?: Array<{ value: string; label: string }>\n orderNotice?: { dirty: boolean; saving?: boolean; message?: string }\n infoNote?: React.ReactNode\n addButtonLabel?: string\n fieldsets?: FieldsetConfig[]\n activeFieldset?: string | null\n onActiveFieldsetChange?: (code: string | null) => void\n onFieldsetsChange?: (next: FieldsetConfig[]) => void\n onFieldsetCodeChange?: (previousCode: string, nextCode: string) => void\n onFieldsetRemoved?: (code: string) => void\n onAddField: () => void\n onRemoveField: (index: number) => void\n onDefinitionChange: (index: number, next: FieldDefinition) => void\n onRestoreField?: (key: string) => void\n onReorder?: (from: number, to: number) => void\n listRef?: React.Ref<HTMLDivElement>\n listProps?: React.HTMLAttributes<HTMLDivElement>\n singleFieldsetPerRecord?: boolean\n onSingleFieldsetPerRecordChange?: (value: boolean) => void\n translate?: (key: string, fallback: string) => string\n}\n\nconst DEFAULT_KIND_OPTIONS = CUSTOM_FIELD_KINDS.map((k) => ({\n value: k,\n label: k.charAt(0).toUpperCase() + k.slice(1),\n}))\n\nconst FIELDSET_ICON_OPTIONS = [\n { value: 'layers', label: 'Layers' },\n { value: 'tag', label: 'Tag' },\n { value: 'sparkles', label: 'Sparkles' },\n { value: 'package', label: 'Package' },\n { value: 'shirt', label: 'Shirt' },\n { value: 'grid', label: 'Grid' },\n { value: 'shoppingBag', label: 'Shopping bag' },\n { value: 'shoppingCart', label: 'Shopping cart' },\n { value: 'store', label: 'Store' },\n { value: 'users', label: 'Users' },\n { value: 'briefcase', label: 'Briefcase' },\n { value: 'building', label: 'Building' },\n { value: 'bookOpen', label: 'Book open' },\n { value: 'bookmark', label: 'Bookmark' },\n { value: 'camera', label: 'Camera' },\n { value: 'car', label: 'Car' },\n { value: 'clock', label: 'Clock' },\n { value: 'cloud', label: 'Cloud' },\n { value: 'compass', label: 'Compass' },\n { value: 'creditCard', label: 'Credit card' },\n { value: 'database', label: 'Database' },\n { value: 'flame', label: 'Flame' },\n { value: 'gift', label: 'Gift' },\n { value: 'globe', label: 'Globe' },\n { value: 'heart', label: 'Heart' },\n { value: 'key', label: 'Key' },\n { value: 'map', label: 'Map' },\n { value: 'palette', label: 'Palette' },\n { value: 'shield', label: 'Shield' },\n { value: 'star', label: 'Star' },\n { value: 'truck', label: 'Truck' },\n { value: 'zap', label: 'Zap' },\n { value: 'coins', label: 'Coins' },\n]\n\nfunction slugifyFieldsetCode(value: string): string {\n return slugify(value, { replacement: '', allowedChars: '_-' })\n}\n\nfunction ensureUniqueFieldsetCode(base: string, existing: FieldsetConfig[]): string {\n const sanitizedBase = slugifyFieldsetCode(base) || 'fieldset'\n let candidate = sanitizedBase\n let counter = 1\n const existingCodes = new Set(existing.map((fs) => fs.code))\n while (existingCodes.has(candidate)) {\n counter += 1\n candidate = `${sanitizedBase}_${counter}`\n }\n return candidate\n}\n\nfunction normalizeGroupValue(raw: unknown): FieldsetGroup | null {\n if (!raw) return null\n if (typeof raw === 'string') {\n const code = raw.trim()\n return code ? { code } : null\n }\n if (typeof raw !== 'object') return null\n const entry = raw as Record<string, unknown>\n const code = typeof entry.code === 'string' ? entry.code.trim() : ''\n if (!code) return null\n const group: FieldsetGroup = { code }\n if (typeof entry.title === 'string' && entry.title.trim()) group.title = entry.title.trim()\n if (typeof entry.hint === 'string' && entry.hint.trim()) group.hint = entry.hint.trim()\n return group\n}\n\nexport function FieldDefinitionsEditor({\n definitions,\n errors,\n deletedKeys,\n kindOptions = DEFAULT_KIND_OPTIONS,\n orderNotice,\n infoNote = (\n <div className=\"text-xs text-muted-foreground mt-2\">\n Supported kinds: text, multiline, integer, float, boolean, select (with options/optionsUrl), currency (fixed currencies list), relation (with related entity and options URL).\n </div>\n ),\n addButtonLabel = 'Add Field',\n fieldsets = [],\n activeFieldset = null,\n onActiveFieldsetChange,\n onFieldsetsChange,\n onFieldsetCodeChange,\n onFieldsetRemoved,\n singleFieldsetPerRecord,\n onSingleFieldsetPerRecordChange,\n onAddField,\n onRemoveField,\n onDefinitionChange,\n onRestoreField,\n onReorder,\n listRef,\n listProps,\n translate,\n}: FieldDefinitionsEditorProps) {\n const dragIndex = React.useRef<number | null>(null)\n const hasFieldsets = fieldsets.length > 0\n const t = React.useCallback((key: string, fallback: string) => (translate ? translate(key, fallback) : fallback), [translate])\n const resolvedActiveFieldset = React.useMemo(() => {\n if (!hasFieldsets) return activeFieldset ?? null\n if (activeFieldset === null) return null\n return fieldsets.some((fs) => fs.code === activeFieldset) ? activeFieldset : (fieldsets[0]?.code ?? null)\n }, [activeFieldset, fieldsets, hasFieldsets])\n\n const filteredDefinitions = React.useMemo(\n () =>\n definitions\n .map((definition, index) => ({ definition, index }))\n .filter(({ definition }) => {\n if (!hasFieldsets) return true\n const assigned = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : undefined\n if (!resolvedActiveFieldset) return !assigned\n return assigned === resolvedActiveFieldset\n }),\n [definitions, hasFieldsets, resolvedActiveFieldset],\n )\n\n const activeFieldsetConfig = hasFieldsets && resolvedActiveFieldset\n ? fieldsets.find((fs) => fs.code === resolvedActiveFieldset) ?? null\n : null\n\n const handleActiveFieldsetChange = (value: string) => {\n if (!onActiveFieldsetChange) return\n onActiveFieldsetChange(value ? value : null)\n }\n\n const handleFieldsetPatch = (code: string, patch: Partial<FieldsetConfig>) => {\n if (!onFieldsetsChange) return\n const next = fieldsets.map((fs) => (fs.code === code ? { ...fs, ...patch } : fs))\n onFieldsetsChange(next)\n }\n\n const handleFieldsetCodeInput = (code: string, nextValue: string) => {\n if (!onFieldsetsChange) return\n const target = fieldsets.find((fs) => fs.code === code)\n if (!target) return\n const sanitized = slugifyFieldsetCode(nextValue)\n if (!sanitized) return\n const next = fieldsets.map((fs) => (fs.code === code ? { ...fs, code: sanitized } : fs))\n onFieldsetsChange(next)\n onFieldsetCodeChange?.(code, sanitized)\n onActiveFieldsetChange?.(sanitized)\n }\n\n const handleAddFieldset = () => {\n if (!onFieldsetsChange) return\n const code = ensureUniqueFieldsetCode(`fieldset_${fieldsets.length + 1}`, fieldsets)\n const nextFieldsets = [...fieldsets, { code, label: 'New fieldset', icon: 'layers' }]\n onFieldsetsChange(nextFieldsets)\n onActiveFieldsetChange?.(code)\n }\n\n const handleRemoveFieldset = () => {\n if (!onFieldsetsChange) return\n if (!resolvedActiveFieldset) return\n if (!window.confirm(`Delete fieldset \"${resolvedActiveFieldset}\"? This will move its fields to Unassigned.`)) return\n const next = fieldsets.filter((fs) => fs.code !== resolvedActiveFieldset)\n onFieldsetsChange(next)\n onFieldsetRemoved?.(resolvedActiveFieldset)\n const fallback = next[0]?.code ?? null\n onActiveFieldsetChange?.(fallback)\n }\n\n const registerGroup = React.useCallback(\n (fieldsetCode: string, group: FieldsetGroup) => {\n if (!onFieldsetsChange || !fieldsetCode) return\n const next = fieldsets.map((fs) => {\n if (fs.code !== fieldsetCode) return fs\n const list = Array.isArray(fs.groups) ? fs.groups : []\n const existingIndex = list.findIndex((entry) => entry.code === group.code)\n if (existingIndex >= 0) {\n const updated = [...list]\n updated[existingIndex] = { ...list[existingIndex], ...group }\n return { ...fs, groups: updated }\n }\n return { ...fs, groups: [...list, group] }\n })\n onFieldsetsChange(next)\n },\n [fieldsets, onFieldsetsChange],\n )\n const removeGroup = React.useCallback(\n (fieldsetCode: string, groupCode: string) => {\n if (!onFieldsetsChange || !fieldsetCode || !groupCode) return\n const next = fieldsets.map((fs) => {\n if (fs.code !== fieldsetCode) return fs\n const list = Array.isArray(fs.groups) ? fs.groups : []\n return { ...fs, groups: list.filter((entry) => entry.code !== groupCode) }\n })\n onFieldsetsChange(next)\n },\n [fieldsets, onFieldsetsChange],\n )\n const availableGroups = activeFieldsetConfig?.groups ?? []\n const canToggleSingleFieldset = hasFieldsets && fieldsets.length > 1\n const singleFieldsetChecked = singleFieldsetPerRecord !== false\n\n const handleReorder = React.useCallback(\n (from: number, to: number) => {\n if (from === to) return\n onReorder?.(from, to)\n },\n [onReorder],\n )\n\n return (\n <div\n ref={listRef}\n className=\"space-y-3\"\n {...listProps}\n >\n {hasFieldsets ? (\n <div className=\"rounded border bg-card p-3 space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-xs font-medium text-muted-foreground\">Fieldset</label>\n <select\n className=\"border rounded px-2 py-1 text-sm\"\n value={resolvedActiveFieldset ?? ''}\n onChange={(event) => handleActiveFieldsetChange(event.target.value)}\n >\n <option value=\"\">Unassigned fields</option>\n {fieldsets.map((fs) => (\n <option key={fs.code} value={fs.code}>\n {fs.label || fs.code}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n onClick={handleAddFieldset}\n className=\"px-2 py-1 border rounded hover:bg-muted inline-flex items-center gap-1 text-xs\"\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add\n </button>\n <button\n type=\"button\"\n onClick={handleRemoveFieldset}\n disabled={!resolvedActiveFieldset}\n className=\"px-2 py-1 border rounded hover:bg-muted inline-flex items-center gap-1 text-xs disabled:opacity-50\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" /> Delete\n </button>\n </div>\n {resolvedActiveFieldset && activeFieldsetConfig ? (\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <div>\n <label className=\"text-xs\">Code</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm font-mono\"\n value={activeFieldsetConfig.code}\n onChange={(event) => handleFieldsetCodeInput(activeFieldsetConfig.code, event.target.value)}\n />\n </div>\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.label}\n onChange={(event) => handleFieldsetPatch(activeFieldsetConfig.code, { label: event.target.value })}\n />\n </div>\n <div>\n <label className=\"text-xs\">Icon</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.icon ?? ''}\n onChange={(event) =>\n handleFieldsetPatch(activeFieldsetConfig.code, {\n icon: event.target.value || undefined,\n })\n }\n >\n <option value=\"\">Default</option>\n {FIELDSET_ICON_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"text-xs\">Description</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={activeFieldsetConfig.description ?? ''}\n onChange={(event) => handleFieldsetPatch(activeFieldsetConfig.code, { description: event.target.value })}\n />\n </div>\n </div>\n ) : null}\n <div className=\"flex items-center gap-2 text-xs\">\n <label className=\"inline-flex items-center gap-2\">\n <input\n type=\"checkbox\"\n disabled={!canToggleSingleFieldset}\n checked={singleFieldsetChecked}\n onChange={(event) => onSingleFieldsetPerRecordChange?.(event.target.checked)}\n />\n Single fieldset per entity\n </label>\n {!canToggleSingleFieldset ? (\n <span className=\"text-muted-foreground\">(add at least two fieldsets to toggle)</span>\n ) : null}\n </div>\n </div>\n ) : (\n <div className=\"rounded border border-dashed bg-muted/30 p-4 text-sm text-muted-foreground flex flex-col gap-3\">\n <div>No fieldsets defined yet. Fieldsets let you group custom fields for different variants of the same entity (e.g., Fashion vs. Sport products).</div>\n <div>\n <button\n type=\"button\"\n onClick={handleAddFieldset}\n className=\"px-3 py-1.5 border rounded bg-card text-sm font-medium inline-flex items-center gap-2\"\n >\n <Plus className=\"h-4 w-4\" />\n Add first fieldset\n </button>\n </div>\n </div>\n )}\n {orderNotice?.dirty && (\n <div className=\"sticky top-0 z-10 -mt-1 -mb-1\">\n <div className=\"inline-flex items-center gap-2 text-xs px-2 py-1 rounded border bg-amber-50 text-amber-800 shadow-sm\">\n {orderNotice?.saving ? 'Saving order\u2026' : (orderNotice?.message ?? 'Reordered \u2014 saving soon')}\n </div>\n </div>\n )}\n {filteredDefinitions.map(({ definition, index }) => {\n const assignedFieldset = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : null\n const groupOptions = assignedFieldset\n ? fieldsets.find((fs) => fs.code === assignedFieldset)?.groups ?? []\n : availableGroups\n return (\n <div\n key={definition.key || `def-${index}`}\n className=\"group\"\n draggable\n onDragStart={() => { dragIndex.current = index }}\n onDragOver={(event) => { event.preventDefault() }}\n onDrop={() => {\n const from = dragIndex.current\n if (from == null) return\n dragIndex.current = null\n handleReorder(from, index)\n }}\n onDragEnd={() => { dragIndex.current = null }}\n tabIndex={0}\n onKeyDown={(event) => {\n if (!event.altKey) return\n if (event.key === 'ArrowUp' || event.key === 'Up') {\n event.preventDefault()\n handleReorder(index, Math.max(0, index - 1))\n }\n if (event.key === 'ArrowDown' || event.key === 'Down') {\n event.preventDefault()\n handleReorder(index, Math.min(definitions.length - 1, index + 1))\n }\n }}\n >\n <FieldDefinitionCard\n definition={definition}\n error={errors?.[index]}\n kindOptions={kindOptions}\n onChange={(next) => onDefinitionChange(index, next)}\n onRemove={() => onRemoveField(index)}\n allowFieldsetSelection={hasFieldsets}\n fieldsets={fieldsets}\n activeFieldset={resolvedActiveFieldset}\n availableGroups={groupOptions}\n onRegisterGroup={registerGroup}\n onRemoveGroup={removeGroup}\n translate={t}\n />\n </div>\n )})}\n <div>\n <button\n type=\"button\"\n onClick={onAddField}\n className=\"px-3 py-1.5 text-sm border rounded hover:bg-muted inline-flex items-center gap-1\"\n >\n <Plus className=\"h-4 w-4\" /> {addButtonLabel}\n </button>\n {infoNote}\n {deletedKeys && deletedKeys.length > 0 && onRestoreField ? (\n <div className=\"text-xs text-muted-foreground mt-2\">\n Restore deleted fields:{' '}\n {deletedKeys.map((key, idx) => (\n <span key={key}>\n <button\n type=\"button\"\n className=\"underline hover:no-underline text-blue-600 disabled:opacity-50\"\n onClick={() => onRestoreField(key)}\n >\n {key}\n </button>\n {idx < deletedKeys.length - 1 ? ', ' : ''}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\ntype FieldDefinitionCardProps = {\n definition: FieldDefinition\n error?: FieldDefinitionError\n kindOptions: Array<{ value: string; label: string }>\n onChange: (next: FieldDefinition) => void\n onRemove: () => void\n allowFieldsetSelection?: boolean\n fieldsets?: FieldsetConfig[]\n activeFieldset?: string | null\n availableGroups?: FieldsetGroup[]\n onRegisterGroup?: (fieldsetCode: string, group: FieldsetGroup) => void\n onRemoveGroup?: (fieldsetCode: string, groupCode: string) => void\n translate?: (key: string, fallback: string) => string\n}\n\nconst FieldDefinitionCard = React.memo(function FieldDefinitionCard({\n definition,\n error,\n kindOptions,\n onChange,\n onRemove,\n allowFieldsetSelection = false,\n fieldsets = [],\n activeFieldset,\n availableGroups = [],\n onRegisterGroup,\n onRemoveGroup,\n translate,\n}: FieldDefinitionCardProps) {\n const [local, setLocal] = React.useState<FieldDefinition>(definition)\n const [optionValueDraft, setOptionValueDraft] = React.useState('')\n const [optionLabelDraft, setOptionLabelDraft] = React.useState('')\n const [optionDialogOpen, setOptionDialogOpen] = React.useState(false)\n const [optionFormError, setOptionFormError] = React.useState<string | null>(null)\n const [groupDialogOpen, setGroupDialogOpen] = React.useState(false)\n const [groupDraft, setGroupDraft] = React.useState({ code: '', title: '', hint: '' })\n const [editingGroupCode, setEditingGroupCode] = React.useState<string | null>(null)\n const [groupError, setGroupError] = React.useState<string | null>(null)\n const currentFieldsetValue = React.useMemo(\n () => (typeof local.configJson?.fieldset === 'string' ? local.configJson.fieldset : ''),\n [local.configJson?.fieldset],\n )\n React.useEffect(() => { setLocal(definition) }, [definition.key])\n React.useEffect(() => {\n setOptionValueDraft('')\n setOptionLabelDraft('')\n setGroupDialogOpen(false)\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupError(null)\n }, [definition.key])\n React.useEffect(() => {\n if (!currentFieldsetValue) {\n setGroupDialogOpen(false)\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupError(null)\n }\n }, [currentFieldsetValue])\n const currentGroup = React.useMemo(() => normalizeGroupValue(local.configJson?.group), [local])\n const groupOptions = React.useMemo(() => {\n const list = Array.isArray(availableGroups) ? [...availableGroups] : []\n if (currentGroup && !list.some((entry) => entry.code === currentGroup.code)) {\n list.push(currentGroup)\n }\n return list\n }, [availableGroups, currentGroup])\n const resolvedOptions = React.useMemo<CustomFieldOptionDto[]>(\n () => normalizeCustomFieldOptions(local.configJson?.options),\n [local.configJson?.options],\n )\n\n const sanitize = (def: FieldDefinition): FieldDefinition => {\n if (!def.configJson || !Array.isArray(def.configJson.options)) return def\n const normalizedOptions = normalizeCustomFieldOptions(def.configJson.options)\n return {\n ...def,\n configJson: {\n ...def.configJson,\n options: normalizedOptions,\n },\n }\n }\n\n const apply = (patch: Partial<FieldDefinition> | ((current: FieldDefinition) => Partial<FieldDefinition>), propagateNow = false) => {\n setLocal((prev) => {\n const resolvedPatch = typeof patch === 'function' ? patch(prev) : patch\n const next = { ...prev, ...resolvedPatch }\n if (!propagateNow) return next\n const sanitized = sanitize(next)\n onChange(sanitized)\n return sanitized\n })\n }\n\n const commit = () => {\n setLocal((prev) => {\n const sanitized = sanitize(prev)\n onChange(sanitized)\n return sanitized\n })\n }\n\n const handleFieldsetSelect = (value: string) => {\n setLocal((prev) => {\n const nextConfig = { ...(prev.configJson || {}) }\n if (value) nextConfig.fieldset = value\n else delete nextConfig.fieldset\n delete nextConfig.group\n const next = { ...prev, configJson: nextConfig }\n onChange(next)\n return next\n })\n }\n\n const handleGroupSelect = (value: string) => {\n if (!currentFieldsetValue) return\n if (!value) {\n const nextConfig = { ...(local.configJson || {}) }\n delete nextConfig.group\n apply({ configJson: nextConfig }, true)\n return\n }\n const match = groupOptions.find((group) => group.code === value)\n const nextGroup = match ?? { code: value }\n const nextConfig = { ...(local.configJson || {}) }\n nextConfig.group = nextGroup\n apply({ configJson: nextConfig }, true)\n onRegisterGroup?.(currentFieldsetValue, nextGroup)\n }\n\n const handleOpenGroupDialog = (group?: FieldsetGroup) => {\n if (!currentFieldsetValue) return\n if (group) {\n setGroupDraft({\n code: group.code,\n title: group.title ?? '',\n hint: group.hint ?? '',\n })\n setEditingGroupCode(group.code)\n } else {\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n }\n setGroupError(null)\n setGroupDialogOpen(true)\n }\n\n const handleGroupDialogSubmit = () => {\n if (!currentFieldsetValue) return\n const code = slugifyFieldsetCode(groupDraft.code || '')\n if (!code) {\n setGroupError('Group code is required.')\n return\n }\n const group: FieldsetGroup = {\n code,\n title: groupDraft.title.trim() || undefined,\n hint: groupDraft.hint.trim() || undefined,\n }\n onRegisterGroup?.(currentFieldsetValue, group)\n const shouldAttachToField = !editingGroupCode || currentGroup?.code === editingGroupCode\n if (shouldAttachToField) {\n const nextConfig = { ...(local.configJson || {}) }\n nextConfig.group = group\n apply({ configJson: nextConfig }, true)\n }\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n setGroupDialogOpen(false)\n }\n\n const handleRemoveGroupEntry = (code: string) => {\n if (!currentFieldsetValue) return\n onRemoveGroup?.(currentFieldsetValue, code)\n if (currentGroup?.code === code) {\n handleGroupSelect('')\n }\n if (editingGroupCode === code) {\n setGroupDraft({ code: '', title: '', hint: '' })\n setEditingGroupCode(null)\n }\n }\n\n const handleEditGroupEntry = (group: FieldsetGroup) => {\n handleOpenGroupDialog(group)\n }\n\n const resetOptionDialog = () => {\n setOptionValueDraft('')\n setOptionLabelDraft('')\n setOptionFormError(null)\n }\n\n const handleOpenOptionDialog = () => {\n resetOptionDialog()\n setOptionDialogOpen(true)\n }\n\n const handleCloseOptionDialog = () => {\n resetOptionDialog()\n setOptionDialogOpen(false)\n }\n\n const handleAddOption = () => {\n const value = optionValueDraft.trim()\n const label = optionLabelDraft.trim()\n if (!value) {\n setOptionFormError('Value is required')\n return\n }\n setOptionFormError(null)\n const nextOptions = Array.isArray(local.configJson?.options) ? [...local.configJson!.options] : []\n nextOptions.push({ value, label: label || value })\n apply({ configJson: { ...(local.configJson || {}), options: nextOptions } }, true)\n handleCloseOptionDialog()\n }\n\n const handleRemoveOption = (index: number) => {\n const nextOptions = Array.isArray(local.configJson?.options) ? [...local.configJson!.options] : []\n nextOptions.splice(index, 1)\n apply({ configJson: { ...(local.configJson || {}), options: nextOptions } }, true)\n }\n\n return (\n <>\n <div className=\"rounded border p-3 bg-card transition-colors hover:border-muted-foreground/60\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center justify-center h-5 w-5 rounded hover:bg-muted cursor-grab active:cursor-grabbing\">\n <GripVertical className=\"h-4 w-4 opacity-70\" />\n </span>\n Drag to reorder\n </div>\n <div className=\"flex items-center gap-3\">\n <label className=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={local.isActive !== false} onChange={(event) => { apply({ isActive: event.target.checked }, true) }} /> Active\n </label>\n <button type=\"button\" onClick={onRemove} className=\"px-2 py-1 border rounded hover:bg-muted\" aria-label=\"Remove field\">\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-12 gap-3 items-center\">\n <div className=\"md:col-span-6\">\n <label className=\"text-xs\">Key</label>\n <input\n className={`rounded w-full px-2 py-1 text-sm font-mono ${error?.key ? 'border-red-500 border' : 'border'}`}\n placeholder=\"snake_case\"\n value={local.key}\n onChange={(event) => apply({ key: event.target.value })}\n onBlur={commit}\n />\n {error?.key ? <div className=\"text-xs text-red-600 mt-1\">{error.key}</div> : null}\n </div>\n <div className=\"md:col-span-6\">\n <label className=\"text-xs\">Kind</label>\n <select\n className={`rounded w-full px-2 py-1 text-sm ${error?.kind ? 'border-red-500 border' : 'border'}`}\n value={local.kind}\n onChange={(event) => { apply({ kind: event.target.value }, true) }}\n >\n {kindOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {error?.kind ? <div className=\"text-xs text-red-600 mt-1\">{error.kind}</div> : null}\n </div>\n </div>\n\n {allowFieldsetSelection ? (\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs\">Assign to fieldset</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={currentFieldsetValue}\n onChange={(event) => handleFieldsetSelect(event.target.value)}\n >\n <option value=\"\">Unassigned</option>\n {(fieldsets || []).map((fs) => (\n <option key={fs.code} value={fs.code}>\n {fs.label || fs.code}\n </option>\n ))}\n </select>\n </div>\n {currentFieldsetValue ? (\n <div>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-xs\">Group</label>\n </div>\n <div className=\"flex items-center gap-2 mt-1\">\n <select\n className=\"flex-1 border rounded px-2 py-1 text-sm\"\n value={currentGroup?.code ?? ''}\n onChange={(event) => handleGroupSelect(event.target.value)}\n >\n <option value=\"\">No group</option>\n {groupOptions.map((group) => (\n <option key={group.code} value={group.code}>\n {group.title || group.code}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n className=\"h-8 w-8 inline-flex items-center justify-center rounded border text-muted-foreground hover:bg-muted/40\"\n onClick={() => handleOpenGroupDialog()}\n aria-label=\"Create group\"\n >\n <Plus className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"h-8 w-8 inline-flex items-center justify-center rounded border text-muted-foreground hover:bg-muted/40\"\n onClick={() => handleOpenGroupDialog()}\n aria-label=\"Edit groups\"\n >\n <Cog className=\"h-4 w-4\" />\n <span className=\"sr-only\">Edit groups</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-3 grid grid-cols-1 md:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.label === 'string' ? local.configJson.label : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), label: event.target.value } })}\n onBlur={commit}\n />\n </div>\n <div>\n <label className=\"text-xs\">Description</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.description === 'string' ? local.configJson.description : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), description: event.target.value } })}\n onBlur={commit}\n />\n </div>\n\n {(local.kind === 'text' || local.kind === 'multiline') && (\n <>\n <div>\n <label className=\"text-xs\">Editor</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={typeof local.configJson?.editor === 'string' ? local.configJson.editor : ''}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), editor: event.target.value || undefined } }, true) }}\n >\n <option value=\"\">Default</option>\n <option value=\"markdown\">Markdown (UIW)</option>\n <option value=\"simpleMarkdown\">Simple Markdown</option>\n <option value=\"htmlRichText\">HTML Rich Text</option>\n </select>\n </div>\n {local.kind === 'text' && (\n <>\n <div className=\"md:col-span-2\">\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input type=\"checkbox\" checked={!!local.configJson?.multi} onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), multi: event.target.checked } }, true) }} /> Multiple\n </label>\n </div>\n {!!local.configJson?.multi && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Multi-select input style</label>\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={local.configJson?.input === 'listbox' ? 'listbox' : 'default'}\n onChange={(event) => {\n const { value } = event.target\n const nextConfig = { ...(local.configJson || {}) }\n if (value === 'listbox') nextConfig.input = 'listbox'\n else delete nextConfig.input\n apply({ configJson: nextConfig }, true)\n }}\n >\n <option value=\"default\">Default</option>\n <option value=\"listbox\">Listbox (searchable)</option>\n </select>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {local.kind === 'select' && (\n <div className=\"md:col-span-6 space-y-3\">\n <label className=\"text-xs\">Options</label>\n <div className=\"space-y-2\">\n {resolvedOptions.length > 0 ? (\n resolvedOptions.map((option, idx) => (\n <div\n key={`${option.value}-${idx}`}\n className=\"flex items-center justify-between rounded border px-3 py-2 text-xs bg-muted\"\n >\n <div>\n <div className=\"font-medium text-foreground\">{option.label}</div>\n <div className=\"text-muted-foreground font-mono text-[11px]\">{option.value}</div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveOption(idx)}\n className=\"text-red-500 hover:text-red-700\"\n aria-label=\"Remove option\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))\n ) : (\n <span className=\"text-xs text-muted-foreground\">No options defined.</span>\n )}\n </div>\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n className=\"text-xs px-2 py-1 border rounded hover:bg-muted inline-flex items-center gap-1\"\n onClick={handleOpenOptionDialog}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add option\n </button>\n </div>\n </div>\n )}\n\n {(local.kind === 'select' || local.kind === 'relation') && (\n <>\n <div>\n <label className=\"text-xs\">Options URL</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"/api/...\"\n value={typeof local.configJson?.optionsUrl === 'string' ? local.configJson.optionsUrl : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), optionsUrl: event.target.value } })}\n onBlur={commit}\n />\n </div>\n {local.kind === 'relation' && (\n <div>\n <label className=\"text-xs\">Related Entity ID</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm font-mono\"\n placeholder=\"module:entity\"\n value={typeof local.configJson?.relatedEntityId === 'string' ? local.configJson.relatedEntityId : ''}\n onChange={(event) => {\n const relatedEntityId = event.target.value\n const defOptionsUrl = relatedEntityId\n ? `/api/entities/relations/options?entityId=${encodeURIComponent(relatedEntityId)}`\n : ''\n apply({\n configJson: {\n ...(local.configJson || {}),\n relatedEntityId,\n optionsUrl: local.configJson?.optionsUrl || defOptionsUrl,\n },\n })\n }}\n onBlur={commit}\n />\n </div>\n )}\n </>\n )}\n\n {local.kind === 'currency' && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Options source</label>\n <div className=\"rounded border bg-muted px-2 py-1 text-xs text-muted-foreground\">\n /api/currencies/options\n </div>\n </div>\n )}\n\n {(local.kind === 'integer' || local.kind === 'float') && (\n <div className=\"md:col-span-2\">\n <label className=\"text-xs\">Units (optional)</label>\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"kg, cm, etc.\"\n value={typeof local.configJson?.unit === 'string' ? local.configJson.unit : ''}\n onChange={(event) => apply({ configJson: { ...(local.configJson || {}), unit: event.target.value } })}\n onBlur={commit}\n />\n </div>\n )}\n </div>\n\n <div className=\"mt-3 pt-3 border-t\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"text-sm font-medium\">Validation rules</label>\n <button\n type=\"button\"\n className=\"text-xs px-2 py-1 border rounded hover:bg-muted inline-flex items-center gap-1\"\n onClick={() => {\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n list.push({ rule: 'required', message: 'This field is required' } as any)\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Add rule\n </button>\n </div>\n <div className=\"space-y-2\">\n {(Array.isArray(local.configJson?.validation) ? local.configJson!.validation : []).map((rule: any, index: number) => (\n <div key={index} className=\"grid grid-cols-1 md:grid-cols-12 gap-2 items-center\">\n <div className=\"md:col-span-3\">\n <select\n className=\"border rounded w-full px-2 py-1 text-sm\"\n value={rule?.rule || 'required'}\n onChange={(event) => {\n const nextRule = event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, rule: nextRule, message: existing.message || rule?.message || '' }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <option value=\"required\">required</option>\n <option value=\"date\">date</option>\n <option value=\"integer\">integer</option>\n <option value=\"float\">float</option>\n <option value=\"lt\">lt</option>\n <option value=\"lte\">lte</option>\n <option value=\"gt\">gt</option>\n <option value=\"gte\">gte</option>\n <option value=\"eq\">eq</option>\n <option value=\"ne\">ne</option>\n <option value=\"regex\">regex</option>\n </select>\n </div>\n <div className=\"md:col-span-4\">\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder={rule?.rule === 'regex' ? 'Pattern (e.g. ^[a-z]+$)' : (['lt','lte','gt','gte'].includes(rule?.rule) ? 'Number' : '\u2014')}\n value={rule?.param ?? ''}\n onChange={(event) => {\n const value = ['lt','lte','gt','gte'].includes(rule?.rule) ? Number(event.target.value) : event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, ...rule, param: value }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n })\n }}\n onBlur={commit}\n disabled={rule?.rule === 'required' || rule?.rule === 'date' || rule?.rule === 'integer' || rule?.rule === 'float'}\n />\n </div>\n <div className=\"md:col-span-4\">\n <input\n className=\"border rounded w-full px-2 py-1 text-sm\"\n placeholder=\"Error message\"\n value={rule?.message || ''}\n onChange={(event) => {\n const message = event.target.value\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n const existing = (list[index] as any) || {}\n list[index] = { ...existing, ...rule, message }\n return { configJson: { ...(current.configJson || {}), validation: list } }\n })\n }}\n onBlur={commit}\n />\n </div>\n <div className=\"md:col-span-1 flex justify-end\">\n <button\n type=\"button\"\n className=\"px-2 py-1 border rounded hover:bg-muted\"\n aria-label=\"Remove rule\"\n onClick={() => {\n apply((current) => {\n const list = Array.isArray(current.configJson?.validation) ? [...current.configJson.validation] : []\n list.splice(index, 1)\n return { configJson: { ...(current.configJson || {}), validation: list } }\n }, true)\n }}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ))}\n {(!Array.isArray(local.configJson?.validation) || local.configJson!.validation.length === 0) && (\n <div className=\"text-xs text-muted-foreground\">No validation rules defined.</div>\n )}\n </div>\n </div>\n\n <div className=\"mt-3\">\n {(() => {\n const Editor = FieldRegistry.getDefEditor(local.kind)\n if (!Editor) return null\n return (\n <Editor\n def={{ key: local.key, kind: local.kind, configJson: local.configJson }}\n onChange={(patch) => apply({ configJson: { ...(local.configJson || {}), ...(patch || {}) } }, true)}\n />\n )\n })()}\n </div>\n\n <div className=\"mt-3 pt-2 border-t flex flex-wrap items-center gap-4\">\n <span className=\"text-xs text-muted-foreground\">Visibility:</span>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={local.configJson?.listVisible !== false}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), listVisible: event.target.checked } }, true) }}\n />\n List\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={!!local.configJson?.filterable}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), filterable: event.target.checked } }, true) }}\n />\n Filter\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={local.configJson?.formEditable !== false}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), formEditable: event.target.checked } }, true) }}\n />\n Form\n </label>\n <label className=\"inline-flex items-center gap-2 text-xs\">\n <input\n type=\"checkbox\"\n checked={!!local.configJson?.encrypted}\n onChange={(event) => { apply({ configJson: { ...(local.configJson || {}), encrypted: event.target.checked } }, true) }}\n />\n {translate?.('entities.customFields.fields.encrypted', 'Encrypted') ?? 'Encrypted'}\n </label>\n </div>\n </div>\n <Dialog\n open={optionDialogOpen}\n onOpenChange={(open) => {\n setOptionDialogOpen(open)\n if (!open) resetOptionDialog()\n }}\n >\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Add option</DialogTitle>\n <DialogDescription>Provide the stored value and optional label shown to users.</DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 py-2\">\n <div>\n <label className=\"text-xs\">Value</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm font-mono\"\n placeholder=\"unique_value\"\n value={optionValueDraft}\n onChange={(event) => {\n setOptionFormError(null)\n setOptionValueDraft(event.target.value)\n }}\n />\n {optionFormError ? <p className=\"mt-1 text-xs text-red-600\">{optionFormError}</p> : null}\n </div>\n <div>\n <label className=\"text-xs\">Label</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n placeholder=\"Label shown to users (optional)\"\n value={optionLabelDraft}\n onChange={(event) => setOptionLabelDraft(event.target.value)}\n />\n </div>\n </div>\n <DialogFooter>\n <button\n type=\"button\"\n className=\"h-8 rounded border px-3 text-sm\"\n onClick={handleCloseOptionDialog}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"h-8 rounded bg-primary px-3 text-sm text-primary-foreground\"\n onClick={handleAddOption}\n >\n Add option\n </button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog\n open={groupDialogOpen}\n onOpenChange={(open) => {\n setGroupDialogOpen(open)\n if (!open) {\n setGroupError(null)\n setEditingGroupCode(null)\n setGroupDraft({ code: '', title: '', hint: '' })\n }\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>{editingGroupCode ? 'Edit group' : 'New group'}</DialogTitle>\n <DialogDescription>\n {editingGroupCode ? 'Update the selected group for this fieldset.' : 'Add a reusable group for this fieldset.'}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label className=\"text-xs font-medium\">Group code</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm font-mono disabled:cursor-not-allowed disabled:bg-muted/40 disabled:text-muted-foreground\"\n value={groupDraft.code}\n onChange={(event) => {\n setGroupDraft((prev) => ({ ...prev, code: event.target.value }))\n if (groupError) setGroupError(null)\n }}\n disabled={!!editingGroupCode}\n placeholder=\"e.g. buying_committee\"\n />\n {groupError ? <div className=\"text-xs text-red-600 mt-1\">{groupError}</div> : null}\n </div>\n <div>\n <label className=\"text-xs font-medium\">Label</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n value={groupDraft.title}\n onChange={(event) => setGroupDraft((prev) => ({ ...prev, title: event.target.value }))}\n placeholder=\"Buying committee\"\n />\n </div>\n <div>\n <label className=\"text-xs font-medium\">Hint</label>\n <input\n className=\"mt-1 w-full rounded border px-2 py-1 text-sm\"\n value={groupDraft.hint}\n onChange={(event) => setGroupDraft((prev) => ({ ...prev, hint: event.target.value }))}\n placeholder=\"Visible to merchandisers\"\n />\n </div>\n {currentFieldsetValue && groupOptions.length > 0 ? (\n <div>\n <div className=\"text-xs font-medium mb-1\">Existing groups</div>\n <div className=\"space-y-2 max-h-40 overflow-y-auto\">\n {groupOptions.map((group) => (\n <div key={group.code} className=\"flex items-center justify-between rounded border px-3 py-2 text-sm\">\n <div>\n <div className=\"font-medium\">{group.title || group.code}</div>\n <div className=\"text-xs text-muted-foreground font-mono\">{group.code}</div>\n {group.hint ? (\n <div className=\"text-xs text-muted-foreground\">{group.hint}</div>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n onClick={() => handleEditGroupEntry(group)}\n aria-label={`Edit ${group.code}`}\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"text-red-500 hover:text-red-600\"\n onClick={() => handleRemoveGroupEntry(group.code)}\n aria-label={`Delete ${group.code}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n <DialogFooter>\n <button\n type=\"button\"\n className=\"h-8 rounded border px-3 text-sm\"\n onClick={() => setGroupDialogOpen(false)}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"h-8 rounded bg-primary px-3 text-sm text-primary-foreground\"\n onClick={handleGroupDialogSubmit}\n >\n Save group\n </button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n})\n\nFieldDefinitionCard.displayName = 'FieldDefinitionCard'\n"],
5
+ "mappings": "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",
6
+ "names": ["code", "FieldDefinitionCard", "nextConfig"]
7
+ }
@@ -0,0 +1,332 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { useQueryClient } from "@tanstack/react-query";
5
+ import { Button } from "../../primitives/button.js";
6
+ import { Spinner } from "../../primitives/spinner.js";
7
+ import { ErrorNotice } from "../../primitives/ErrorNotice.js";
8
+ import { flash } from "../FlashMessages.js";
9
+ import { apiCall, readApiResultOrThrow } from "../utils/apiCall.js";
10
+ import { raiseCrudError } from "../utils/serverErrors.js";
11
+ import { invalidateCustomFieldDefs } from "../utils/customFieldDefs.js";
12
+ import { FieldDefinitionsEditor } from "./FieldDefinitionsEditor.js";
13
+ import { upsertCustomFieldDefSchema } from "@open-mercato/shared/modules/entities/validators";
14
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
15
+ function normalizeGroupPayload(value) {
16
+ if (!value) return null;
17
+ if (typeof value === "string") {
18
+ const code2 = value.trim();
19
+ return code2 ? { code: code2 } : null;
20
+ }
21
+ if (typeof value !== "object") return null;
22
+ const entry = value;
23
+ const code = typeof entry.code === "string" ? entry.code.trim() : "";
24
+ if (!code) return null;
25
+ const group = { code };
26
+ if (typeof entry.title === "string" && entry.title.trim()) group.title = entry.title.trim();
27
+ if (typeof entry.hint === "string" && entry.hint.trim()) group.hint = entry.hint.trim();
28
+ return group;
29
+ }
30
+ const FieldDefinitionsManager = React.forwardRef(
31
+ function FieldDefinitionsManager2({ entityId, initialFieldset = null, onClose, onSaved, fullEditorHref }, ref) {
32
+ const t = useT();
33
+ const queryClient = useQueryClient();
34
+ const [loading, setLoading] = React.useState(true);
35
+ const [saving, setSaving] = React.useState(false);
36
+ const [statusError, setStatusError] = React.useState(null);
37
+ const [defs, setDefs] = React.useState([]);
38
+ const [deletedKeys, setDeletedKeys] = React.useState([]);
39
+ const [defErrors, setDefErrors] = React.useState({});
40
+ const [fieldsets, setFieldsets] = React.useState([]);
41
+ const [activeFieldset, setActiveFieldset] = React.useState(initialFieldset);
42
+ const [singleFieldsetPerRecord, setSingleFieldsetPerRecord] = React.useState(true);
43
+ const [isDirty, setIsDirty] = React.useState(false);
44
+ const [orderDirty, setOrderDirty] = React.useState(false);
45
+ const loadDefinitions = React.useCallback(async () => {
46
+ if (!entityId) return;
47
+ setLoading(true);
48
+ setStatusError(null);
49
+ try {
50
+ const json = await readApiResultOrThrow(
51
+ `/api/entities/definitions.manage?entityId=${encodeURIComponent(entityId)}`,
52
+ void 0,
53
+ { errorMessage: t("entities.customFields.errors.loadFailed", "Failed to load field definitions"), fallback: { items: [], deletedKeys: [] } }
54
+ );
55
+ const loaded = (json.items || []).map((d) => ({
56
+ key: d.key,
57
+ kind: d.kind,
58
+ configJson: d.configJson || {},
59
+ isActive: d.isActive !== false
60
+ }));
61
+ loaded.sort(
62
+ (a, b) => Number(a.configJson?.priority ?? 0) - Number(b.configJson?.priority ?? 0)
63
+ );
64
+ setDefs(loaded);
65
+ setDeletedKeys(Array.isArray(json.deletedKeys) ? json.deletedKeys : []);
66
+ const loadedFieldsets = Array.isArray(json.fieldsets) ? json.fieldsets : [];
67
+ setFieldsets(loadedFieldsets);
68
+ setActiveFieldset((current) => {
69
+ if (initialFieldset && loadedFieldsets.some((fs) => fs.code === initialFieldset)) {
70
+ return initialFieldset;
71
+ }
72
+ if (current && loadedFieldsets.some((fs) => fs.code === current)) return current;
73
+ return loadedFieldsets[0]?.code ?? null;
74
+ });
75
+ setSingleFieldsetPerRecord(json.settings?.singleFieldsetPerRecord !== false);
76
+ setDefErrors({});
77
+ setIsDirty(false);
78
+ setOrderDirty(false);
79
+ } catch (err) {
80
+ const message = err instanceof Error ? err.message : t("entities.customFields.errors.loadFailed", "Failed to load field definitions");
81
+ setStatusError(message);
82
+ } finally {
83
+ setLoading(false);
84
+ }
85
+ }, [entityId, initialFieldset, t]);
86
+ React.useEffect(() => {
87
+ loadDefinitions().catch(() => {
88
+ });
89
+ }, [loadDefinitions]);
90
+ const buildFieldsetPayload = React.useCallback(() => {
91
+ const groupMap = /* @__PURE__ */ new Map();
92
+ defs.forEach((definition) => {
93
+ const code = typeof definition.configJson?.fieldset === "string" ? definition.configJson.fieldset : null;
94
+ if (!code) return;
95
+ const normalized = normalizeGroupPayload(definition.configJson?.group);
96
+ if (!normalized) return;
97
+ const list = groupMap.get(code) ?? [];
98
+ if (!list.some((entry) => entry.code === normalized.code)) {
99
+ list.push(normalized);
100
+ groupMap.set(code, list);
101
+ }
102
+ });
103
+ return fieldsets.map((fs) => ({
104
+ ...fs,
105
+ groups: groupMap.get(fs.code) ?? []
106
+ }));
107
+ }, [defs, fieldsets]);
108
+ const validateDef = React.useCallback(
109
+ (definition) => {
110
+ const parsed = upsertCustomFieldDefSchema.safeParse({
111
+ entityId,
112
+ key: definition.key,
113
+ kind: definition.kind,
114
+ configJson: definition.configJson,
115
+ isActive: definition.isActive
116
+ });
117
+ if (parsed.success) return {};
118
+ const errs = {};
119
+ for (const issue of parsed.error.issues) {
120
+ if (issue.path.includes("key")) errs.key = issue.message;
121
+ if (issue.path.includes("kind")) errs.kind = issue.message;
122
+ }
123
+ return errs;
124
+ },
125
+ [entityId]
126
+ );
127
+ const validateAll = React.useCallback(() => {
128
+ const nextErrors = {};
129
+ defs.forEach((definition, index) => {
130
+ nextErrors[index] = validateDef(definition);
131
+ });
132
+ setDefErrors(nextErrors);
133
+ return Object.values(nextErrors).every((entry) => !entry.key && !entry.kind);
134
+ }, [defs, validateDef]);
135
+ const handleDefinitionChange = React.useCallback((index, nextDef) => {
136
+ setDefs((arr) => arr.map((entry, idx) => idx === index ? nextDef : entry));
137
+ setDefErrors((prev) => ({ ...prev, [index]: validateDef(nextDef) }));
138
+ setIsDirty(true);
139
+ }, [validateDef]);
140
+ const handleAddField = React.useCallback(() => {
141
+ setDefs((arr) => [
142
+ ...arr,
143
+ {
144
+ key: "",
145
+ kind: "text",
146
+ configJson: activeFieldset ? { fieldset: activeFieldset } : {},
147
+ isActive: true
148
+ }
149
+ ]);
150
+ setIsDirty(true);
151
+ }, [activeFieldset]);
152
+ const handleRemoveField = React.useCallback(async (index) => {
153
+ const def = defs[index];
154
+ if (!def) return;
155
+ if (def.key) {
156
+ try {
157
+ const call = await apiCall("/api/entities/definitions", {
158
+ method: "DELETE",
159
+ headers: { "content-type": "application/json" },
160
+ body: JSON.stringify({ entityId, key: def.key })
161
+ });
162
+ if (!call.ok) {
163
+ await raiseCrudError(call.response, t("entities.customFields.errors.deleteFailed", "Failed to delete field"));
164
+ }
165
+ } catch (error) {
166
+ const message = error instanceof Error ? error.message : t("entities.customFields.errors.deleteFailed", "Failed to delete field");
167
+ flash(message, "error");
168
+ return;
169
+ }
170
+ }
171
+ setDefs((arr) => arr.filter((_, idx) => idx !== index));
172
+ setIsDirty(true);
173
+ }, [defs, entityId, t]);
174
+ const handleRestoreField = React.useCallback(async (key) => {
175
+ try {
176
+ const call = await apiCall("/api/entities/definitions.restore", {
177
+ method: "POST",
178
+ headers: { "content-type": "application/json" },
179
+ body: JSON.stringify({ entityId, key })
180
+ });
181
+ if (!call.ok) {
182
+ await raiseCrudError(call.response, t("entities.customFields.errors.restoreFailed", "Failed to restore field"));
183
+ }
184
+ flash(t("entities.customFields.flash.restored", "Field restored"), "success");
185
+ await loadDefinitions();
186
+ } catch (error) {
187
+ const message = error instanceof Error ? error.message : t("entities.customFields.errors.restoreFailed", "Failed to restore field");
188
+ flash(message, "error");
189
+ }
190
+ }, [entityId, loadDefinitions, t]);
191
+ const handleReorder = React.useCallback((from, to) => {
192
+ setDefs((arr) => {
193
+ const next = [...arr];
194
+ const [moved] = next.splice(from, 1);
195
+ next.splice(to, 0, moved);
196
+ return next;
197
+ });
198
+ setIsDirty(true);
199
+ setOrderDirty(true);
200
+ }, []);
201
+ const handleFieldsetsChange = React.useCallback((next) => {
202
+ setFieldsets(next);
203
+ if (!next.some((fs) => fs.code === activeFieldset)) {
204
+ setActiveFieldset(next[0]?.code ?? null);
205
+ }
206
+ setIsDirty(true);
207
+ }, [activeFieldset]);
208
+ const handleFieldsetCodeChange = React.useCallback((previousCode, nextCode) => {
209
+ if (!previousCode || !nextCode || previousCode === nextCode) return;
210
+ setDefs(
211
+ (arr) => arr.map((entry) => {
212
+ const current = typeof entry.configJson?.fieldset === "string" ? entry.configJson.fieldset : void 0;
213
+ if (current !== previousCode) return entry;
214
+ const nextConfig = { ...entry.configJson || {} };
215
+ nextConfig.fieldset = nextCode;
216
+ return { ...entry, configJson: nextConfig };
217
+ })
218
+ );
219
+ setActiveFieldset((current) => current === previousCode ? nextCode : current);
220
+ setIsDirty(true);
221
+ }, []);
222
+ const handleFieldsetRemoved = React.useCallback((code) => {
223
+ if (!code) return;
224
+ setDefs(
225
+ (arr) => arr.map((entry) => {
226
+ const current = typeof entry.configJson?.fieldset === "string" ? entry.configJson.fieldset : void 0;
227
+ if (current !== code) return entry;
228
+ const nextConfig = { ...entry.configJson || {} };
229
+ delete nextConfig.fieldset;
230
+ delete nextConfig.group;
231
+ return { ...entry, configJson: nextConfig };
232
+ })
233
+ );
234
+ setIsDirty(true);
235
+ }, []);
236
+ const submit = React.useCallback(async () => {
237
+ if (!entityId) return;
238
+ setSaving(true);
239
+ setStatusError(null);
240
+ try {
241
+ if (!validateAll()) {
242
+ flash(t("entities.customFields.errors.validation", "Please fix validation errors"), "error");
243
+ throw new Error(t("entities.customFields.errors.validation", "Validation failed"));
244
+ }
245
+ const payload = {
246
+ entityId,
247
+ definitions: defs.filter((d) => !!d.key).map((d) => ({
248
+ key: d.key,
249
+ kind: d.kind,
250
+ configJson: d.configJson,
251
+ isActive: d.isActive !== false
252
+ })),
253
+ fieldsets: buildFieldsetPayload(),
254
+ singleFieldsetPerRecord
255
+ };
256
+ const call = await apiCall("/api/entities/definitions.batch", {
257
+ method: "POST",
258
+ headers: { "content-type": "application/json" },
259
+ body: JSON.stringify(payload)
260
+ });
261
+ if (!call.ok) {
262
+ await raiseCrudError(call.response, t("entities.customFields.errors.saveFailed", "Failed to save definitions"));
263
+ }
264
+ await invalidateCustomFieldDefs(queryClient, entityId);
265
+ flash(t("entities.customFields.flash.saved", "Definitions saved"), "success");
266
+ setIsDirty(false);
267
+ setOrderDirty(false);
268
+ if (onSaved) await onSaved();
269
+ onClose();
270
+ } catch (err) {
271
+ const message = err instanceof Error ? err.message : t("entities.customFields.errors.saveFailed", "Failed to save definitions");
272
+ setStatusError(message);
273
+ } finally {
274
+ setSaving(false);
275
+ }
276
+ }, [buildFieldsetPayload, defs, entityId, onClose, onSaved, queryClient, singleFieldsetPerRecord, t, validateAll]);
277
+ React.useImperativeHandle(ref, () => ({ submit }), [submit]);
278
+ const cancelLabel = t("ui.forms.actions.cancel", "Cancel");
279
+ const saveLabel = saving ? t("ui.forms.status.saving", "Saving...") : t("ui.forms.actions.save", "Save");
280
+ const openFullLabel = t("entities.customFields.openInNewTab", "Open full editor");
281
+ const handleOpenFullEditor = React.useCallback(() => {
282
+ if (!fullEditorHref || typeof window === "undefined") return;
283
+ window.open(fullEditorHref, "_blank", "noopener,noreferrer");
284
+ }, [fullEditorHref]);
285
+ const content = loading ? /* @__PURE__ */ jsx("div", { className: "flex h-64 items-center justify-center", children: /* @__PURE__ */ jsx(Spinner, { size: "lg" }) }) : /* @__PURE__ */ jsx(
286
+ FieldDefinitionsEditor,
287
+ {
288
+ definitions: defs,
289
+ errors: defErrors,
290
+ deletedKeys,
291
+ fieldsets,
292
+ activeFieldset,
293
+ onActiveFieldsetChange: setActiveFieldset,
294
+ onFieldsetsChange: handleFieldsetsChange,
295
+ onFieldsetCodeChange: handleFieldsetCodeChange,
296
+ onFieldsetRemoved: handleFieldsetRemoved,
297
+ singleFieldsetPerRecord,
298
+ onSingleFieldsetPerRecordChange: (value) => {
299
+ setSingleFieldsetPerRecord(value);
300
+ setIsDirty(true);
301
+ },
302
+ onAddField: handleAddField,
303
+ onRemoveField: (index) => {
304
+ void handleRemoveField(index);
305
+ },
306
+ onDefinitionChange: handleDefinitionChange,
307
+ onRestoreField: (key) => {
308
+ void handleRestoreField(key);
309
+ },
310
+ onReorder: handleReorder,
311
+ orderNotice: orderDirty ? { dirty: true, message: t("entities.customFields.orderNotice", "Reordered \u2014 remember to save") } : void 0,
312
+ translate: t
313
+ }
314
+ );
315
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
316
+ statusError ? /* @__PURE__ */ jsx(ErrorNotice, { title: t("entities.customFields.errors.title", "Something went wrong"), message: statusError }) : null,
317
+ /* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-card p-4 max-h-[70vh] overflow-y-auto", children: content }),
318
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
319
+ fullEditorHref ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", onClick: handleOpenFullEditor, children: openFullLabel }) : null,
320
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: onClose, disabled: saving, children: cancelLabel }),
321
+ /* @__PURE__ */ jsx(Button, { type: "button", onClick: () => {
322
+ void submit();
323
+ }, disabled: saving || !isDirty, children: saveLabel })
324
+ ] })
325
+ ] });
326
+ }
327
+ );
328
+ FieldDefinitionsManager.displayName = "FieldDefinitionsManager";
329
+ export {
330
+ FieldDefinitionsManager
331
+ };
332
+ //# sourceMappingURL=FieldDefinitionsManager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/backend/custom-fields/FieldDefinitionsManager.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { Button } from '../../primitives/button'\nimport { Spinner } from '../../primitives/spinner'\nimport { ErrorNotice } from '../../primitives/ErrorNotice'\nimport { flash } from '../FlashMessages'\nimport { apiCall, readApiResultOrThrow } from '../utils/apiCall'\nimport { raiseCrudError } from '../utils/serverErrors'\nimport { invalidateCustomFieldDefs } from '../utils/customFieldDefs'\nimport { FieldDefinitionsEditor, type FieldDefinition, type FieldDefinitionError } from './FieldDefinitionsEditor'\nimport { upsertCustomFieldDefSchema } from '@open-mercato/shared/modules/entities/validators'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ntype FieldsetGroup = { code: string; title?: string; hint?: string }\ntype FieldsetDefinition = { code: string; label: string; icon?: string; description?: string; groups?: FieldsetGroup[] }\ntype DefinitionsManageResponse = {\n items?: any[]\n deletedKeys?: string[]\n fieldsets?: FieldsetDefinition[]\n settings?: { singleFieldsetPerRecord?: boolean }\n}\n\ntype FieldDefinitionsManagerProps = {\n entityId: string\n initialFieldset?: string | null\n onClose: () => void\n onSaved?: () => void | Promise<void>\n fullEditorHref?: string | null\n}\n\nexport type FieldDefinitionsManagerHandle = {\n submit: () => Promise<void>\n}\n\nfunction normalizeGroupPayload(value: unknown): FieldsetGroup | null {\n if (!value) return null\n if (typeof value === 'string') {\n const code = value.trim()\n return code ? { code } : null\n }\n if (typeof value !== 'object') return null\n const entry = value as Record<string, unknown>\n const code = typeof entry.code === 'string' ? entry.code.trim() : ''\n if (!code) return null\n const group: FieldsetGroup = { code }\n if (typeof entry.title === 'string' && entry.title.trim()) group.title = entry.title.trim()\n if (typeof entry.hint === 'string' && entry.hint.trim()) group.hint = entry.hint.trim()\n return group\n}\n\nexport const FieldDefinitionsManager = React.forwardRef<FieldDefinitionsManagerHandle, FieldDefinitionsManagerProps>(\n function FieldDefinitionsManager({ entityId, initialFieldset = null, onClose, onSaved, fullEditorHref }, ref) {\n const t = useT()\n const queryClient = useQueryClient()\n const [loading, setLoading] = React.useState(true)\n const [saving, setSaving] = React.useState(false)\n const [statusError, setStatusError] = React.useState<string | null>(null)\n const [defs, setDefs] = React.useState<FieldDefinition[]>([])\n const [deletedKeys, setDeletedKeys] = React.useState<string[]>([])\n const [defErrors, setDefErrors] = React.useState<Record<number, FieldDefinitionError>>({})\n const [fieldsets, setFieldsets] = React.useState<FieldsetDefinition[]>([])\n const [activeFieldset, setActiveFieldset] = React.useState<string | null>(initialFieldset)\n const [singleFieldsetPerRecord, setSingleFieldsetPerRecord] = React.useState(true)\n const [isDirty, setIsDirty] = React.useState(false)\n const [orderDirty, setOrderDirty] = React.useState(false)\n\n const loadDefinitions = React.useCallback(async () => {\n if (!entityId) return\n setLoading(true)\n setStatusError(null)\n try {\n const json = await readApiResultOrThrow<DefinitionsManageResponse>(\n `/api/entities/definitions.manage?entityId=${encodeURIComponent(entityId)}`,\n undefined,\n { errorMessage: t('entities.customFields.errors.loadFailed', 'Failed to load field definitions'), fallback: { items: [], deletedKeys: [] } },\n )\n const loaded: FieldDefinition[] = (json.items || []).map((d: any) => ({\n key: d.key,\n kind: d.kind,\n configJson: d.configJson || {},\n isActive: d.isActive !== false,\n }))\n loaded.sort(\n (a, b) => Number(a.configJson?.priority ?? 0) - Number(b.configJson?.priority ?? 0)\n )\n setDefs(loaded)\n setDeletedKeys(Array.isArray(json.deletedKeys) ? json.deletedKeys : [])\n const loadedFieldsets = Array.isArray(json.fieldsets) ? json.fieldsets : []\n setFieldsets(loadedFieldsets)\n setActiveFieldset((current) => {\n if (initialFieldset && loadedFieldsets.some((fs) => fs.code === initialFieldset)) {\n return initialFieldset\n }\n if (current && loadedFieldsets.some((fs) => fs.code === current)) return current\n return loadedFieldsets[0]?.code ?? null\n })\n setSingleFieldsetPerRecord(json.settings?.singleFieldsetPerRecord !== false)\n setDefErrors({})\n setIsDirty(false)\n setOrderDirty(false)\n } catch (err) {\n const message = err instanceof Error ? err.message : t('entities.customFields.errors.loadFailed', 'Failed to load field definitions')\n setStatusError(message)\n } finally {\n setLoading(false)\n }\n }, [entityId, initialFieldset, t])\n\n React.useEffect(() => {\n loadDefinitions().catch(() => {})\n }, [loadDefinitions])\n\n const buildFieldsetPayload = React.useCallback(() => {\n const groupMap = new Map<string, FieldsetGroup[]>()\n defs.forEach((definition) => {\n const code = typeof definition.configJson?.fieldset === 'string' ? definition.configJson.fieldset : null\n if (!code) return\n const normalized = normalizeGroupPayload(definition.configJson?.group)\n if (!normalized) return\n const list = groupMap.get(code) ?? []\n if (!list.some((entry) => entry.code === normalized.code)) {\n list.push(normalized)\n groupMap.set(code, list)\n }\n })\n return fieldsets.map((fs) => ({\n ...fs,\n groups: groupMap.get(fs.code) ?? [],\n }))\n }, [defs, fieldsets])\n\n const validateDef = React.useCallback(\n (definition: FieldDefinition): FieldDefinitionError => {\n const parsed = upsertCustomFieldDefSchema.safeParse({\n entityId,\n key: definition.key,\n kind: definition.kind,\n configJson: definition.configJson,\n isActive: definition.isActive,\n })\n if (parsed.success) return {}\n const errs: FieldDefinitionError = {}\n for (const issue of parsed.error.issues) {\n if (issue.path.includes('key')) errs.key = issue.message\n if (issue.path.includes('kind')) errs.kind = issue.message\n }\n return errs\n },\n [entityId],\n )\n\n const validateAll = React.useCallback(() => {\n const nextErrors: Record<number, FieldDefinitionError> = {}\n defs.forEach((definition, index) => {\n nextErrors[index] = validateDef(definition)\n })\n setDefErrors(nextErrors)\n return Object.values(nextErrors).every((entry) => !entry.key && !entry.kind)\n }, [defs, validateDef])\n\n const handleDefinitionChange = React.useCallback((index: number, nextDef: FieldDefinition) => {\n setDefs((arr) => arr.map((entry, idx) => (idx === index ? nextDef : entry)))\n setDefErrors((prev) => ({ ...prev, [index]: validateDef(nextDef) }))\n setIsDirty(true)\n }, [validateDef])\n\n const handleAddField = React.useCallback(() => {\n setDefs((arr) => [\n ...arr,\n {\n key: '',\n kind: 'text',\n configJson: activeFieldset ? { fieldset: activeFieldset } : {},\n isActive: true,\n },\n ])\n setIsDirty(true)\n }, [activeFieldset])\n\n const handleRemoveField = React.useCallback(async (index: number) => {\n const def = defs[index]\n if (!def) return\n if (def.key) {\n try {\n const call = await apiCall('/api/entities/definitions', {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ entityId, key: def.key }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('entities.customFields.errors.deleteFailed', 'Failed to delete field'))\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : t('entities.customFields.errors.deleteFailed', 'Failed to delete field')\n flash(message, 'error')\n return\n }\n }\n setDefs((arr) => arr.filter((_, idx) => idx !== index))\n setIsDirty(true)\n }, [defs, entityId, t])\n\n const handleRestoreField = React.useCallback(async (key: string) => {\n try {\n const call = await apiCall('/api/entities/definitions.restore', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ entityId, key }),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('entities.customFields.errors.restoreFailed', 'Failed to restore field'))\n }\n flash(t('entities.customFields.flash.restored', 'Field restored'), 'success')\n await loadDefinitions()\n } catch (error) {\n const message = error instanceof Error ? error.message : t('entities.customFields.errors.restoreFailed', 'Failed to restore field')\n flash(message, 'error')\n }\n }, [entityId, loadDefinitions, t])\n\n const handleReorder = React.useCallback((from: number, to: number) => {\n setDefs((arr) => {\n const next = [...arr]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved)\n return next\n })\n setIsDirty(true)\n setOrderDirty(true)\n }, [])\n\n const handleFieldsetsChange = React.useCallback((next: FieldsetDefinition[]) => {\n setFieldsets(next)\n if (!next.some((fs) => fs.code === activeFieldset)) {\n setActiveFieldset(next[0]?.code ?? null)\n }\n setIsDirty(true)\n }, [activeFieldset])\n\n const handleFieldsetCodeChange = React.useCallback((previousCode: string, nextCode: string) => {\n if (!previousCode || !nextCode || previousCode === nextCode) return\n setDefs((arr) =>\n arr.map((entry) => {\n const current = typeof entry.configJson?.fieldset === 'string' ? entry.configJson.fieldset : undefined\n if (current !== previousCode) return entry\n const nextConfig = { ...(entry.configJson || {}) }\n nextConfig.fieldset = nextCode\n return { ...entry, configJson: nextConfig }\n }),\n )\n setActiveFieldset((current) => (current === previousCode ? nextCode : current))\n setIsDirty(true)\n }, [])\n\n const handleFieldsetRemoved = React.useCallback((code: string) => {\n if (!code) return\n setDefs((arr) =>\n arr.map((entry) => {\n const current = typeof entry.configJson?.fieldset === 'string' ? entry.configJson.fieldset : undefined\n if (current !== code) return entry\n const nextConfig = { ...(entry.configJson || {}) }\n delete nextConfig.fieldset\n delete nextConfig.group\n return { ...entry, configJson: nextConfig }\n }),\n )\n setIsDirty(true)\n }, [])\n\n const submit = React.useCallback(async () => {\n if (!entityId) return\n setSaving(true)\n setStatusError(null)\n try {\n if (!validateAll()) {\n flash(t('entities.customFields.errors.validation', 'Please fix validation errors'), 'error')\n throw new Error(t('entities.customFields.errors.validation', 'Validation failed'))\n }\n const payload = {\n entityId,\n definitions: defs.filter((d) => !!d.key).map((d) => ({\n key: d.key,\n kind: d.kind,\n configJson: d.configJson,\n isActive: d.isActive !== false,\n })),\n fieldsets: buildFieldsetPayload(),\n singleFieldsetPerRecord,\n }\n const call = await apiCall('/api/entities/definitions.batch', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!call.ok) {\n await raiseCrudError(call.response, t('entities.customFields.errors.saveFailed', 'Failed to save definitions'))\n }\n await invalidateCustomFieldDefs(queryClient, entityId)\n flash(t('entities.customFields.flash.saved', 'Definitions saved'), 'success')\n setIsDirty(false)\n setOrderDirty(false)\n if (onSaved) await onSaved()\n onClose()\n } catch (err) {\n const message = err instanceof Error ? err.message : t('entities.customFields.errors.saveFailed', 'Failed to save definitions')\n setStatusError(message)\n } finally {\n setSaving(false)\n }\n }, [buildFieldsetPayload, defs, entityId, onClose, onSaved, queryClient, singleFieldsetPerRecord, t, validateAll])\n\n React.useImperativeHandle(ref, () => ({ submit }), [submit])\n\n const cancelLabel = t('ui.forms.actions.cancel', 'Cancel')\n const saveLabel = saving ? t('ui.forms.status.saving', 'Saving...') : t('ui.forms.actions.save', 'Save')\n const openFullLabel = t('entities.customFields.openInNewTab', 'Open full editor')\n\n const handleOpenFullEditor = React.useCallback(() => {\n if (!fullEditorHref || typeof window === 'undefined') return\n window.open(fullEditorHref, '_blank', 'noopener,noreferrer')\n }, [fullEditorHref])\n\n const content = loading ? (\n <div className=\"flex h-64 items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : (\n <FieldDefinitionsEditor\n definitions={defs}\n errors={defErrors}\n deletedKeys={deletedKeys}\n fieldsets={fieldsets}\n activeFieldset={activeFieldset}\n onActiveFieldsetChange={setActiveFieldset}\n onFieldsetsChange={handleFieldsetsChange}\n onFieldsetCodeChange={handleFieldsetCodeChange}\n onFieldsetRemoved={handleFieldsetRemoved}\n singleFieldsetPerRecord={singleFieldsetPerRecord}\n onSingleFieldsetPerRecordChange={(value) => {\n setSingleFieldsetPerRecord(value)\n setIsDirty(true)\n }}\n onAddField={handleAddField}\n onRemoveField={(index) => { void handleRemoveField(index) }}\n onDefinitionChange={handleDefinitionChange}\n onRestoreField={(key) => { void handleRestoreField(key) }}\n onReorder={handleReorder}\n orderNotice={orderDirty ? { dirty: true, message: t('entities.customFields.orderNotice', 'Reordered \u2014 remember to save') } : undefined}\n translate={t}\n />\n )\n\n return (\n <div className=\"flex flex-col gap-4\">\n {statusError ? (\n <ErrorNotice title={t('entities.customFields.errors.title', 'Something went wrong')} message={statusError} />\n ) : null}\n <div className=\"rounded-lg border bg-card p-4 max-h-[70vh] overflow-y-auto\">\n {content}\n </div>\n <div className=\"flex justify-end gap-2\">\n {fullEditorHref ? (\n <Button type=\"button\" variant=\"ghost\" onClick={handleOpenFullEditor}>\n {openFullLabel}\n </Button>\n ) : null}\n <Button type=\"button\" variant=\"outline\" onClick={onClose} disabled={saving}>\n {cancelLabel}\n </Button>\n <Button type=\"button\" onClick={() => { void submit() }} disabled={saving || !isDirty}>\n {saveLabel}\n </Button>\n </div>\n </div>\n )\n },\n)\n\nFieldDefinitionsManager.displayName = 'FieldDefinitionsManager'\n"],
5
+ "mappings": "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",
6
+ "names": ["code", "FieldDefinitionsManager"]
7
+ }