@freighttech/ui 0.13.18

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 (1477) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/dist/backend/AppShell.js +1289 -0
  4. package/dist/backend/AppShell.js.map +7 -0
  5. package/dist/backend/BackendChromeProvider.js +83 -0
  6. package/dist/backend/BackendChromeProvider.js.map +7 -0
  7. package/dist/backend/BackendPageSurface.js +19 -0
  8. package/dist/backend/BackendPageSurface.js.map +7 -0
  9. package/dist/backend/CollapsibleNavSection.js +149 -0
  10. package/dist/backend/CollapsibleNavSection.js.map +7 -0
  11. package/dist/backend/ContextHelp.js +33 -0
  12. package/dist/backend/ContextHelp.js.map +7 -0
  13. package/dist/backend/CrudForm.js +3163 -0
  14. package/dist/backend/CrudForm.js.map +7 -0
  15. package/dist/backend/DataTable.js +2091 -0
  16. package/dist/backend/DataTable.js.map +7 -0
  17. package/dist/backend/EmptyState.js +52 -0
  18. package/dist/backend/EmptyState.js.map +7 -0
  19. package/dist/backend/FilterBar.js +147 -0
  20. package/dist/backend/FilterBar.js.map +7 -0
  21. package/dist/backend/FilterOverlay.js +337 -0
  22. package/dist/backend/FilterOverlay.js.map +7 -0
  23. package/dist/backend/FlashMessages.js +158 -0
  24. package/dist/backend/FlashMessages.js.map +7 -0
  25. package/dist/backend/HtmlRichTextEditor.js +129 -0
  26. package/dist/backend/HtmlRichTextEditor.js.map +7 -0
  27. package/dist/backend/IntegrationsButton.js +25 -0
  28. package/dist/backend/IntegrationsButton.js.map +7 -0
  29. package/dist/backend/JsonBuilder.js +323 -0
  30. package/dist/backend/JsonBuilder.js.map +7 -0
  31. package/dist/backend/JsonDisplay.js +207 -0
  32. package/dist/backend/JsonDisplay.js.map +7 -0
  33. package/dist/backend/NextStepCallout.js +79 -0
  34. package/dist/backend/NextStepCallout.js.map +7 -0
  35. package/dist/backend/Page.js +27 -0
  36. package/dist/backend/Page.js.map +7 -0
  37. package/dist/backend/PerspectiveSidebar.js +456 -0
  38. package/dist/backend/PerspectiveSidebar.js.map +7 -0
  39. package/dist/backend/ProfileDropdown.js +341 -0
  40. package/dist/backend/ProfileDropdown.js.map +7 -0
  41. package/dist/backend/RowActions.js +155 -0
  42. package/dist/backend/RowActions.js.map +7 -0
  43. package/dist/backend/SectionHeader.js +74 -0
  44. package/dist/backend/SectionHeader.js.map +7 -0
  45. package/dist/backend/SettingsButton.js +25 -0
  46. package/dist/backend/SettingsButton.js.map +7 -0
  47. package/dist/backend/Sidebar.js +510 -0
  48. package/dist/backend/Sidebar.js.map +7 -0
  49. package/dist/backend/Sidebar.stories.js +166 -0
  50. package/dist/backend/Sidebar.stories.js.map +7 -0
  51. package/dist/backend/TruncatedCell.js +92 -0
  52. package/dist/backend/TruncatedCell.js.map +7 -0
  53. package/dist/backend/UserMenu.js +146 -0
  54. package/dist/backend/UserMenu.js.map +7 -0
  55. package/dist/backend/ValueIcons.js +34 -0
  56. package/dist/backend/ValueIcons.js.map +7 -0
  57. package/dist/backend/WebhookSetupGuide.js +79 -0
  58. package/dist/backend/WebhookSetupGuide.js.map +7 -0
  59. package/dist/backend/charts/BarChart.js +154 -0
  60. package/dist/backend/charts/BarChart.js.map +7 -0
  61. package/dist/backend/charts/ChartUtils.js +141 -0
  62. package/dist/backend/charts/ChartUtils.js.map +7 -0
  63. package/dist/backend/charts/ComboChart.js +261 -0
  64. package/dist/backend/charts/ComboChart.js.map +7 -0
  65. package/dist/backend/charts/ComboChart.stories.js +88 -0
  66. package/dist/backend/charts/ComboChart.stories.js.map +7 -0
  67. package/dist/backend/charts/KpiCard.js +96 -0
  68. package/dist/backend/charts/KpiCard.js.map +7 -0
  69. package/dist/backend/charts/LineChart.js +165 -0
  70. package/dist/backend/charts/LineChart.js.map +7 -0
  71. package/dist/backend/charts/PieChart.js +121 -0
  72. package/dist/backend/charts/PieChart.js.map +7 -0
  73. package/dist/backend/charts/ScatterChart.js +320 -0
  74. package/dist/backend/charts/ScatterChart.js.map +7 -0
  75. package/dist/backend/charts/TopNTable.js +91 -0
  76. package/dist/backend/charts/TopNTable.js.map +7 -0
  77. package/dist/backend/charts/WaterfallChart.js +136 -0
  78. package/dist/backend/charts/WaterfallChart.js.map +7 -0
  79. package/dist/backend/charts/index.js +30 -0
  80. package/dist/backend/charts/index.js.map +7 -0
  81. package/dist/backend/columns/ColumnChooserPanel.js +244 -0
  82. package/dist/backend/columns/ColumnChooserPanel.js.map +7 -0
  83. package/dist/backend/confirm-dialog/ConfirmDialog.js +214 -0
  84. package/dist/backend/confirm-dialog/ConfirmDialog.js.map +7 -0
  85. package/dist/backend/confirm-dialog/index.js +7 -0
  86. package/dist/backend/confirm-dialog/index.js.map +7 -0
  87. package/dist/backend/confirm-dialog/useConfirmDialog.js +113 -0
  88. package/dist/backend/confirm-dialog/useConfirmDialog.js.map +7 -0
  89. package/dist/backend/custom-fields/FieldDefinitionsEditor.js +1352 -0
  90. package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +7 -0
  91. package/dist/backend/custom-fields/FieldDefinitionsManager.js +332 -0
  92. package/dist/backend/custom-fields/FieldDefinitionsManager.js.map +7 -0
  93. package/dist/backend/dashboard/DashboardScreen.js +598 -0
  94. package/dist/backend/dashboard/DashboardScreen.js.map +7 -0
  95. package/dist/backend/dashboard/index.js +5 -0
  96. package/dist/backend/dashboard/index.js.map +7 -0
  97. package/dist/backend/dashboard/widgetRegistry.js +55 -0
  98. package/dist/backend/dashboard/widgetRegistry.js.map +7 -0
  99. package/dist/backend/date-range/DateRangeSelect.js +39 -0
  100. package/dist/backend/date-range/DateRangeSelect.js.map +7 -0
  101. package/dist/backend/date-range/InlineDateRangeSelect.js +42 -0
  102. package/dist/backend/date-range/InlineDateRangeSelect.js.map +7 -0
  103. package/dist/backend/date-range/InlineGranularitySelect.js +40 -0
  104. package/dist/backend/date-range/InlineGranularitySelect.js.map +7 -0
  105. package/dist/backend/date-range/dateRanges.js +176 -0
  106. package/dist/backend/date-range/dateRanges.js.map +7 -0
  107. package/dist/backend/date-range/index.js +25 -0
  108. package/dist/backend/date-range/index.js.map +7 -0
  109. package/dist/backend/detail/AccessDeniedMessage.js +28 -0
  110. package/dist/backend/detail/AccessDeniedMessage.js.map +7 -0
  111. package/dist/backend/detail/ActivitiesSection.js +947 -0
  112. package/dist/backend/detail/ActivitiesSection.js.map +7 -0
  113. package/dist/backend/detail/AddressEditor.js +417 -0
  114. package/dist/backend/detail/AddressEditor.js.map +7 -0
  115. package/dist/backend/detail/AddressTiles.js +441 -0
  116. package/dist/backend/detail/AddressTiles.js.map +7 -0
  117. package/dist/backend/detail/AddressesSection.js +274 -0
  118. package/dist/backend/detail/AddressesSection.js.map +7 -0
  119. package/dist/backend/detail/AttachmentDeleteDialog.js +41 -0
  120. package/dist/backend/detail/AttachmentDeleteDialog.js.map +7 -0
  121. package/dist/backend/detail/AttachmentMetadataDialog.js +519 -0
  122. package/dist/backend/detail/AttachmentMetadataDialog.js.map +7 -0
  123. package/dist/backend/detail/AttachmentVisualPreview.js +132 -0
  124. package/dist/backend/detail/AttachmentVisualPreview.js.map +7 -0
  125. package/dist/backend/detail/AttachmentsSection.js +281 -0
  126. package/dist/backend/detail/AttachmentsSection.js.map +7 -0
  127. package/dist/backend/detail/CustomDataSection.js +575 -0
  128. package/dist/backend/detail/CustomDataSection.js.map +7 -0
  129. package/dist/backend/detail/DetailFieldsSection.js +85 -0
  130. package/dist/backend/detail/DetailFieldsSection.js.map +7 -0
  131. package/dist/backend/detail/ErrorMessage.js +28 -0
  132. package/dist/backend/detail/ErrorMessage.js.map +7 -0
  133. package/dist/backend/detail/InlineEditors.js +697 -0
  134. package/dist/backend/detail/InlineEditors.js.map +7 -0
  135. package/dist/backend/detail/LoadingMessage.js +14 -0
  136. package/dist/backend/detail/LoadingMessage.js.map +7 -0
  137. package/dist/backend/detail/NotesSection.js +1022 -0
  138. package/dist/backend/detail/NotesSection.js.map +7 -0
  139. package/dist/backend/detail/TabEmptyState.js +25 -0
  140. package/dist/backend/detail/TabEmptyState.js.map +7 -0
  141. package/dist/backend/detail/TagsSection.js +375 -0
  142. package/dist/backend/detail/TagsSection.js.map +7 -0
  143. package/dist/backend/detail/addressFormat.js +77 -0
  144. package/dist/backend/detail/addressFormat.js.map +7 -0
  145. package/dist/backend/detail/index.js +36 -0
  146. package/dist/backend/detail/index.js.map +7 -0
  147. package/dist/backend/devtools/UmesDevToolsPanel.js +109 -0
  148. package/dist/backend/devtools/UmesDevToolsPanel.js.map +7 -0
  149. package/dist/backend/devtools/components/ConflictWarnings.js +32 -0
  150. package/dist/backend/devtools/components/ConflictWarnings.js.map +7 -0
  151. package/dist/backend/devtools/components/EnricherTiming.js +46 -0
  152. package/dist/backend/devtools/components/EnricherTiming.js.map +7 -0
  153. package/dist/backend/devtools/components/EventFlow.js +34 -0
  154. package/dist/backend/devtools/components/EventFlow.js.map +7 -0
  155. package/dist/backend/devtools/components/ExtensionPointList.js +58 -0
  156. package/dist/backend/devtools/components/ExtensionPointList.js.map +7 -0
  157. package/dist/backend/devtools/components/InterceptorActivity.js +36 -0
  158. package/dist/backend/devtools/components/InterceptorActivity.js.map +7 -0
  159. package/dist/backend/devtools/index.js +7 -0
  160. package/dist/backend/devtools/index.js.map +7 -0
  161. package/dist/backend/devtools/useUmesDevTools.js +125 -0
  162. package/dist/backend/devtools/useUmesDevTools.js.map +7 -0
  163. package/dist/backend/document-viewer/RegionOverlay.js +92 -0
  164. package/dist/backend/document-viewer/RegionOverlay.js.map +7 -0
  165. package/dist/backend/document-viewer/index.js +6 -0
  166. package/dist/backend/document-viewer/index.js.map +7 -0
  167. package/dist/backend/dynamic-grid/DynamicGrid.js +130 -0
  168. package/dist/backend/dynamic-grid/DynamicGrid.js.map +7 -0
  169. package/dist/backend/dynamic-grid/adapters.js +34 -0
  170. package/dist/backend/dynamic-grid/adapters.js.map +7 -0
  171. package/dist/backend/dynamic-grid/components/GridCell.js +149 -0
  172. package/dist/backend/dynamic-grid/components/GridCell.js.map +7 -0
  173. package/dist/backend/dynamic-grid/components/GridRow.js +32 -0
  174. package/dist/backend/dynamic-grid/components/GridRow.js.map +7 -0
  175. package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js +115 -0
  176. package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js.map +7 -0
  177. package/dist/backend/dynamic-grid/index.js +9 -0
  178. package/dist/backend/dynamic-grid/index.js.map +7 -0
  179. package/dist/backend/dynamic-grid/types.js +1 -0
  180. package/dist/backend/dynamic-grid/types.js.map +7 -0
  181. package/dist/backend/dynamic-table/DynamicTable.js +2607 -0
  182. package/dist/backend/dynamic-table/DynamicTable.js.map +7 -0
  183. package/dist/backend/dynamic-table/DynamicTable.stories.js +233 -0
  184. package/dist/backend/dynamic-table/DynamicTable.stories.js.map +7 -0
  185. package/dist/backend/dynamic-table/components/ActiveFilterChips.js +60 -0
  186. package/dist/backend/dynamic-table/components/ActiveFilterChips.js.map +7 -0
  187. package/dist/backend/dynamic-table/components/BulkActionsBar.js +58 -0
  188. package/dist/backend/dynamic-table/components/BulkActionsBar.js.map +7 -0
  189. package/dist/backend/dynamic-table/components/Cell.js +155 -0
  190. package/dist/backend/dynamic-table/components/Cell.js.map +7 -0
  191. package/dist/backend/dynamic-table/components/CellCommentDialog.js +726 -0
  192. package/dist/backend/dynamic-table/components/CellCommentDialog.js.map +7 -0
  193. package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js +77 -0
  194. package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js.map +7 -0
  195. package/dist/backend/dynamic-table/components/ColumnFilterPopover.js +485 -0
  196. package/dist/backend/dynamic-table/components/ColumnFilterPopover.js.map +7 -0
  197. package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js +173 -0
  198. package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js.map +7 -0
  199. package/dist/backend/dynamic-table/components/ColumnHeaders.js +528 -0
  200. package/dist/backend/dynamic-table/components/ColumnHeaders.js.map +7 -0
  201. package/dist/backend/dynamic-table/components/CompactLabelCell.js +64 -0
  202. package/dist/backend/dynamic-table/components/CompactLabelCell.js.map +7 -0
  203. package/dist/backend/dynamic-table/components/ConfigureViewFields.js +139 -0
  204. package/dist/backend/dynamic-table/components/ConfigureViewFields.js.map +7 -0
  205. package/dist/backend/dynamic-table/components/ConfigureViewFilters.js +305 -0
  206. package/dist/backend/dynamic-table/components/ConfigureViewFilters.js.map +7 -0
  207. package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js +169 -0
  208. package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js.map +7 -0
  209. package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js +298 -0
  210. package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js.map +7 -0
  211. package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js +224 -0
  212. package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js.map +7 -0
  213. package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js +167 -0
  214. package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js.map +7 -0
  215. package/dist/backend/dynamic-table/components/ConfigureViewPanel.js +592 -0
  216. package/dist/backend/dynamic-table/components/ConfigureViewPanel.js.map +7 -0
  217. package/dist/backend/dynamic-table/components/ConfigureViewRollups.js +269 -0
  218. package/dist/backend/dynamic-table/components/ConfigureViewRollups.js.map +7 -0
  219. package/dist/backend/dynamic-table/components/ConfigureViewSorting.js +107 -0
  220. package/dist/backend/dynamic-table/components/ConfigureViewSorting.js.map +7 -0
  221. package/dist/backend/dynamic-table/components/ContextMenu.js +91 -0
  222. package/dist/backend/dynamic-table/components/ContextMenu.js.map +7 -0
  223. package/dist/backend/dynamic-table/components/DateCell.js +80 -0
  224. package/dist/backend/dynamic-table/components/DateCell.js.map +7 -0
  225. package/dist/backend/dynamic-table/components/Debugger.js +311 -0
  226. package/dist/backend/dynamic-table/components/Debugger.js.map +7 -0
  227. package/dist/backend/dynamic-table/components/DensityControl.js +289 -0
  228. package/dist/backend/dynamic-table/components/DensityControl.js.map +7 -0
  229. package/dist/backend/dynamic-table/components/EmptyState.js +42 -0
  230. package/dist/backend/dynamic-table/components/EmptyState.js.map +7 -0
  231. package/dist/backend/dynamic-table/components/EntitySearchEditor.js +369 -0
  232. package/dist/backend/dynamic-table/components/EntitySearchEditor.js.map +7 -0
  233. package/dist/backend/dynamic-table/components/ExportMenu.js +63 -0
  234. package/dist/backend/dynamic-table/components/ExportMenu.js.map +7 -0
  235. package/dist/backend/dynamic-table/components/FilterDatePicker.js +165 -0
  236. package/dist/backend/dynamic-table/components/FilterDatePicker.js.map +7 -0
  237. package/dist/backend/dynamic-table/components/FilterValueInput.js +200 -0
  238. package/dist/backend/dynamic-table/components/FilterValueInput.js.map +7 -0
  239. package/dist/backend/dynamic-table/components/FooterTotalsRow.js +165 -0
  240. package/dist/backend/dynamic-table/components/FooterTotalsRow.js.map +7 -0
  241. package/dist/backend/dynamic-table/components/FullscreenOverlay.js +51 -0
  242. package/dist/backend/dynamic-table/components/FullscreenOverlay.js.map +7 -0
  243. package/dist/backend/dynamic-table/components/GroupHeaderRow.js +108 -0
  244. package/dist/backend/dynamic-table/components/GroupHeaderRow.js.map +7 -0
  245. package/dist/backend/dynamic-table/components/GroupSummaryRow.js +134 -0
  246. package/dist/backend/dynamic-table/components/GroupSummaryRow.js.map +7 -0
  247. package/dist/backend/dynamic-table/components/ImportPanel.js +341 -0
  248. package/dist/backend/dynamic-table/components/ImportPanel.js.map +7 -0
  249. package/dist/backend/dynamic-table/components/ImportPreviewGrid.js +114 -0
  250. package/dist/backend/dynamic-table/components/ImportPreviewGrid.js.map +7 -0
  251. package/dist/backend/dynamic-table/components/LoadErrorState.js +23 -0
  252. package/dist/backend/dynamic-table/components/LoadErrorState.js.map +7 -0
  253. package/dist/backend/dynamic-table/components/MentionPopup.js +149 -0
  254. package/dist/backend/dynamic-table/components/MentionPopup.js.map +7 -0
  255. package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js +57 -0
  256. package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js.map +7 -0
  257. package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js +100 -0
  258. package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js.map +7 -0
  259. package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js +159 -0
  260. package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js.map +7 -0
  261. package/dist/backend/dynamic-table/components/PerspectiveTabs.js +319 -0
  262. package/dist/backend/dynamic-table/components/PerspectiveTabs.js.map +7 -0
  263. package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js +90 -0
  264. package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js.map +7 -0
  265. package/dist/backend/dynamic-table/components/RowHeaderCell.js +58 -0
  266. package/dist/backend/dynamic-table/components/RowHeaderCell.js.map +7 -0
  267. package/dist/backend/dynamic-table/components/SearchBar.js +221 -0
  268. package/dist/backend/dynamic-table/components/SearchBar.js.map +7 -0
  269. package/dist/backend/dynamic-table/components/SelectMenu.js +186 -0
  270. package/dist/backend/dynamic-table/components/SelectMenu.js.map +7 -0
  271. package/dist/backend/dynamic-table/components/StaleDataBar.js +26 -0
  272. package/dist/backend/dynamic-table/components/StaleDataBar.js.map +7 -0
  273. package/dist/backend/dynamic-table/components/TableDeleteDialog.js +48 -0
  274. package/dist/backend/dynamic-table/components/TableDeleteDialog.js.map +7 -0
  275. package/dist/backend/dynamic-table/components/TablePagination.js +69 -0
  276. package/dist/backend/dynamic-table/components/TablePagination.js.map +7 -0
  277. package/dist/backend/dynamic-table/components/TableSkeleton.js +43 -0
  278. package/dist/backend/dynamic-table/components/TableSkeleton.js.map +7 -0
  279. package/dist/backend/dynamic-table/components/ToolbarOverflow.js +204 -0
  280. package/dist/backend/dynamic-table/components/ToolbarOverflow.js.map +7 -0
  281. package/dist/backend/dynamic-table/components/ViewModeSwitch.js +50 -0
  282. package/dist/backend/dynamic-table/components/ViewModeSwitch.js.map +7 -0
  283. package/dist/backend/dynamic-table/components/VirtualRow.js +214 -0
  284. package/dist/backend/dynamic-table/components/VirtualRow.js.map +7 -0
  285. package/dist/backend/dynamic-table/components/editors.js +1483 -0
  286. package/dist/backend/dynamic-table/components/editors.js.map +7 -0
  287. package/dist/backend/dynamic-table/components/renderers.js +131 -0
  288. package/dist/backend/dynamic-table/components/renderers.js.map +7 -0
  289. package/dist/backend/dynamic-table/events/events.js +73 -0
  290. package/dist/backend/dynamic-table/events/events.js.map +7 -0
  291. package/dist/backend/dynamic-table/formula/check.js +243 -0
  292. package/dist/backend/dynamic-table/formula/check.js.map +7 -0
  293. package/dist/backend/dynamic-table/formula/evaluate.js +302 -0
  294. package/dist/backend/dynamic-table/formula/evaluate.js.map +7 -0
  295. package/dist/backend/dynamic-table/formula/functions.js +602 -0
  296. package/dist/backend/dynamic-table/formula/functions.js.map +7 -0
  297. package/dist/backend/dynamic-table/formula/index.js +47 -0
  298. package/dist/backend/dynamic-table/formula/index.js.map +7 -0
  299. package/dist/backend/dynamic-table/formula/parse.js +293 -0
  300. package/dist/backend/dynamic-table/formula/parse.js.map +7 -0
  301. package/dist/backend/dynamic-table/formula/types.js +24 -0
  302. package/dist/backend/dynamic-table/formula/types.js.map +7 -0
  303. package/dist/backend/dynamic-table/handlers/cellWrites.js +143 -0
  304. package/dist/backend/dynamic-table/handlers/cellWrites.js.map +7 -0
  305. package/dist/backend/dynamic-table/handlers/index.js +504 -0
  306. package/dist/backend/dynamic-table/handlers/index.js.map +7 -0
  307. package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js +377 -0
  308. package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js.map +7 -0
  309. package/dist/backend/dynamic-table/hooks/index.js +524 -0
  310. package/dist/backend/dynamic-table/hooks/index.js.map +7 -0
  311. package/dist/backend/dynamic-table/hooks/useAbbreviations.js +19 -0
  312. package/dist/backend/dynamic-table/hooks/useAbbreviations.js.map +7 -0
  313. package/dist/backend/dynamic-table/hooks/useAnnotations.js +115 -0
  314. package/dist/backend/dynamic-table/hooks/useAnnotations.js.map +7 -0
  315. package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js +155 -0
  316. package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js.map +7 -0
  317. package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js +135 -0
  318. package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js.map +7 -0
  319. package/dist/backend/dynamic-table/hooks/useDensityPreference.js +203 -0
  320. package/dist/backend/dynamic-table/hooks/useDensityPreference.js.map +7 -0
  321. package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js +1005 -0
  322. package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js.map +7 -0
  323. package/dist/backend/dynamic-table/hooks/useEscapeLayer.js +32 -0
  324. package/dist/backend/dynamic-table/hooks/useEscapeLayer.js.map +7 -0
  325. package/dist/backend/dynamic-table/hooks/useGrouping.js +256 -0
  326. package/dist/backend/dynamic-table/hooks/useGrouping.js.map +7 -0
  327. package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js +63 -0
  328. package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js.map +7 -0
  329. package/dist/backend/dynamic-table/hooks/useTableDateFormat.js +11 -0
  330. package/dist/backend/dynamic-table/hooks/useTableDateFormat.js.map +7 -0
  331. package/dist/backend/dynamic-table/index.js +476 -0
  332. package/dist/backend/dynamic-table/index.js.map +7 -0
  333. package/dist/backend/dynamic-table/registry/ContentRegistryContext.js +126 -0
  334. package/dist/backend/dynamic-table/registry/ContentRegistryContext.js.map +7 -0
  335. package/dist/backend/dynamic-table/registry/TableRegistryContext.js +43 -0
  336. package/dist/backend/dynamic-table/registry/TableRegistryContext.js.map +7 -0
  337. package/dist/backend/dynamic-table/registry/filterAccessibleTables.js +13 -0
  338. package/dist/backend/dynamic-table/registry/filterAccessibleTables.js.map +7 -0
  339. package/dist/backend/dynamic-table/registry/index.js +44 -0
  340. package/dist/backend/dynamic-table/registry/index.js.map +7 -0
  341. package/dist/backend/dynamic-table/registry/lazyTable.js +55 -0
  342. package/dist/backend/dynamic-table/registry/lazyTable.js.map +7 -0
  343. package/dist/backend/dynamic-table/registry/types.js +1 -0
  344. package/dist/backend/dynamic-table/registry/types.js.map +7 -0
  345. package/dist/backend/dynamic-table/registry/widgetCatalog.js +96 -0
  346. package/dist/backend/dynamic-table/registry/widgetCatalog.js.map +7 -0
  347. package/dist/backend/dynamic-table/server/aggregate.js +261 -0
  348. package/dist/backend/dynamic-table/server/aggregate.js.map +7 -0
  349. package/dist/backend/dynamic-table/server/dateWindows.js +105 -0
  350. package/dist/backend/dynamic-table/server/dateWindows.js.map +7 -0
  351. package/dist/backend/dynamic-table/server/filterParser.js +97 -0
  352. package/dist/backend/dynamic-table/server/filterParser.js.map +7 -0
  353. package/dist/backend/dynamic-table/server/filterSuggestions.js +70 -0
  354. package/dist/backend/dynamic-table/server/filterSuggestions.js.map +7 -0
  355. package/dist/backend/dynamic-table/server/index.js +47 -0
  356. package/dist/backend/dynamic-table/server/index.js.map +7 -0
  357. package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js +270 -0
  358. package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js.map +7 -0
  359. package/dist/backend/dynamic-table/split-view/ContentPicker.js +171 -0
  360. package/dist/backend/dynamic-table/split-view/ContentPicker.js.map +7 -0
  361. package/dist/backend/dynamic-table/split-view/EmptySlot.js +47 -0
  362. package/dist/backend/dynamic-table/split-view/EmptySlot.js.map +7 -0
  363. package/dist/backend/dynamic-table/split-view/SplitViewHost.js +863 -0
  364. package/dist/backend/dynamic-table/split-view/SplitViewHost.js.map +7 -0
  365. package/dist/backend/dynamic-table/split-view/WidgetPane.js +280 -0
  366. package/dist/backend/dynamic-table/split-view/WidgetPane.js.map +7 -0
  367. package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js +524 -0
  368. package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js.map +7 -0
  369. package/dist/backend/dynamic-table/split-view/index.js +61 -0
  370. package/dist/backend/dynamic-table/split-view/index.js.map +7 -0
  371. package/dist/backend/dynamic-table/split-view/layoutPersistence.js +91 -0
  372. package/dist/backend/dynamic-table/split-view/layoutPersistence.js.map +7 -0
  373. package/dist/backend/dynamic-table/split-view/sharedCriteria.js +62 -0
  374. package/dist/backend/dynamic-table/split-view/sharedCriteria.js.map +7 -0
  375. package/dist/backend/dynamic-table/split-view/types.js +426 -0
  376. package/dist/backend/dynamic-table/split-view/types.js.map +7 -0
  377. package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js +79 -0
  378. package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js.map +7 -0
  379. package/dist/backend/dynamic-table/store/index.js +611 -0
  380. package/dist/backend/dynamic-table/store/index.js.map +7 -0
  381. package/dist/backend/dynamic-table/styles/ContextMenu.css.js +2 -0
  382. package/dist/backend/dynamic-table/styles/DynamicTable.css.js +2 -0
  383. package/dist/backend/dynamic-table/styles/DynamicTable.v2.css.js +2 -0
  384. package/dist/backend/dynamic-table/styles/SearchBar.css.js +2 -0
  385. package/dist/backend/dynamic-table/styles/dateCell.css.js +2 -0
  386. package/dist/backend/dynamic-table/styles/density.css.js +2 -0
  387. package/dist/backend/dynamic-table/types/density.js +29 -0
  388. package/dist/backend/dynamic-table/types/density.js.map +7 -0
  389. package/dist/backend/dynamic-table/types/filters.js +124 -0
  390. package/dist/backend/dynamic-table/types/filters.js.map +7 -0
  391. package/dist/backend/dynamic-table/types/grouping.js +34 -0
  392. package/dist/backend/dynamic-table/types/grouping.js.map +7 -0
  393. package/dist/backend/dynamic-table/types/import.js +7 -0
  394. package/dist/backend/dynamic-table/types/import.js.map +7 -0
  395. package/dist/backend/dynamic-table/types/index.js +46 -0
  396. package/dist/backend/dynamic-table/types/index.js.map +7 -0
  397. package/dist/backend/dynamic-table/types/perspective.js +79 -0
  398. package/dist/backend/dynamic-table/types/perspective.js.map +7 -0
  399. package/dist/backend/dynamic-table/types/rollup.js +13 -0
  400. package/dist/backend/dynamic-table/types/rollup.js.map +7 -0
  401. package/dist/backend/dynamic-table/utils/abbreviations.js +228 -0
  402. package/dist/backend/dynamic-table/utils/abbreviations.js.map +7 -0
  403. package/dist/backend/dynamic-table/utils/anchoredPosition.js +21 -0
  404. package/dist/backend/dynamic-table/utils/anchoredPosition.js.map +7 -0
  405. package/dist/backend/dynamic-table/utils/badgeAutoFit.js +35 -0
  406. package/dist/backend/dynamic-table/utils/badgeAutoFit.js.map +7 -0
  407. package/dist/backend/dynamic-table/utils/clipboard.js +172 -0
  408. package/dist/backend/dynamic-table/utils/clipboard.js.map +7 -0
  409. package/dist/backend/dynamic-table/utils/coerceCellValue.js +52 -0
  410. package/dist/backend/dynamic-table/utils/coerceCellValue.js.map +7 -0
  411. package/dist/backend/dynamic-table/utils/colorAdjacency.js +27 -0
  412. package/dist/backend/dynamic-table/utils/colorAdjacency.js.map +7 -0
  413. package/dist/backend/dynamic-table/utils/columnFill.js +36 -0
  414. package/dist/backend/dynamic-table/utils/columnFill.js.map +7 -0
  415. package/dist/backend/dynamic-table/utils/columnSpacerStyle.js +21 -0
  416. package/dist/backend/dynamic-table/utils/columnSpacerStyle.js.map +7 -0
  417. package/dist/backend/dynamic-table/utils/columnWindow.js +293 -0
  418. package/dist/backend/dynamic-table/utils/columnWindow.js.map +7 -0
  419. package/dist/backend/dynamic-table/utils/conditionalFormat.js +188 -0
  420. package/dist/backend/dynamic-table/utils/conditionalFormat.js.map +7 -0
  421. package/dist/backend/dynamic-table/utils/exportTable.js +82 -0
  422. package/dist/backend/dynamic-table/utils/exportTable.js.map +7 -0
  423. package/dist/backend/dynamic-table/utils/fillGeometry.js +92 -0
  424. package/dist/backend/dynamic-table/utils/fillGeometry.js.map +7 -0
  425. package/dist/backend/dynamic-table/utils/fillPatterns.js +241 -0
  426. package/dist/backend/dynamic-table/utils/fillPatterns.js.map +7 -0
  427. package/dist/backend/dynamic-table/utils/formatAggregate.js +82 -0
  428. package/dist/backend/dynamic-table/utils/formatAggregate.js.map +7 -0
  429. package/dist/backend/dynamic-table/utils/formatDateCompact.js +508 -0
  430. package/dist/backend/dynamic-table/utils/formatDateCompact.js.map +7 -0
  431. package/dist/backend/dynamic-table/utils/formatLabelCompact.js +312 -0
  432. package/dist/backend/dynamic-table/utils/formatLabelCompact.js.map +7 -0
  433. package/dist/backend/dynamic-table/utils/formulaColumns.js +158 -0
  434. package/dist/backend/dynamic-table/utils/formulaColumns.js.map +7 -0
  435. package/dist/backend/dynamic-table/utils/importMapping.js +118 -0
  436. package/dist/backend/dynamic-table/utils/importMapping.js.map +7 -0
  437. package/dist/backend/dynamic-table/utils/importParse.js +121 -0
  438. package/dist/backend/dynamic-table/utils/importParse.js.map +7 -0
  439. package/dist/backend/dynamic-table/utils/lookupColumns.js +28 -0
  440. package/dist/backend/dynamic-table/utils/lookupColumns.js.map +7 -0
  441. package/dist/backend/dynamic-table/utils/perspectiveTransforms.js +191 -0
  442. package/dist/backend/dynamic-table/utils/perspectiveTransforms.js.map +7 -0
  443. package/dist/backend/dynamic-table/utils/rollupColumns.js +81 -0
  444. package/dist/backend/dynamic-table/utils/rollupColumns.js.map +7 -0
  445. package/dist/backend/dynamic-table/validators/index.js +36 -0
  446. package/dist/backend/dynamic-table/validators/index.js.map +7 -0
  447. package/dist/backend/fields/registry.generated.js +8 -0
  448. package/dist/backend/fields/registry.generated.js.map +7 -0
  449. package/dist/backend/fields/registry.js +29 -0
  450. package/dist/backend/fields/registry.js.map +7 -0
  451. package/dist/backend/filters/AdvancedFilterBuilder.js +280 -0
  452. package/dist/backend/filters/AdvancedFilterBuilder.js.map +7 -0
  453. package/dist/backend/forms/ActionsDropdown.js +160 -0
  454. package/dist/backend/forms/ActionsDropdown.js.map +7 -0
  455. package/dist/backend/forms/FormActionButtons.js +59 -0
  456. package/dist/backend/forms/FormActionButtons.js.map +7 -0
  457. package/dist/backend/forms/FormFooter.js +18 -0
  458. package/dist/backend/forms/FormFooter.js.map +7 -0
  459. package/dist/backend/forms/FormHeader.js +125 -0
  460. package/dist/backend/forms/FormHeader.js.map +7 -0
  461. package/dist/backend/forms/index.js +11 -0
  462. package/dist/backend/forms/index.js.map +7 -0
  463. package/dist/backend/hooks/useAdvancedFilter.js +64 -0
  464. package/dist/backend/hooks/useAdvancedFilter.js.map +7 -0
  465. package/dist/backend/indexes/PartialIndexBanner.js +74 -0
  466. package/dist/backend/indexes/PartialIndexBanner.js.map +7 -0
  467. package/dist/backend/indexes/store.js +62 -0
  468. package/dist/backend/indexes/store.js.map +7 -0
  469. package/dist/backend/injection/ComponentOverrideProvider.js +55 -0
  470. package/dist/backend/injection/ComponentOverrideProvider.js.map +7 -0
  471. package/dist/backend/injection/InjectedField.js +166 -0
  472. package/dist/backend/injection/InjectedField.js.map +7 -0
  473. package/dist/backend/injection/InjectionSpot.js +323 -0
  474. package/dist/backend/injection/InjectionSpot.js.map +7 -0
  475. package/dist/backend/injection/InjectionWizard.js +256 -0
  476. package/dist/backend/injection/InjectionWizard.js.map +7 -0
  477. package/dist/backend/injection/PageInjectionBoundary.js +26 -0
  478. package/dist/backend/injection/PageInjectionBoundary.js.map +7 -0
  479. package/dist/backend/injection/SseEventIndicator.js +8 -0
  480. package/dist/backend/injection/SseEventIndicator.js.map +7 -0
  481. package/dist/backend/injection/StatusBadgeInjectionSpot.js +34 -0
  482. package/dist/backend/injection/StatusBadgeInjectionSpot.js.map +7 -0
  483. package/dist/backend/injection/StatusBadgeRenderer.js +58 -0
  484. package/dist/backend/injection/StatusBadgeRenderer.js.map +7 -0
  485. package/dist/backend/injection/WidgetSharedState.js +49 -0
  486. package/dist/backend/injection/WidgetSharedState.js.map +7 -0
  487. package/dist/backend/injection/WizardInjectionSpot.js +30 -0
  488. package/dist/backend/injection/WizardInjectionSpot.js.map +7 -0
  489. package/dist/backend/injection/eventBridge.js +129 -0
  490. package/dist/backend/injection/eventBridge.js.map +7 -0
  491. package/dist/backend/injection/helpers.js +26 -0
  492. package/dist/backend/injection/helpers.js.map +7 -0
  493. package/dist/backend/injection/mergeMenuItems.js +49 -0
  494. package/dist/backend/injection/mergeMenuItems.js.map +7 -0
  495. package/dist/backend/injection/mutationEvents.js +20 -0
  496. package/dist/backend/injection/mutationEvents.js.map +7 -0
  497. package/dist/backend/injection/resolveInjectedIcon.js +23 -0
  498. package/dist/backend/injection/resolveInjectedIcon.js.map +7 -0
  499. package/dist/backend/injection/spotIds.js +72 -0
  500. package/dist/backend/injection/spotIds.js.map +7 -0
  501. package/dist/backend/injection/useAppEvent.js +35 -0
  502. package/dist/backend/injection/useAppEvent.js.map +7 -0
  503. package/dist/backend/injection/useGuardedMutation.js +71 -0
  504. package/dist/backend/injection/useGuardedMutation.js.map +7 -0
  505. package/dist/backend/injection/useInjectedMenuItems.js +49 -0
  506. package/dist/backend/injection/useInjectedMenuItems.js.map +7 -0
  507. package/dist/backend/injection/useInjectionDataWidgets.js +36 -0
  508. package/dist/backend/injection/useInjectionDataWidgets.js.map +7 -0
  509. package/dist/backend/injection/useOperationProgress.js +64 -0
  510. package/dist/backend/injection/useOperationProgress.js.map +7 -0
  511. package/dist/backend/injection/useRegisteredComponent.js +89 -0
  512. package/dist/backend/injection/useRegisteredComponent.js.map +7 -0
  513. package/dist/backend/injection/useWidgetSharedState.js +26 -0
  514. package/dist/backend/injection/useWidgetSharedState.js.map +7 -0
  515. package/dist/backend/injection/visibility-utils.js +29 -0
  516. package/dist/backend/injection/visibility-utils.js.map +7 -0
  517. package/dist/backend/injection/widgetRegistry.js +55 -0
  518. package/dist/backend/injection/widgetRegistry.js.map +7 -0
  519. package/dist/backend/inputs/ComboboxInput.js +228 -0
  520. package/dist/backend/inputs/ComboboxInput.js.map +7 -0
  521. package/dist/backend/inputs/DatePicker.js +148 -0
  522. package/dist/backend/inputs/DatePicker.js.map +7 -0
  523. package/dist/backend/inputs/DateTimePicker.js +188 -0
  524. package/dist/backend/inputs/DateTimePicker.js.map +7 -0
  525. package/dist/backend/inputs/EventPatternInput.js +38 -0
  526. package/dist/backend/inputs/EventPatternInput.js.map +7 -0
  527. package/dist/backend/inputs/EventSelect.js +115 -0
  528. package/dist/backend/inputs/EventSelect.js.map +7 -0
  529. package/dist/backend/inputs/LookupSelect.js +197 -0
  530. package/dist/backend/inputs/LookupSelect.js.map +7 -0
  531. package/dist/backend/inputs/PhoneNumberField.js +133 -0
  532. package/dist/backend/inputs/PhoneNumberField.js.map +7 -0
  533. package/dist/backend/inputs/SwitchableMarkdownInput.js +73 -0
  534. package/dist/backend/inputs/SwitchableMarkdownInput.js.map +7 -0
  535. package/dist/backend/inputs/TagsInput.js +258 -0
  536. package/dist/backend/inputs/TagsInput.js.map +7 -0
  537. package/dist/backend/inputs/TimeInput.js +132 -0
  538. package/dist/backend/inputs/TimeInput.js.map +7 -0
  539. package/dist/backend/inputs/TimePicker.js +105 -0
  540. package/dist/backend/inputs/TimePicker.js.map +7 -0
  541. package/dist/backend/inputs/index.js +12 -0
  542. package/dist/backend/inputs/index.js.map +7 -0
  543. package/dist/backend/markdown/MarkdownContent.js +20 -0
  544. package/dist/backend/markdown/MarkdownContent.js.map +7 -0
  545. package/dist/backend/markdown/index.js +3 -0
  546. package/dist/backend/markdown/index.js.map +7 -0
  547. package/dist/backend/markdown/useMarkdownRemarkPlugins.js +33 -0
  548. package/dist/backend/markdown/useMarkdownRemarkPlugins.js.map +7 -0
  549. package/dist/backend/messages/MessageComposer.js +158 -0
  550. package/dist/backend/messages/MessageComposer.js.map +7 -0
  551. package/dist/backend/messages/MessageObjectDetail.js +81 -0
  552. package/dist/backend/messages/MessageObjectDetail.js.map +7 -0
  553. package/dist/backend/messages/MessageObjectPreview.js +48 -0
  554. package/dist/backend/messages/MessageObjectPreview.js.map +7 -0
  555. package/dist/backend/messages/MessageObjectRecordPicker.js +89 -0
  556. package/dist/backend/messages/MessageObjectRecordPicker.js.map +7 -0
  557. package/dist/backend/messages/MessagePrioritySelector.js +74 -0
  558. package/dist/backend/messages/MessagePrioritySelector.js.map +7 -0
  559. package/dist/backend/messages/MessagesIcon.js +22 -0
  560. package/dist/backend/messages/MessagesIcon.js.map +7 -0
  561. package/dist/backend/messages/SendObjectMessageDialog.js +65 -0
  562. package/dist/backend/messages/SendObjectMessageDialog.js.map +7 -0
  563. package/dist/backend/messages/index.js +17 -0
  564. package/dist/backend/messages/index.js.map +7 -0
  565. package/dist/backend/messages/message-compose-form-groups.js +333 -0
  566. package/dist/backend/messages/message-compose-form-groups.js.map +7 -0
  567. package/dist/backend/messages/message-composer.types.js +1 -0
  568. package/dist/backend/messages/message-composer.types.js.map +7 -0
  569. package/dist/backend/messages/message-priority.js +40 -0
  570. package/dist/backend/messages/message-priority.js.map +7 -0
  571. package/dist/backend/messages/useMessageCompose.js +488 -0
  572. package/dist/backend/messages/useMessageCompose.js.map +7 -0
  573. package/dist/backend/messages/useMessageComposeOperations.js +163 -0
  574. package/dist/backend/messages/useMessageComposeOperations.js.map +7 -0
  575. package/dist/backend/messages/useMessagesPoll.js +79 -0
  576. package/dist/backend/messages/useMessagesPoll.js.map +7 -0
  577. package/dist/backend/notifications/NotificationBell.js +83 -0
  578. package/dist/backend/notifications/NotificationBell.js.map +7 -0
  579. package/dist/backend/notifications/NotificationCountBadge.js +9 -0
  580. package/dist/backend/notifications/NotificationCountBadge.js.map +7 -0
  581. package/dist/backend/notifications/NotificationDispatcher.js +165 -0
  582. package/dist/backend/notifications/NotificationDispatcher.js.map +7 -0
  583. package/dist/backend/notifications/NotificationItem.js +187 -0
  584. package/dist/backend/notifications/NotificationItem.js.map +7 -0
  585. package/dist/backend/notifications/NotificationPanel.js +146 -0
  586. package/dist/backend/notifications/NotificationPanel.js.map +7 -0
  587. package/dist/backend/notifications/index.js +19 -0
  588. package/dist/backend/notifications/index.js.map +7 -0
  589. package/dist/backend/notifications/useNotificationActions.js +124 -0
  590. package/dist/backend/notifications/useNotificationActions.js.map +7 -0
  591. package/dist/backend/notifications/useNotificationEffect.js +13 -0
  592. package/dist/backend/notifications/useNotificationEffect.js.map +7 -0
  593. package/dist/backend/notifications/useNotifications.js +11 -0
  594. package/dist/backend/notifications/useNotifications.js.map +7 -0
  595. package/dist/backend/notifications/useNotificationsPoll.js +135 -0
  596. package/dist/backend/notifications/useNotificationsPoll.js.map +7 -0
  597. package/dist/backend/notifications/useNotificationsSse.js +173 -0
  598. package/dist/backend/notifications/useNotificationsSse.js.map +7 -0
  599. package/dist/backend/operations/LastOperationBanner.js +80 -0
  600. package/dist/backend/operations/LastOperationBanner.js.map +7 -0
  601. package/dist/backend/operations/store.js +183 -0
  602. package/dist/backend/operations/store.js.map +7 -0
  603. package/dist/backend/progress/ProgressTopBar.js +129 -0
  604. package/dist/backend/progress/ProgressTopBar.js.map +7 -0
  605. package/dist/backend/progress/useProgress.js +11 -0
  606. package/dist/backend/progress/useProgress.js.map +7 -0
  607. package/dist/backend/progress/useProgressPoll.js +69 -0
  608. package/dist/backend/progress/useProgressPoll.js.map +7 -0
  609. package/dist/backend/progress/useProgressSse.js +104 -0
  610. package/dist/backend/progress/useProgressSse.js.map +7 -0
  611. package/dist/backend/schedule/ScheduleAgenda.js +107 -0
  612. package/dist/backend/schedule/ScheduleAgenda.js.map +7 -0
  613. package/dist/backend/schedule/ScheduleGrid.js +107 -0
  614. package/dist/backend/schedule/ScheduleGrid.js.map +7 -0
  615. package/dist/backend/schedule/ScheduleToolbar.js +166 -0
  616. package/dist/backend/schedule/ScheduleToolbar.js.map +7 -0
  617. package/dist/backend/schedule/ScheduleView.js +168 -0
  618. package/dist/backend/schedule/ScheduleView.js.map +7 -0
  619. package/dist/backend/schedule/index.js +6 -0
  620. package/dist/backend/schedule/index.js.map +7 -0
  621. package/dist/backend/schedule/recurrence.js +83 -0
  622. package/dist/backend/schedule/recurrence.js.map +7 -0
  623. package/dist/backend/schedule/types.js +1 -0
  624. package/dist/backend/schedule/types.js.map +7 -0
  625. package/dist/backend/section-page/SectionNav.js +104 -0
  626. package/dist/backend/section-page/SectionNav.js.map +7 -0
  627. package/dist/backend/section-page/SectionPage.js +33 -0
  628. package/dist/backend/section-page/SectionPage.js.map +7 -0
  629. package/dist/backend/section-page/index.js +7 -0
  630. package/dist/backend/section-page/index.js.map +7 -0
  631. package/dist/backend/section-page/types.js +1 -0
  632. package/dist/backend/section-page/types.js.map +7 -0
  633. package/dist/backend/settings/SettingsNavigation.js +43 -0
  634. package/dist/backend/settings/SettingsNavigation.js.map +7 -0
  635. package/dist/backend/settings/SettingsPageWrapper.js +66 -0
  636. package/dist/backend/settings/SettingsPageWrapper.js.map +7 -0
  637. package/dist/backend/settings/index.js +6 -0
  638. package/dist/backend/settings/index.js.map +7 -0
  639. package/dist/backend/upgrades/UpgradeActionBanner.js +91 -0
  640. package/dist/backend/upgrades/UpgradeActionBanner.js.map +7 -0
  641. package/dist/backend/utils/api.js +178 -0
  642. package/dist/backend/utils/api.js.map +7 -0
  643. package/dist/backend/utils/apiCall.js +68 -0
  644. package/dist/backend/utils/apiCall.js.map +7 -0
  645. package/dist/backend/utils/crud.js +126 -0
  646. package/dist/backend/utils/crud.js.map +7 -0
  647. package/dist/backend/utils/customFieldColumns.js +100 -0
  648. package/dist/backend/utils/customFieldColumns.js.map +7 -0
  649. package/dist/backend/utils/customFieldDefs.js +143 -0
  650. package/dist/backend/utils/customFieldDefs.js.map +7 -0
  651. package/dist/backend/utils/customFieldFilters.js +151 -0
  652. package/dist/backend/utils/customFieldFilters.js.map +7 -0
  653. package/dist/backend/utils/customFieldForms.js +169 -0
  654. package/dist/backend/utils/customFieldForms.js.map +7 -0
  655. package/dist/backend/utils/customFieldRelationDisplay.js +239 -0
  656. package/dist/backend/utils/customFieldRelationDisplay.js.map +7 -0
  657. package/dist/backend/utils/customFieldValues.js +26 -0
  658. package/dist/backend/utils/customFieldValues.js.map +7 -0
  659. package/dist/backend/utils/flash.js +16 -0
  660. package/dist/backend/utils/flash.js.map +7 -0
  661. package/dist/backend/utils/nav.js +280 -0
  662. package/dist/backend/utils/nav.js.map +7 -0
  663. package/dist/backend/utils/richTextSanitizer.js +11 -0
  664. package/dist/backend/utils/richTextSanitizer.js.map +7 -0
  665. package/dist/backend/utils/scopedHeaderStack.js +44 -0
  666. package/dist/backend/utils/scopedHeaderStack.js.map +7 -0
  667. package/dist/backend/utils/serverErrors.js +237 -0
  668. package/dist/backend/utils/serverErrors.js.map +7 -0
  669. package/dist/backend/utils/useAutoDiscoveredFields.js +96 -0
  670. package/dist/backend/utils/useAutoDiscoveredFields.js.map +7 -0
  671. package/dist/backend/version-history/VersionHistoryAction.js +67 -0
  672. package/dist/backend/version-history/VersionHistoryAction.js.map +7 -0
  673. package/dist/backend/version-history/VersionHistoryDetail.js +57 -0
  674. package/dist/backend/version-history/VersionHistoryDetail.js.map +7 -0
  675. package/dist/backend/version-history/VersionHistoryPanel.js +270 -0
  676. package/dist/backend/version-history/VersionHistoryPanel.js.map +7 -0
  677. package/dist/backend/version-history/index.js +13 -0
  678. package/dist/backend/version-history/index.js.map +7 -0
  679. package/dist/backend/version-history/labels.js +52 -0
  680. package/dist/backend/version-history/labels.js.map +7 -0
  681. package/dist/backend/version-history/types.js +1 -0
  682. package/dist/backend/version-history/types.js.map +7 -0
  683. package/dist/backend/version-history/useAuditPermissions.js +72 -0
  684. package/dist/backend/version-history/useAuditPermissions.js.map +7 -0
  685. package/dist/backend/version-history/useVersionHistory.js +141 -0
  686. package/dist/backend/version-history/useVersionHistory.js.map +7 -0
  687. package/dist/backend/views/NewViewForm.js +56 -0
  688. package/dist/backend/views/NewViewForm.js.map +7 -0
  689. package/dist/backend/views/ShareForm.js +49 -0
  690. package/dist/backend/views/ShareForm.js.map +7 -0
  691. package/dist/backend/views/ViewChip.js +112 -0
  692. package/dist/backend/views/ViewChip.js.map +7 -0
  693. package/dist/backend/views/ViewChipMenu.js +89 -0
  694. package/dist/backend/views/ViewChipMenu.js.map +7 -0
  695. package/dist/backend/views/types.js +1 -0
  696. package/dist/backend/views/types.js.map +7 -0
  697. package/dist/frontend/AuthFooter.js +23 -0
  698. package/dist/frontend/AuthFooter.js.map +7 -0
  699. package/dist/frontend/LanguageSwitcher.js +57 -0
  700. package/dist/frontend/LanguageSwitcher.js.map +7 -0
  701. package/dist/frontend/Layout.js +14 -0
  702. package/dist/frontend/Layout.js.map +7 -0
  703. package/dist/hooks/useIsMobile.js +21 -0
  704. package/dist/hooks/useIsMobile.js.map +7 -0
  705. package/dist/index.js +40 -0
  706. package/dist/index.js.map +7 -0
  707. package/dist/portal/PortalContext.js +113 -0
  708. package/dist/portal/PortalContext.js.map +7 -0
  709. package/dist/portal/PortalLayoutProvider.js +5 -0
  710. package/dist/portal/PortalLayoutProvider.js.map +7 -0
  711. package/dist/portal/PortalLayoutShell.js +44 -0
  712. package/dist/portal/PortalLayoutShell.js.map +7 -0
  713. package/dist/portal/PortalShell.js +229 -0
  714. package/dist/portal/PortalShell.js.map +7 -0
  715. package/dist/portal/components/PortalCard.js +31 -0
  716. package/dist/portal/components/PortalCard.js.map +7 -0
  717. package/dist/portal/components/PortalEmptyState.js +16 -0
  718. package/dist/portal/components/PortalEmptyState.js.map +7 -0
  719. package/dist/portal/components/PortalFeatureCard.js +21 -0
  720. package/dist/portal/components/PortalFeatureCard.js.map +7 -0
  721. package/dist/portal/components/PortalNotificationBell.js +67 -0
  722. package/dist/portal/components/PortalNotificationBell.js.map +7 -0
  723. package/dist/portal/components/PortalNotificationPanel.js +158 -0
  724. package/dist/portal/components/PortalNotificationPanel.js.map +7 -0
  725. package/dist/portal/components/PortalPageHeader.js +16 -0
  726. package/dist/portal/components/PortalPageHeader.js.map +7 -0
  727. package/dist/portal/components/index.js +18 -0
  728. package/dist/portal/components/index.js.map +7 -0
  729. package/dist/portal/hooks/useCustomerAuth.js +69 -0
  730. package/dist/portal/hooks/useCustomerAuth.js.map +7 -0
  731. package/dist/portal/hooks/usePortalAppEvent.js +26 -0
  732. package/dist/portal/hooks/usePortalAppEvent.js.map +7 -0
  733. package/dist/portal/hooks/usePortalDashboardWidgets.js +37 -0
  734. package/dist/portal/hooks/usePortalDashboardWidgets.js.map +7 -0
  735. package/dist/portal/hooks/usePortalEventBridge.js +129 -0
  736. package/dist/portal/hooks/usePortalEventBridge.js.map +7 -0
  737. package/dist/portal/hooks/usePortalInjectedMenuItems.js +88 -0
  738. package/dist/portal/hooks/usePortalInjectedMenuItems.js.map +7 -0
  739. package/dist/portal/hooks/usePortalNotifications.js +85 -0
  740. package/dist/portal/hooks/usePortalNotifications.js.map +7 -0
  741. package/dist/portal/hooks/useTenantContext.js +53 -0
  742. package/dist/portal/hooks/useTenantContext.js.map +7 -0
  743. package/dist/primitives/DataLoader.js +68 -0
  744. package/dist/primitives/DataLoader.js.map +7 -0
  745. package/dist/primitives/ErrorNotice.js +14 -0
  746. package/dist/primitives/ErrorNotice.js.map +7 -0
  747. package/dist/primitives/Notice.js +55 -0
  748. package/dist/primitives/Notice.js.map +7 -0
  749. package/dist/primitives/alert.js +38 -0
  750. package/dist/primitives/alert.js.map +7 -0
  751. package/dist/primitives/badge.js +33 -0
  752. package/dist/primitives/badge.js.map +7 -0
  753. package/dist/primitives/button.js +45 -0
  754. package/dist/primitives/button.js.map +7 -0
  755. package/dist/primitives/calendar.js +62 -0
  756. package/dist/primitives/calendar.js.map +7 -0
  757. package/dist/primitives/card.js +91 -0
  758. package/dist/primitives/card.js.map +7 -0
  759. package/dist/primitives/checkbox.js +28 -0
  760. package/dist/primitives/checkbox.js.map +7 -0
  761. package/dist/primitives/dialog.js +101 -0
  762. package/dist/primitives/dialog.js.map +7 -0
  763. package/dist/primitives/form-field.js +78 -0
  764. package/dist/primitives/form-field.js.map +7 -0
  765. package/dist/primitives/icon-button.js +40 -0
  766. package/dist/primitives/icon-button.js.map +7 -0
  767. package/dist/primitives/input.js +22 -0
  768. package/dist/primitives/input.js.map +7 -0
  769. package/dist/primitives/label.js +21 -0
  770. package/dist/primitives/label.js.map +7 -0
  771. package/dist/primitives/popover.js +36 -0
  772. package/dist/primitives/popover.js.map +7 -0
  773. package/dist/primitives/primitives.stories.js +187 -0
  774. package/dist/primitives/primitives.stories.js.map +7 -0
  775. package/dist/primitives/progress.js +28 -0
  776. package/dist/primitives/progress.js.map +7 -0
  777. package/dist/primitives/separator.js +9 -0
  778. package/dist/primitives/separator.js.map +7 -0
  779. package/dist/primitives/sheet.js +103 -0
  780. package/dist/primitives/sheet.js.map +7 -0
  781. package/dist/primitives/spinner.js +24 -0
  782. package/dist/primitives/spinner.js.map +7 -0
  783. package/dist/primitives/status-badge.js +38 -0
  784. package/dist/primitives/status-badge.js.map +7 -0
  785. package/dist/primitives/switch.js +80 -0
  786. package/dist/primitives/switch.js.map +7 -0
  787. package/dist/primitives/table.js +29 -0
  788. package/dist/primitives/table.js.map +7 -0
  789. package/dist/primitives/tabs.js +90 -0
  790. package/dist/primitives/tabs.js.map +7 -0
  791. package/dist/primitives/textarea.js +21 -0
  792. package/dist/primitives/textarea.js.map +7 -0
  793. package/dist/primitives/tooltip.js +60 -0
  794. package/dist/primitives/tooltip.js.map +7 -0
  795. package/dist/primitives-v2/Alert.js +69 -0
  796. package/dist/primitives-v2/Alert.js.map +7 -0
  797. package/dist/primitives-v2/Alert.stories.js +42 -0
  798. package/dist/primitives-v2/Alert.stories.js.map +7 -0
  799. package/dist/primitives-v2/Avatar.js +93 -0
  800. package/dist/primitives-v2/Avatar.js.map +7 -0
  801. package/dist/primitives-v2/Avatar.stories.js +57 -0
  802. package/dist/primitives-v2/Avatar.stories.js.map +7 -0
  803. package/dist/primitives-v2/Badge.js +50 -0
  804. package/dist/primitives-v2/Badge.js.map +7 -0
  805. package/dist/primitives-v2/Badge.stories.js +66 -0
  806. package/dist/primitives-v2/Badge.stories.js.map +7 -0
  807. package/dist/primitives-v2/Breadcrumb.js +53 -0
  808. package/dist/primitives-v2/Breadcrumb.js.map +7 -0
  809. package/dist/primitives-v2/Breadcrumb.stories.js +70 -0
  810. package/dist/primitives-v2/Breadcrumb.stories.js.map +7 -0
  811. package/dist/primitives-v2/Button.js +85 -0
  812. package/dist/primitives-v2/Button.js.map +7 -0
  813. package/dist/primitives-v2/Button.stories.js +48 -0
  814. package/dist/primitives-v2/Button.stories.js.map +7 -0
  815. package/dist/primitives-v2/Checkbox.js +65 -0
  816. package/dist/primitives-v2/Checkbox.js.map +7 -0
  817. package/dist/primitives-v2/Checkbox.stories.js +31 -0
  818. package/dist/primitives-v2/Checkbox.stories.js.map +7 -0
  819. package/dist/primitives-v2/IconButton.js +13 -0
  820. package/dist/primitives-v2/IconButton.js.map +7 -0
  821. package/dist/primitives-v2/IconButton.stories.js +37 -0
  822. package/dist/primitives-v2/IconButton.stories.js.map +7 -0
  823. package/dist/primitives-v2/Input.js +74 -0
  824. package/dist/primitives-v2/Input.js.map +7 -0
  825. package/dist/primitives-v2/Input.stories.js +56 -0
  826. package/dist/primitives-v2/Input.stories.js.map +7 -0
  827. package/dist/primitives-v2/NavGroup.js +54 -0
  828. package/dist/primitives-v2/NavGroup.js.map +7 -0
  829. package/dist/primitives-v2/NavGroup.stories.js +39 -0
  830. package/dist/primitives-v2/NavGroup.stories.js.map +7 -0
  831. package/dist/primitives-v2/NavItem.js +61 -0
  832. package/dist/primitives-v2/NavItem.js.map +7 -0
  833. package/dist/primitives-v2/NavItem.stories.js +56 -0
  834. package/dist/primitives-v2/NavItem.stories.js.map +7 -0
  835. package/dist/primitives-v2/SearchInput.js +93 -0
  836. package/dist/primitives-v2/SearchInput.js.map +7 -0
  837. package/dist/primitives-v2/SearchInput.stories.js +41 -0
  838. package/dist/primitives-v2/SearchInput.stories.js.map +7 -0
  839. package/dist/primitives-v2/Sidebar.js +48 -0
  840. package/dist/primitives-v2/Sidebar.js.map +7 -0
  841. package/dist/primitives-v2/Sidebar.stories.js +76 -0
  842. package/dist/primitives-v2/Sidebar.stories.js.map +7 -0
  843. package/dist/primitives-v2/Tab.js +78 -0
  844. package/dist/primitives-v2/Tab.js.map +7 -0
  845. package/dist/primitives-v2/Tab.stories.js +51 -0
  846. package/dist/primitives-v2/Tab.stories.js.map +7 -0
  847. package/dist/primitives-v2/Tag.js +61 -0
  848. package/dist/primitives-v2/Tag.js.map +7 -0
  849. package/dist/primitives-v2/Tag.stories.js +121 -0
  850. package/dist/primitives-v2/Tag.stories.js.map +7 -0
  851. package/dist/primitives-v2/Toggle.js +72 -0
  852. package/dist/primitives-v2/Toggle.js.map +7 -0
  853. package/dist/primitives-v2/Toggle.stories.js +34 -0
  854. package/dist/primitives-v2/Toggle.stories.js.map +7 -0
  855. package/dist/primitives-v2/Topbar.js +24 -0
  856. package/dist/primitives-v2/Topbar.js.map +7 -0
  857. package/dist/primitives-v2/Topbar.stories.js +58 -0
  858. package/dist/primitives-v2/Topbar.stories.js.map +7 -0
  859. package/dist/primitives-v2/index.js +41 -0
  860. package/dist/primitives-v2/index.js.map +7 -0
  861. package/dist/primitives-v2/utils.js +7 -0
  862. package/dist/primitives-v2/utils.js.map +7 -0
  863. package/dist/theme/BrandThemeProvider.js +49 -0
  864. package/dist/theme/BrandThemeProvider.js.map +7 -0
  865. package/dist/theme/QueryProvider.js +44 -0
  866. package/dist/theme/QueryProvider.js.map +7 -0
  867. package/dist/theme/ThemeProvider.js +96 -0
  868. package/dist/theme/ThemeProvider.js.map +7 -0
  869. package/dist/theme/ThemeToggle.js +88 -0
  870. package/dist/theme/ThemeToggle.js.map +7 -0
  871. package/dist/theme/index.js +12 -0
  872. package/dist/theme/index.js.map +7 -0
  873. package/dist/theme/m3.css.js +2 -0
  874. package/dist/theme/tokens.v2.css.js +2 -0
  875. package/dist/theme/typography.css.js +2 -0
  876. package/dist/theme/typography.stories.js +123 -0
  877. package/dist/theme/typography.stories.js.map +7 -0
  878. package/dist/theme/typography.tokens.js +281 -0
  879. package/dist/theme/typography.tokens.js.map +7 -0
  880. package/dist/types/react-big-calendar.d.js +1 -0
  881. package/dist/types/react-big-calendar.d.js.map +7 -0
  882. package/package.json +411 -0
  883. package/src/backend/AppShell.tsx +1606 -0
  884. package/src/backend/BackendChromeProvider.tsx +99 -0
  885. package/src/backend/BackendPageSurface.tsx +57 -0
  886. package/src/backend/CollapsibleNavSection.tsx +201 -0
  887. package/src/backend/ContextHelp.tsx +40 -0
  888. package/src/backend/CrudForm.tsx +3796 -0
  889. package/src/backend/DataTable.tsx +2584 -0
  890. package/src/backend/EmptyState.tsx +65 -0
  891. package/src/backend/FilterBar.tsx +171 -0
  892. package/src/backend/FilterOverlay.tsx +388 -0
  893. package/src/backend/FlashMessages.tsx +189 -0
  894. package/src/backend/HtmlRichTextEditor.tsx +124 -0
  895. package/src/backend/IntegrationsButton.tsx +29 -0
  896. package/src/backend/JsonBuilder.tsx +359 -0
  897. package/src/backend/JsonDisplay.tsx +258 -0
  898. package/src/backend/NextStepCallout.tsx +134 -0
  899. package/src/backend/Page.tsx +30 -0
  900. package/src/backend/PerspectiveSidebar.tsx +506 -0
  901. package/src/backend/ProfileDropdown.tsx +369 -0
  902. package/src/backend/RowActions.tsx +158 -0
  903. package/src/backend/SectionHeader.tsx +119 -0
  904. package/src/backend/SettingsButton.tsx +28 -0
  905. package/src/backend/Sidebar.stories.tsx +183 -0
  906. package/src/backend/Sidebar.tsx +737 -0
  907. package/src/backend/TruncatedCell.tsx +133 -0
  908. package/src/backend/UserMenu.tsx +153 -0
  909. package/src/backend/ValueIcons.tsx +48 -0
  910. package/src/backend/WebhookSetupGuide.tsx +127 -0
  911. package/src/backend/__tests__/AppShell.test.tsx +392 -0
  912. package/src/backend/__tests__/CrudForm.custom-fields.test.tsx +180 -0
  913. package/src/backend/__tests__/CrudForm.datetime.test.tsx +95 -0
  914. package/src/backend/__tests__/CrudForm.defaults.test.tsx +195 -0
  915. package/src/backend/__tests__/CrudForm.navigation.test.tsx +156 -0
  916. package/src/backend/__tests__/CrudForm.render.test.tsx +146 -0
  917. package/src/backend/__tests__/CrudForm.transformData.test.tsx +231 -0
  918. package/src/backend/__tests__/CrudForm.unsavedNavigation.test.tsx +145 -0
  919. package/src/backend/__tests__/CrudForm.validation.test.tsx +178 -0
  920. package/src/backend/__tests__/CustomDataSection.test.tsx +465 -0
  921. package/src/backend/__tests__/DataTable.extensions.test.tsx +339 -0
  922. package/src/backend/__tests__/DataTable.namespaces.test.ts +32 -0
  923. package/src/backend/__tests__/DataTable.render.test.tsx +48 -0
  924. package/src/backend/__tests__/FieldDefinitionsEditor.test.tsx +64 -0
  925. package/src/backend/__tests__/FlashMessages.test.tsx +105 -0
  926. package/src/backend/__tests__/FormHeader.test.tsx +81 -0
  927. package/src/backend/__tests__/NotificationDispatcher.test.ts +172 -0
  928. package/src/backend/__tests__/VersionHistoryPanel.test.tsx +109 -0
  929. package/src/backend/__tests__/component-replacement.test.tsx +270 -0
  930. package/src/backend/__tests__/custom-field-filters.test.ts +72 -0
  931. package/src/backend/__tests__/custom-field-forms.test.ts +54 -0
  932. package/src/backend/__tests__/nav-utils.test.ts +175 -0
  933. package/src/backend/__tests__/serverErrors.test.ts +83 -0
  934. package/src/backend/__tests__/useAuditPermissions.test.tsx +51 -0
  935. package/src/backend/__tests__/useNotifications.strategy.test.ts +58 -0
  936. package/src/backend/__tests__/useProgress.strategy.test.ts +62 -0
  937. package/src/backend/charts/BarChart.tsx +208 -0
  938. package/src/backend/charts/ChartUtils.tsx +196 -0
  939. package/src/backend/charts/ComboChart.stories.tsx +103 -0
  940. package/src/backend/charts/ComboChart.tsx +350 -0
  941. package/src/backend/charts/KpiCard.tsx +155 -0
  942. package/src/backend/charts/LineChart.tsx +207 -0
  943. package/src/backend/charts/PieChart.tsx +157 -0
  944. package/src/backend/charts/ScatterChart.tsx +498 -0
  945. package/src/backend/charts/TopNTable.tsx +141 -0
  946. package/src/backend/charts/WaterfallChart.tsx +213 -0
  947. package/src/backend/charts/index.ts +21 -0
  948. package/src/backend/columns/ColumnChooserPanel.tsx +293 -0
  949. package/src/backend/confirm-dialog/ConfirmDialog.tsx +275 -0
  950. package/src/backend/confirm-dialog/index.ts +7 -0
  951. package/src/backend/confirm-dialog/useConfirmDialog.tsx +146 -0
  952. package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +1413 -0
  953. package/src/backend/custom-fields/FieldDefinitionsManager.tsx +381 -0
  954. package/src/backend/dashboard/DashboardScreen.tsx +706 -0
  955. package/src/backend/dashboard/__tests__/DashboardScreen.test.tsx +114 -0
  956. package/src/backend/dashboard/index.ts +1 -0
  957. package/src/backend/dashboard/widgetRegistry.ts +68 -0
  958. package/src/backend/date-range/DateRangeSelect.tsx +50 -0
  959. package/src/backend/date-range/InlineDateRangeSelect.tsx +52 -0
  960. package/src/backend/date-range/InlineGranularitySelect.tsx +63 -0
  961. package/src/backend/date-range/__tests__/dateRanges.test.ts +224 -0
  962. package/src/backend/date-range/dateRanges.ts +218 -0
  963. package/src/backend/date-range/index.ts +15 -0
  964. package/src/backend/detail/AccessDeniedMessage.tsx +32 -0
  965. package/src/backend/detail/ActivitiesSection.tsx +1261 -0
  966. package/src/backend/detail/AddressEditor.tsx +479 -0
  967. package/src/backend/detail/AddressTiles.tsx +591 -0
  968. package/src/backend/detail/AddressesSection.tsx +362 -0
  969. package/src/backend/detail/AttachmentDeleteDialog.tsx +56 -0
  970. package/src/backend/detail/AttachmentMetadataDialog.tsx +674 -0
  971. package/src/backend/detail/AttachmentVisualPreview.tsx +155 -0
  972. package/src/backend/detail/AttachmentsSection.tsx +327 -0
  973. package/src/backend/detail/CustomDataSection.tsx +700 -0
  974. package/src/backend/detail/DetailFieldsSection.tsx +163 -0
  975. package/src/backend/detail/ErrorMessage.tsx +32 -0
  976. package/src/backend/detail/InlineEditors.tsx +894 -0
  977. package/src/backend/detail/LoadingMessage.tsx +14 -0
  978. package/src/backend/detail/NotesSection.tsx +1266 -0
  979. package/src/backend/detail/TabEmptyState.tsx +48 -0
  980. package/src/backend/detail/TagsSection.tsx +470 -0
  981. package/src/backend/detail/__tests__/InlineEditors.test.tsx +59 -0
  982. package/src/backend/detail/addressFormat.tsx +121 -0
  983. package/src/backend/detail/index.ts +46 -0
  984. package/src/backend/devtools/UmesDevToolsPanel.tsx +122 -0
  985. package/src/backend/devtools/components/ConflictWarnings.tsx +36 -0
  986. package/src/backend/devtools/components/EnricherTiming.tsx +50 -0
  987. package/src/backend/devtools/components/EventFlow.tsx +45 -0
  988. package/src/backend/devtools/components/ExtensionPointList.tsx +59 -0
  989. package/src/backend/devtools/components/InterceptorActivity.tsx +48 -0
  990. package/src/backend/devtools/index.ts +2 -0
  991. package/src/backend/devtools/useUmesDevTools.ts +188 -0
  992. package/src/backend/document-viewer/RegionOverlay.tsx +150 -0
  993. package/src/backend/document-viewer/index.ts +2 -0
  994. package/src/backend/dynamic-grid/DynamicGrid.tsx +161 -0
  995. package/src/backend/dynamic-grid/adapters.ts +57 -0
  996. package/src/backend/dynamic-grid/components/GridCell.tsx +194 -0
  997. package/src/backend/dynamic-grid/components/GridRow.tsx +40 -0
  998. package/src/backend/dynamic-grid/hooks/useGridKeyboardNav.ts +134 -0
  999. package/src/backend/dynamic-grid/index.ts +4 -0
  1000. package/src/backend/dynamic-grid/types.ts +55 -0
  1001. package/src/backend/dynamic-table/DynamicTable.stories.tsx +274 -0
  1002. package/src/backend/dynamic-table/DynamicTable.tsx +4419 -0
  1003. package/src/backend/dynamic-table/README.md +1199 -0
  1004. package/src/backend/dynamic-table/URL_FILTERING.md +217 -0
  1005. package/src/backend/dynamic-table/__e2e__/GridHarness.ts +1155 -0
  1006. package/src/backend/dynamic-table/__e2e__/SplitViewHarness.ts +366 -0
  1007. package/src/backend/dynamic-table/__tests__/BulkActionsBar.test.tsx +143 -0
  1008. package/src/backend/dynamic-table/__tests__/ColumnQuickFilter.test.tsx +607 -0
  1009. package/src/backend/dynamic-table/__tests__/ConfigureViewFilters.suggestions.test.tsx +177 -0
  1010. package/src/backend/dynamic-table/__tests__/ConfigureViewFormatting.test.tsx +125 -0
  1011. package/src/backend/dynamic-table/__tests__/ConfigureViewFormulas.test.tsx +228 -0
  1012. package/src/backend/dynamic-table/__tests__/ConfigureViewGrouping.aggregations.test.tsx +131 -0
  1013. package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.baseView.test.tsx +162 -0
  1014. package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.focus.test.tsx +54 -0
  1015. package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.sections.test.tsx +142 -0
  1016. package/src/backend/dynamic-table/__tests__/ConfigureViewRollups.test.tsx +228 -0
  1017. package/src/backend/dynamic-table/__tests__/ContextMenu.test.tsx +89 -0
  1018. package/src/backend/dynamic-table/__tests__/DynamicTable.density.test.tsx +299 -0
  1019. package/src/backend/dynamic-table/__tests__/DynamicTable.exportTruncation.test.tsx +145 -0
  1020. package/src/backend/dynamic-table/__tests__/DynamicTable.loadError.test.tsx +173 -0
  1021. package/src/backend/dynamic-table/__tests__/DynamicTable.wiring.test.tsx +357 -0
  1022. package/src/backend/dynamic-table/__tests__/EmptyState.test.tsx +70 -0
  1023. package/src/backend/dynamic-table/__tests__/ExportMenu.test.tsx +82 -0
  1024. package/src/backend/dynamic-table/__tests__/FooterTotalsRow.test.tsx +154 -0
  1025. package/src/backend/dynamic-table/__tests__/GroupSummaryRow.render.test.tsx +131 -0
  1026. package/src/backend/dynamic-table/__tests__/LoadErrorState.test.tsx +74 -0
  1027. package/src/backend/dynamic-table/__tests__/MentionPopup.search.test.tsx +127 -0
  1028. package/src/backend/dynamic-table/__tests__/PerspectiveTabs.test.tsx +170 -0
  1029. package/src/backend/dynamic-table/__tests__/RowHeaderCell.selection.test.tsx +80 -0
  1030. package/src/backend/dynamic-table/__tests__/abbreviationsSubscription.test.ts +171 -0
  1031. package/src/backend/dynamic-table/__tests__/aggregate.spec.test.ts +224 -0
  1032. package/src/backend/dynamic-table/__tests__/aggregateDimension.test.tsx +191 -0
  1033. package/src/backend/dynamic-table/__tests__/anchoredPosition.test.ts +88 -0
  1034. package/src/backend/dynamic-table/__tests__/badgeAutoFit.test.ts +121 -0
  1035. package/src/backend/dynamic-table/__tests__/cellHandlers.save.test.ts +282 -0
  1036. package/src/backend/dynamic-table/__tests__/cellWrites.test.ts +274 -0
  1037. package/src/backend/dynamic-table/__tests__/clipboard.test.ts +230 -0
  1038. package/src/backend/dynamic-table/__tests__/coerceCellValue.test.ts +117 -0
  1039. package/src/backend/dynamic-table/__tests__/colorAdjacency.test.ts +151 -0
  1040. package/src/backend/dynamic-table/__tests__/columnFill.test.ts +66 -0
  1041. package/src/backend/dynamic-table/__tests__/columnHeaderHandlers.sort.test.ts +100 -0
  1042. package/src/backend/dynamic-table/__tests__/columnHeaderReorder.test.tsx +209 -0
  1043. package/src/backend/dynamic-table/__tests__/columnReorderPersistence.test.tsx +127 -0
  1044. package/src/backend/dynamic-table/__tests__/columnVirtualization.render.test.tsx +420 -0
  1045. package/src/backend/dynamic-table/__tests__/columnVisibilityPersistence.test.tsx +136 -0
  1046. package/src/backend/dynamic-table/__tests__/columnWindow.test.ts +643 -0
  1047. package/src/backend/dynamic-table/__tests__/commentAudience.test.tsx +137 -0
  1048. package/src/backend/dynamic-table/__tests__/commentScope.test.tsx +214 -0
  1049. package/src/backend/dynamic-table/__tests__/conditionalFormat.test.ts +175 -0
  1050. package/src/backend/dynamic-table/__tests__/contentRegistry.test.ts +267 -0
  1051. package/src/backend/dynamic-table/__tests__/dateWindows.test.ts +149 -0
  1052. package/src/backend/dynamic-table/__tests__/density.test.ts +204 -0
  1053. package/src/backend/dynamic-table/__tests__/exportTable.test.ts +146 -0
  1054. package/src/backend/dynamic-table/__tests__/fillGeometry.test.ts +201 -0
  1055. package/src/backend/dynamic-table/__tests__/fillPatterns.test.ts +272 -0
  1056. package/src/backend/dynamic-table/__tests__/filterParser.presets.test.ts +64 -0
  1057. package/src/backend/dynamic-table/__tests__/filterParser.relative.test.ts +109 -0
  1058. package/src/backend/dynamic-table/__tests__/filterSuggestions.test.ts +152 -0
  1059. package/src/backend/dynamic-table/__tests__/formatAggregate.test.ts +99 -0
  1060. package/src/backend/dynamic-table/__tests__/formatDateCompact.test.ts +489 -0
  1061. package/src/backend/dynamic-table/__tests__/formatLabelCompact.test.ts +717 -0
  1062. package/src/backend/dynamic-table/__tests__/formula.check.test.ts +257 -0
  1063. package/src/backend/dynamic-table/__tests__/formula.evaluate.test.ts +274 -0
  1064. package/src/backend/dynamic-table/__tests__/formula.functions.test.ts +226 -0
  1065. package/src/backend/dynamic-table/__tests__/formula.noEval.test.ts +92 -0
  1066. package/src/backend/dynamic-table/__tests__/formula.parse.test.ts +233 -0
  1067. package/src/backend/dynamic-table/__tests__/formulaColumns.test.tsx +213 -0
  1068. package/src/backend/dynamic-table/__tests__/handlerIdentity.test.ts +77 -0
  1069. package/src/backend/dynamic-table/__tests__/importMapping.test.ts +174 -0
  1070. package/src/backend/dynamic-table/__tests__/importParse.test.ts +130 -0
  1071. package/src/backend/dynamic-table/__tests__/importServerOnly.test.ts +37 -0
  1072. package/src/backend/dynamic-table/__tests__/layoutPersistence.test.ts +372 -0
  1073. package/src/backend/dynamic-table/__tests__/mouseHandlers.doubleClick.test.ts +155 -0
  1074. package/src/backend/dynamic-table/__tests__/perspectivePersonalization.test.ts +188 -0
  1075. package/src/backend/dynamic-table/__tests__/perspectiveResolver.test.ts +133 -0
  1076. package/src/backend/dynamic-table/__tests__/perspectiveState.defaultGrouping.test.ts +306 -0
  1077. package/src/backend/dynamic-table/__tests__/perspectiveState.defaults.test.ts +107 -0
  1078. package/src/backend/dynamic-table/__tests__/perspectiveTemplates.test.tsx +269 -0
  1079. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.aggregations.test.ts +105 -0
  1080. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.conditionalFormats.test.ts +107 -0
  1081. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.dateFormat.test.ts +61 -0
  1082. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.formulas.test.ts +85 -0
  1083. package/src/backend/dynamic-table/__tests__/perspectiveTransforms.frozenColumns.test.ts +124 -0
  1084. package/src/backend/dynamic-table/__tests__/rollupColumns.test.ts +149 -0
  1085. package/src/backend/dynamic-table/__tests__/sharedCriteria.test.ts +255 -0
  1086. package/src/backend/dynamic-table/__tests__/splitViewTree.test.ts +324 -0
  1087. package/src/backend/dynamic-table/__tests__/store.clipboardMarker.test.ts +143 -0
  1088. package/src/backend/dynamic-table/__tests__/store.fillPreview.test.ts +168 -0
  1089. package/src/backend/dynamic-table/__tests__/store.mutations.test.ts +345 -0
  1090. package/src/backend/dynamic-table/__tests__/store.selection.test.ts +157 -0
  1091. package/src/backend/dynamic-table/__tests__/store.undo.test.ts +225 -0
  1092. package/src/backend/dynamic-table/__tests__/store.valueSource.test.tsx +204 -0
  1093. package/src/backend/dynamic-table/__tests__/useAnnotations.legacyOptions.test.tsx +58 -0
  1094. package/src/backend/dynamic-table/__tests__/useColumnVirtualizer.test.ts +290 -0
  1095. package/src/backend/dynamic-table/__tests__/useDensityPreference.test.ts +435 -0
  1096. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.duplicate.test.tsx +99 -0
  1097. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.export.test.tsx +281 -0
  1098. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.personalization.test.tsx +313 -0
  1099. package/src/backend/dynamic-table/__tests__/useDynamicTablePage.perspectiveRestore.test.tsx +126 -0
  1100. package/src/backend/dynamic-table/__tests__/useGrouping.aggregations.test.ts +158 -0
  1101. package/src/backend/dynamic-table/__tests__/useGrouping.groupKey.test.ts +58 -0
  1102. package/src/backend/dynamic-table/__tests__/useKeyboardNavigation.test.ts +594 -0
  1103. package/src/backend/dynamic-table/__tests__/useStickyOffsets.memo.test.tsx +75 -0
  1104. package/src/backend/dynamic-table/__tests__/useStickyOffsets.test.ts +106 -0
  1105. package/src/backend/dynamic-table/__tests__/widgetPane.test.tsx +338 -0
  1106. package/src/backend/dynamic-table/components/ActiveFilterChips.tsx +109 -0
  1107. package/src/backend/dynamic-table/components/BulkActionsBar.tsx +89 -0
  1108. package/src/backend/dynamic-table/components/Cell.tsx +292 -0
  1109. package/src/backend/dynamic-table/components/CellCommentDialog.tsx +887 -0
  1110. package/src/backend/dynamic-table/components/CellCommentHoverPopup.tsx +94 -0
  1111. package/src/backend/dynamic-table/components/ColumnFilterPopover.tsx +775 -0
  1112. package/src/backend/dynamic-table/components/ColumnHeaderMenu.tsx +189 -0
  1113. package/src/backend/dynamic-table/components/ColumnHeaders.tsx +867 -0
  1114. package/src/backend/dynamic-table/components/CompactLabelCell.tsx +293 -0
  1115. package/src/backend/dynamic-table/components/ConfigureViewFields.tsx +173 -0
  1116. package/src/backend/dynamic-table/components/ConfigureViewFilters.tsx +346 -0
  1117. package/src/backend/dynamic-table/components/ConfigureViewFormatting.tsx +205 -0
  1118. package/src/backend/dynamic-table/components/ConfigureViewFormulas.tsx +423 -0
  1119. package/src/backend/dynamic-table/components/ConfigureViewGrouping.tsx +264 -0
  1120. package/src/backend/dynamic-table/components/ConfigureViewLinkedColumns.tsx +249 -0
  1121. package/src/backend/dynamic-table/components/ConfigureViewPanel.tsx +857 -0
  1122. package/src/backend/dynamic-table/components/ConfigureViewRollups.tsx +364 -0
  1123. package/src/backend/dynamic-table/components/ConfigureViewSorting.tsx +121 -0
  1124. package/src/backend/dynamic-table/components/ContextMenu.tsx +140 -0
  1125. package/src/backend/dynamic-table/components/DateCell.tsx +205 -0
  1126. package/src/backend/dynamic-table/components/Debugger.tsx +340 -0
  1127. package/src/backend/dynamic-table/components/DensityControl.tsx +441 -0
  1128. package/src/backend/dynamic-table/components/EmptyState.tsx +103 -0
  1129. package/src/backend/dynamic-table/components/EntitySearchEditor.tsx +528 -0
  1130. package/src/backend/dynamic-table/components/ExportMenu.tsx +90 -0
  1131. package/src/backend/dynamic-table/components/FilterDatePicker.tsx +194 -0
  1132. package/src/backend/dynamic-table/components/FilterValueInput.tsx +294 -0
  1133. package/src/backend/dynamic-table/components/FooterTotalsRow.tsx +291 -0
  1134. package/src/backend/dynamic-table/components/FullscreenOverlay.tsx +66 -0
  1135. package/src/backend/dynamic-table/components/GroupHeaderRow.tsx +136 -0
  1136. package/src/backend/dynamic-table/components/GroupSummaryRow.tsx +184 -0
  1137. package/src/backend/dynamic-table/components/ImportPanel.tsx +445 -0
  1138. package/src/backend/dynamic-table/components/ImportPreviewGrid.tsx +155 -0
  1139. package/src/backend/dynamic-table/components/LoadErrorState.tsx +70 -0
  1140. package/src/backend/dynamic-table/components/MentionPopup.tsx +224 -0
  1141. package/src/backend/dynamic-table/components/PerspectiveDeleteDialog.tsx +96 -0
  1142. package/src/backend/dynamic-table/components/PerspectivePublishDialog.tsx +152 -0
  1143. package/src/backend/dynamic-table/components/PerspectiveTabMenu.tsx +215 -0
  1144. package/src/backend/dynamic-table/components/PerspectiveTabs.tsx +426 -0
  1145. package/src/backend/dynamic-table/components/PerspectiveTemplateMenu.tsx +135 -0
  1146. package/src/backend/dynamic-table/components/RowHeaderCell.tsx +73 -0
  1147. package/src/backend/dynamic-table/components/SearchBar.tsx +309 -0
  1148. package/src/backend/dynamic-table/components/SelectMenu.tsx +237 -0
  1149. package/src/backend/dynamic-table/components/StaleDataBar.tsx +74 -0
  1150. package/src/backend/dynamic-table/components/TableDeleteDialog.tsx +74 -0
  1151. package/src/backend/dynamic-table/components/TablePagination.tsx +96 -0
  1152. package/src/backend/dynamic-table/components/TableSkeleton.tsx +123 -0
  1153. package/src/backend/dynamic-table/components/ToolbarOverflow.tsx +284 -0
  1154. package/src/backend/dynamic-table/components/ViewModeSwitch.tsx +92 -0
  1155. package/src/backend/dynamic-table/components/VirtualRow.tsx +346 -0
  1156. package/src/backend/dynamic-table/components/editors.tsx +1727 -0
  1157. package/src/backend/dynamic-table/components/renderers.tsx +162 -0
  1158. package/src/backend/dynamic-table/events/events.ts +107 -0
  1159. package/src/backend/dynamic-table/formula/check.ts +359 -0
  1160. package/src/backend/dynamic-table/formula/evaluate.ts +473 -0
  1161. package/src/backend/dynamic-table/formula/functions.ts +737 -0
  1162. package/src/backend/dynamic-table/formula/index.ts +57 -0
  1163. package/src/backend/dynamic-table/formula/parse.ts +414 -0
  1164. package/src/backend/dynamic-table/formula/types.ts +151 -0
  1165. package/src/backend/dynamic-table/handlers/cellWrites.ts +362 -0
  1166. package/src/backend/dynamic-table/handlers/index.ts +789 -0
  1167. package/src/backend/dynamic-table/handlers/perspectiveHandlers.ts +684 -0
  1168. package/src/backend/dynamic-table/hooks/index.ts +888 -0
  1169. package/src/backend/dynamic-table/hooks/useAbbreviations.ts +67 -0
  1170. package/src/backend/dynamic-table/hooks/useAnnotations.ts +215 -0
  1171. package/src/backend/dynamic-table/hooks/useColumnVirtualizer.ts +303 -0
  1172. package/src/backend/dynamic-table/hooks/useColumnWidthPersistence.ts +214 -0
  1173. package/src/backend/dynamic-table/hooks/useDensityPreference.ts +451 -0
  1174. package/src/backend/dynamic-table/hooks/useDynamicTablePage.tsx +1681 -0
  1175. package/src/backend/dynamic-table/hooks/useEscapeLayer.ts +72 -0
  1176. package/src/backend/dynamic-table/hooks/useGrouping.ts +428 -0
  1177. package/src/backend/dynamic-table/hooks/useSuggestionFetch.ts +109 -0
  1178. package/src/backend/dynamic-table/hooks/useTableDateFormat.tsx +19 -0
  1179. package/src/backend/dynamic-table/index.ts +497 -0
  1180. package/src/backend/dynamic-table/registry/ContentRegistryContext.tsx +244 -0
  1181. package/src/backend/dynamic-table/registry/TableRegistryContext.tsx +84 -0
  1182. package/src/backend/dynamic-table/registry/filterAccessibleTables.ts +36 -0
  1183. package/src/backend/dynamic-table/registry/index.ts +38 -0
  1184. package/src/backend/dynamic-table/registry/lazyTable.tsx +80 -0
  1185. package/src/backend/dynamic-table/registry/types.ts +181 -0
  1186. package/src/backend/dynamic-table/registry/widgetCatalog.ts +226 -0
  1187. package/src/backend/dynamic-table/server/aggregate.ts +474 -0
  1188. package/src/backend/dynamic-table/server/dateWindows.ts +201 -0
  1189. package/src/backend/dynamic-table/server/filterParser.ts +132 -0
  1190. package/src/backend/dynamic-table/server/filterSuggestions.ts +150 -0
  1191. package/src/backend/dynamic-table/server/index.ts +47 -0
  1192. package/src/backend/dynamic-table/server/makeDynamicTableRoute.ts +426 -0
  1193. package/src/backend/dynamic-table/split-view/ContentPicker.tsx +251 -0
  1194. package/src/backend/dynamic-table/split-view/EmptySlot.tsx +69 -0
  1195. package/src/backend/dynamic-table/split-view/SplitViewHost.tsx +1336 -0
  1196. package/src/backend/dynamic-table/split-view/WidgetPane.tsx +390 -0
  1197. package/src/backend/dynamic-table/split-view/WorkspaceFilterBar.tsx +728 -0
  1198. package/src/backend/dynamic-table/split-view/index.ts +48 -0
  1199. package/src/backend/dynamic-table/split-view/layoutPersistence.ts +185 -0
  1200. package/src/backend/dynamic-table/split-view/sharedCriteria.ts +196 -0
  1201. package/src/backend/dynamic-table/split-view/types.ts +778 -0
  1202. package/src/backend/dynamic-table/split-view/useSplitViewLayouts.ts +97 -0
  1203. package/src/backend/dynamic-table/store/index.ts +1011 -0
  1204. package/src/backend/dynamic-table/styles/ContextMenu.css +387 -0
  1205. package/src/backend/dynamic-table/styles/DynamicTable.css +3659 -0
  1206. package/src/backend/dynamic-table/styles/DynamicTable.v2.css +2651 -0
  1207. package/src/backend/dynamic-table/styles/SearchBar.css +426 -0
  1208. package/src/backend/dynamic-table/styles/dateCell.css +146 -0
  1209. package/src/backend/dynamic-table/styles/density.css +690 -0
  1210. package/src/backend/dynamic-table/types/density.ts +179 -0
  1211. package/src/backend/dynamic-table/types/filters.ts +156 -0
  1212. package/src/backend/dynamic-table/types/grouping.ts +189 -0
  1213. package/src/backend/dynamic-table/types/import.ts +132 -0
  1214. package/src/backend/dynamic-table/types/index.ts +1198 -0
  1215. package/src/backend/dynamic-table/types/perspective.ts +436 -0
  1216. package/src/backend/dynamic-table/types/rollup.ts +111 -0
  1217. package/src/backend/dynamic-table/utils/abbreviations.ts +556 -0
  1218. package/src/backend/dynamic-table/utils/anchoredPosition.ts +106 -0
  1219. package/src/backend/dynamic-table/utils/badgeAutoFit.ts +108 -0
  1220. package/src/backend/dynamic-table/utils/clipboard.ts +294 -0
  1221. package/src/backend/dynamic-table/utils/coerceCellValue.ts +96 -0
  1222. package/src/backend/dynamic-table/utils/colorAdjacency.ts +87 -0
  1223. package/src/backend/dynamic-table/utils/columnFill.ts +93 -0
  1224. package/src/backend/dynamic-table/utils/columnSpacerStyle.ts +53 -0
  1225. package/src/backend/dynamic-table/utils/columnWindow.ts +668 -0
  1226. package/src/backend/dynamic-table/utils/conditionalFormat.ts +300 -0
  1227. package/src/backend/dynamic-table/utils/exportTable.ts +140 -0
  1228. package/src/backend/dynamic-table/utils/fillGeometry.ts +187 -0
  1229. package/src/backend/dynamic-table/utils/fillPatterns.ts +422 -0
  1230. package/src/backend/dynamic-table/utils/formatAggregate.ts +145 -0
  1231. package/src/backend/dynamic-table/utils/formatDateCompact.ts +879 -0
  1232. package/src/backend/dynamic-table/utils/formatLabelCompact.ts +640 -0
  1233. package/src/backend/dynamic-table/utils/formulaColumns.tsx +237 -0
  1234. package/src/backend/dynamic-table/utils/importMapping.ts +202 -0
  1235. package/src/backend/dynamic-table/utils/importParse.ts +220 -0
  1236. package/src/backend/dynamic-table/utils/lookupColumns.tsx +47 -0
  1237. package/src/backend/dynamic-table/utils/perspectiveTransforms.ts +368 -0
  1238. package/src/backend/dynamic-table/utils/rollupColumns.ts +162 -0
  1239. package/src/backend/dynamic-table/validators/index.ts +40 -0
  1240. package/src/backend/fields/registry.generated.ts +8 -0
  1241. package/src/backend/fields/registry.ts +38 -0
  1242. package/src/backend/filters/AdvancedFilterBuilder.tsx +339 -0
  1243. package/src/backend/forms/ActionsDropdown.tsx +198 -0
  1244. package/src/backend/forms/FormActionButtons.tsx +98 -0
  1245. package/src/backend/forms/FormFooter.tsx +27 -0
  1246. package/src/backend/forms/FormHeader.tsx +204 -0
  1247. package/src/backend/forms/index.ts +4 -0
  1248. package/src/backend/hooks/useAdvancedFilter.ts +77 -0
  1249. package/src/backend/indexes/PartialIndexBanner.tsx +86 -0
  1250. package/src/backend/indexes/store.ts +88 -0
  1251. package/src/backend/injection/ComponentOverrideProvider.tsx +66 -0
  1252. package/src/backend/injection/InjectedField.tsx +196 -0
  1253. package/src/backend/injection/InjectionSpot.tsx +457 -0
  1254. package/src/backend/injection/InjectionWizard.tsx +335 -0
  1255. package/src/backend/injection/PageInjectionBoundary.tsx +31 -0
  1256. package/src/backend/injection/SseEventIndicator.tsx +11 -0
  1257. package/src/backend/injection/StatusBadgeInjectionSpot.tsx +50 -0
  1258. package/src/backend/injection/StatusBadgeRenderer.tsx +100 -0
  1259. package/src/backend/injection/WidgetSharedState.ts +58 -0
  1260. package/src/backend/injection/WizardInjectionSpot.tsx +46 -0
  1261. package/src/backend/injection/eventBridge.ts +158 -0
  1262. package/src/backend/injection/helpers.ts +35 -0
  1263. package/src/backend/injection/mergeMenuItems.ts +80 -0
  1264. package/src/backend/injection/mutationEvents.ts +22 -0
  1265. package/src/backend/injection/resolveInjectedIcon.tsx +30 -0
  1266. package/src/backend/injection/spotIds.ts +64 -0
  1267. package/src/backend/injection/useAppEvent.ts +76 -0
  1268. package/src/backend/injection/useGuardedMutation.ts +101 -0
  1269. package/src/backend/injection/useInjectedMenuItems.ts +67 -0
  1270. package/src/backend/injection/useInjectionDataWidgets.ts +41 -0
  1271. package/src/backend/injection/useOperationProgress.ts +105 -0
  1272. package/src/backend/injection/useRegisteredComponent.tsx +106 -0
  1273. package/src/backend/injection/useWidgetSharedState.ts +28 -0
  1274. package/src/backend/injection/visibility-utils.ts +31 -0
  1275. package/src/backend/injection/widgetRegistry.ts +68 -0
  1276. package/src/backend/inputs/ComboboxInput.tsx +272 -0
  1277. package/src/backend/inputs/DatePicker.tsx +162 -0
  1278. package/src/backend/inputs/DateTimePicker.tsx +199 -0
  1279. package/src/backend/inputs/EventPatternInput.tsx +46 -0
  1280. package/src/backend/inputs/EventSelect.tsx +183 -0
  1281. package/src/backend/inputs/LookupSelect.tsx +253 -0
  1282. package/src/backend/inputs/PhoneNumberField.tsx +166 -0
  1283. package/src/backend/inputs/SwitchableMarkdownInput.tsx +106 -0
  1284. package/src/backend/inputs/TagsInput.tsx +297 -0
  1285. package/src/backend/inputs/TimeInput.tsx +146 -0
  1286. package/src/backend/inputs/TimePicker.tsx +120 -0
  1287. package/src/backend/inputs/__tests__/DatePicker.test.tsx +76 -0
  1288. package/src/backend/inputs/__tests__/DateTimePicker.logic.test.ts +126 -0
  1289. package/src/backend/inputs/__tests__/PhoneNumberField.test.tsx +73 -0
  1290. package/src/backend/inputs/__tests__/TagsInput.test.tsx +78 -0
  1291. package/src/backend/inputs/__tests__/TimeInput.test.tsx +134 -0
  1292. package/src/backend/inputs/__tests__/TimePicker.test.tsx +50 -0
  1293. package/src/backend/inputs/index.ts +11 -0
  1294. package/src/backend/markdown/MarkdownContent.tsx +33 -0
  1295. package/src/backend/markdown/index.ts +2 -0
  1296. package/src/backend/markdown/useMarkdownRemarkPlugins.ts +39 -0
  1297. package/src/backend/messages/MessageComposer.tsx +197 -0
  1298. package/src/backend/messages/MessageObjectDetail.tsx +95 -0
  1299. package/src/backend/messages/MessageObjectPreview.tsx +64 -0
  1300. package/src/backend/messages/MessageObjectRecordPicker.tsx +149 -0
  1301. package/src/backend/messages/MessagePrioritySelector.tsx +78 -0
  1302. package/src/backend/messages/MessagesIcon.tsx +32 -0
  1303. package/src/backend/messages/SendObjectMessageDialog.tsx +74 -0
  1304. package/src/backend/messages/__tests__/MessageComposer.test.tsx +350 -0
  1305. package/src/backend/messages/__tests__/SendObjectMessageDialog.test.tsx +77 -0
  1306. package/src/backend/messages/index.ts +22 -0
  1307. package/src/backend/messages/message-compose-form-groups.tsx +383 -0
  1308. package/src/backend/messages/message-composer.types.ts +82 -0
  1309. package/src/backend/messages/message-priority.ts +53 -0
  1310. package/src/backend/messages/useMessageCompose.ts +666 -0
  1311. package/src/backend/messages/useMessageComposeOperations.ts +259 -0
  1312. package/src/backend/messages/useMessagesPoll.ts +118 -0
  1313. package/src/backend/notifications/NotificationBell.tsx +91 -0
  1314. package/src/backend/notifications/NotificationCountBadge.tsx +14 -0
  1315. package/src/backend/notifications/NotificationDispatcher.ts +213 -0
  1316. package/src/backend/notifications/NotificationItem.tsx +262 -0
  1317. package/src/backend/notifications/NotificationPanel.tsx +225 -0
  1318. package/src/backend/notifications/__tests__/NotificationCountBadge.test.tsx +34 -0
  1319. package/src/backend/notifications/index.ts +20 -0
  1320. package/src/backend/notifications/useNotificationActions.ts +161 -0
  1321. package/src/backend/notifications/useNotificationEffect.ts +17 -0
  1322. package/src/backend/notifications/useNotifications.ts +12 -0
  1323. package/src/backend/notifications/useNotificationsPoll.ts +167 -0
  1324. package/src/backend/notifications/useNotificationsSse.ts +220 -0
  1325. package/src/backend/operations/LastOperationBanner.tsx +85 -0
  1326. package/src/backend/operations/__tests__/LastOperationBanner.test.tsx +101 -0
  1327. package/src/backend/operations/store.ts +230 -0
  1328. package/src/backend/progress/ProgressTopBar.tsx +189 -0
  1329. package/src/backend/progress/useProgress.ts +12 -0
  1330. package/src/backend/progress/useProgressPoll.ts +100 -0
  1331. package/src/backend/progress/useProgressSse.ts +118 -0
  1332. package/src/backend/schedule/ScheduleAgenda.tsx +136 -0
  1333. package/src/backend/schedule/ScheduleGrid.tsx +136 -0
  1334. package/src/backend/schedule/ScheduleToolbar.tsx +178 -0
  1335. package/src/backend/schedule/ScheduleView.tsx +201 -0
  1336. package/src/backend/schedule/index.ts +5 -0
  1337. package/src/backend/schedule/recurrence.ts +99 -0
  1338. package/src/backend/schedule/types.ts +26 -0
  1339. package/src/backend/section-page/SectionNav.tsx +140 -0
  1340. package/src/backend/section-page/SectionPage.tsx +34 -0
  1341. package/src/backend/section-page/index.ts +3 -0
  1342. package/src/backend/section-page/types.ts +30 -0
  1343. package/src/backend/settings/SettingsNavigation.tsx +74 -0
  1344. package/src/backend/settings/SettingsPageWrapper.tsx +78 -0
  1345. package/src/backend/settings/index.ts +3 -0
  1346. package/src/backend/upgrades/UpgradeActionBanner.tsx +128 -0
  1347. package/src/backend/utils/__tests__/api.scoped-headers.test.ts +58 -0
  1348. package/src/backend/utils/__tests__/api.test.ts +148 -0
  1349. package/src/backend/utils/__tests__/apiCall.scoped-request-headers.test.ts +58 -0
  1350. package/src/backend/utils/__tests__/apiCall.test.ts +109 -0
  1351. package/src/backend/utils/__tests__/crud.test.ts +87 -0
  1352. package/src/backend/utils/__tests__/customFieldDefs.test.ts +25 -0
  1353. package/src/backend/utils/__tests__/customFieldValues.test.ts +35 -0
  1354. package/src/backend/utils/__tests__/richTextSanitizer.test.ts +57 -0
  1355. package/src/backend/utils/api.ts +214 -0
  1356. package/src/backend/utils/apiCall.ts +123 -0
  1357. package/src/backend/utils/crud.ts +174 -0
  1358. package/src/backend/utils/customFieldColumns.ts +118 -0
  1359. package/src/backend/utils/customFieldDefs.ts +247 -0
  1360. package/src/backend/utils/customFieldFilters.ts +174 -0
  1361. package/src/backend/utils/customFieldForms.ts +203 -0
  1362. package/src/backend/utils/customFieldRelationDisplay.ts +302 -0
  1363. package/src/backend/utils/customFieldValues.ts +41 -0
  1364. package/src/backend/utils/flash.ts +17 -0
  1365. package/src/backend/utils/nav.ts +402 -0
  1366. package/src/backend/utils/richTextSanitizer.ts +7 -0
  1367. package/src/backend/utils/scopedHeaderStack.ts +49 -0
  1368. package/src/backend/utils/serverErrors.ts +313 -0
  1369. package/src/backend/utils/useAutoDiscoveredFields.ts +138 -0
  1370. package/src/backend/version-history/VersionHistoryAction.tsx +76 -0
  1371. package/src/backend/version-history/VersionHistoryDetail.tsx +87 -0
  1372. package/src/backend/version-history/VersionHistoryPanel.tsx +331 -0
  1373. package/src/backend/version-history/index.ts +9 -0
  1374. package/src/backend/version-history/labels.ts +56 -0
  1375. package/src/backend/version-history/types.ts +27 -0
  1376. package/src/backend/version-history/useAuditPermissions.ts +94 -0
  1377. package/src/backend/version-history/useVersionHistory.ts +173 -0
  1378. package/src/backend/views/NewViewForm.tsx +54 -0
  1379. package/src/backend/views/ShareForm.tsx +62 -0
  1380. package/src/backend/views/ViewChip.tsx +123 -0
  1381. package/src/backend/views/ViewChipMenu.tsx +94 -0
  1382. package/src/backend/views/types.ts +4 -0
  1383. package/src/frontend/AuthFooter.tsx +29 -0
  1384. package/src/frontend/LanguageSwitcher.tsx +66 -0
  1385. package/src/frontend/Layout.tsx +13 -0
  1386. package/src/hooks/useIsMobile.ts +27 -0
  1387. package/src/index.ts +40 -0
  1388. package/src/portal/PortalContext.tsx +180 -0
  1389. package/src/portal/PortalLayoutProvider.tsx +5 -0
  1390. package/src/portal/PortalLayoutShell.tsx +64 -0
  1391. package/src/portal/PortalShell.tsx +370 -0
  1392. package/src/portal/components/PortalCard.tsx +77 -0
  1393. package/src/portal/components/PortalEmptyState.tsx +32 -0
  1394. package/src/portal/components/PortalFeatureCard.tsx +41 -0
  1395. package/src/portal/components/PortalNotificationBell.tsx +81 -0
  1396. package/src/portal/components/PortalNotificationPanel.tsx +230 -0
  1397. package/src/portal/components/PortalPageHeader.tsx +33 -0
  1398. package/src/portal/components/index.ts +6 -0
  1399. package/src/portal/hooks/useCustomerAuth.ts +97 -0
  1400. package/src/portal/hooks/usePortalAppEvent.ts +56 -0
  1401. package/src/portal/hooks/usePortalDashboardWidgets.ts +50 -0
  1402. package/src/portal/hooks/usePortalEventBridge.ts +162 -0
  1403. package/src/portal/hooks/usePortalInjectedMenuItems.ts +130 -0
  1404. package/src/portal/hooks/usePortalNotifications.ts +116 -0
  1405. package/src/portal/hooks/useTenantContext.ts +83 -0
  1406. package/src/primitives/DataLoader.tsx +93 -0
  1407. package/src/primitives/ErrorNotice.tsx +17 -0
  1408. package/src/primitives/Notice.tsx +83 -0
  1409. package/src/primitives/alert.tsx +59 -0
  1410. package/src/primitives/badge.tsx +43 -0
  1411. package/src/primitives/button.tsx +60 -0
  1412. package/src/primitives/calendar.tsx +69 -0
  1413. package/src/primitives/card.tsx +92 -0
  1414. package/src/primitives/checkbox.tsx +34 -0
  1415. package/src/primitives/dialog.tsx +122 -0
  1416. package/src/primitives/form-field.tsx +106 -0
  1417. package/src/primitives/icon-button.tsx +48 -0
  1418. package/src/primitives/input.tsx +26 -0
  1419. package/src/primitives/label.tsx +18 -0
  1420. package/src/primitives/popover.tsx +37 -0
  1421. package/src/primitives/primitives.stories.tsx +223 -0
  1422. package/src/primitives/progress.tsx +28 -0
  1423. package/src/primitives/separator.tsx +7 -0
  1424. package/src/primitives/sheet.tsx +137 -0
  1425. package/src/primitives/spinner.tsx +27 -0
  1426. package/src/primitives/status-badge.tsx +62 -0
  1427. package/src/primitives/switch.tsx +92 -0
  1428. package/src/primitives/table.tsx +27 -0
  1429. package/src/primitives/tabs.tsx +131 -0
  1430. package/src/primitives/textarea.tsx +20 -0
  1431. package/src/primitives/tooltip.tsx +85 -0
  1432. package/src/primitives-v2/AGENTS.md +66 -0
  1433. package/src/primitives-v2/Alert.stories.tsx +56 -0
  1434. package/src/primitives-v2/Alert.tsx +108 -0
  1435. package/src/primitives-v2/Avatar.stories.tsx +60 -0
  1436. package/src/primitives-v2/Avatar.tsx +139 -0
  1437. package/src/primitives-v2/Badge.stories.tsx +80 -0
  1438. package/src/primitives-v2/Badge.tsx +99 -0
  1439. package/src/primitives-v2/Breadcrumb.stories.tsx +61 -0
  1440. package/src/primitives-v2/Breadcrumb.tsx +96 -0
  1441. package/src/primitives-v2/Button.stories.tsx +72 -0
  1442. package/src/primitives-v2/Button.tsx +178 -0
  1443. package/src/primitives-v2/Checkbox.stories.tsx +34 -0
  1444. package/src/primitives-v2/Checkbox.tsx +103 -0
  1445. package/src/primitives-v2/IconButton.stories.tsx +40 -0
  1446. package/src/primitives-v2/IconButton.tsx +40 -0
  1447. package/src/primitives-v2/Input.stories.tsx +60 -0
  1448. package/src/primitives-v2/Input.tsx +113 -0
  1449. package/src/primitives-v2/NavGroup.stories.tsx +50 -0
  1450. package/src/primitives-v2/NavGroup.tsx +76 -0
  1451. package/src/primitives-v2/NavItem.stories.tsx +68 -0
  1452. package/src/primitives-v2/NavItem.tsx +105 -0
  1453. package/src/primitives-v2/SearchInput.stories.tsx +44 -0
  1454. package/src/primitives-v2/SearchInput.tsx +123 -0
  1455. package/src/primitives-v2/Sidebar.stories.tsx +91 -0
  1456. package/src/primitives-v2/Sidebar.tsx +92 -0
  1457. package/src/primitives-v2/Tab.stories.tsx +62 -0
  1458. package/src/primitives-v2/Tab.tsx +148 -0
  1459. package/src/primitives-v2/Tag.stories.tsx +123 -0
  1460. package/src/primitives-v2/Tag.tsx +115 -0
  1461. package/src/primitives-v2/Toggle.stories.tsx +37 -0
  1462. package/src/primitives-v2/Toggle.tsx +93 -0
  1463. package/src/primitives-v2/Topbar.stories.tsx +65 -0
  1464. package/src/primitives-v2/Topbar.tsx +37 -0
  1465. package/src/primitives-v2/index.ts +31 -0
  1466. package/src/primitives-v2/utils.ts +9 -0
  1467. package/src/theme/BrandThemeProvider.tsx +122 -0
  1468. package/src/theme/QueryProvider.tsx +46 -0
  1469. package/src/theme/ThemeProvider.tsx +120 -0
  1470. package/src/theme/ThemeToggle.tsx +88 -0
  1471. package/src/theme/index.ts +4 -0
  1472. package/src/theme/m3.css +622 -0
  1473. package/src/theme/tokens.v2.css +559 -0
  1474. package/src/theme/typography.css +163 -0
  1475. package/src/theme/typography.stories.tsx +157 -0
  1476. package/src/theme/typography.tokens.ts +326 -0
  1477. package/src/types/react-big-calendar.d.ts +16 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 { cn } from '@open-mercato/shared/lib/utils'\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'\nimport { sanitizeHtmlRichText, sanitizeRichTextHref, sanitizeRichTextPasteContent } from './utils/richTextSanitizer'\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\nfunction resolveInternalNavigationTarget(target: string | URL | null | undefined): string | null {\n if (typeof window === 'undefined' || target == null) return null\n try {\n const url = target instanceof URL ? target : new URL(target, window.location.origin)\n if (url.origin !== window.location.origin) return null\n const currentPath = `${window.location.pathname}${window.location.search}`\n const nextPath = `${url.pathname}${url.search}`\n if (nextPath === currentPath) return null\n return `${url.pathname}${url.search}${url.hash}`\n } catch {\n return null\n }\n}\n\nfunction buildResolvedEntityIdsKey(entityId?: string, entityIds?: string[]): string {\n const dedup = new Set<string>()\n const list: string[] = []\n\n if (Array.isArray(entityIds) && entityIds.length) {\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 } else if (typeof entityId === 'string' && entityId.trim().length > 0) {\n list.push(entityId.trim())\n }\n\n return list.join('\\0')\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 defaultValue?: unknown\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 CrudFormSubmitContext = {\n submitter?: {\n id?: string\n name?: string\n value?: string\n dataset: Record<string, string>\n }\n}\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, context?: CrudFormSubmitContext) => 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 readOnly?: boolean\n readOnlyOverlay?: 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\nfunction serializeIssuePath(path: ReadonlyArray<string | number | symbol>): string | null {\n if (!Array.isArray(path) || path.length === 0) return null\n const segments = path\n .map((segment) => {\n if (typeof segment === 'string' || typeof segment === 'number') {\n const normalized = String(segment).trim()\n return normalized.length > 0 ? normalized : null\n }\n return null\n })\n .filter((segment): segment is string => segment !== null)\n return segments.length > 0 ? segments.join('.') : null\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\nclass FieldDefinitionsManagerErrorBoundary extends React.Component<\n { children: React.ReactNode; onClose: () => void; unavailableMessage: string },\n { hasError: boolean }\n> {\n constructor(props: { children: React.ReactNode; onClose: () => void; unavailableMessage: string }) {\n super(props)\n this.state = { hasError: false }\n }\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 p-6 text-sm text-muted-foreground\">\n <p>{this.props.unavailableMessage}</p>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={this.props.onClose}>\n Close\n </Button>\n </div>\n )\n }\n return this.props.children\n }\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 readOnly = false,\n readOnlyOverlay,\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 hasVersionHistory = Boolean(versionHistory?.resourceKind)\n const deleteConfirmMessage = hasVersionHistory\n ? t('ui.forms.confirmDeleteWithUndo', 'Delete this record? You can restore it using version history.')\n : 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 formReadOnly = Boolean(readOnly)\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 resolvedEntityIdsKey = React.useMemo(() => buildResolvedEntityIdsKey(entityId, entityIds), [entityId, entityIds])\n const resolvedEntityIds = React.useMemo(\n () => (resolvedEntityIdsKey ? resolvedEntityIdsKey.split('\\0') : []),\n [resolvedEntityIdsKey],\n )\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 isDirtyRef = React.useRef(false)\n const navigationPromptBypassRef = React.useRef(false)\n const navigationConfirmPendingRef = React.useRef(false)\n const submitNavigationBypassRef = React.useRef(false)\n const submitNavigationBypassTimeoutRef = React.useRef<number | null>(null)\n const [hasUnsavedChanges, setHasUnsavedChanges] = React.useState(false)\n const popStateRollbackRef = React.useRef(false)\n\n React.useEffect(() => {\n if (embedded) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n const snapshot = dirtyBaselineSnapshotRef.current\n if (!snapshot) {\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n return\n }\n const currentSnapshot = JSON.stringify(values)\n const dirty = currentSnapshot !== snapshot\n isDirtyRef.current = dirty\n setHasUnsavedChanges(dirty)\n }, [embedded, values])\n\n const allowNextNavigation = React.useCallback(() => {\n navigationPromptBypassRef.current = true\n if (typeof window !== 'undefined') {\n window.setTimeout(() => {\n navigationPromptBypassRef.current = false\n }, 0)\n }\n }, [])\n\n const clearSubmitNavigationBypass = React.useCallback(() => {\n submitNavigationBypassRef.current = false\n if (typeof window !== 'undefined' && submitNavigationBypassTimeoutRef.current !== null) {\n window.clearTimeout(submitNavigationBypassTimeoutRef.current)\n submitNavigationBypassTimeoutRef.current = null\n }\n }, [])\n\n const keepSubmitNavigationBypassAlive = React.useCallback(() => {\n if (typeof window === 'undefined') return\n submitNavigationBypassRef.current = true\n if (submitNavigationBypassTimeoutRef.current !== null) {\n window.clearTimeout(submitNavigationBypassTimeoutRef.current)\n }\n submitNavigationBypassTimeoutRef.current = window.setTimeout(() => {\n submitNavigationBypassRef.current = false\n submitNavigationBypassTimeoutRef.current = null\n }, 1500)\n }, [])\n\n React.useEffect(() => {\n return () => {\n clearSubmitNavigationBypass()\n }\n }, [clearSubmitNavigationBypass])\n\n const clearDirtyState = React.useCallback((snapshotSource?: Record<string, unknown>) => {\n const source = snapshotSource ?? (valuesRef.current as Record<string, unknown>)\n dirtyBaselineSnapshotRef.current = JSON.stringify(source)\n isDirtyRef.current = false\n setHasUnsavedChanges(false)\n }, [])\n\n const confirmUnsavedChanges = React.useCallback(async (): Promise<boolean> => {\n if (!isDirtyRef.current || typeof window === 'undefined') return true\n if (navigationPromptBypassRef.current || submitNavigationBypassRef.current) return true\n if (navigationConfirmPendingRef.current) return false\n navigationConfirmPendingRef.current = true\n try {\n const confirmed = await confirm({\n title: t('ui.forms.confirmUnsavedChanges', 'You have unsaved changes. Are you sure you want to leave?'),\n })\n if (confirmed) allowNextNavigation()\n return confirmed\n } finally {\n navigationConfirmPendingRef.current = false\n }\n }, [allowNextNavigation, confirm, t])\n\n React.useEffect(() => {\n if (embedded || !hasUnsavedChanges) return\n const beforeUnloadHandler = (event: BeforeUnloadEvent) => {\n if (!isDirtyRef.current) return\n event.preventDefault()\n event.returnValue = ''\n }\n window.addEventListener('beforeunload', beforeUnloadHandler)\n\n const clickHandler = (event: MouseEvent) => {\n if (event.defaultPrevented) return\n if (!isDirtyRef.current) return\n const anchor = (event.target as HTMLElement)?.closest?.('a[href]') as HTMLAnchorElement | null\n if (!anchor) return\n const href = anchor.getAttribute('href')\n if (!href || href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:')) return\n if (anchor.target === '_blank' || event.metaKey || event.ctrlKey || event.shiftKey) return\n const target = resolveInternalNavigationTarget(href)\n if (!target) return\n event.preventDefault()\n event.stopPropagation()\n if (navigationConfirmPendingRef.current) return\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n router.push(target)\n })\n }\n document.addEventListener('click', clickHandler, true)\n\n const originalPushState = window.history.pushState.bind(window.history)\n const originalReplaceState = window.history.replaceState.bind(window.history)\n\n const createHistoryInterceptor = (original: History['pushState']): History['pushState'] =>\n ((data: unknown, unused: string, url?: string | URL | null) => {\n const target = resolveInternalNavigationTarget(url ?? null)\n if (!target || navigationPromptBypassRef.current || submitNavigationBypassRef.current) {\n return original(data, unused, url)\n }\n if (navigationConfirmPendingRef.current) {\n return undefined\n }\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n original(data, unused, url)\n })\n return undefined\n }) as History['pushState']\n\n const popStateHandler = () => {\n if (popStateRollbackRef.current) {\n popStateRollbackRef.current = false\n return\n }\n if (!isDirtyRef.current || navigationPromptBypassRef.current || submitNavigationBypassRef.current) return\n popStateRollbackRef.current = true\n window.history.go(1)\n if (navigationConfirmPendingRef.current) return\n void confirmUnsavedChanges().then((confirmed) => {\n if (!confirmed) return\n clearDirtyState()\n allowNextNavigation()\n window.history.back()\n })\n }\n\n window.history.pushState = createHistoryInterceptor(originalPushState)\n window.history.replaceState = createHistoryInterceptor(originalReplaceState)\n window.addEventListener('popstate', popStateHandler)\n\n return () => {\n window.removeEventListener('beforeunload', beforeUnloadHandler)\n document.removeEventListener('click', clickHandler, true)\n window.removeEventListener('popstate', popStateHandler)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [allowNextNavigation, clearDirtyState, confirmUnsavedChanges, embedded, hasUnsavedChanges, router])\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 mapDefsForValidation = React.useCallback(\n (definitions: CustomFieldDefDto[]): CustomFieldDefLike[] =>\n definitions.map((definition) => ({\n key: definition.key,\n kind: definition.kind,\n configJson: {\n validation: Array.isArray(definition.validation) ? definition.validation : [],\n },\n })),\n [],\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) {\n allowNextNavigation()\n router.push(target)\n }\n },\n [allowNextNavigation, 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 validateFieldOnBlur = React.useCallback(async (\n fieldId: string,\n sourceValues?: CrudFormValues<TValues>,\n ) => {\n if (formReadOnly) return\n const field = fieldById.get(fieldId)\n if (!field || field.disabled) return\n if (hiddenInjectedFieldIds.has(fieldId)) return\n\n const nextValues = sourceValues ?? valuesRef.current\n const nextFieldErrors: Record<string, string> = {}\n const requiredMessage = t('ui.forms.errors.required')\n const value = nextValues[fieldId]\n const isArray = Array.isArray(value)\n const isString = typeof value === 'string'\n const empty =\n value === undefined ||\n value === null ||\n (isString && value.trim() === '') ||\n (isArray && value.length === 0) ||\n (field.type === 'checkbox' && value !== true)\n\n if (field.required && empty) {\n nextFieldErrors[fieldId] = requiredMessage\n }\n\n const customFieldKey = customEntity\n ? cfDefinitions.some((definition) => definition.key === fieldId)\n ? fieldId\n : null\n : fieldId.startsWith('cf_')\n ? fieldId.replace(/^cf_/, '')\n : null\n\n if (!Object.keys(nextFieldErrors).length && customFieldKey) {\n const defsForField = cfDefinitions.filter((definition) => definition.key === customFieldKey)\n if (defsForField.length) {\n try {\n const { validateValuesAgainstDefs } = await import('@open-mercato/shared/modules/entities/validation')\n const validationResult = validateValuesAgainstDefs(\n { [customFieldKey]: value },\n mapDefsForValidation(defsForField),\n )\n if (!validationResult.ok) {\n const normalizedFieldErrors = customEntity\n ? Object.fromEntries(\n Object.entries(validationResult.fieldErrors).map(([key, message]) => [\n key.replace(/^cf_/, ''),\n String(message),\n ]),\n )\n : Object.fromEntries(\n Object.entries(validationResult.fieldErrors).map(([key, message]) => [key, String(message)]),\n )\n const transformedErrors = await transformValidationErrors(normalizedFieldErrors)\n Object.assign(nextFieldErrors, translateValidationErrors(transformedErrors))\n }\n } catch {\n // ignore client-side custom field validation if helper is unavailable\n }\n }\n }\n\n if (!Object.keys(nextFieldErrors).length && schema) {\n const widgetValues = { ...(nextValues 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 const result = schema.safeParse(coreValues)\n if (!result.success) {\n const schemaFieldErrors: Record<string, string> = {}\n result.error.issues.forEach((issue) => {\n const path = serializeIssuePath(issue.path)\n if (!path) return\n if (\n path === fieldId ||\n path.startsWith(`${fieldId}.`) ||\n fieldId.startsWith(`${path}.`)\n ) {\n schemaFieldErrors[path] = issue.message\n }\n })\n if (Object.keys(schemaFieldErrors).length) {\n const transformedErrors = await transformValidationErrors(schemaFieldErrors)\n Object.assign(nextFieldErrors, translateValidationErrors(transformedErrors))\n }\n }\n }\n\n setErrors((prev) => {\n const next = Object.fromEntries(\n Object.entries(prev).filter(([existingFieldId]) => !(\n existingFieldId === fieldId ||\n existingFieldId.startsWith(`${fieldId}.`) ||\n fieldId.startsWith(`${existingFieldId}.`)\n )),\n )\n for (const [key, message] of Object.entries(nextFieldErrors)) {\n next[key] = message\n }\n const same =\n Object.keys(next).length === Object.keys(prev).length &&\n Object.entries(next).every(([key, message]) => prev[key] === message)\n return same ? prev : next\n })\n }, [\n cfDefinitions,\n customEntity,\n fieldById,\n formReadOnly,\n hiddenInjectedFieldIds,\n injectedFieldIdSet,\n mapDefsForValidation,\n schema,\n t,\n transformValidationErrors,\n translateValidationErrors,\n ])\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 placedCustomFieldIds = React.useMemo(() => {\n const placed = new Set<string>()\n for (const other of (groups ?? [])) {\n if (other.kind === 'customFields' || !other.fields) continue\n for (const entry of other.fields) {\n if (typeof entry === 'string') placed.add(entry)\n else if (entry && typeof (entry as CrudField).id === 'string') placed.add((entry as CrudField).id)\n }\n }\n return placed\n }, [groups])\n\n const resolveGroupFields = React.useCallback((g: CrudFormGroup): CrudField[] => {\n if (g.kind === 'customFields') {\n return cfFields.filter((f) => !placedCustomFieldIds.has(f.id))\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, placedCustomFieldIds])\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 (formReadOnly) return\n if (typeof document === 'undefined') return\n const form = document.getElementById(formId) as HTMLFormElement | null\n form?.requestSubmit()\n }, [formId, formReadOnly])\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 || formReadOnly) {\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({ preventScroll: true })\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, formReadOnly, 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 valuesRef.current = nextData\n return nextData\n })\n const clearedMessages: string[] = []\n setErrors((prev) => {\n if (!Object.keys(prev).length) return prev\n let changed = false\n const nextEntries = Object.entries(prev).filter(([fieldId, message]) => {\n const shouldClear =\n fieldId === id ||\n fieldId.startsWith(`${id}.`) ||\n id.startsWith(`${fieldId}.`)\n if (shouldClear) {\n changed = true\n clearedMessages.push(message)\n }\n return !shouldClear\n })\n return changed ? Object.fromEntries(nextEntries) : prev\n })\n if (clearedMessages.length) {\n const highlightedMessage = t('ui.forms.errors.highlighted')\n const translatedMessages = new Set(\n clearedMessages\n .map((message) => translateValidationMessage(message))\n .filter((message) => message.trim().length > 0),\n )\n setFormError((prev) => {\n if (!prev) return prev\n const normalized = prev.trim()\n if (!normalized) return null\n if (normalized === highlightedMessage || translatedMessages.has(normalized)) {\n return null\n }\n return prev\n })\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, t, translateValidationMessage, 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 appliedInitialValuesSnapshotRef = React.useRef<string | undefined>(undefined)\n const dirtyBaselineSnapshotRef = React.useRef<string | undefined>(undefined)\n React.useLayoutEffect(() => {\n if (!initialValues) return\n const snapshot = JSON.stringify(initialValues)\n if (appliedInitialValuesSnapshotRef.current === snapshot) return\n appliedInitialValuesSnapshotRef.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 (mergedValues) {\n dirtyBaselineSnapshotRef.current = JSON.stringify(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 dirtyBaselineSnapshotRef.current = JSON.stringify(transformed as Record<string, unknown>)\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 // Apply custom field defaults on create flows (one-time, ref-guarded).\n // Mode is determined from the host-provided initialValues prop, not from\n // the reactive values.id (which lags on async-loading edit pages).\n // We also wait for isLoading to settle so async edit pages that start with\n // initialValues={} don't get mis-detected as create flows.\n const cfDefaultsAppliedRef = React.useRef(false)\n const initialValuesHasId = React.useMemo(() => {\n if (!initialValues) return false\n const raw = (initialValues as Record<string, unknown>).id\n return raw !== undefined && raw !== null && raw !== ''\n }, [initialValues])\n\n React.useEffect(() => {\n // Do not fire while the host is still loading the record\n if (isLoading) return\n // Edit flow: initialValues contains an id \u2014 never apply defaults\n if (initialValuesHasId) return\n // Wait until custom field definitions have loaded\n if (!cfDefinitions.length) return\n // One-shot guard: do not reapply if already done\n if (cfDefaultsAppliedRef.current) return\n cfDefaultsAppliedRef.current = true\n\n const defaults: Record<string, unknown> = {}\n const prefix = customEntity ? '' : 'cf_'\n for (const def of cfDefinitions) {\n if (def.defaultValue === undefined || def.defaultValue === null) continue\n const fieldId = `${prefix}${def.key}`\n defaults[fieldId] = def.defaultValue\n }\n\n if (Object.keys(defaults).length === 0) return\n\n let mergedValues: CrudFormValues<TValues> | null = null\n setValues((prev) => {\n const merged = { ...prev } as CrudFormValues<TValues>\n let applied = false\n for (const [fieldId, defaultVal] of Object.entries(defaults)) {\n // Skip if a value already exists (from initialValues or user input)\n if (merged[fieldId] !== undefined) continue\n ;(merged as Record<string, unknown>)[fieldId] = defaultVal\n applied = true\n }\n if (!applied) return prev\n mergedValues = merged\n return mergedValues\n })\n\n // Update the dirty baseline so the form doesn't appear dirty from defaults\n if (mergedValues) {\n dirtyBaselineSnapshotRef.current = JSON.stringify(mergedValues)\n }\n }, [isLoading, initialValuesHasId, cfDefinitions, customEntity])\n\n const markFormAsClean = React.useCallback((snapshotSource?: Record<string, unknown>) => {\n clearDirtyState(snapshotSource)\n }, [clearDirtyState])\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 if (formReadOnly) return\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 defs = cfDefinitions.length\n ? cfDefinitions\n : await import('./utils/customFieldDefs').then((mod) => 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 = mapDefsForValidation(defs)\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 = { ...(valuesRef.current 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 const path = serializeIssuePath(issue.path)\n if (path) fieldErrors[path] = 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 const nativeSubmitter = 'nativeEvent' in e ? (e.nativeEvent as SubmitEvent).submitter : null\n const submitContext: CrudFormSubmitContext | undefined =\n nativeSubmitter instanceof HTMLElement\n ? {\n submitter: {\n id: nativeSubmitter.id || undefined,\n name:\n 'name' in nativeSubmitter && typeof nativeSubmitter.name === 'string' && nativeSubmitter.name.trim().length > 0\n ? nativeSubmitter.name\n : undefined,\n value:\n 'value' in nativeSubmitter && typeof nativeSubmitter.value === 'string' && nativeSubmitter.value.trim().length > 0\n ? nativeSubmitter.value\n : undefined,\n dataset: Object.fromEntries(\n Object.entries(nativeSubmitter.dataset).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n ),\n },\n }\n : undefined\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 submitNavigationBypassRef.current = true\n if (injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0) {\n await withScopedApiRequestHeaders(injectionRequestHeaders, async () => {\n await onSubmit?.(coreSubmitValues, submitContext)\n })\n } else {\n await onSubmit?.(coreSubmitValues, submitContext)\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 markFormAsClean(valuesRef.current as Record<string, unknown>)\n keepSubmitNavigationBypassAlive()\n if (successRedirect) await navigateWithGuard(successRedirect)\n } catch (err: unknown) {\n clearSubmitNavigationBypass()\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 if (!hasFieldErrors) {\n flash(displayMessage, 'error')\n }\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 onBlurRequest={(fieldId) => { void validateFieldOnBlur(fieldId) }}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={!formReadOnly && 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 type=\"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 const visibleFields = placedCustomFieldIds.size > 0\n ? group.fields.filter((f) => !placedCustomFieldIds.has(f.id))\n : group.fields\n if (!visibleFields.length) return null\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(visibleFields)}\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 placedCustomFieldIds,\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 aria-describedby={undefined}\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 <FieldDefinitionsManagerErrorBoundary\n onClose={() => setFieldsetEditorTarget(null)}\n unavailableMessage={fieldsetDialogUnavailable}\n >\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 </FieldDefinitionsManagerErrorBoundary>\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 const handleReadOnlyFocusCapture = React.useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (!formReadOnly) return\n const target = event.target\n if (target instanceof HTMLElement) target.blur()\n }, [formReadOnly])\n\n const handleReadOnlyKeyDownCapture = React.useCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!formReadOnly) return\n event.preventDefault()\n }, [formReadOnly])\n\n const wrapFormBody = React.useCallback((children: React.ReactNode, className?: string) => {\n if (!formReadOnly) return children\n return (\n <div\n className={cn('relative', className)}\n onFocusCapture={handleReadOnlyFocusCapture}\n onKeyDownCapture={handleReadOnlyKeyDownCapture}\n >\n <div className=\"pointer-events-none select-none opacity-70\">\n {children}\n </div>\n <div className=\"absolute inset-0 z-10 flex items-start justify-center rounded-lg bg-background/60 p-4 backdrop-blur-[1px] sm:p-6\">\n {readOnlyOverlay ?? <div className=\"rounded-xl border border-border/70 bg-background/95 px-4 py-3 shadow-sm\" />}\n </div>\n </div>\n )\n }, [formReadOnly, handleReadOnlyFocusCapture, handleReadOnlyKeyDownCapture, readOnlyOverlay])\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: !formReadOnly && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: formReadOnly ? undefined : { 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 {wrapFormBody(\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 || formReadOnly}\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 && !Object.keys(errors).length ? <div className=\"text-sm text-red-600\">{formError}</div> : null}\n {hideFooterActions || formReadOnly ? 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 )}\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: !formReadOnly && showDelete,\n onDelete: handleDelete, // NOSONAR \u2014 async\u2192void assignment is valid TypeScript\n deleteLabel,\n cancelHref,\n cancelLabel,\n submit: formReadOnly ? undefined : { 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 {wrapFormBody(\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 || formReadOnly}\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 onBlurRequest={(fieldId) => { void validateFieldOnBlur(fieldId) }}\n values={values}\n loadFieldOptions={loadFieldOptions}\n autoFocus={!formReadOnly && 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 && !Object.keys(errors).length ? <div className=\"text-sm text-red-600\">{formError}</div> : null}\n {hideFooterActions || formReadOnly ? 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 )}\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 const commitIfChanged = React.useCallback(() => {\n if (local === value) return\n onChange(local)\n }, [local, onChange, value])\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 commitIfChanged()\n onSubmit?.()\n }\n }, [commitIfChanged, disabled, 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 commitIfChanged()\n }, [commitIfChanged])\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 serializedValue = value !== undefined && value !== null ? String(value) : ''\n const [local, setLocal] = React.useState<string>(serializedValue)\n const isFocusedRef = React.useRef(false)\n const commitIfChanged = React.useCallback(() => {\n if (local === serializedValue) return\n const numValue = local === '' ? undefined : Number(local)\n onChange(numValue)\n }, [local, onChange, serializedValue])\n \n React.useEffect(() => {\n // Only sync from props when not focused to avoid caret jumps\n if (!isFocusedRef.current) {\n setLocal(serializedValue)\n }\n }, [serializedValue])\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 commitIfChanged()\n onSubmit?.()\n }\n }, [commitIfChanged, onSubmit])\n \n const handleFocus = React.useCallback(() => {\n isFocusedRef.current = true\n }, [])\n \n const handleBlur = React.useCallback(() => {\n isFocusedRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\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 const commitIfChanged = React.useCallback(() => {\n if (local === value) return\n onChange(local)\n }, [local, onChange, value])\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(() => {\n isFocusedRef.current = false\n commitIfChanged()\n }, [commitIfChanged])\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 const sanitizedValue = sanitizeHtmlRichText(value)\n if (!typingRef.current && current !== sanitizedValue) {\n applyingExternal.current = true\n el.innerHTML = sanitizedValue\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 const onPaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n const html = e.clipboardData.getData('text/html')\n const text = e.clipboardData.getData('text/plain')\n const sanitizedPaste = sanitizeRichTextPasteContent(html, text)\n if (!sanitizedPaste) return\n\n e.preventDefault()\n exec(sanitizedPaste.command, sanitizedPaste.value)\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 = sanitizeRichTextHref(window.prompt(linkUrlPrompt))\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 onPaste={onPaste}\n onInput={() => { if (!applyingExternal.current) typingRef.current = true }}\n onBlur={() => {\n const el = ref.current\n if (!el) return\n typingRef.current = false\n const sanitizedValue = sanitizeHtmlRichText(el.innerHTML)\n if (el.innerHTML !== sanitizedValue) {\n applyingExternal.current = true\n el.innerHTML = sanitizedValue\n requestAnimationFrame(() => { applyingExternal.current = false })\n }\n onChange(sanitizedValue)\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 onBlurRequest: (fieldId: string) => 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\nfunction supportsWrapperBlurValidation(field: CrudField): boolean {\n return (\n field.type === 'text' ||\n field.type === 'password' ||\n field.type === 'textarea' ||\n field.type === 'checkbox' ||\n field.type === 'select' ||\n field.type === 'number'\n )\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 onBlurRequest,\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 const validateOnWrapperBlur = supportsWrapperBlurValidation(field)\n\n return (\n <div\n className={rootClassName}\n data-crud-field-id={field.id}\n onBlur={validateOnWrapperBlur\n ? (event) => {\n const nextFocused = event.relatedTarget\n if (nextFocused instanceof Node && event.currentTarget.contains(nextFocused)) return\n onBlurRequest(field.id)\n }\n : undefined}\n >\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
+ "names": ["entityId", "groups", "entityIds", "code", "bucket", "setValue", "provided", "dynamic", "MarkdownEditor", "HtmlRichTextEditor", "SimpleMarkdownEditor", "ListboxMultiSelect"]
7
+ }