@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,243 @@
1
+ import { formulaIssue } from "./types.js";
2
+ import { collectFieldRefs, parseFormula } from "./parse.js";
3
+ import { declaredArgType, lookupFormulaFunction, resolveResultType, unifyTypes } from "./functions.js";
4
+ const ORDERABLE = ["number", "date", "text", "unknown"];
5
+ function describeNode(node, fields) {
6
+ switch (node.k) {
7
+ case "field":
8
+ return fields.get(node.name)?.label ?? node.name;
9
+ case "call":
10
+ return `${node.fn}()`;
11
+ case "lit":
12
+ return node.v === null ? "empty" : JSON.stringify(node.v);
13
+ default:
14
+ return "the expression";
15
+ }
16
+ }
17
+ function typeAccepts(expected, actual) {
18
+ if (expected === "unknown" || actual === "unknown") return true;
19
+ return expected === actual;
20
+ }
21
+ function checkAst(ast, ctx) {
22
+ const fields = new Map(ctx.fields.map((f) => [f.key, f]));
23
+ const issues = [];
24
+ const walk = (node) => {
25
+ switch (node.k) {
26
+ case "lit": {
27
+ if (node.v === null) return "unknown";
28
+ if (typeof node.v === "number") return "number";
29
+ if (typeof node.v === "boolean") return "boolean";
30
+ return "text";
31
+ }
32
+ case "field": {
33
+ const meta = fields.get(node.name);
34
+ if (!meta) {
35
+ issues.push(
36
+ formulaIssue("unknown_field", `Unknown column: ${node.name}`, { name: node.name })
37
+ );
38
+ return "unknown";
39
+ }
40
+ return meta.type;
41
+ }
42
+ case "neg": {
43
+ const inner = walk(node.e);
44
+ if (!typeAccepts("number", inner)) {
45
+ const name = describeNode(node.e, fields);
46
+ issues.push(formulaIssue("type_mismatch", `${name} is not a number`, { name }));
47
+ }
48
+ return "number";
49
+ }
50
+ case "call": {
51
+ const def = lookupFormulaFunction(node.fn);
52
+ if (!def) {
53
+ issues.push(
54
+ formulaIssue("unknown_function", `Unknown function: ${node.fn}`, { name: node.fn })
55
+ );
56
+ node.args.forEach(walk);
57
+ return "unknown";
58
+ }
59
+ const argTypes = node.args.map(walk);
60
+ if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {
61
+ issues.push(
62
+ formulaIssue("arity", `${def.name} takes ${def.signature}`, {
63
+ name: def.name,
64
+ signature: def.signature
65
+ })
66
+ );
67
+ return resolveResultType(def, argTypes);
68
+ }
69
+ node.args.forEach((arg, index) => {
70
+ const expected = declaredArgType(def, index);
71
+ if (!typeAccepts(expected, argTypes[index])) {
72
+ const name = describeNode(arg, fields);
73
+ issues.push(
74
+ formulaIssue("type_mismatch", `${name} is not a ${expected}`, {
75
+ name,
76
+ expected
77
+ })
78
+ );
79
+ }
80
+ });
81
+ return resolveResultType(def, argTypes);
82
+ }
83
+ case "bin": {
84
+ const left = walk(node.l);
85
+ const right = walk(node.r);
86
+ const requireNumber = (side, type2) => {
87
+ if (typeAccepts("number", type2)) return;
88
+ const name = describeNode(side, fields);
89
+ issues.push(formulaIssue("type_mismatch", `${name} is not a number`, { name }));
90
+ };
91
+ const requireBoolean = (side, type2) => {
92
+ if (typeAccepts("boolean", type2)) return;
93
+ const name = describeNode(side, fields);
94
+ issues.push(
95
+ formulaIssue("type_mismatch", `${name} is not a true/false value`, {
96
+ name,
97
+ expected: "boolean"
98
+ })
99
+ );
100
+ };
101
+ switch (node.op) {
102
+ case "+":
103
+ case "-":
104
+ case "*":
105
+ case "/":
106
+ requireNumber(node.l, left);
107
+ requireNumber(node.r, right);
108
+ if (node.op === "/" && node.r.k === "lit" && node.r.v === 0) {
109
+ issues.push(formulaIssue("divide_by_zero", "Cannot divide by zero"));
110
+ }
111
+ return "number";
112
+ case "&&":
113
+ case "||":
114
+ requireBoolean(node.l, left);
115
+ requireBoolean(node.r, right);
116
+ return "boolean";
117
+ case "concat":
118
+ return "text";
119
+ case "=":
120
+ case "!=":
121
+ return "boolean";
122
+ case ">":
123
+ case ">=":
124
+ case "<":
125
+ case "<=": {
126
+ for (const [side, type2] of [
127
+ [node.l, left],
128
+ [node.r, right]
129
+ ]) {
130
+ if (!ORDERABLE.includes(type2)) {
131
+ const name = describeNode(side, fields);
132
+ issues.push(formulaIssue("type_mismatch", `${name} cannot be compared`, { name }));
133
+ }
134
+ }
135
+ if (unifyTypes(left, right) === "unknown" && left !== "unknown" && right !== "unknown") {
136
+ const name = describeNode(node.r, fields);
137
+ issues.push(
138
+ formulaIssue("type_mismatch", `${name} is not a ${left}`, { name, expected: left })
139
+ );
140
+ }
141
+ return "boolean";
142
+ }
143
+ default:
144
+ return "unknown";
145
+ }
146
+ }
147
+ default:
148
+ return "unknown";
149
+ }
150
+ };
151
+ const type = walk(ast);
152
+ return issues.length > 0 ? { ok: false, issues } : { ok: true, type };
153
+ }
154
+ function detectFormulaCycles(refs) {
155
+ const keys = new Set(refs.map((r) => r.key));
156
+ const edges = /* @__PURE__ */ new Map();
157
+ for (const ref of refs) {
158
+ const parsed = parseFormula(ref.expression);
159
+ const deps = parsed.ok ? collectFieldRefs(parsed.ast).filter((d) => keys.has(d)) : [];
160
+ edges.set(ref.key, deps);
161
+ }
162
+ const cycles = /* @__PURE__ */ new Map();
163
+ const state = /* @__PURE__ */ new Map();
164
+ const stack = [];
165
+ const visit = (key) => {
166
+ const mark = state.get(key);
167
+ if (mark === "done") return;
168
+ if (mark === "visiting") {
169
+ const from = stack.indexOf(key);
170
+ const path = [...stack.slice(from), key];
171
+ for (const member of path) cycles.set(member, path);
172
+ return;
173
+ }
174
+ state.set(key, "visiting");
175
+ stack.push(key);
176
+ for (const dep of edges.get(key) ?? []) visit(dep);
177
+ stack.pop();
178
+ state.set(key, "done");
179
+ };
180
+ for (const ref of refs) visit(ref.key);
181
+ return cycles;
182
+ }
183
+ function checkFormulaColumn(input) {
184
+ const { ref, fields } = input;
185
+ const existing = (input.existing ?? []).filter((r) => r.key !== ref.key);
186
+ const parsed = parseFormula(ref.expression);
187
+ if (!parsed.ok) return { ok: false, issues: [parsed.issue] };
188
+ const cycles = detectFormulaCycles([...existing, ref]);
189
+ const cycle = cycles.get(ref.key);
190
+ if (cycle) {
191
+ const isSelf = cycle.length <= 2;
192
+ return {
193
+ ok: false,
194
+ issues: [
195
+ formulaIssue(
196
+ "cycle",
197
+ isSelf ? "This formula refers to itself" : `Circular reference: ${cycle.join(" \u2192 ")}`,
198
+ { path: cycle.join(" \u2192 ") }
199
+ )
200
+ ]
201
+ };
202
+ }
203
+ const formulaFields = existing.map((r) => ({
204
+ key: r.key,
205
+ label: r.label,
206
+ type: r.resultType
207
+ }));
208
+ return mapCheck(checkAst(parsed.ast, { fields: [...fields, ...formulaFields] }), parsed.ast);
209
+ }
210
+ function mapCheck(result, ast) {
211
+ return result.ok ? { ok: true, ast, type: result.type } : { ok: false, issues: result.issues };
212
+ }
213
+ function fieldMetaFromColumns(columns) {
214
+ return columns.map((col) => ({
215
+ key: col.data,
216
+ label: col.title,
217
+ type: columnTypeToFormulaType(col.type)
218
+ }));
219
+ }
220
+ function columnTypeToFormulaType(type) {
221
+ switch (type) {
222
+ case "numeric":
223
+ return "number";
224
+ case "date":
225
+ return "date";
226
+ case "boolean":
227
+ return "boolean";
228
+ case "text":
229
+ case "dropdown":
230
+ case "multiselect":
231
+ return "text";
232
+ default:
233
+ return "unknown";
234
+ }
235
+ }
236
+ export {
237
+ checkAst,
238
+ checkFormulaColumn,
239
+ columnTypeToFormulaType,
240
+ detectFormulaCycles,
241
+ fieldMetaFromColumns
242
+ };
243
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/formula/check.ts"],
4
+ "sourcesContent": ["// formula/check.ts\n//\n// Definition-time validation. Everything that can be known without data is\n// decided HERE, when the user saves the formula \u2014 not discovered per cell at\n// render time. That is the whole point: an unknown column reference and a\n// self-referencing formula are refused by the editor, so a saved view can never\n// contain one.\n//\n// What survives to evaluation time is only what genuinely depends on the data:\n// a `type_mismatch` on an undeclared column, and `divide_by_zero`.\n\nimport type {\n FormulaAst,\n FormulaColumnRef,\n FormulaFieldMeta,\n FormulaIssue,\n FormulaValueType,\n} from './types';\nimport { formulaIssue } from './types';\nimport { collectFieldRefs, parseFormula } from './parse';\nimport { declaredArgType, lookupFormulaFunction, resolveResultType, unifyTypes } from './functions';\n\n// ============================================\n// TYPE + REFERENCE CHECKING\n// ============================================\n\nexport interface FormulaCheckContext {\n /** Every column the formula may reference, native or synthesised. */\n fields: readonly FormulaFieldMeta[];\n}\n\nexport type CheckResult =\n | { ok: true; type: FormulaValueType }\n | { ok: false; issues: FormulaIssue[] };\n\n/** Types that can be compared with `<`, `>`, `<=`, `>=`. */\nconst ORDERABLE: FormulaValueType[] = ['number', 'date', 'text', 'unknown'];\n\n/**\n * A human name for a node, used in `{name} is not a number`. A field reference\n * names the column; anything else is described by shape, because quoting the\n * user's own sub-expression back at them is noise.\n */\nfunction describeNode(node: FormulaAst, fields: Map<string, FormulaFieldMeta>): string {\n switch (node.k) {\n case 'field':\n return fields.get(node.name)?.label ?? node.name;\n case 'call':\n return `${node.fn}()`;\n case 'lit':\n return node.v === null ? 'empty' : JSON.stringify(node.v);\n default:\n return 'the expression';\n }\n}\n\n/** True when `actual` is acceptable where `expected` is declared. */\nfunction typeAccepts(expected: FormulaValueType, actual: FormulaValueType): boolean {\n if (expected === 'unknown' || actual === 'unknown') return true;\n return expected === actual;\n}\n\n/**\n * Walk the AST assigning types and collecting every problem \u2014 not just the\n * first, because a user fixing one error at a time is a user who stops using\n * the feature.\n */\nexport function checkAst(ast: FormulaAst, ctx: FormulaCheckContext): CheckResult {\n const fields = new Map<string, FormulaFieldMeta>(ctx.fields.map((f) => [f.key, f]));\n const issues: FormulaIssue[] = [];\n\n const walk = (node: FormulaAst): FormulaValueType => {\n switch (node.k) {\n case 'lit': {\n if (node.v === null) return 'unknown';\n if (typeof node.v === 'number') return 'number';\n if (typeof node.v === 'boolean') return 'boolean';\n return 'text';\n }\n\n case 'field': {\n const meta = fields.get(node.name);\n if (!meta) {\n issues.push(\n formulaIssue('unknown_field', `Unknown column: ${node.name}`, { name: node.name }),\n );\n return 'unknown';\n }\n return meta.type;\n }\n\n case 'neg': {\n const inner = walk(node.e);\n if (!typeAccepts('number', inner)) {\n const name = describeNode(node.e, fields);\n issues.push(formulaIssue('type_mismatch', `${name} is not a number`, { name }));\n }\n return 'number';\n }\n\n case 'call': {\n const def = lookupFormulaFunction(node.fn);\n if (!def) {\n issues.push(\n formulaIssue('unknown_function', `Unknown function: ${node.fn}`, { name: node.fn }),\n );\n node.args.forEach(walk);\n return 'unknown';\n }\n const argTypes = node.args.map(walk);\n if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {\n issues.push(\n formulaIssue('arity', `${def.name} takes ${def.signature}`, {\n name: def.name,\n signature: def.signature,\n }),\n );\n return resolveResultType(def, argTypes);\n }\n node.args.forEach((arg, index) => {\n const expected = declaredArgType(def, index);\n if (!typeAccepts(expected, argTypes[index])) {\n const name = describeNode(arg, fields);\n issues.push(\n formulaIssue('type_mismatch', `${name} is not a ${expected}`, {\n name,\n expected,\n }),\n );\n }\n });\n return resolveResultType(def, argTypes);\n }\n\n case 'bin': {\n const left = walk(node.l);\n const right = walk(node.r);\n\n const requireNumber = (side: FormulaAst, type: FormulaValueType) => {\n if (typeAccepts('number', type)) return;\n const name = describeNode(side, fields);\n issues.push(formulaIssue('type_mismatch', `${name} is not a number`, { name }));\n };\n const requireBoolean = (side: FormulaAst, type: FormulaValueType) => {\n if (typeAccepts('boolean', type)) return;\n const name = describeNode(side, fields);\n issues.push(\n formulaIssue('type_mismatch', `${name} is not a true/false value`, {\n name,\n expected: 'boolean',\n }),\n );\n };\n\n switch (node.op) {\n case '+':\n case '-':\n case '*':\n case '/':\n requireNumber(node.l, left);\n requireNumber(node.r, right);\n // A literal zero divisor is provable now, so prove it now.\n if (node.op === '/' && node.r.k === 'lit' && node.r.v === 0) {\n issues.push(formulaIssue('divide_by_zero', 'Cannot divide by zero'));\n }\n return 'number';\n\n case '&&':\n case '||':\n requireBoolean(node.l, left);\n requireBoolean(node.r, right);\n return 'boolean';\n\n case 'concat':\n return 'text';\n\n case '=':\n case '!=':\n return 'boolean';\n\n case '>':\n case '>=':\n case '<':\n case '<=': {\n for (const [side, type] of [\n [node.l, left],\n [node.r, right],\n ] as [FormulaAst, FormulaValueType][]) {\n if (!ORDERABLE.includes(type)) {\n const name = describeNode(side, fields);\n issues.push(formulaIssue('type_mismatch', `${name} cannot be compared`, { name }));\n }\n }\n if (unifyTypes(left, right) === 'unknown' && left !== 'unknown' && right !== 'unknown') {\n const name = describeNode(node.r, fields);\n issues.push(\n formulaIssue('type_mismatch', `${name} is not a ${left}`, { name, expected: left }),\n );\n }\n return 'boolean';\n }\n\n default:\n return 'unknown';\n }\n }\n\n default:\n return 'unknown';\n }\n };\n\n const type = walk(ast);\n return issues.length > 0 ? { ok: false, issues } : { ok: true, type };\n}\n\n// ============================================\n// CYCLE DETECTION\n// ============================================\n\n/**\n * Cycles among formula columns, keyed by the formula key that participates.\n * Same-row references (A3) keep the graph tiny \u2014 one node per formula column \u2014\n * so this is exhaustive rather than heuristic, and it runs at DEFINITION time.\n *\n * A formula that fails to parse contributes no edges; its syntax error is\n * reported separately and it cannot be saved anyway.\n */\nexport function detectFormulaCycles(refs: readonly FormulaColumnRef[]): Map<string, string[]> {\n const keys = new Set(refs.map((r) => r.key));\n const edges = new Map<string, string[]>();\n\n for (const ref of refs) {\n const parsed = parseFormula(ref.expression);\n const deps = parsed.ok ? collectFieldRefs(parsed.ast).filter((d) => keys.has(d)) : [];\n edges.set(ref.key, deps);\n }\n\n const cycles = new Map<string, string[]>();\n const state = new Map<string, 'visiting' | 'done'>();\n const stack: string[] = [];\n\n const visit = (key: string): void => {\n const mark = state.get(key);\n if (mark === 'done') return;\n if (mark === 'visiting') {\n // Found a back-edge: everything from `key` to the top of the stack is the\n // cycle, and every member of it is refused.\n const from = stack.indexOf(key);\n const path = [...stack.slice(from), key];\n for (const member of path) cycles.set(member, path);\n return;\n }\n state.set(key, 'visiting');\n stack.push(key);\n for (const dep of edges.get(key) ?? []) visit(dep);\n stack.pop();\n state.set(key, 'done');\n };\n\n for (const ref of refs) visit(ref.key);\n return cycles;\n}\n\n// ============================================\n// THE EDITOR'S ENTRY POINT\n// ============================================\n\nexport interface CheckFormulaColumnInput {\n /** The definition being saved (new or edited). */\n ref: FormulaColumnRef;\n /** Native + lookup columns the formula may reference. */\n fields: readonly FormulaFieldMeta[];\n /**\n * Every other formula column already on the view. The one being edited is\n * matched by key and replaced, so re-saving an existing formula is not\n * mistaken for a cycle with its own previous version.\n */\n existing?: readonly FormulaColumnRef[];\n}\n\nexport type CheckFormulaColumnResult =\n | { ok: true; ast: FormulaAst; type: FormulaValueType }\n | { ok: false; issues: FormulaIssue[] };\n\n/**\n * Validate one formula definition end to end: syntax \u2192 cycles \u2192 references and\n * types. Returns EVERY issue so the editor can list them.\n */\nexport function checkFormulaColumn(input: CheckFormulaColumnInput): CheckFormulaColumnResult {\n const { ref, fields } = input;\n const existing = (input.existing ?? []).filter((r) => r.key !== ref.key);\n\n const parsed = parseFormula(ref.expression);\n if (!parsed.ok) return { ok: false, issues: [parsed.issue] };\n\n // Cycles first: a self-reference makes the type check meaningless.\n const cycles = detectFormulaCycles([...existing, ref]);\n const cycle = cycles.get(ref.key);\n if (cycle) {\n const isSelf = cycle.length <= 2;\n return {\n ok: false,\n issues: [\n formulaIssue(\n 'cycle',\n isSelf ? 'This formula refers to itself' : `Circular reference: ${cycle.join(' \u2192 ')}`,\n { path: cycle.join(' \u2192 ') },\n ),\n ],\n };\n }\n\n // Other formula columns are referenceable, typed by their declared result.\n const formulaFields: FormulaFieldMeta[] = existing.map((r) => ({\n key: r.key,\n label: r.label,\n type: r.resultType,\n }));\n\n return mapCheck(checkAst(parsed.ast, { fields: [...fields, ...formulaFields] }), parsed.ast);\n}\n\nfunction mapCheck(result: CheckResult, ast: FormulaAst): CheckFormulaColumnResult {\n return result.ok ? { ok: true, ast, type: result.type } : { ok: false, issues: result.issues };\n}\n\n/**\n * Column metadata in the shape the checker wants, derived from `ColumnDef`s.\n * `ColumnDef.type` is the grid's vocabulary (`numeric`, `dropdown`, \u2026); this is\n * the single place that translation lives.\n */\nexport function fieldMetaFromColumns(\n columns: readonly { data: string; title?: string; type?: string }[],\n): FormulaFieldMeta[] {\n return columns.map((col) => ({\n key: col.data,\n label: col.title,\n type: columnTypeToFormulaType(col.type),\n }));\n}\n\n/** `ColumnDef.type` \u2192 checker type. Undeclared columns are `unknown`. */\nexport function columnTypeToFormulaType(type: string | undefined): FormulaValueType {\n switch (type) {\n case 'numeric':\n return 'number';\n case 'date':\n return 'date';\n case 'boolean':\n return 'boolean';\n case 'text':\n case 'dropdown':\n case 'multiselect':\n return 'text';\n default:\n return 'unknown';\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["type"]
7
+ }
@@ -0,0 +1,302 @@
1
+ import { collectFieldRefs, parseFormula } from "./parse.js";
2
+ import {
3
+ EMPTY,
4
+ fail,
5
+ lookupFormulaFunction,
6
+ ok,
7
+ toBoolean,
8
+ toDate,
9
+ toNumber,
10
+ toText
11
+ } from "./functions.js";
12
+ import { checkFormulaColumn } from "./check.js";
13
+ function normalise(raw) {
14
+ if (raw === null || raw === void 0) return null;
15
+ if (raw instanceof Date) return raw;
16
+ const type = typeof raw;
17
+ if (type === "number" || type === "string" || type === "boolean") return raw;
18
+ return null;
19
+ }
20
+ function evaluateAst(ast, row, options = {}) {
21
+ const nowFn = options.now ?? (() => /* @__PURE__ */ new Date());
22
+ const fields = options.fields;
23
+ const computed = options.computed;
24
+ const runtime = {
25
+ evaluateNode: (node) => walk(node),
26
+ now: nowFn
27
+ };
28
+ const nameOf = (node) => {
29
+ if (node.k === "field") return fields?.get(node.name)?.label ?? node.name;
30
+ if (node.k === "call") return `${node.fn}()`;
31
+ return "value";
32
+ };
33
+ function walk(node) {
34
+ switch (node.k) {
35
+ case "lit":
36
+ return ok(node.v);
37
+ case "field": {
38
+ const upstream = computed?.get(node.name);
39
+ if (upstream) {
40
+ if (upstream.state === "error") return { ok: false, issue: upstream.issue };
41
+ return ok(upstream.value);
42
+ }
43
+ return ok(normalise(row[node.name]));
44
+ }
45
+ case "neg": {
46
+ const inner = walk(node.e);
47
+ if (!inner.ok) return inner;
48
+ const n = toNumber(inner.value, nameOf(node.e));
49
+ if (!n.ok || n.value === null) return n;
50
+ return ok(-n.value);
51
+ }
52
+ case "call": {
53
+ const def = lookupFormulaFunction(node.fn);
54
+ if (!def) {
55
+ return fail("unknown_function", `Unknown function: ${node.fn}`, { name: node.fn });
56
+ }
57
+ if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {
58
+ return fail("arity", `${def.name} takes ${def.signature}`, {
59
+ name: def.name,
60
+ signature: def.signature
61
+ });
62
+ }
63
+ if (def.lazy && def.callLazy) return def.callLazy(node.args, runtime);
64
+ const values = [];
65
+ for (const arg of node.args) {
66
+ const result = walk(arg);
67
+ if (!result.ok) return result;
68
+ if (result.value === null && def.nullPolicy !== "accept") return EMPTY;
69
+ values.push(result.value);
70
+ }
71
+ if (!def.call) return EMPTY;
72
+ return def.call(values, runtime);
73
+ }
74
+ case "bin":
75
+ return walkBinary(node);
76
+ default:
77
+ return EMPTY;
78
+ }
79
+ }
80
+ function walkBinary(node) {
81
+ const { op } = node;
82
+ if (op === "&&" || op === "||") {
83
+ const left2 = walk(node.l);
84
+ if (!left2.ok) return left2;
85
+ const lb = toBoolean(left2.value, nameOf(node.l));
86
+ if (!lb.ok) return lb;
87
+ if (lb.value === null) return EMPTY;
88
+ if (op === "&&" && lb.value === false) return ok(false);
89
+ if (op === "||" && lb.value === true) return ok(true);
90
+ const right2 = walk(node.r);
91
+ if (!right2.ok) return right2;
92
+ const rb = toBoolean(right2.value, nameOf(node.r));
93
+ if (!rb.ok || rb.value === null) return rb;
94
+ return ok(rb.value);
95
+ }
96
+ const left = walk(node.l);
97
+ if (!left.ok) return left;
98
+ const right = walk(node.r);
99
+ if (!right.ok) return right;
100
+ if (op === "concat") {
101
+ const l2 = toText(left.value);
102
+ if (!l2.ok) return l2;
103
+ const r2 = toText(right.value);
104
+ if (!r2.ok) return r2;
105
+ const ls = l2.value === null ? "" : l2.value;
106
+ const rs = r2.value === null ? "" : r2.value;
107
+ if (left.value === null && right.value === null) return EMPTY;
108
+ return ok(ls + rs);
109
+ }
110
+ if (op === "=" || op === "!=") {
111
+ const equal = looseEquals(left.value, right.value);
112
+ return ok(op === "=" ? equal : !equal);
113
+ }
114
+ if (op === ">" || op === ">=" || op === "<" || op === "<=") {
115
+ if (left.value === null || right.value === null) return EMPTY;
116
+ const cmp = compare(left.value, right.value, nameOf(node.r));
117
+ if (!cmp.ok) return cmp;
118
+ const c = cmp.value;
119
+ switch (op) {
120
+ case ">":
121
+ return ok(c > 0);
122
+ case ">=":
123
+ return ok(c >= 0);
124
+ case "<":
125
+ return ok(c < 0);
126
+ default:
127
+ return ok(c <= 0);
128
+ }
129
+ }
130
+ const l = toNumber(left.value, nameOf(node.l));
131
+ if (!l.ok) return l;
132
+ const r = toNumber(right.value, nameOf(node.r));
133
+ if (!r.ok) return r;
134
+ if (l.value === null || r.value === null) return EMPTY;
135
+ const a = l.value;
136
+ const b = r.value;
137
+ switch (op) {
138
+ case "+":
139
+ return ok(a + b);
140
+ case "-":
141
+ return ok(a - b);
142
+ case "*":
143
+ return ok(a * b);
144
+ case "/":
145
+ if (b === 0) return fail("divide_by_zero", "Cannot divide by zero");
146
+ return ok(a / b);
147
+ default:
148
+ return EMPTY;
149
+ }
150
+ }
151
+ function looseEquals(a, b) {
152
+ if (a === null || b === null) return a === b;
153
+ if (a instanceof Date || b instanceof Date) {
154
+ const da = toDate(a);
155
+ const db = toDate(b);
156
+ if (!da.ok || !db.ok || da.value === null || db.value === null) return false;
157
+ return da.value.getTime() === db.value.getTime();
158
+ }
159
+ if (typeof a === "number" || typeof b === "number") {
160
+ const na = toNumber(a);
161
+ const nb = toNumber(b);
162
+ if (na.ok && nb.ok && na.value !== null && nb.value !== null) return na.value === nb.value;
163
+ return false;
164
+ }
165
+ return a === b;
166
+ }
167
+ function compare(a, b, rightName) {
168
+ if (a instanceof Date || b instanceof Date) {
169
+ const da = toDate(a, rightName);
170
+ if (!da.ok) return da;
171
+ const db = toDate(b, rightName);
172
+ if (!db.ok) return db;
173
+ if (da.value === null || db.value === null) return EMPTY;
174
+ return ok(Math.sign(da.value.getTime() - db.value.getTime()));
175
+ }
176
+ if (typeof a === "string" && typeof b === "string") {
177
+ const na2 = Number(a.trim());
178
+ const nb2 = Number(b.trim());
179
+ if (a.trim() && b.trim() && !Number.isNaN(na2) && !Number.isNaN(nb2)) {
180
+ return ok(Math.sign(na2 - nb2));
181
+ }
182
+ return ok(Math.sign(a.localeCompare(b)));
183
+ }
184
+ const na = toNumber(a, rightName);
185
+ if (!na.ok) return na;
186
+ const nb = toNumber(b, rightName);
187
+ if (!nb.ok) return nb;
188
+ if (na.value === null || nb.value === null) return EMPTY;
189
+ return ok(Math.sign(na.value - nb.value));
190
+ }
191
+ return walk(ast);
192
+ }
193
+ function coerceToResultType(outcome, resultType, label) {
194
+ if (!outcome.ok) return { state: "error", value: null, issue: outcome.issue };
195
+ if (outcome.value === null) return { state: "empty", value: null };
196
+ let coerced;
197
+ switch (resultType) {
198
+ case "number":
199
+ coerced = toNumber(outcome.value, label);
200
+ break;
201
+ case "text":
202
+ coerced = toText(outcome.value);
203
+ break;
204
+ case "boolean":
205
+ coerced = toBoolean(outcome.value, label);
206
+ break;
207
+ default:
208
+ coerced = toDate(outcome.value, label);
209
+ }
210
+ if (!coerced.ok) return { state: "error", value: null, issue: coerced.issue };
211
+ if (coerced.value === null) return { state: "empty", value: null };
212
+ return { state: "ok", value: coerced.value };
213
+ }
214
+ function compileFormulaColumns(refs, fields) {
215
+ const fieldMap = new Map(fields.map((f) => [f.key, f]));
216
+ const invalid = /* @__PURE__ */ new Map();
217
+ const compiled = /* @__PURE__ */ new Map();
218
+ for (const ref of refs) {
219
+ const checked = checkFormulaColumn({ ref, fields, existing: refs });
220
+ if (!checked.ok) {
221
+ invalid.set(ref.key, checked.issues[0]);
222
+ continue;
223
+ }
224
+ compiled.set(ref.key, { ref, ast: checked.ast, deps: collectFieldRefs(checked.ast) });
225
+ }
226
+ const order = [];
227
+ const placed = /* @__PURE__ */ new Set();
228
+ const place = (key, seen) => {
229
+ if (placed.has(key) || seen.has(key)) return;
230
+ const entry = compiled.get(key);
231
+ if (!entry) return;
232
+ seen.add(key);
233
+ for (const dep of entry.deps) {
234
+ if (compiled.has(dep)) place(dep, seen);
235
+ }
236
+ seen.delete(key);
237
+ placed.add(key);
238
+ order.push(entry);
239
+ };
240
+ for (const ref of refs) place(ref.key, /* @__PURE__ */ new Set());
241
+ const inputKeys = /* @__PURE__ */ new Set();
242
+ for (const entry of order) {
243
+ for (const dep of entry.deps) {
244
+ if (!compiled.has(dep)) inputKeys.add(dep);
245
+ }
246
+ }
247
+ return { order, invalid, fields: fieldMap, inputKeys: [...inputKeys] };
248
+ }
249
+ function evaluateFormulaRow(set, row, options = {}) {
250
+ const computed = /* @__PURE__ */ new Map();
251
+ for (const [key, issue] of set.invalid) {
252
+ computed.set(key, { state: "error", value: null, issue });
253
+ }
254
+ for (const entry of set.order) {
255
+ const outcome = evaluateAst(entry.ast, row, {
256
+ fields: set.fields,
257
+ now: options.now,
258
+ computed
259
+ });
260
+ computed.set(
261
+ entry.ref.key,
262
+ coerceToResultType(outcome, entry.ref.resultType, entry.ref.label)
263
+ );
264
+ }
265
+ return computed;
266
+ }
267
+ function createFormulaRowEvaluator(set, options = {}) {
268
+ const cache = /* @__PURE__ */ new WeakMap();
269
+ const signatureOf = (row) => set.inputKeys.map((key) => {
270
+ const value = row[key];
271
+ if (value === null || value === void 0) return "\0";
272
+ if (value instanceof Date) return String(value.getTime());
273
+ return String(value);
274
+ }).join("");
275
+ return (row) => {
276
+ if (!row || typeof row !== "object") return /* @__PURE__ */ new Map();
277
+ const signature = signatureOf(row);
278
+ const hit = cache.get(row);
279
+ if (hit && hit.signature === signature) return hit.results;
280
+ const results = evaluateFormulaRow(set, row, options);
281
+ cache.set(row, { signature, results });
282
+ return results;
283
+ };
284
+ }
285
+ function evaluateExpression(expression, row, fields, resultType = "number", options = {}) {
286
+ const parsed = parseFormula(expression);
287
+ if (!parsed.ok) return { state: "error", value: null, issue: parsed.issue };
288
+ const outcome = evaluateAst(parsed.ast, row, {
289
+ fields: new Map(fields.map((f) => [f.key, f])),
290
+ now: options.now
291
+ });
292
+ return coerceToResultType(outcome, resultType, expression);
293
+ }
294
+ export {
295
+ coerceToResultType,
296
+ compileFormulaColumns,
297
+ createFormulaRowEvaluator,
298
+ evaluateAst,
299
+ evaluateExpression,
300
+ evaluateFormulaRow
301
+ };
302
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/dynamic-table/formula/evaluate.ts"],
4
+ "sourcesContent": ["// formula/evaluate.ts\n//\n// The AST walker. It is a plain recursive function over five node kinds.\n//\n// There is no `eval`, no `new Function`, no template interpolation into SQL and\n// no dynamic property access into host objects \u2014 a formula can read the row it\n// is handed and nothing else. That is enforced structurally (the language has\n// no syntax for anything else) and asserted mechanically by\n// `__tests__/formula.noEval.test.ts`.\n//\n// Null propagates: an arithmetic operand that is empty makes the whole result\n// empty. It never becomes `0` and it never becomes `NaN`.\n\nimport type {\n FormulaAst,\n FormulaCellResult,\n FormulaColumnRef,\n FormulaFieldMeta,\n FormulaIssue,\n FormulaResultType,\n FormulaValue,\n} from './types';\nimport { collectFieldRefs, parseFormula } from './parse';\nimport {\n EMPTY,\n fail,\n lookupFormulaFunction,\n ok,\n toBoolean,\n toDate,\n toNumber,\n toText,\n type EvalOutcome,\n type FormulaRuntime,\n} from './functions';\nimport { checkFormulaColumn } from './check';\n\nexport interface EvaluateOptions {\n /** Column metadata, used to name a column in a `type_mismatch` message. */\n fields?: ReadonlyMap<string, FormulaFieldMeta>;\n /** Injectable clock so `TODAY()` is deterministic under test. */\n now?: () => Date;\n /**\n * Results of formula columns already evaluated for this row. A field\n * reference resolves here first, which is how one formula reads another.\n */\n computed?: ReadonlyMap<string, FormulaCellResult>;\n}\n\n// ============================================\n// CORE WALKER\n// ============================================\n\n/** Normalise a raw row value into the evaluator's value domain. */\nfunction normalise(raw: unknown): FormulaValue {\n if (raw === null || raw === undefined) return null;\n if (raw instanceof Date) return raw;\n const type = typeof raw;\n if (type === 'number' || type === 'string' || type === 'boolean') return raw as FormulaValue;\n // Objects and arrays have no meaning in a same-row language; treating them as\n // empty is safer than stringifying `[object Object]` into a total.\n return null;\n}\n\n/**\n * Evaluate one AST against one row. Never throws \u2014 every failure is an\n * `EvalOutcome` carrying the issue that will be shown in that cell.\n */\nexport function evaluateAst(\n ast: FormulaAst,\n row: Record<string, unknown>,\n options: EvaluateOptions = {},\n): EvalOutcome {\n const nowFn = options.now ?? (() => new Date());\n const fields = options.fields;\n const computed = options.computed;\n\n const runtime: FormulaRuntime = {\n evaluateNode: (node) => walk(node),\n now: nowFn,\n };\n\n const nameOf = (node: FormulaAst): string => {\n if (node.k === 'field') return fields?.get(node.name)?.label ?? node.name;\n if (node.k === 'call') return `${node.fn}()`;\n return 'value';\n };\n\n function walk(node: FormulaAst): EvalOutcome {\n switch (node.k) {\n case 'lit':\n return ok(node.v);\n\n case 'field': {\n const upstream = computed?.get(node.name);\n if (upstream) {\n // A formula reading another formula inherits its error rather than\n // inventing a fresh one \u2014 the user needs to fix the upstream cell.\n if (upstream.state === 'error') return { ok: false, issue: upstream.issue };\n return ok(upstream.value);\n }\n return ok(normalise(row[node.name]));\n }\n\n case 'neg': {\n const inner = walk(node.e);\n if (!inner.ok) return inner;\n const n = toNumber(inner.value, nameOf(node.e));\n if (!n.ok || n.value === null) return n;\n return ok(-(n.value as number));\n }\n\n case 'call': {\n const def = lookupFormulaFunction(node.fn);\n if (!def) {\n return fail('unknown_function', `Unknown function: ${node.fn}`, { name: node.fn });\n }\n if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {\n return fail('arity', `${def.name} takes ${def.signature}`, {\n name: def.name,\n signature: def.signature,\n });\n }\n if (def.lazy && def.callLazy) return def.callLazy(node.args, runtime);\n\n const values: FormulaValue[] = [];\n for (const arg of node.args) {\n const result = walk(arg);\n if (!result.ok) return result;\n if (result.value === null && def.nullPolicy !== 'accept') return EMPTY;\n values.push(result.value);\n }\n if (!def.call) return EMPTY;\n return def.call(values, runtime);\n }\n\n case 'bin':\n return walkBinary(node);\n\n default:\n return EMPTY;\n }\n }\n\n function walkBinary(node: Extract<FormulaAst, { k: 'bin' }>): EvalOutcome {\n const { op } = node;\n\n // `&&` / `||` short-circuit, so the right operand is not evaluated at all\n // when the left decides the answer.\n if (op === '&&' || op === '||') {\n const left = walk(node.l);\n if (!left.ok) return left;\n const lb = toBoolean(left.value, nameOf(node.l));\n if (!lb.ok) return lb;\n if (lb.value === null) return EMPTY;\n if (op === '&&' && lb.value === false) return ok(false);\n if (op === '||' && lb.value === true) return ok(true);\n const right = walk(node.r);\n if (!right.ok) return right;\n const rb = toBoolean(right.value, nameOf(node.r));\n if (!rb.ok || rb.value === null) return rb;\n return ok(rb.value);\n }\n\n const left = walk(node.l);\n if (!left.ok) return left;\n const right = walk(node.r);\n if (!right.ok) return right;\n\n if (op === 'concat') {\n const l = toText(left.value);\n if (!l.ok) return l;\n const r = toText(right.value);\n if (!r.ok) return r;\n // Concatenation treats empty as the empty string; `'A' & null` is `'A'`,\n // not empty \u2014 otherwise every optional suffix would blank the column.\n const ls = l.value === null ? '' : (l.value as string);\n const rs = r.value === null ? '' : (r.value as string);\n if (left.value === null && right.value === null) return EMPTY;\n return ok(ls + rs);\n }\n\n if (op === '=' || op === '!=') {\n const equal = looseEquals(left.value, right.value);\n return ok(op === '=' ? equal : !equal);\n }\n\n if (op === '>' || op === '>=' || op === '<' || op === '<=') {\n if (left.value === null || right.value === null) return EMPTY;\n const cmp = compare(left.value, right.value, nameOf(node.r));\n if (!cmp.ok) return cmp;\n const c = cmp.value as number;\n switch (op) {\n case '>':\n return ok(c > 0);\n case '>=':\n return ok(c >= 0);\n case '<':\n return ok(c < 0);\n default:\n return ok(c <= 0);\n }\n }\n\n // Arithmetic.\n const l = toNumber(left.value, nameOf(node.l));\n if (!l.ok) return l;\n const r = toNumber(right.value, nameOf(node.r));\n if (!r.ok) return r;\n if (l.value === null || r.value === null) return EMPTY;\n\n const a = l.value as number;\n const b = r.value as number;\n switch (op) {\n case '+':\n return ok(a + b);\n case '-':\n return ok(a - b);\n case '*':\n return ok(a * b);\n case '/':\n if (b === 0) return fail('divide_by_zero', 'Cannot divide by zero');\n return ok(a / b);\n default:\n return EMPTY;\n }\n }\n\n /**\n * Equality across the value domain. Two empties are equal (as in Excel, where\n * blank equals blank); a date equals a date with the same instant; numbers\n * and numeric strings compare as numbers so `'10' = 10` is true.\n */\n function looseEquals(a: FormulaValue, b: FormulaValue): boolean {\n if (a === null || b === null) return a === b;\n if (a instanceof Date || b instanceof Date) {\n const da = toDate(a);\n const db = toDate(b);\n if (!da.ok || !db.ok || da.value === null || db.value === null) return false;\n return (da.value as Date).getTime() === (db.value as Date).getTime();\n }\n if (typeof a === 'number' || typeof b === 'number') {\n const na = toNumber(a);\n const nb = toNumber(b);\n if (na.ok && nb.ok && na.value !== null && nb.value !== null) return na.value === nb.value;\n return false;\n }\n return a === b;\n }\n\n /** Three-way comparison for ordering operators. */\n function compare(a: FormulaValue, b: FormulaValue, rightName: string): EvalOutcome {\n if (a instanceof Date || b instanceof Date) {\n const da = toDate(a, rightName);\n if (!da.ok) return da;\n const db = toDate(b, rightName);\n if (!db.ok) return db;\n if (da.value === null || db.value === null) return EMPTY;\n return ok(Math.sign((da.value as Date).getTime() - (db.value as Date).getTime()));\n }\n if (typeof a === 'string' && typeof b === 'string') {\n const na = Number(a.trim());\n const nb = Number(b.trim());\n if (a.trim() && b.trim() && !Number.isNaN(na) && !Number.isNaN(nb)) {\n return ok(Math.sign(na - nb));\n }\n return ok(Math.sign(a.localeCompare(b)));\n }\n const na = toNumber(a, rightName);\n if (!na.ok) return na;\n const nb = toNumber(b, rightName);\n if (!nb.ok) return nb;\n if (na.value === null || nb.value === null) return EMPTY;\n return ok(Math.sign((na.value as number) - (nb.value as number)));\n }\n\n return walk(ast);\n}\n\n// ============================================\n// RESULT SHAPING\n// ============================================\n\n/** Coerce an evaluated value into the column's declared result type. */\nexport function coerceToResultType(\n outcome: EvalOutcome,\n resultType: FormulaResultType,\n label: string,\n): FormulaCellResult {\n if (!outcome.ok) return { state: 'error', value: null, issue: outcome.issue };\n if (outcome.value === null) return { state: 'empty', value: null };\n\n let coerced: EvalOutcome;\n switch (resultType) {\n case 'number':\n coerced = toNumber(outcome.value, label);\n break;\n case 'text':\n coerced = toText(outcome.value);\n break;\n case 'boolean':\n coerced = toBoolean(outcome.value, label);\n break;\n default:\n coerced = toDate(outcome.value, label);\n }\n\n if (!coerced.ok) return { state: 'error', value: null, issue: coerced.issue };\n if (coerced.value === null) return { state: 'empty', value: null };\n return { state: 'ok', value: coerced.value };\n}\n\n// ============================================\n// COLUMN SETS\n// ============================================\n\nexport interface CompiledFormula {\n ref: FormulaColumnRef;\n ast: FormulaAst;\n /** Every field key the expression reads, formula keys included. */\n deps: string[];\n}\n\nexport interface CompiledFormulaSet {\n /** Valid formulas in dependency order \u2014 an upstream formula evaluates first. */\n order: CompiledFormula[];\n /** Definition-time failures, keyed by formula column key. */\n invalid: Map<string, FormulaIssue>;\n fields: Map<string, FormulaFieldMeta>;\n /**\n * Union of every NON-formula field the set reads. The evaluator's cache\n * signature is built from exactly these, so a cache entry is invalidated when\n * an input changes and by nothing else.\n */\n inputKeys: string[];\n}\n\n/**\n * Validate and order a view's formula columns once, so per-row evaluation is a\n * walk and nothing more. Definition failures (syntax, unknown field, cycle) are\n * captured per key: one broken formula shows an error in its own column and\n * leaves every other column working.\n */\nexport function compileFormulaColumns(\n refs: readonly FormulaColumnRef[],\n fields: readonly FormulaFieldMeta[],\n): CompiledFormulaSet {\n const fieldMap = new Map<string, FormulaFieldMeta>(fields.map((f) => [f.key, f]));\n const invalid = new Map<string, FormulaIssue>();\n const compiled = new Map<string, CompiledFormula>();\n\n for (const ref of refs) {\n const checked = checkFormulaColumn({ ref, fields, existing: refs });\n if (!checked.ok) {\n invalid.set(ref.key, checked.issues[0]);\n continue;\n }\n compiled.set(ref.key, { ref, ast: checked.ast, deps: collectFieldRefs(checked.ast) });\n }\n\n // Dependency order. Cycles are already refused above, so this terminates.\n const order: CompiledFormula[] = [];\n const placed = new Set<string>();\n const place = (key: string, seen: Set<string>): void => {\n if (placed.has(key) || seen.has(key)) return;\n const entry = compiled.get(key);\n if (!entry) return;\n seen.add(key);\n for (const dep of entry.deps) {\n if (compiled.has(dep)) place(dep, seen);\n }\n seen.delete(key);\n placed.add(key);\n order.push(entry);\n };\n for (const ref of refs) place(ref.key, new Set());\n\n const inputKeys = new Set<string>();\n for (const entry of order) {\n for (const dep of entry.deps) {\n if (!compiled.has(dep)) inputKeys.add(dep);\n }\n }\n\n return { order, invalid, fields: fieldMap, inputKeys: [...inputKeys] };\n}\n\n/**\n * Evaluate every formula column for one row, in dependency order.\n * Returns a result for EVERY declared key \u2014 including the invalid ones, whose\n * definition error is what that cell shows.\n */\nexport function evaluateFormulaRow(\n set: CompiledFormulaSet,\n row: Record<string, unknown>,\n options: { now?: () => Date } = {},\n): Map<string, FormulaCellResult> {\n const computed = new Map<string, FormulaCellResult>();\n\n for (const [key, issue] of set.invalid) {\n computed.set(key, { state: 'error', value: null, issue });\n }\n\n for (const entry of set.order) {\n const outcome = evaluateAst(entry.ast, row, {\n fields: set.fields,\n now: options.now,\n computed,\n });\n computed.set(\n entry.ref.key,\n coerceToResultType(outcome, entry.ref.resultType, entry.ref.label),\n );\n }\n\n return computed;\n}\n\n/**\n * A row evaluator that computes each row at most once per change to its inputs.\n *\n * The cache is keyed on the row object AND a signature over just the fields the\n * formulas read. Object identity alone is not enough: the cell store mutates\n * `rowData` in place on an inline edit, so an identity-only cache would serve a\n * stale margin after the user changed the cost. The signature is over two or\n * three values, so it is far cheaper than re-walking the ASTs.\n */\nexport function createFormulaRowEvaluator(\n set: CompiledFormulaSet,\n options: { now?: () => Date } = {},\n): (row: Record<string, unknown>) => Map<string, FormulaCellResult> {\n const cache = new WeakMap<object, { signature: string; results: Map<string, FormulaCellResult> }>();\n\n const signatureOf = (row: Record<string, unknown>): string =>\n set.inputKeys\n .map((key) => {\n const value = row[key];\n if (value === null || value === undefined) return '\u0000';\n if (value instanceof Date) return String(value.getTime());\n return String(value);\n })\n .join('\u0001');\n\n return (row) => {\n if (!row || typeof row !== 'object') return new Map();\n const signature = signatureOf(row);\n const hit = cache.get(row);\n if (hit && hit.signature === signature) return hit.results;\n const results = evaluateFormulaRow(set, row, options);\n cache.set(row, { signature, results });\n return results;\n };\n}\n\n/**\n * One-shot convenience: parse, check and evaluate a single expression against a\n * row. Used by the editor's live preview, where there is no compiled set yet.\n */\nexport function evaluateExpression(\n expression: string,\n row: Record<string, unknown>,\n fields: readonly FormulaFieldMeta[],\n resultType: FormulaResultType = 'number',\n options: { now?: () => Date } = {},\n): FormulaCellResult {\n const parsed = parseFormula(expression);\n if (!parsed.ok) return { state: 'error', value: null, issue: parsed.issue };\n const outcome = evaluateAst(parsed.ast, row, {\n fields: new Map(fields.map((f) => [f.key, f])),\n now: options.now,\n });\n return coerceToResultType(outcome, resultType, expression);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["left", "right", "l", "r", "na", "nb"]
7
+ }