@cratis/components 0.1.9

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 (577) hide show
  1. package/.storybook/main.ts +24 -0
  2. package/CommandDialog/CommandDialog.stories.tsx +25 -0
  3. package/CommandDialog/CommandDialog.tsx +161 -0
  4. package/CommandDialog/index.ts +4 -0
  5. package/CommandForm/CommandForm.stories.tsx +24 -0
  6. package/CommandForm/CommandForm.tsx +266 -0
  7. package/CommandForm/CommandFormField.tsx +27 -0
  8. package/CommandForm/CommandFormFields.tsx +142 -0
  9. package/CommandForm/DatePickerField.tsx +57 -0
  10. package/CommandForm/DropdownField.tsx +65 -0
  11. package/CommandForm/InputTextField.tsx +62 -0
  12. package/CommandForm/SliderField.tsx +68 -0
  13. package/CommandForm/index.ts +10 -0
  14. package/Common/ErrorBoundary.stories.tsx +10 -0
  15. package/Common/ErrorBoundary.tsx +41 -0
  16. package/Common/FormElement.stories.tsx +10 -0
  17. package/Common/FormElement.tsx +20 -0
  18. package/Common/Page.stories.tsx +10 -0
  19. package/Common/Page.tsx +21 -0
  20. package/Common/index.ts +6 -0
  21. package/DataPage/DataPage.stories.tsx +10 -0
  22. package/DataPage/DataPage.tsx +191 -0
  23. package/DataPage/index.ts +4 -0
  24. package/DataTables/DataTableForObservableQuery.stories.tsx +10 -0
  25. package/DataTables/DataTableForObservableQuery.tsx +97 -0
  26. package/DataTables/DataTableForQuery.stories.tsx +10 -0
  27. package/DataTables/DataTableForQuery.tsx +97 -0
  28. package/DataTables/index.ts +5 -0
  29. package/Dialogs/BusyIndicatorDialog.stories.tsx +26 -0
  30. package/Dialogs/BusyIndicatorDialog.tsx +26 -0
  31. package/Dialogs/ConfirmationDialog.stories.tsx +36 -0
  32. package/Dialogs/ConfirmationDialog.tsx +75 -0
  33. package/Dialogs/index.ts +5 -0
  34. package/Dropdown/Dropdown.tsx +23 -0
  35. package/Dropdown/index.ts +4 -0
  36. package/PivotViewer/PivotViewer.stories.tsx +24 -0
  37. package/PivotViewer/PivotViewer.tsx +791 -0
  38. package/PivotViewer/components/AxisLabels.tsx +69 -0
  39. package/PivotViewer/components/DetailPanel.tsx +108 -0
  40. package/PivotViewer/components/FilterPanel.tsx +189 -0
  41. package/PivotViewer/components/FilterPanelContainer.tsx +10 -0
  42. package/PivotViewer/components/PivotCanvas.tsx +660 -0
  43. package/PivotViewer/components/PivotViewerMain.tsx +229 -0
  44. package/PivotViewer/components/RangeHistogramFilter.tsx +220 -0
  45. package/PivotViewer/components/Spinner.tsx +21 -0
  46. package/PivotViewer/components/Toolbar.tsx +130 -0
  47. package/PivotViewer/components/ToolbarContainer.tsx +10 -0
  48. package/PivotViewer/components/index.ts +12 -0
  49. package/PivotViewer/components/pivot/animation.ts +108 -0
  50. package/PivotViewer/components/pivot/buckets.ts +152 -0
  51. package/PivotViewer/components/pivot/colorResolver.ts +67 -0
  52. package/PivotViewer/components/pivot/constants.ts +46 -0
  53. package/PivotViewer/components/pivot/sprites.ts +265 -0
  54. package/PivotViewer/components/pivot/visibility.ts +319 -0
  55. package/PivotViewer/constants.ts +9 -0
  56. package/PivotViewer/engine/layout.ts +149 -0
  57. package/PivotViewer/engine/pivot.worker.ts +86 -0
  58. package/PivotViewer/engine/store.ts +437 -0
  59. package/PivotViewer/engine/types.ts +255 -0
  60. package/PivotViewer/hooks/index.ts +13 -0
  61. package/PivotViewer/hooks/useContainerDimensions.ts +45 -0
  62. package/PivotViewer/hooks/useDimensionState.ts +53 -0
  63. package/PivotViewer/hooks/useFilterOptions.ts +36 -0
  64. package/PivotViewer/hooks/useFilterPanelDrag.ts +49 -0
  65. package/PivotViewer/hooks/useFilterState.ts +106 -0
  66. package/PivotViewer/hooks/useFilteredData.ts +119 -0
  67. package/PivotViewer/hooks/usePanning.ts +163 -0
  68. package/PivotViewer/hooks/usePivotEngine.ts +252 -0
  69. package/PivotViewer/hooks/useSelectedItem.ts +402 -0
  70. package/PivotViewer/hooks/useWheelZoom.ts +114 -0
  71. package/PivotViewer/hooks/useZoomState.ts +34 -0
  72. package/PivotViewer/index.ts +7 -0
  73. package/PivotViewer/types.ts +59 -0
  74. package/PivotViewer/utils/animations.ts +249 -0
  75. package/PivotViewer/utils/constants.ts +20 -0
  76. package/PivotViewer/utils/index.ts +6 -0
  77. package/PivotViewer/utils/selection.ts +292 -0
  78. package/PivotViewer/utils/utils.ts +259 -0
  79. package/README.md +1 -0
  80. package/TimeMachine/EventsView.stories.tsx +10 -0
  81. package/TimeMachine/EventsView.tsx +119 -0
  82. package/TimeMachine/Properties.stories.tsx +10 -0
  83. package/TimeMachine/Properties.tsx +98 -0
  84. package/TimeMachine/ReadModelView.stories.tsx +10 -0
  85. package/TimeMachine/ReadModelView.tsx +143 -0
  86. package/TimeMachine/TimeMachine.stories.tsx +10 -0
  87. package/TimeMachine/TimeMachine.tsx +244 -0
  88. package/TimeMachine/index.ts +8 -0
  89. package/TimeMachine/types.ts +23 -0
  90. package/dist/cjs/CommandDialog/CommandDialog.js +71 -0
  91. package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -0
  92. package/dist/cjs/CommandDialog/index.js +9 -0
  93. package/dist/cjs/CommandDialog/index.js.map +1 -0
  94. package/dist/cjs/CommandForm/CommandForm.js +179 -0
  95. package/dist/cjs/CommandForm/CommandForm.js.map +1 -0
  96. package/dist/cjs/CommandForm/CommandFormField.js +11 -0
  97. package/dist/cjs/CommandForm/CommandFormField.js.map +1 -0
  98. package/dist/cjs/CommandForm/CommandFormFields.js +67 -0
  99. package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -0
  100. package/dist/cjs/CommandForm/DatePickerField.js +31 -0
  101. package/dist/cjs/CommandForm/DatePickerField.js.map +1 -0
  102. package/dist/cjs/CommandForm/DropdownField.js +31 -0
  103. package/dist/cjs/CommandForm/DropdownField.js.map +1 -0
  104. package/dist/cjs/CommandForm/InputTextField.js +32 -0
  105. package/dist/cjs/CommandForm/InputTextField.js.map +1 -0
  106. package/dist/cjs/CommandForm/SliderField.js +34 -0
  107. package/dist/cjs/CommandForm/SliderField.js.map +1 -0
  108. package/dist/cjs/CommandForm/index.js +23 -0
  109. package/dist/cjs/CommandForm/index.js.map +1 -0
  110. package/dist/cjs/Common/Page.js +10 -0
  111. package/dist/cjs/Common/Page.js.map +1 -0
  112. package/dist/cjs/DataPage/DataPage.js +64 -0
  113. package/dist/cjs/DataPage/DataPage.js.map +1 -0
  114. package/dist/cjs/DataPage/index.js +11 -0
  115. package/dist/cjs/DataPage/index.js.map +1 -0
  116. package/dist/cjs/DataTables/DataTableForObservableQuery.js +17 -0
  117. package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -0
  118. package/dist/cjs/DataTables/DataTableForQuery.js +17 -0
  119. package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -0
  120. package/dist/cjs/DataTables/index.js +10 -0
  121. package/dist/cjs/DataTables/index.js.map +1 -0
  122. package/dist/cjs/Dialogs/BusyIndicatorDialog.js +13 -0
  123. package/dist/cjs/Dialogs/BusyIndicatorDialog.js.map +1 -0
  124. package/dist/cjs/Dialogs/ConfirmationDialog.js +33 -0
  125. package/dist/cjs/Dialogs/ConfirmationDialog.js.map +1 -0
  126. package/dist/cjs/Dialogs/index.js +10 -0
  127. package/dist/cjs/Dialogs/index.js.map +1 -0
  128. package/dist/cjs/Dropdown/Dropdown.js +15 -0
  129. package/dist/cjs/Dropdown/Dropdown.js.map +1 -0
  130. package/dist/cjs/Dropdown/index.js +8 -0
  131. package/dist/cjs/Dropdown/index.js.map +1 -0
  132. package/dist/cjs/PivotViewer/PivotViewer.js +525 -0
  133. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -0
  134. package/dist/cjs/PivotViewer/components/AxisLabels.js +27 -0
  135. package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -0
  136. package/dist/cjs/PivotViewer/components/DetailPanel.js +35 -0
  137. package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -0
  138. package/dist/cjs/PivotViewer/components/FilterPanel.js +59 -0
  139. package/dist/cjs/PivotViewer/components/FilterPanel.js.map +1 -0
  140. package/dist/cjs/PivotViewer/components/FilterPanelContainer.js +11 -0
  141. package/dist/cjs/PivotViewer/components/FilterPanelContainer.js.map +1 -0
  142. package/dist/cjs/PivotViewer/components/PivotCanvas.js +394 -0
  143. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -0
  144. package/dist/cjs/PivotViewer/components/PivotViewerMain.js +81 -0
  145. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -0
  146. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js +124 -0
  147. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
  148. package/dist/cjs/PivotViewer/components/Spinner.js +11 -0
  149. package/dist/cjs/PivotViewer/components/Spinner.js.map +1 -0
  150. package/dist/cjs/PivotViewer/components/Toolbar.js +12 -0
  151. package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -0
  152. package/dist/cjs/PivotViewer/components/ToolbarContainer.js +11 -0
  153. package/dist/cjs/PivotViewer/components/ToolbarContainer.js.map +1 -0
  154. package/dist/cjs/PivotViewer/components/pivot/animation.js +82 -0
  155. package/dist/cjs/PivotViewer/components/pivot/animation.js.map +1 -0
  156. package/dist/cjs/PivotViewer/components/pivot/buckets.js +124 -0
  157. package/dist/cjs/PivotViewer/components/pivot/buckets.js.map +1 -0
  158. package/dist/cjs/PivotViewer/components/pivot/colorResolver.js +64 -0
  159. package/dist/cjs/PivotViewer/components/pivot/colorResolver.js.map +1 -0
  160. package/dist/cjs/PivotViewer/components/pivot/constants.js +19 -0
  161. package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -0
  162. package/dist/cjs/PivotViewer/components/pivot/sprites.js +227 -0
  163. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -0
  164. package/dist/cjs/PivotViewer/components/pivot/visibility.js +223 -0
  165. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -0
  166. package/dist/cjs/PivotViewer/constants.js +16 -0
  167. package/dist/cjs/PivotViewer/constants.js.map +1 -0
  168. package/dist/cjs/PivotViewer/engine/layout.js +95 -0
  169. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -0
  170. package/dist/cjs/PivotViewer/engine/store.js +336 -0
  171. package/dist/cjs/PivotViewer/engine/store.js.map +1 -0
  172. package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js +30 -0
  173. package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
  174. package/dist/cjs/PivotViewer/hooks/useDimensionState.js +43 -0
  175. package/dist/cjs/PivotViewer/hooks/useDimensionState.js.map +1 -0
  176. package/dist/cjs/PivotViewer/hooks/useFilterOptions.js +24 -0
  177. package/dist/cjs/PivotViewer/hooks/useFilterOptions.js.map +1 -0
  178. package/dist/cjs/PivotViewer/hooks/useFilterState.js +96 -0
  179. package/dist/cjs/PivotViewer/hooks/useFilterState.js.map +1 -0
  180. package/dist/cjs/PivotViewer/hooks/usePanning.js +120 -0
  181. package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -0
  182. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +183 -0
  183. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -0
  184. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js +93 -0
  185. package/dist/cjs/PivotViewer/hooks/useWheelZoom.js.map +1 -0
  186. package/dist/cjs/PivotViewer/hooks/useZoomState.js +31 -0
  187. package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -0
  188. package/dist/cjs/PivotViewer/index.js +9 -0
  189. package/dist/cjs/PivotViewer/index.js.map +1 -0
  190. package/dist/cjs/PivotViewer/utils/animations.js +144 -0
  191. package/dist/cjs/PivotViewer/utils/animations.js.map +1 -0
  192. package/dist/cjs/PivotViewer/utils/constants.js +12 -0
  193. package/dist/cjs/PivotViewer/utils/constants.js.map +1 -0
  194. package/dist/cjs/PivotViewer/utils/selection.js +136 -0
  195. package/dist/cjs/PivotViewer/utils/selection.js.map +1 -0
  196. package/dist/cjs/PivotViewer/utils/utils.js +150 -0
  197. package/dist/cjs/PivotViewer/utils/utils.js.map +1 -0
  198. package/dist/cjs/TimeMachine/EventsView.js +57 -0
  199. package/dist/cjs/TimeMachine/EventsView.js.map +1 -0
  200. package/dist/cjs/TimeMachine/Properties.js +58 -0
  201. package/dist/cjs/TimeMachine/Properties.js.map +1 -0
  202. package/dist/cjs/TimeMachine/ReadModelView.js +40 -0
  203. package/dist/cjs/TimeMachine/ReadModelView.js.map +1 -0
  204. package/dist/cjs/TimeMachine/TimeMachine.js +98 -0
  205. package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -0
  206. package/dist/cjs/TimeMachine/index.js +14 -0
  207. package/dist/cjs/TimeMachine/index.js.map +1 -0
  208. package/dist/cjs/index.js +22 -0
  209. package/dist/cjs/index.js.map +1 -0
  210. package/dist/cjs/useOverlayZIndex.js +24 -0
  211. package/dist/cjs/useOverlayZIndex.js.map +1 -0
  212. package/dist/esm/CommandDialog/CommandDialog.d.ts +45 -0
  213. package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -0
  214. package/dist/esm/CommandDialog/CommandDialog.js +68 -0
  215. package/dist/esm/CommandDialog/CommandDialog.js.map +1 -0
  216. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts +7 -0
  217. package/dist/esm/CommandDialog/CommandDialog.stories.d.ts.map +1 -0
  218. package/dist/esm/CommandDialog/CommandDialog.stories.js +12 -0
  219. package/dist/esm/CommandDialog/CommandDialog.stories.js.map +1 -0
  220. package/dist/esm/CommandDialog/index.d.ts +2 -0
  221. package/dist/esm/CommandDialog/index.d.ts.map +1 -0
  222. package/dist/esm/CommandDialog/index.js +2 -0
  223. package/dist/esm/CommandDialog/index.js.map +1 -0
  224. package/dist/esm/CommandForm/CommandForm.d.ts +49 -0
  225. package/dist/esm/CommandForm/CommandForm.d.ts.map +1 -0
  226. package/dist/esm/CommandForm/CommandForm.js +174 -0
  227. package/dist/esm/CommandForm/CommandForm.js.map +1 -0
  228. package/dist/esm/CommandForm/CommandForm.stories.d.ts +7 -0
  229. package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -0
  230. package/dist/esm/CommandForm/CommandForm.stories.js +12 -0
  231. package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -0
  232. package/dist/esm/CommandForm/CommandFormField.d.ts +18 -0
  233. package/dist/esm/CommandForm/CommandFormField.d.ts.map +1 -0
  234. package/dist/esm/CommandForm/CommandFormField.js +9 -0
  235. package/dist/esm/CommandForm/CommandFormField.js.map +1 -0
  236. package/dist/esm/CommandForm/CommandFormFields.d.ts +11 -0
  237. package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -0
  238. package/dist/esm/CommandForm/CommandFormFields.js +65 -0
  239. package/dist/esm/CommandForm/CommandFormFields.js.map +1 -0
  240. package/dist/esm/CommandForm/DatePickerField.d.ts +20 -0
  241. package/dist/esm/CommandForm/DatePickerField.d.ts.map +1 -0
  242. package/dist/esm/CommandForm/DatePickerField.js +29 -0
  243. package/dist/esm/CommandForm/DatePickerField.js.map +1 -0
  244. package/dist/esm/CommandForm/DropdownField.d.ts +24 -0
  245. package/dist/esm/CommandForm/DropdownField.d.ts.map +1 -0
  246. package/dist/esm/CommandForm/DropdownField.js +29 -0
  247. package/dist/esm/CommandForm/DropdownField.js.map +1 -0
  248. package/dist/esm/CommandForm/InputTextField.d.ts +20 -0
  249. package/dist/esm/CommandForm/InputTextField.d.ts.map +1 -0
  250. package/dist/esm/CommandForm/InputTextField.js +30 -0
  251. package/dist/esm/CommandForm/InputTextField.js.map +1 -0
  252. package/dist/esm/CommandForm/SliderField.d.ts +23 -0
  253. package/dist/esm/CommandForm/SliderField.d.ts.map +1 -0
  254. package/dist/esm/CommandForm/SliderField.js +32 -0
  255. package/dist/esm/CommandForm/SliderField.js.map +1 -0
  256. package/dist/esm/CommandForm/index.d.ts +8 -0
  257. package/dist/esm/CommandForm/index.d.ts.map +1 -0
  258. package/dist/esm/CommandForm/index.js +8 -0
  259. package/dist/esm/CommandForm/index.js.map +1 -0
  260. package/dist/esm/Common/ErrorBoundary.d.ts +16 -0
  261. package/dist/esm/Common/ErrorBoundary.d.ts.map +1 -0
  262. package/dist/esm/Common/ErrorBoundary.js +21 -0
  263. package/dist/esm/Common/ErrorBoundary.js.map +1 -0
  264. package/dist/esm/Common/ErrorBoundary.stories.d.ts +8 -0
  265. package/dist/esm/Common/ErrorBoundary.stories.d.ts.map +1 -0
  266. package/dist/esm/Common/ErrorBoundary.stories.js +6 -0
  267. package/dist/esm/Common/ErrorBoundary.stories.js.map +1 -0
  268. package/dist/esm/Common/FormElement.d.ts +6 -0
  269. package/dist/esm/Common/FormElement.d.ts.map +1 -0
  270. package/dist/esm/Common/FormElement.js +5 -0
  271. package/dist/esm/Common/FormElement.js.map +1 -0
  272. package/dist/esm/Common/FormElement.stories.d.ts +8 -0
  273. package/dist/esm/Common/FormElement.stories.d.ts.map +1 -0
  274. package/dist/esm/Common/FormElement.stories.js +6 -0
  275. package/dist/esm/Common/FormElement.stories.js.map +1 -0
  276. package/dist/esm/Common/Page.d.ts +8 -0
  277. package/dist/esm/Common/Page.d.ts.map +1 -0
  278. package/dist/esm/Common/Page.js +8 -0
  279. package/dist/esm/Common/Page.js.map +1 -0
  280. package/dist/esm/Common/Page.stories.d.ts +8 -0
  281. package/dist/esm/Common/Page.stories.d.ts.map +1 -0
  282. package/dist/esm/Common/Page.stories.js +6 -0
  283. package/dist/esm/Common/Page.stories.js.map +1 -0
  284. package/dist/esm/Common/index.d.ts +4 -0
  285. package/dist/esm/Common/index.d.ts.map +1 -0
  286. package/dist/esm/Common/index.js +4 -0
  287. package/dist/esm/Common/index.js.map +1 -0
  288. package/dist/esm/DataPage/DataPage.d.ts +41 -0
  289. package/dist/esm/DataPage/DataPage.d.ts.map +1 -0
  290. package/dist/esm/DataPage/DataPage.js +59 -0
  291. package/dist/esm/DataPage/DataPage.js.map +1 -0
  292. package/dist/esm/DataPage/DataPage.stories.d.ts +8 -0
  293. package/dist/esm/DataPage/DataPage.stories.d.ts.map +1 -0
  294. package/dist/esm/DataPage/DataPage.stories.js +6 -0
  295. package/dist/esm/DataPage/DataPage.stories.js.map +1 -0
  296. package/dist/esm/DataPage/index.d.ts +2 -0
  297. package/dist/esm/DataPage/index.d.ts.map +1 -0
  298. package/dist/esm/DataPage/index.js +2 -0
  299. package/dist/esm/DataPage/index.js.map +1 -0
  300. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +17 -0
  301. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -0
  302. package/dist/esm/DataTables/DataTableForObservableQuery.js +15 -0
  303. package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -0
  304. package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts +8 -0
  305. package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts.map +1 -0
  306. package/dist/esm/DataTables/DataTableForObservableQuery.stories.js +6 -0
  307. package/dist/esm/DataTables/DataTableForObservableQuery.stories.js.map +1 -0
  308. package/dist/esm/DataTables/DataTableForQuery.d.ts +17 -0
  309. package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -0
  310. package/dist/esm/DataTables/DataTableForQuery.js +15 -0
  311. package/dist/esm/DataTables/DataTableForQuery.js.map +1 -0
  312. package/dist/esm/DataTables/DataTableForQuery.stories.d.ts +8 -0
  313. package/dist/esm/DataTables/DataTableForQuery.stories.d.ts.map +1 -0
  314. package/dist/esm/DataTables/DataTableForQuery.stories.js +6 -0
  315. package/dist/esm/DataTables/DataTableForQuery.stories.js.map +1 -0
  316. package/dist/esm/DataTables/index.d.ts +3 -0
  317. package/dist/esm/DataTables/index.d.ts.map +1 -0
  318. package/dist/esm/DataTables/index.js +3 -0
  319. package/dist/esm/DataTables/index.js.map +1 -0
  320. package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts +3 -0
  321. package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts.map +1 -0
  322. package/dist/esm/Dialogs/BusyIndicatorDialog.js +11 -0
  323. package/dist/esm/Dialogs/BusyIndicatorDialog.js.map +1 -0
  324. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts +7 -0
  325. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts.map +1 -0
  326. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js +15 -0
  327. package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js.map +1 -0
  328. package/dist/esm/Dialogs/ConfirmationDialog.d.ts +2 -0
  329. package/dist/esm/Dialogs/ConfirmationDialog.d.ts.map +1 -0
  330. package/dist/esm/Dialogs/ConfirmationDialog.js +31 -0
  331. package/dist/esm/Dialogs/ConfirmationDialog.js.map +1 -0
  332. package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts +7 -0
  333. package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts.map +1 -0
  334. package/dist/esm/Dialogs/ConfirmationDialog.stories.js +20 -0
  335. package/dist/esm/Dialogs/ConfirmationDialog.stories.js.map +1 -0
  336. package/dist/esm/Dialogs/index.d.ts +3 -0
  337. package/dist/esm/Dialogs/index.d.ts.map +1 -0
  338. package/dist/esm/Dialogs/index.js +3 -0
  339. package/dist/esm/Dialogs/index.js.map +1 -0
  340. package/dist/esm/Dropdown/Dropdown.d.ts +5 -0
  341. package/dist/esm/Dropdown/Dropdown.d.ts.map +1 -0
  342. package/dist/esm/Dropdown/Dropdown.js +13 -0
  343. package/dist/esm/Dropdown/Dropdown.js.map +1 -0
  344. package/dist/esm/Dropdown/index.d.ts +2 -0
  345. package/dist/esm/Dropdown/index.d.ts.map +1 -0
  346. package/dist/esm/Dropdown/index.js +2 -0
  347. package/dist/esm/Dropdown/index.js.map +1 -0
  348. package/dist/esm/PivotViewer/PivotViewer.d.ts +4 -0
  349. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -0
  350. package/dist/esm/PivotViewer/PivotViewer.js +523 -0
  351. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -0
  352. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +7 -0
  353. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -0
  354. package/dist/esm/PivotViewer/PivotViewer.stories.js +12 -0
  355. package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -0
  356. package/dist/esm/PivotViewer/components/AxisLabels.d.ts +13 -0
  357. package/dist/esm/PivotViewer/components/AxisLabels.d.ts.map +1 -0
  358. package/dist/esm/PivotViewer/components/AxisLabels.js +25 -0
  359. package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -0
  360. package/dist/esm/PivotViewer/components/DetailPanel.d.ts +6 -0
  361. package/dist/esm/PivotViewer/components/DetailPanel.d.ts.map +1 -0
  362. package/dist/esm/PivotViewer/components/DetailPanel.js +33 -0
  363. package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -0
  364. package/dist/esm/PivotViewer/components/FilterPanel.d.ts +27 -0
  365. package/dist/esm/PivotViewer/components/FilterPanel.d.ts.map +1 -0
  366. package/dist/esm/PivotViewer/components/FilterPanel.js +57 -0
  367. package/dist/esm/PivotViewer/components/FilterPanel.js.map +1 -0
  368. package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts +4 -0
  369. package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts.map +1 -0
  370. package/dist/esm/PivotViewer/components/FilterPanelContainer.js +9 -0
  371. package/dist/esm/PivotViewer/components/FilterPanelContainer.js.map +1 -0
  372. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +29 -0
  373. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -0
  374. package/dist/esm/PivotViewer/components/PivotCanvas.js +373 -0
  375. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -0
  376. package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +43 -0
  377. package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -0
  378. package/dist/esm/PivotViewer/components/PivotViewerMain.js +79 -0
  379. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -0
  380. package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts +11 -0
  381. package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts.map +1 -0
  382. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js +122 -0
  383. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
  384. package/dist/esm/PivotViewer/components/Spinner.d.ts +3 -0
  385. package/dist/esm/PivotViewer/components/Spinner.d.ts.map +1 -0
  386. package/dist/esm/PivotViewer/components/Spinner.js +9 -0
  387. package/dist/esm/PivotViewer/components/Spinner.js.map +1 -0
  388. package/dist/esm/PivotViewer/components/Toolbar.d.ts +21 -0
  389. package/dist/esm/PivotViewer/components/Toolbar.d.ts.map +1 -0
  390. package/dist/esm/PivotViewer/components/Toolbar.js +10 -0
  391. package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -0
  392. package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts +4 -0
  393. package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts.map +1 -0
  394. package/dist/esm/PivotViewer/components/ToolbarContainer.js +9 -0
  395. package/dist/esm/PivotViewer/components/ToolbarContainer.js.map +1 -0
  396. package/dist/esm/PivotViewer/components/index.d.ts +9 -0
  397. package/dist/esm/PivotViewer/components/index.d.ts.map +1 -0
  398. package/dist/esm/PivotViewer/components/index.js +8 -0
  399. package/dist/esm/PivotViewer/components/index.js.map +1 -0
  400. package/dist/esm/PivotViewer/components/pivot/animation.d.ts +29 -0
  401. package/dist/esm/PivotViewer/components/pivot/animation.d.ts.map +1 -0
  402. package/dist/esm/PivotViewer/components/pivot/animation.js +79 -0
  403. package/dist/esm/PivotViewer/components/pivot/animation.js.map +1 -0
  404. package/dist/esm/PivotViewer/components/pivot/buckets.d.ts +6 -0
  405. package/dist/esm/PivotViewer/components/pivot/buckets.d.ts.map +1 -0
  406. package/dist/esm/PivotViewer/components/pivot/buckets.js +102 -0
  407. package/dist/esm/PivotViewer/components/pivot/buckets.js.map +1 -0
  408. package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts +4 -0
  409. package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts.map +1 -0
  410. package/dist/esm/PivotViewer/components/pivot/colorResolver.js +61 -0
  411. package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -0
  412. package/dist/esm/PivotViewer/components/pivot/constants.d.ts +38 -0
  413. package/dist/esm/PivotViewer/components/pivot/constants.d.ts.map +1 -0
  414. package/dist/esm/PivotViewer/components/pivot/constants.js +14 -0
  415. package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -0
  416. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +6 -0
  417. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -0
  418. package/dist/esm/PivotViewer/components/pivot/sprites.js +203 -0
  419. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -0
  420. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts +26 -0
  421. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -0
  422. package/dist/esm/PivotViewer/components/pivot/visibility.js +221 -0
  423. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -0
  424. package/dist/esm/PivotViewer/constants.d.ts +7 -0
  425. package/dist/esm/PivotViewer/constants.d.ts.map +1 -0
  426. package/dist/esm/PivotViewer/constants.js +9 -0
  427. package/dist/esm/PivotViewer/constants.js.map +1 -0
  428. package/dist/esm/PivotViewer/engine/layout.d.ts +3 -0
  429. package/dist/esm/PivotViewer/engine/layout.d.ts.map +1 -0
  430. package/dist/esm/PivotViewer/engine/layout.js +93 -0
  431. package/dist/esm/PivotViewer/engine/layout.js.map +1 -0
  432. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts +2 -0
  433. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -0
  434. package/dist/esm/PivotViewer/engine/pivot.worker.js +58 -0
  435. package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -0
  436. package/dist/esm/PivotViewer/engine/store.d.ts +9 -0
  437. package/dist/esm/PivotViewer/engine/store.d.ts.map +1 -0
  438. package/dist/esm/PivotViewer/engine/store.js +328 -0
  439. package/dist/esm/PivotViewer/engine/store.js.map +1 -0
  440. package/dist/esm/PivotViewer/engine/types.d.ts +125 -0
  441. package/dist/esm/PivotViewer/engine/types.d.ts.map +1 -0
  442. package/dist/esm/PivotViewer/engine/types.js +2 -0
  443. package/dist/esm/PivotViewer/engine/types.js.map +1 -0
  444. package/dist/esm/PivotViewer/hooks/index.d.ts +11 -0
  445. package/dist/esm/PivotViewer/hooks/index.d.ts.map +1 -0
  446. package/dist/esm/PivotViewer/hooks/index.js +11 -0
  447. package/dist/esm/PivotViewer/hooks/index.js.map +1 -0
  448. package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts +5 -0
  449. package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts.map +1 -0
  450. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js +28 -0
  451. package/dist/esm/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
  452. package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts +11 -0
  453. package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts.map +1 -0
  454. package/dist/esm/PivotViewer/hooks/useDimensionState.js +41 -0
  455. package/dist/esm/PivotViewer/hooks/useDimensionState.js.map +1 -0
  456. package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts +12 -0
  457. package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts.map +1 -0
  458. package/dist/esm/PivotViewer/hooks/useFilterOptions.js +22 -0
  459. package/dist/esm/PivotViewer/hooks/useFilterOptions.js.map +1 -0
  460. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts +9 -0
  461. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts.map +1 -0
  462. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js +42 -0
  463. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js.map +1 -0
  464. package/dist/esm/PivotViewer/hooks/useFilterState.d.ts +11 -0
  465. package/dist/esm/PivotViewer/hooks/useFilterState.d.ts.map +1 -0
  466. package/dist/esm/PivotViewer/hooks/useFilterState.js +94 -0
  467. package/dist/esm/PivotViewer/hooks/useFilterState.js.map +1 -0
  468. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +9 -0
  469. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -0
  470. package/dist/esm/PivotViewer/hooks/useFilteredData.js +85 -0
  471. package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -0
  472. package/dist/esm/PivotViewer/hooks/usePanning.d.ts +10 -0
  473. package/dist/esm/PivotViewer/hooks/usePanning.d.ts.map +1 -0
  474. package/dist/esm/PivotViewer/hooks/usePanning.js +118 -0
  475. package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -0
  476. package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts +14 -0
  477. package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -0
  478. package/dist/esm/PivotViewer/hooks/usePivotEngine.js +180 -0
  479. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -0
  480. package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts +8 -0
  481. package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts.map +1 -0
  482. package/dist/esm/PivotViewer/hooks/useSelectedItem.js +322 -0
  483. package/dist/esm/PivotViewer/hooks/useSelectedItem.js.map +1 -0
  484. package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts +2 -0
  485. package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts.map +1 -0
  486. package/dist/esm/PivotViewer/hooks/useWheelZoom.js +91 -0
  487. package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -0
  488. package/dist/esm/PivotViewer/hooks/useZoomState.d.ts +9 -0
  489. package/dist/esm/PivotViewer/hooks/useZoomState.d.ts.map +1 -0
  490. package/dist/esm/PivotViewer/hooks/useZoomState.js +29 -0
  491. package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -0
  492. package/dist/esm/PivotViewer/index.d.ts +4 -0
  493. package/dist/esm/PivotViewer/index.d.ts.map +1 -0
  494. package/dist/esm/PivotViewer/index.js +2 -0
  495. package/dist/esm/PivotViewer/index.js.map +1 -0
  496. package/dist/esm/PivotViewer/types.d.ts +47 -0
  497. package/dist/esm/PivotViewer/types.d.ts.map +1 -0
  498. package/dist/esm/PivotViewer/types.js +2 -0
  499. package/dist/esm/PivotViewer/types.js.map +1 -0
  500. package/dist/esm/PivotViewer/utils/animations.d.ts +54 -0
  501. package/dist/esm/PivotViewer/utils/animations.d.ts.map +1 -0
  502. package/dist/esm/PivotViewer/utils/animations.js +139 -0
  503. package/dist/esm/PivotViewer/utils/animations.js.map +1 -0
  504. package/dist/esm/PivotViewer/utils/constants.d.ts +13 -0
  505. package/dist/esm/PivotViewer/utils/constants.d.ts.map +1 -0
  506. package/dist/esm/PivotViewer/utils/constants.js +7 -0
  507. package/dist/esm/PivotViewer/utils/constants.js.map +1 -0
  508. package/dist/esm/PivotViewer/utils/index.d.ts +4 -0
  509. package/dist/esm/PivotViewer/utils/index.d.ts.map +1 -0
  510. package/dist/esm/PivotViewer/utils/index.js +4 -0
  511. package/dist/esm/PivotViewer/utils/index.js.map +1 -0
  512. package/dist/esm/PivotViewer/utils/selection.d.ts +50 -0
  513. package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -0
  514. package/dist/esm/PivotViewer/utils/selection.js +134 -0
  515. package/dist/esm/PivotViewer/utils/selection.js.map +1 -0
  516. package/dist/esm/PivotViewer/utils/utils.d.ts +24 -0
  517. package/dist/esm/PivotViewer/utils/utils.d.ts.map +1 -0
  518. package/dist/esm/PivotViewer/utils/utils.js +138 -0
  519. package/dist/esm/PivotViewer/utils/utils.js.map +1 -0
  520. package/dist/esm/TimeMachine/EventsView.d.ts +9 -0
  521. package/dist/esm/TimeMachine/EventsView.d.ts.map +1 -0
  522. package/dist/esm/TimeMachine/EventsView.js +55 -0
  523. package/dist/esm/TimeMachine/EventsView.js.map +1 -0
  524. package/dist/esm/TimeMachine/EventsView.stories.d.ts +8 -0
  525. package/dist/esm/TimeMachine/EventsView.stories.d.ts.map +1 -0
  526. package/dist/esm/TimeMachine/EventsView.stories.js +6 -0
  527. package/dist/esm/TimeMachine/EventsView.stories.js.map +1 -0
  528. package/dist/esm/TimeMachine/Properties.d.ts +9 -0
  529. package/dist/esm/TimeMachine/Properties.d.ts.map +1 -0
  530. package/dist/esm/TimeMachine/Properties.js +56 -0
  531. package/dist/esm/TimeMachine/Properties.js.map +1 -0
  532. package/dist/esm/TimeMachine/Properties.stories.d.ts +8 -0
  533. package/dist/esm/TimeMachine/Properties.stories.d.ts.map +1 -0
  534. package/dist/esm/TimeMachine/Properties.stories.js +6 -0
  535. package/dist/esm/TimeMachine/Properties.stories.js.map +1 -0
  536. package/dist/esm/TimeMachine/ReadModelView.d.ts +12 -0
  537. package/dist/esm/TimeMachine/ReadModelView.d.ts.map +1 -0
  538. package/dist/esm/TimeMachine/ReadModelView.js +38 -0
  539. package/dist/esm/TimeMachine/ReadModelView.js.map +1 -0
  540. package/dist/esm/TimeMachine/ReadModelView.stories.d.ts +8 -0
  541. package/dist/esm/TimeMachine/ReadModelView.stories.d.ts.map +1 -0
  542. package/dist/esm/TimeMachine/ReadModelView.stories.js +6 -0
  543. package/dist/esm/TimeMachine/ReadModelView.stories.js.map +1 -0
  544. package/dist/esm/TimeMachine/TimeMachine.d.ts +12 -0
  545. package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -0
  546. package/dist/esm/TimeMachine/TimeMachine.js +93 -0
  547. package/dist/esm/TimeMachine/TimeMachine.js.map +1 -0
  548. package/dist/esm/TimeMachine/TimeMachine.stories.d.ts +8 -0
  549. package/dist/esm/TimeMachine/TimeMachine.stories.d.ts.map +1 -0
  550. package/dist/esm/TimeMachine/TimeMachine.stories.js +6 -0
  551. package/dist/esm/TimeMachine/TimeMachine.stories.js.map +1 -0
  552. package/dist/esm/TimeMachine/index.d.ts +6 -0
  553. package/dist/esm/TimeMachine/index.d.ts.map +1 -0
  554. package/dist/esm/TimeMachine/index.js +5 -0
  555. package/dist/esm/TimeMachine/index.js.map +1 -0
  556. package/dist/esm/TimeMachine/types.d.ts +19 -0
  557. package/dist/esm/TimeMachine/types.d.ts.map +1 -0
  558. package/dist/esm/TimeMachine/types.js +2 -0
  559. package/dist/esm/TimeMachine/types.js.map +1 -0
  560. package/dist/esm/index.d.ts +10 -0
  561. package/dist/esm/index.d.ts.map +1 -0
  562. package/dist/esm/index.js +17 -0
  563. package/dist/esm/index.js.map +1 -0
  564. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  565. package/dist/esm/useOverlayZIndex.d.ts +2 -0
  566. package/dist/esm/useOverlayZIndex.d.ts.map +1 -0
  567. package/dist/esm/useOverlayZIndex.js +22 -0
  568. package/dist/esm/useOverlayZIndex.js.map +1 -0
  569. package/dist/esm/vite.config.d.ts +3 -0
  570. package/dist/esm/vite.config.d.ts.map +1 -0
  571. package/dist/esm/vite.config.js +76 -0
  572. package/dist/esm/vite.config.js.map +1 -0
  573. package/global.d.ts +11 -0
  574. package/index.ts +22 -0
  575. package/package.json +160 -0
  576. package/useOverlayZIndex.ts +32 -0
  577. package/vite.config.ts +80 -0
@@ -0,0 +1,24 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import type { StorybookConfig } from '@storybook/react-vite';
5
+ import type { UserConfig as ViteConfig } from 'vite';
6
+
7
+ const config: StorybookConfig = {
8
+ stories: ['../**/*.stories.@(js|jsx|ts|tsx)'],
9
+ addons: [],
10
+ framework: {
11
+ name: '@storybook/react-vite',
12
+ options: {}
13
+ },
14
+ core: { builder: '@storybook/builder-vite' },
15
+ staticDirs: ['../public'],
16
+ // Ensure Vite dev server does not open the browser when Storybook starts
17
+ async viteFinal(existingConfig: ViteConfig) {
18
+ const cfg: ViteConfig = { ...existingConfig };
19
+ cfg.server = { ...(cfg.server || {}), open: false } as unknown;
20
+ return cfg;
21
+ }
22
+ };
23
+
24
+ export default config;
@@ -0,0 +1,25 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import React from 'react';
5
+ import { Meta, StoryObj } from '@storybook/react';
6
+ import { CommandDialog } from './CommandDialog';
7
+
8
+ const meta: Meta<typeof CommandDialog> = {
9
+ title: 'CommandDialog/CommandDialog',
10
+ component: CommandDialog,
11
+ };
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof CommandDialog>;
15
+
16
+ export const Default: Story = {
17
+ args: {
18
+
19
+ },
20
+ render: (args) => (
21
+ <div className="storybook-wrapper">
22
+ <CommandDialog {...args} />
23
+ </div>
24
+ )
25
+ };
@@ -0,0 +1,161 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { ICommandResult } from '@cratis/arc/commands';
5
+ import { Constructor } from '@cratis/fundamentals';
6
+ import { Dialog } from 'primereact/dialog';
7
+ import { Button } from 'primereact/button';
8
+ import React, { createContext, useContext } from 'react';
9
+ import { CommandForm, useCommandFormContext, BeforeExecuteCallback } from '../CommandForm/CommandForm';
10
+ import { useCommandInstance } from '../CommandForm/CommandForm';
11
+
12
+ export type FieldValidator<TCommand> = (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;
13
+ export type FieldChangeCallback<TCommand> = (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;
14
+
15
+ export interface CommandDialogProps<TCommand, TResponse = object> {
16
+ command: Constructor<TCommand>;
17
+ initialValues?: Partial<TCommand>;
18
+ currentValues?: Partial<TCommand> | undefined;
19
+ visible: boolean;
20
+ header: string;
21
+ confirmLabel?: string;
22
+ cancelLabel?: string;
23
+ confirmIcon?: string;
24
+ cancelIcon?: string;
25
+ onConfirm: (result: ICommandResult<TResponse>) => void | Promise<void>;
26
+ onCancel: () => void;
27
+ onFieldValidate?: FieldValidator<TCommand>;
28
+ onFieldChange?: FieldChangeCallback<TCommand>;
29
+ onBeforeExecute?: BeforeExecuteCallback<TCommand>;
30
+ children?: React.ReactNode;
31
+ style?: React.CSSProperties;
32
+ width?: string;
33
+ }
34
+
35
+ interface CommandDialogContextValue<TCommand = unknown> {
36
+ onSuccess: (result: ICommandResult<any>) => void | Promise<void>;
37
+ onCancel: () => void;
38
+ confirmLabel: string;
39
+ cancelLabel: string;
40
+ confirmIcon: string;
41
+ cancelIcon: string;
42
+ onFieldValidate?: FieldValidator<TCommand>;
43
+ onFieldChange?: FieldChangeCallback<TCommand>;
44
+ onBeforeExecute?: BeforeExecuteCallback<TCommand>;
45
+ }
46
+
47
+ const CommandDialogContext = createContext<CommandDialogContextValue<unknown> | undefined>(undefined);
48
+
49
+ export const useCommandDialogContext = <TCommand = unknown,>() => {
50
+ const context = useContext(CommandDialogContext);
51
+ if (!context) {
52
+ throw new Error('useCommandDialogContext must be used within a CommandDialog');
53
+ }
54
+ return context as CommandDialogContextValue<TCommand>;
55
+ };
56
+
57
+ const CommandDialogFormContent = () => {
58
+ const command = useCommandInstance();
59
+ const { setCommandResult, setCommandValues, isValid, onBeforeExecute } = useCommandFormContext();
60
+ const { onSuccess: onConfirm, onCancel, confirmLabel, cancelLabel, confirmIcon, cancelIcon } = useCommandDialogContext();
61
+
62
+ const handleConfirm = async () => {
63
+ if (onBeforeExecute) {
64
+ const transformedValues = onBeforeExecute(command);
65
+ setCommandValues(transformedValues);
66
+ }
67
+ const result = await command.execute();
68
+ if (result.isSuccess) {
69
+ await onConfirm(result);
70
+ } else {
71
+ setCommandResult(result);
72
+ }
73
+ };
74
+
75
+ const handleCancel = () => {
76
+ onCancel();
77
+ };
78
+
79
+ return (
80
+ <>
81
+ <div className="card flex flex-wrap justify-content-center gap-3 mt-8">
82
+ <Button label={confirmLabel} icon={confirmIcon} onClick={handleConfirm} disabled={!isValid} />
83
+ <Button label={cancelLabel} icon={cancelIcon} severity='secondary' onClick={handleCancel} />
84
+ </div>
85
+ </>
86
+ );
87
+ };
88
+
89
+ const CommandDialogFieldsWrapper = (props: { children: React.ReactNode }) => {
90
+ React.Children.forEach(props.children, child => {
91
+ if (React.isValidElement(child)) {
92
+ const component = child.type as any;
93
+ if (component.displayName !== 'CommandFormField') {
94
+ throw new Error(`Only CommandFormField components are allowed as children of CommandDialog.Fields. Got: ${component.displayName || component.name || 'Unknown'}`);
95
+ }
96
+ }
97
+ });
98
+
99
+ return (
100
+ <CommandForm.Fields>
101
+ {props.children}
102
+ </CommandForm.Fields>
103
+ );
104
+ };
105
+
106
+ const CommandDialogComponent = <TCommand extends object = any, TResponse = object>(props: CommandDialogProps<TCommand, TResponse>) => {
107
+ const {
108
+ command,
109
+ initialValues,
110
+ currentValues,
111
+ visible,
112
+ header,
113
+ confirmLabel = 'Confirm',
114
+ cancelLabel = 'Cancel',
115
+ confirmIcon = 'pi pi-check',
116
+ cancelIcon = 'pi pi-times',
117
+ onConfirm,
118
+ onCancel,
119
+ onFieldValidate,
120
+ onFieldChange,
121
+ onBeforeExecute,
122
+ children,
123
+ style = { width: '50vw' },
124
+ width
125
+ } = props;
126
+
127
+ const dialogStyle = width ? { ...style, width } : style;
128
+
129
+ const contextValue: CommandDialogContextValue<TCommand> = {
130
+ onSuccess: onConfirm,
131
+ onCancel,
132
+ confirmLabel,
133
+ cancelLabel,
134
+ confirmIcon,
135
+ cancelIcon,
136
+ onFieldValidate,
137
+ onFieldChange,
138
+ onBeforeExecute
139
+ };
140
+
141
+ return (
142
+ <Dialog
143
+ header={header}
144
+ visible={visible}
145
+ style={dialogStyle}
146
+ onHide={onCancel}
147
+ contentStyle={{ overflow: 'visible' }}
148
+ >
149
+ <CommandDialogContext.Provider value={contextValue}>
150
+ <CommandForm command={command} initialValues={initialValues} currentValues={currentValues} onFieldValidate={onFieldValidate} onFieldChange={onFieldChange} onBeforeExecute={onBeforeExecute}>
151
+ {children}
152
+ <CommandDialogFormContent />
153
+ </CommandForm>
154
+ </CommandDialogContext.Provider>
155
+ </Dialog>
156
+ );
157
+ };
158
+
159
+ CommandDialogComponent.Fields = CommandDialogFieldsWrapper;
160
+
161
+ export const CommandDialog = CommandDialogComponent;
@@ -0,0 +1,4 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ export * from './CommandDialog';
@@ -0,0 +1,24 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import React from 'react';
5
+ import { Meta, StoryObj } from '@storybook/react';
6
+ import { CommandForm } from './CommandForm';
7
+
8
+ const meta: Meta<typeof CommandForm> = {
9
+ title: 'CommandForm/CommandForm',
10
+ component: CommandForm,
11
+ };
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof CommandForm>;
15
+ export const Default: Story = {
16
+ args: {
17
+
18
+ },
19
+ render: (args) => (
20
+ <div className="storybook-wrapper">
21
+ <CommandForm {...args} />
22
+ </div>
23
+ )
24
+ };
@@ -0,0 +1,266 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { CommandFormFields, ColumnInfo } from './CommandFormFields';
5
+ import { Constructor } from '@cratis/fundamentals';
6
+ import { useCommand, SetCommandValues } from '@cratis/arc.react/commands';
7
+ import { ICommandResult } from '@cratis/arc/commands';
8
+ import React, { createContext, useContext, useMemo, useState, useCallback } from 'react';
9
+ import type { CommandFormFieldProps } from './CommandFormField';
10
+ import { Panel } from 'primereact/panel';
11
+
12
+ export type BeforeExecuteCallback<TCommand> = (values: TCommand) => TCommand;
13
+
14
+ export interface CommandFormProps<TCommand extends object> {
15
+ command: Constructor<TCommand>;
16
+ initialValues?: Partial<TCommand>;
17
+ currentValues?: Partial<TCommand> | undefined;
18
+ onFieldValidate?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;
19
+ onFieldChange?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;
20
+ onBeforeExecute?: BeforeExecuteCallback<TCommand>;
21
+ children?: React.ReactNode;
22
+ }
23
+
24
+ interface CommandFormContextValue<TCommand> {
25
+ command: Constructor<TCommand>;
26
+ commandInstance: TCommand;
27
+ setCommandValues: SetCommandValues<TCommand>;
28
+ commandResult?: ICommandResult<unknown>;
29
+ setCommandResult: (result: ICommandResult<unknown>) => void;
30
+ getFieldError: (propertyName: string) => string | undefined;
31
+ isValid: boolean;
32
+ setFieldValidity: (fieldName: string, isValid: boolean) => void;
33
+ onFieldValidate?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;
34
+ onFieldChange?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;
35
+ onBeforeExecute?: BeforeExecuteCallback<TCommand>;
36
+ customFieldErrors: Record<string, string>;
37
+ setCustomFieldError: (fieldName: string, error: string | undefined) => void;
38
+ }
39
+
40
+ const CommandFormContext = createContext<CommandFormContextValue<any> | undefined>(undefined);
41
+
42
+ export const useCommandFormContext = <TCommand,>() => {
43
+ const context = useContext(CommandFormContext);
44
+ if (!context) {
45
+ throw new Error('useCommandFormContext must be used within a CommandForm');
46
+ }
47
+ return context as CommandFormContextValue<TCommand>;
48
+ };
49
+
50
+ // Hook to get just the command instance for easier access
51
+ export const useCommandInstance = <TCommand = any>() => {
52
+ const { commandInstance } = useCommandFormContext<any>();
53
+ return commandInstance as TCommand;
54
+ };
55
+
56
+ // Hook to get setCommandResult for easier access
57
+ export const useSetCommandResult = () => {
58
+ const { setCommandResult } = useCommandFormContext();
59
+ return setCommandResult;
60
+ };
61
+
62
+ const CommandFormFieldsWrapper = (props: { children: React.ReactNode }) => {
63
+ React.Children.forEach(props.children, child => {
64
+ if (React.isValidElement(child)) {
65
+ const component = child.type as any;
66
+ if (component.displayName !== 'CommandFormField') {
67
+ throw new Error(`Only CommandFormField components are allowed as children of CommandForm.Fields. Got: ${component.displayName || component.name || 'Unknown'}`);
68
+ }
69
+ }
70
+ });
71
+
72
+ return <></>;
73
+ };
74
+
75
+ CommandFormFieldsWrapper.displayName = 'CommandFormFieldsWrapper';
76
+
77
+ const getCommandFormFields = <TCommand,>(props: { children?: React.ReactNode }): { fieldsOrColumns: React.ReactElement[] | ColumnInfo[], otherChildren: React.ReactNode[], initialValuesFromFields: Partial<TCommand> } => {
78
+ if (!props.children) {
79
+ return { fieldsOrColumns: [], otherChildren: [], initialValuesFromFields: {} };
80
+ }
81
+ let fields: React.ReactElement<CommandFormFieldProps<any>>[] = [];
82
+ const columns: ColumnInfo[] = [];
83
+ let hasColumns = false;
84
+ const otherChildren: React.ReactNode[] = [];
85
+ let initialValuesFromFields: Partial<TCommand> = {};
86
+
87
+ const extractInitialValue = (field: React.ReactElement) => {
88
+ const fieldProps = field.props as any;
89
+ if (fieldProps.currentValue !== undefined && fieldProps.value) {
90
+ const propertyAccessor = fieldProps.value;
91
+ const propertyName = getPropertyNameFromAccessor(propertyAccessor);
92
+ if (propertyName) {
93
+ initialValuesFromFields = { ...initialValuesFromFields, [propertyName]: fieldProps.currentValue } as Partial<TCommand>;
94
+ }
95
+ }
96
+ };
97
+
98
+ React.Children.toArray(props.children).forEach(child => {
99
+ if (!React.isValidElement(child)) {
100
+ otherChildren.push(child);
101
+ return;
102
+ }
103
+
104
+ const component = child.type as any;
105
+
106
+ // Check if child is a CommandFormColumn
107
+ if (component.displayName === 'CommandFormColumn') {
108
+ hasColumns = true;
109
+ const childProps = child.props as { children?: React.ReactNode };
110
+ const columnFields = React.Children.toArray(childProps.children).filter(child => {
111
+ if (React.isValidElement(child)) {
112
+ const comp = child.type as any;
113
+ if (comp.displayName === 'CommandFormField') {
114
+ extractInitialValue(child as React.ReactElement);
115
+ return true;
116
+ }
117
+ }
118
+ return false;
119
+ }) as React.ReactElement[];
120
+ columns.push({ fields: columnFields as React.ReactElement<CommandFormFieldProps<any>>[] });
121
+ }
122
+ // Check if child is a CommandFormField (direct child)
123
+ else if (component.displayName === 'CommandFormField') {
124
+ extractInitialValue(child as React.ReactElement);
125
+ fields.push(child as React.ReactElement<CommandFormFieldProps<any>>);
126
+ }
127
+ // Check if child is Fields wrapper (backwards compatibility)
128
+ else if (component === CommandFormFieldsWrapper || component.displayName === 'CommandFormFieldsWrapper') {
129
+ const childProps = child.props as { children: React.ReactNode };
130
+ const relevantChildren = React.Children.toArray(childProps.children).filter(child => {
131
+ if (React.isValidElement(child)) {
132
+ const component = child.type as any;
133
+ if (component.displayName === 'CommandFormField') {
134
+ extractInitialValue(child as React.ReactElement);
135
+ return true;
136
+ }
137
+ }
138
+ return false;
139
+ }) as React.ReactElement[];
140
+ fields = [...fields, ...(relevantChildren as React.ReactElement<CommandFormFieldProps<any>>[])];
141
+ }
142
+ // Everything else is not a field, keep it as other children
143
+ else {
144
+ otherChildren.push(child);
145
+ }
146
+ });
147
+
148
+ return { fieldsOrColumns: hasColumns ? columns : fields, otherChildren, initialValuesFromFields };
149
+ };
150
+
151
+ // Helper function to extract property name from accessor function
152
+ function getPropertyNameFromAccessor<T>(accessor: (obj: T) => unknown): string {
153
+ const fnStr = accessor.toString();
154
+ const match = fnStr.match(/\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);
155
+ return match ? match[1] : '';
156
+ }
157
+
158
+ const CommandFormComponent = <TCommand extends object = any>(props: CommandFormProps<TCommand>) => {
159
+ const { fieldsOrColumns, otherChildren, initialValuesFromFields } = useMemo(() => getCommandFormFields<TCommand>(props), [props.children]);
160
+
161
+ // Extract matching properties from currentValues
162
+ const valuesFromCurrentValues = useMemo(() => {
163
+ if (!props.currentValues) return {};
164
+
165
+ const tempCommand = new props.command();
166
+ const commandProperties = (tempCommand as any).properties || [];
167
+ const extracted: Partial<TCommand> = {};
168
+
169
+ commandProperties.forEach((propertyName: string) => {
170
+ if ((props.currentValues as any)[propertyName] !== undefined) {
171
+ (extracted as any)[propertyName] = (props.currentValues as any)[propertyName];
172
+ }
173
+ });
174
+
175
+ return extracted;
176
+ }, [props.currentValues, props.command]);
177
+
178
+ // Merge initialValues prop with values extracted from field currentValue props and currentValues
179
+ const mergedInitialValues = useMemo(() => ({
180
+ ...valuesFromCurrentValues,
181
+ ...initialValuesFromFields,
182
+ ...props.initialValues
183
+ }), [valuesFromCurrentValues, initialValuesFromFields, props.initialValues]);
184
+
185
+ // useCommand returns [instance, setter] for the typed command. Provide generics so commandInstance is TCommand.
186
+ const [commandInstance, setCommandValues] = useCommand<any>(props.command as Constructor<any>, mergedInitialValues as Partial<any>);
187
+ const [commandResult, setCommandResult] = useState<ICommandResult<unknown> | undefined>(undefined);
188
+ const [fieldValidities, setFieldValidities] = useState<Record<string, boolean>>({});
189
+ const [customFieldErrors, setCustomFieldErrors] = useState<Record<string, string>>({});
190
+
191
+ // Update command values when mergedInitialValues changes (e.g., when data loads asynchronously)
192
+ React.useEffect(() => {
193
+ if (mergedInitialValues && Object.keys(mergedInitialValues).length > 0) {
194
+ setCommandValues(mergedInitialValues as TCommand);
195
+ }
196
+ }, [mergedInitialValues, setCommandValues]);
197
+
198
+ const isValid = Object.values(fieldValidities).every(valid => valid);
199
+
200
+ const setFieldValidity = useCallback((fieldName: string, isFieldValid: boolean) => {
201
+ setFieldValidities(prev => ({ ...prev, [fieldName]: isFieldValid }));
202
+ }, []);
203
+
204
+ const setCustomFieldError = useCallback((fieldName: string, error: string | undefined) => {
205
+ setCustomFieldErrors(prev => {
206
+ if (error === undefined) {
207
+ const newErrors = { ...prev };
208
+ delete newErrors[fieldName];
209
+ return newErrors;
210
+ }
211
+ return { ...prev, [fieldName]: error };
212
+ });
213
+ }, []);
214
+
215
+ const getFieldError = (propertyName: string): string | undefined => {
216
+ // Check custom field errors first
217
+ if (customFieldErrors[propertyName]) {
218
+ return customFieldErrors[propertyName];
219
+ }
220
+
221
+ if (!commandResult || !commandResult.validationResults) {
222
+ return undefined;
223
+ }
224
+
225
+ for (const validationResult of commandResult.validationResults) {
226
+ if (validationResult.members && validationResult.members.includes(propertyName)) {
227
+ return validationResult.message;
228
+ }
229
+ }
230
+
231
+ return undefined;
232
+ };
233
+
234
+ const exceptionMessages = commandResult?.exceptionMessages || [];
235
+ const hasColumns = fieldsOrColumns.length > 0 && 'fields' in fieldsOrColumns[0];
236
+
237
+ return (
238
+ <CommandFormContext.Provider value={{ command: props.command, commandInstance, setCommandValues, commandResult, setCommandResult, getFieldError, isValid, setFieldValidity, onFieldValidate: props.onFieldValidate, onFieldChange: props.onFieldChange, onBeforeExecute: props.onBeforeExecute, customFieldErrors, setCustomFieldError }}>
239
+ <CommandFormFields fields={hasColumns ? undefined : (fieldsOrColumns as React.ReactElement<CommandFormFieldProps<any>>[])} columns={hasColumns ? fieldsOrColumns as ColumnInfo[] : undefined} />
240
+ {exceptionMessages.length > 0 && (
241
+ <div className="card flex flex-row gap-3 mt-3">
242
+ <Panel header="The server responded with" className="w-full">
243
+ <ul>
244
+ {exceptionMessages.map((msg, idx) => (
245
+ <li key={idx}>{msg}</li>
246
+ ))}
247
+ </ul>
248
+ </Panel>
249
+ </div>
250
+ )}
251
+ {otherChildren}
252
+ </CommandFormContext.Provider>
253
+ );
254
+ };
255
+
256
+ const CommandFormColumnComponent = (_props: { children: React.ReactNode }) => {
257
+ void _props;
258
+ return <></>;
259
+ };
260
+
261
+ CommandFormColumnComponent.displayName = 'CommandFormColumn';
262
+
263
+ CommandFormComponent.Fields = CommandFormFieldsWrapper;
264
+ CommandFormComponent.Column = CommandFormColumnComponent;
265
+
266
+ export const CommandForm = CommandFormComponent;
@@ -0,0 +1,27 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import type { PropertyAccessor } from '@cratis/fundamentals';
5
+
6
+ export interface CommandFormFieldProps<TCommand = unknown> {
7
+ icon?: React.ReactElement;
8
+ /** Accessor function that selects a property on the command, e.g. c => c.name */
9
+ value?: PropertyAccessor<TCommand>;
10
+ /** Current value for the property (injected by CommandFormFields) */
11
+ currentValue?: unknown;
12
+ /** Called when the field value changes (injected by CommandFormFields) */
13
+ onValueChange?: (value: unknown) => void;
14
+ onChange?: (value: unknown) => void;
15
+ required?: boolean;
16
+ title?: string;
17
+ description?: string;
18
+ propertyDescriptor?: unknown;
19
+ fieldName?: string;
20
+ }
21
+
22
+ export const CommandFormField = <TCommand,>(_props?: CommandFormFieldProps<TCommand>) => {
23
+ void _props;
24
+ return <></>;
25
+ };
26
+
27
+ CommandFormField.displayName = 'CommandFormField';
@@ -0,0 +1,142 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { useCommandFormContext } from './CommandForm';
5
+ import React from 'react';
6
+ import { Tooltip } from 'primereact/tooltip';
7
+ import type { CommandFormFieldProps } from './CommandFormField';
8
+
9
+ export interface ColumnInfo {
10
+ fields: React.ReactElement<CommandFormFieldProps<any>>[];
11
+ }
12
+
13
+ export interface CommandFormFieldsProps {
14
+ fields?: React.ReactElement<CommandFormFieldProps<any>>[];
15
+ columns?: ColumnInfo[];
16
+ }
17
+
18
+ // Separate component for each field to prevent re-rendering all fields
19
+ const CommandFormFieldWrapper = ({ field, index }: { field: React.ReactElement<CommandFormFieldProps<any>>; index: number }) => {
20
+ const context = useCommandFormContext<any>();
21
+ const fieldProps = field.props as CommandFormFieldProps<any>;
22
+ const propertyAccessor = fieldProps.value;
23
+
24
+ // Get the property name from the accessor function
25
+ const propertyName = propertyAccessor ? getPropertyName(propertyAccessor) : '';
26
+
27
+ // Get the current value from the command instance
28
+ const currentValue = propertyName ? (context.commandInstance as any)?.[propertyName] : undefined;
29
+
30
+ // Get the error message for this field, if any
31
+ const errorMessage = propertyName ? context.getFieldError(propertyName) : undefined;
32
+
33
+ // Get the property descriptor for this field from the command instance
34
+ const propertyDescriptor = propertyName && (context.commandInstance as any)?.propertyDescriptors
35
+ ? (context.commandInstance as any).propertyDescriptors.find((pd: any) => pd.name === propertyName)
36
+ : undefined;
37
+
38
+ // Clone the field element with the current value and onChange handler
39
+ const clonedField = React.cloneElement(field as React.ReactElement, {
40
+ ...fieldProps,
41
+ currentValue,
42
+ propertyDescriptor,
43
+ fieldName: propertyName,
44
+ onValueChange: (value: unknown) => {
45
+ if (propertyName) {
46
+ const oldValue = currentValue;
47
+
48
+ // Call custom field validator if provided
49
+ if (context.onFieldValidate) {
50
+ const validationError = context.onFieldValidate(context.commandInstance as any, propertyName, oldValue, value);
51
+ context.setCustomFieldError(propertyName, validationError);
52
+ }
53
+
54
+ context.setCommandValues({ [propertyName]: value } as any);
55
+
56
+ // Call field change callback if provided
57
+ if (context.onFieldChange) {
58
+ context.onFieldChange(context.commandInstance as any, propertyName, oldValue, value);
59
+ }
60
+ }
61
+ fieldProps.onChange?.(value as any);
62
+ },
63
+ required: fieldProps.required ?? true,
64
+ invalid: !!errorMessage
65
+ } as any);
66
+
67
+ const tooltipId = fieldProps.description ? `tooltip-${propertyName}-${index}` : undefined;
68
+
69
+ return (
70
+ <div style={{ width: '100%' }}>
71
+ <div className="p-inputgroup" style={{ width: '100%' }}>
72
+ {fieldProps.description && (
73
+ <Tooltip target={`.${tooltipId}`} content={fieldProps.description} />
74
+ )}
75
+ {fieldProps.icon && (
76
+ <span className={`p-inputgroup-addon ${tooltipId || ''}`}>
77
+ {fieldProps.icon}
78
+ </span>
79
+ )}
80
+ {clonedField}
81
+ </div>
82
+ {errorMessage && (
83
+ <small className="p-error block mt-1">{errorMessage}</small>
84
+ )}
85
+ </div>
86
+ );
87
+ };
88
+
89
+ export const CommandFormFields = (props: CommandFormFieldsProps) => {
90
+ const { fields, columns } = props;
91
+
92
+ // Render columns if provided
93
+ if (columns && columns.length > 0) {
94
+ return (
95
+ <div className="card flex flex-column md:flex-row gap-3">
96
+ {columns.map((column, columnIndex) => (
97
+ <div key={`column-${columnIndex}`} className="flex flex-column gap-3 flex-1">
98
+ {column.fields.map((field, index) => {
99
+ const fieldProps = field.props as CommandFormFieldProps<any>;
100
+ const propertyAccessor = fieldProps.value;
101
+ const propertyName = propertyAccessor ? getPropertyName(propertyAccessor) : `field-${columnIndex}-${index}`;
102
+
103
+ return (
104
+ <CommandFormFieldWrapper
105
+ key={propertyName}
106
+ field={field}
107
+ index={index}
108
+ />
109
+ );
110
+ })}
111
+ </div>
112
+ ))}
113
+ </div>
114
+ );
115
+ }
116
+
117
+ // Render fields (single column layout)
118
+ return (
119
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', width: '100%' }}>
120
+ {(fields || []).map((field, index) => {
121
+ const fieldProps = field.props as CommandFormFieldProps<any>;
122
+ const propertyAccessor = fieldProps.value;
123
+ const propertyName = propertyAccessor ? getPropertyName(propertyAccessor) : `field-${index}`;
124
+
125
+ return (
126
+ <CommandFormFieldWrapper
127
+ key={propertyName}
128
+ field={field}
129
+ index={index}
130
+ />
131
+ );
132
+ })}
133
+ </div>
134
+ );
135
+ };
136
+
137
+ // Helper function to extract property name from accessor function
138
+ function getPropertyName<T>(accessor: (obj: T) => unknown): string {
139
+ const fnStr = accessor.toString();
140
+ const match = fnStr.match(/\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);
141
+ return match ? match[1] : '';
142
+ }