@cratis/components 0.1.10 → 0.1.13

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 (211) hide show
  1. package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -1
  2. package/dist/cjs/CommandForm/CommandForm.js +6 -2
  3. package/dist/cjs/CommandForm/CommandForm.js.map +1 -1
  4. package/dist/cjs/CommandForm/CommandFormFields.js +9 -3
  5. package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -1
  6. package/dist/cjs/CommandForm/ValidationMessage.js +24 -0
  7. package/dist/cjs/CommandForm/ValidationMessage.js.map +1 -0
  8. package/dist/cjs/CommandForm/asCommandFormField.js +47 -0
  9. package/dist/cjs/CommandForm/asCommandFormField.js.map +1 -0
  10. package/dist/cjs/CommandForm/fields/CheckboxField.js +13 -0
  11. package/dist/cjs/CommandForm/fields/CheckboxField.js.map +1 -0
  12. package/dist/cjs/CommandForm/fields/DropdownField.js +13 -0
  13. package/dist/cjs/CommandForm/fields/DropdownField.js.map +1 -0
  14. package/dist/cjs/CommandForm/fields/InputTextField.js +13 -0
  15. package/dist/cjs/CommandForm/fields/InputTextField.js.map +1 -0
  16. package/dist/cjs/CommandForm/fields/NumberField.js +13 -0
  17. package/dist/cjs/CommandForm/fields/NumberField.js.map +1 -0
  18. package/dist/cjs/CommandForm/fields/SliderField.js +17 -0
  19. package/dist/cjs/CommandForm/fields/SliderField.js.map +1 -0
  20. package/dist/cjs/CommandForm/fields/TextAreaField.js +13 -0
  21. package/dist/cjs/CommandForm/fields/TextAreaField.js.map +1 -0
  22. package/dist/cjs/CommandForm/index.js +15 -7
  23. package/dist/cjs/CommandForm/index.js.map +1 -1
  24. package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -1
  25. package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -1
  26. package/dist/cjs/PivotViewer/PivotViewer.js +14 -0
  27. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
  28. package/dist/cjs/PivotViewer/components/PivotCanvas.js +36 -13
  29. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
  30. package/dist/cjs/PivotViewer/components/PivotViewerMain.js +1 -1
  31. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
  32. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  33. package/dist/cjs/PivotViewer/components/pivot/buckets.js.map +1 -1
  34. package/dist/cjs/PivotViewer/components/pivot/sprites.js +80 -16
  35. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
  36. package/dist/cjs/PivotViewer/components/pivot/visibility.js +36 -10
  37. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
  38. package/dist/cjs/PivotViewer/engine/layout.js +2 -1
  39. package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
  40. package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -1
  41. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +37 -2
  42. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  43. package/dist/cjs/PivotViewer/index.js +3 -0
  44. package/dist/cjs/PivotViewer/index.js.map +1 -1
  45. package/dist/cjs/PivotViewer/types.js +22 -0
  46. package/dist/cjs/PivotViewer/types.js.map +1 -0
  47. package/dist/cjs/TimeMachine/TimeMachine.js +8 -3
  48. package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
  49. package/dist/esm/CommandDialog/CommandDialog.d.ts +2 -2
  50. package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -1
  51. package/dist/esm/CommandDialog/CommandDialog.js.map +1 -1
  52. package/dist/esm/CommandForm/CommandForm.d.ts +2 -2
  53. package/dist/esm/CommandForm/CommandForm.d.ts.map +1 -1
  54. package/dist/esm/CommandForm/CommandForm.js +6 -2
  55. package/dist/esm/CommandForm/CommandForm.js.map +1 -1
  56. package/dist/esm/CommandForm/CommandForm.stories.d.ts +1 -0
  57. package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -1
  58. package/dist/esm/CommandForm/CommandForm.stories.js +34 -1
  59. package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -1
  60. package/dist/esm/CommandForm/CommandFormFields.d.ts +2 -2
  61. package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -1
  62. package/dist/esm/CommandForm/CommandFormFields.js +9 -3
  63. package/dist/esm/CommandForm/CommandFormFields.js.map +1 -1
  64. package/dist/esm/CommandForm/UserRegistrationCommand.d.ts +63 -0
  65. package/dist/esm/CommandForm/UserRegistrationCommand.d.ts.map +1 -0
  66. package/dist/esm/CommandForm/UserRegistrationCommand.js +143 -0
  67. package/dist/esm/CommandForm/UserRegistrationCommand.js.map +1 -0
  68. package/dist/esm/CommandForm/ValidationMessage.d.ts +8 -0
  69. package/dist/esm/CommandForm/ValidationMessage.d.ts.map +1 -0
  70. package/dist/esm/CommandForm/ValidationMessage.js +22 -0
  71. package/dist/esm/CommandForm/ValidationMessage.js.map +1 -0
  72. package/dist/esm/CommandForm/asCommandFormField.d.ts +32 -0
  73. package/dist/esm/CommandForm/asCommandFormField.d.ts.map +1 -0
  74. package/dist/esm/CommandForm/asCommandFormField.js +45 -0
  75. package/dist/esm/CommandForm/asCommandFormField.js.map +1 -0
  76. package/dist/esm/CommandForm/fields/CheckboxField.d.ts +10 -0
  77. package/dist/esm/CommandForm/fields/CheckboxField.d.ts.map +1 -0
  78. package/dist/esm/CommandForm/fields/CheckboxField.js +11 -0
  79. package/dist/esm/CommandForm/fields/CheckboxField.js.map +1 -0
  80. package/dist/esm/CommandForm/fields/DropdownField.d.ts +15 -0
  81. package/dist/esm/CommandForm/fields/DropdownField.d.ts.map +1 -0
  82. package/dist/esm/CommandForm/fields/DropdownField.js +11 -0
  83. package/dist/esm/CommandForm/fields/DropdownField.js.map +1 -0
  84. package/dist/esm/CommandForm/fields/InputTextField.d.ts +11 -0
  85. package/dist/esm/CommandForm/fields/InputTextField.d.ts.map +1 -0
  86. package/dist/esm/CommandForm/fields/InputTextField.js +11 -0
  87. package/dist/esm/CommandForm/fields/InputTextField.js.map +1 -0
  88. package/dist/esm/CommandForm/fields/NumberField.d.ts +13 -0
  89. package/dist/esm/CommandForm/fields/NumberField.d.ts.map +1 -0
  90. package/dist/esm/CommandForm/fields/NumberField.js +11 -0
  91. package/dist/esm/CommandForm/fields/NumberField.js.map +1 -0
  92. package/dist/esm/CommandForm/fields/SliderField.d.ts +12 -0
  93. package/dist/esm/CommandForm/fields/SliderField.d.ts.map +1 -0
  94. package/dist/esm/CommandForm/fields/SliderField.js +15 -0
  95. package/dist/esm/CommandForm/fields/SliderField.js.map +1 -0
  96. package/dist/esm/CommandForm/fields/TextAreaField.d.ts +12 -0
  97. package/dist/esm/CommandForm/fields/TextAreaField.d.ts.map +1 -0
  98. package/dist/esm/CommandForm/fields/TextAreaField.js +11 -0
  99. package/dist/esm/CommandForm/fields/TextAreaField.js.map +1 -0
  100. package/dist/esm/CommandForm/fields/index.d.ts +7 -0
  101. package/dist/esm/CommandForm/fields/index.d.ts.map +1 -0
  102. package/dist/esm/CommandForm/fields/index.js +7 -0
  103. package/dist/esm/CommandForm/fields/index.js.map +1 -0
  104. package/dist/esm/CommandForm/index.d.ts +3 -4
  105. package/dist/esm/CommandForm/index.d.ts.map +1 -1
  106. package/dist/esm/CommandForm/index.js +8 -4
  107. package/dist/esm/CommandForm/index.js.map +1 -1
  108. package/dist/esm/Common/ErrorBoundary.stories.d.ts +1 -1
  109. package/dist/esm/Common/ErrorBoundary.stories.js.map +1 -1
  110. package/dist/esm/Common/FormElement.stories.d.ts +1 -1
  111. package/dist/esm/Common/FormElement.stories.js.map +1 -1
  112. package/dist/esm/Common/Page.stories.d.ts +1 -1
  113. package/dist/esm/Common/Page.stories.js.map +1 -1
  114. package/dist/esm/DataPage/DataPage.stories.d.ts +1 -1
  115. package/dist/esm/DataPage/DataPage.stories.js.map +1 -1
  116. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +4 -4
  117. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -1
  118. package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -1
  119. package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts +1 -1
  120. package/dist/esm/DataTables/DataTableForObservableQuery.stories.js.map +1 -1
  121. package/dist/esm/DataTables/DataTableForQuery.d.ts +4 -4
  122. package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -1
  123. package/dist/esm/DataTables/DataTableForQuery.js.map +1 -1
  124. package/dist/esm/DataTables/DataTableForQuery.stories.d.ts +1 -1
  125. package/dist/esm/DataTables/DataTableForQuery.stories.js.map +1 -1
  126. package/dist/esm/Dialogs/ConfirmationDialog.stories.js.map +1 -1
  127. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
  128. package/dist/esm/PivotViewer/PivotViewer.js +14 -0
  129. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  130. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +1 -0
  131. package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
  132. package/dist/esm/PivotViewer/PivotViewer.stories.js +43 -3
  133. package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
  134. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +2 -2
  135. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
  136. package/dist/esm/PivotViewer/components/PivotCanvas.js +36 -13
  137. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
  138. package/dist/esm/PivotViewer/components/PivotViewerMain.js +1 -1
  139. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
  140. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  141. package/dist/esm/PivotViewer/components/pivot/buckets.js.map +1 -1
  142. package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
  143. package/dist/esm/PivotViewer/components/pivot/sprites.js +80 -16
  144. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
  145. package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
  146. package/dist/esm/PivotViewer/components/pivot/visibility.js +36 -10
  147. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  148. package/dist/esm/PivotViewer/engine/layout.js +2 -1
  149. package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
  150. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -1
  151. package/dist/esm/PivotViewer/engine/pivot.worker.js +22 -7
  152. package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -1
  153. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js.map +1 -1
  154. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +2 -2
  155. package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -1
  156. package/dist/esm/PivotViewer/hooks/useFilteredData.js +4 -2
  157. package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -1
  158. package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -1
  159. package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -1
  160. package/dist/esm/PivotViewer/hooks/usePivotEngine.js +37 -2
  161. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  162. package/dist/esm/PivotViewer/index.d.ts +2 -1
  163. package/dist/esm/PivotViewer/index.d.ts.map +1 -1
  164. package/dist/esm/PivotViewer/index.js +1 -0
  165. package/dist/esm/PivotViewer/index.js.map +1 -1
  166. package/dist/esm/PivotViewer/types.d.ts +4 -1
  167. package/dist/esm/PivotViewer/types.d.ts.map +1 -1
  168. package/dist/esm/PivotViewer/types.js +19 -2
  169. package/dist/esm/PivotViewer/types.js.map +1 -1
  170. package/dist/esm/TimeMachine/EventsView.stories.d.ts +1 -1
  171. package/dist/esm/TimeMachine/EventsView.stories.js.map +1 -1
  172. package/dist/esm/TimeMachine/Properties.stories.d.ts +1 -1
  173. package/dist/esm/TimeMachine/Properties.stories.js.map +1 -1
  174. package/dist/esm/TimeMachine/ReadModelView.stories.d.ts +1 -1
  175. package/dist/esm/TimeMachine/ReadModelView.stories.js.map +1 -1
  176. package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -1
  177. package/dist/esm/TimeMachine/TimeMachine.js +8 -3
  178. package/dist/esm/TimeMachine/TimeMachine.js.map +1 -1
  179. package/dist/esm/TimeMachine/TimeMachine.stories.d.ts +1 -1
  180. package/dist/esm/TimeMachine/TimeMachine.stories.js.map +1 -1
  181. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  182. package/dist/esm/vite.config.js.map +1 -1
  183. package/dist/esm/vitest.setup.d.ts +2 -0
  184. package/dist/esm/vitest.setup.d.ts.map +1 -0
  185. package/dist/esm/vitest.setup.js +8 -0
  186. package/dist/esm/vitest.setup.js.map +1 -0
  187. package/package.json +30 -29
  188. package/dist/cjs/CommandForm/DatePickerField.js +0 -31
  189. package/dist/cjs/CommandForm/DatePickerField.js.map +0 -1
  190. package/dist/cjs/CommandForm/DropdownField.js +0 -31
  191. package/dist/cjs/CommandForm/DropdownField.js.map +0 -1
  192. package/dist/cjs/CommandForm/InputTextField.js +0 -32
  193. package/dist/cjs/CommandForm/InputTextField.js.map +0 -1
  194. package/dist/cjs/CommandForm/SliderField.js +0 -34
  195. package/dist/cjs/CommandForm/SliderField.js.map +0 -1
  196. package/dist/esm/CommandForm/DatePickerField.d.ts +0 -20
  197. package/dist/esm/CommandForm/DatePickerField.d.ts.map +0 -1
  198. package/dist/esm/CommandForm/DatePickerField.js +0 -29
  199. package/dist/esm/CommandForm/DatePickerField.js.map +0 -1
  200. package/dist/esm/CommandForm/DropdownField.d.ts +0 -24
  201. package/dist/esm/CommandForm/DropdownField.d.ts.map +0 -1
  202. package/dist/esm/CommandForm/DropdownField.js +0 -29
  203. package/dist/esm/CommandForm/DropdownField.js.map +0 -1
  204. package/dist/esm/CommandForm/InputTextField.d.ts +0 -20
  205. package/dist/esm/CommandForm/InputTextField.d.ts.map +0 -1
  206. package/dist/esm/CommandForm/InputTextField.js +0 -30
  207. package/dist/esm/CommandForm/InputTextField.js.map +0 -1
  208. package/dist/esm/CommandForm/SliderField.d.ts +0 -23
  209. package/dist/esm/CommandForm/SliderField.d.ts.map +0 -1
  210. package/dist/esm/CommandForm/SliderField.js +0 -32
  211. package/dist/esm/CommandForm/SliderField.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"usePivotEngine.js","sources":["../../../../PivotViewer/hooks/usePivotEngine.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport type {\n PivotStore,\n PivotIndexes,\n FilterSpec,\n FilterResult,\n GroupSpec,\n GroupingResult,\n WorkerInMessage,\n WorkerOutMessage,\n FieldValue,\n} from '../engine/types';\nimport { buildStore, buildIndexes, applyFilters, computeGrouping, sortIds } from '../engine/store';\n\nexport interface UsePivotEngineOptions<TItem extends object> {\n data: TItem[];\n fieldExtractors: Map<string, (item: TItem) => FieldValue>;\n indexFields: string[];\n}\n\nexport interface UsePivotEngineResult {\n ready: boolean;\n applyFilters: (filters: FilterSpec[]) => Promise<FilterResult>;\n computeGrouping: (visibleIds: Uint32Array, groupBy: GroupSpec) => Promise<GroupingResult>;\n sortIds: (visibleIds: Uint32Array, sortBy: string) => Promise<Uint32Array>;\n}\n\nexport function usePivotEngine<TItem extends object>({\n data,\n fieldExtractors,\n indexFields,\n}: UsePivotEngineOptions<TItem>): UsePivotEngineResult {\n const [ready, setReady] = useState(false);\n const workerRef = useRef<Worker | null>(null);\n const indexesRef = useRef<PivotIndexes | null>(null);\n const fallbackRef = useRef(false);\n const storeRef = useRef<PivotStore | null>(null);\n const pendingCallbacksRef = useRef<Map<string, (result: unknown) => void>>(new Map());\n\n useEffect(() => {\n const worker = new Worker(\n new URL('../engine/pivot.worker.ts', import.meta.url),\n { type: 'module' }\n );\n\n workerRef.current = worker;\n\n worker.onmessage = (e: MessageEvent<WorkerOutMessage>) => {\n const message = e.data;\n\n switch (message.type) {\n case 'indexesReady':\n console.log('[PivotEngine] Indexes ready');\n setReady(true);\n break;\n\n case 'filterResult': {\n const callback = pendingCallbacksRef.current.get('filter');\n if (callback) {\n callback(message.result);\n pendingCallbacksRef.current.delete('filter');\n }\n break;\n }\n\n case 'groupingResult': {\n const callback = pendingCallbacksRef.current.get('grouping');\n if (callback) {\n callback(message.result);\n pendingCallbacksRef.current.delete('grouping');\n }\n break;\n }\n\n case 'sortResult': {\n const callback = pendingCallbacksRef.current.get('sort');\n if (callback) {\n callback(message.result);\n pendingCallbacksRef.current.delete('sort');\n }\n break;\n }\n }\n };\n\n worker.onerror = (error) => {\n console.error('[PivotEngine] Worker error:', error);\n // enable synchronous fallback so UI can still function without worker\n fallbackRef.current = true;\n workerRef.current = null;\n // if we already built store/indexes, mark ready so UI can use fallback\n if (storeRef.current) {\n try {\n indexesRef.current = buildIndexes(storeRef.current, indexFields);\n } catch (e) {\n console.error('[PivotEngine] Failed to build indexes in fallback:', e);\n indexesRef.current = null;\n }\n setReady(true);\n }\n };\n\n return () => {\n worker.terminate();\n };\n }, []);\n\n useEffect(() => {\n if (!workerRef.current) return;\n\n console.log('[PivotEngine] Building indexes for', data.length, 'items');\n setReady(false);\n\n const store = buildStore(data, fieldExtractors);\n storeRef.current = store;\n\n // compute indexes locally for immediate fallback and cache\n try {\n indexesRef.current = buildIndexes(store, indexFields);\n } catch (e) {\n console.error('[PivotEngine] buildIndexes failed:', e);\n indexesRef.current = null;\n }\n\n if (workerRef.current) {\n const message: WorkerInMessage = {\n type: 'buildIndexes',\n store,\n fields: indexFields,\n };\n\n workerRef.current.postMessage(message);\n } else {\n // no worker available, mark ready to allow fallback synchronous usage\n setReady(true);\n }\n }, [data, fieldExtractors, indexFields]);\n\n const applyFiltersCallback = useCallback(\n (filters: FilterSpec[]): Promise<FilterResult> => {\n return new Promise((resolve) => {\n // If worker is not available, use synchronous fallback using local indexes\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n const indexes = indexesRef.current;\n if (store && indexes) {\n const result = applyFilters(store, indexes, filters);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback applyFilters error:', e);\n }\n\n // if fallback not possible, return empty result\n resolve({ visibleIds: new Uint32Array(0), count: 0 });\n return;\n }\n\n pendingCallbacksRef.current.set('filter', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'applyFilters',\n filters,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n const computeGroupingCallback = useCallback(\n (visibleIds: Uint32Array, groupBy: GroupSpec): Promise<GroupingResult> => {\n return new Promise((resolve) => {\n // synchronous fallback if worker unavailable\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n const indexes = indexesRef.current;\n if (store && indexes) {\n const result = computeGrouping(store, indexes, visibleIds, groupBy);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback computeGrouping error:', e);\n }\n\n resolve({ groups: [] });\n return;\n }\n\n pendingCallbacksRef.current.set('grouping', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'computeGrouping',\n visibleIds,\n groupBy,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n const sortIdsCallback = useCallback(\n (visibleIds: Uint32Array, sortBy: string): Promise<Uint32Array> => {\n return new Promise((resolve) => {\n // synchronous fallback if worker unavailable\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n if (store) {\n const result = sortIds(store, visibleIds, sortBy);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback sortIds error:', e);\n }\n\n resolve(visibleIds);\n return;\n }\n\n pendingCallbacksRef.current.set('sort', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'sort',\n ids: visibleIds,\n sortBy,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n return {\n ready,\n applyFilters: applyFiltersCallback,\n computeGrouping: computeGroupingCallback,\n sortIds: sortIdsCallback,\n };\n}\n"],"names":["useState","useRef","useEffect","buildIndexes","store","buildStore","useCallback","applyFilters","computeGrouping","sortIds"],"mappings":"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"}
1
+ {"version":3,"file":"usePivotEngine.js","sources":["../../../../PivotViewer/hooks/usePivotEngine.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport type {\n PivotStore,\n PivotIndexes,\n FilterSpec,\n FilterResult,\n GroupSpec,\n GroupingResult,\n WorkerInMessage,\n WorkerOutMessage,\n FieldValue,\n} from '../engine/types';\nimport { buildStore, buildIndexes, applyFilters, computeGrouping, sortIds } from '../engine/store';\n\nexport interface UsePivotEngineOptions<TItem extends object> {\n data: TItem[];\n fieldExtractors: Map<string, (item: TItem) => FieldValue>;\n indexFields: string[];\n}\n\nexport interface UsePivotEngineResult {\n ready: boolean;\n applyFilters: (filters: FilterSpec[]) => Promise<FilterResult>;\n computeGrouping: (visibleIds: Uint32Array, groupBy: GroupSpec) => Promise<GroupingResult>;\n sortIds: (visibleIds: Uint32Array, sortBy: string) => Promise<Uint32Array>;\n}\n\nexport function usePivotEngine<TItem extends object>({\n data,\n fieldExtractors,\n indexFields,\n}: UsePivotEngineOptions<TItem>): UsePivotEngineResult {\n const [ready, setReady] = useState(false);\n const workerRef = useRef<Worker | null>(null);\n const indexesRef = useRef<PivotIndexes | null>(null);\n const fallbackRef = useRef(false);\n const storeRef = useRef<PivotStore | null>(null);\n const pendingCallbacksRef = useRef<Map<string, (result: unknown) => void>>(new Map());\n\n useEffect(() => {\n console.log('[PivotEngine] Creating worker');\n const worker = new Worker(\n new URL('../engine/pivot.worker.ts', import.meta.url),\n { type: 'module' }\n );\n\n workerRef.current = worker;\n console.log('[PivotEngine] Worker created, setting up message handlers');\n\n worker.onmessage = (e: MessageEvent<WorkerOutMessage>) => {\n const message = e.data;\n console.log('[PivotEngine] Received message from worker:', message.type);\n\n switch (message.type) {\n case 'indexesReady':\n console.log('[PivotEngine] Indexes ready');\n setReady(true);\n break;\n\n case 'filterResult': {\n const callback = pendingCallbacksRef.current.get('filter');\n if (callback) {\n console.log('[PivotEngine] Calling filter callback and deleting');\n callback(message.result);\n pendingCallbacksRef.current.delete('filter');\n } else {\n console.warn('[PivotEngine] No callback registered for filter result - ignoring duplicate message');\n }\n break;\n }\n\n case 'groupingResult': {\n console.log('[PivotEngine] Received groupingResult:', message.result);\n const callback = pendingCallbacksRef.current.get('grouping');\n if (callback) {\n console.log('[PivotEngine] Calling grouping callback and deleting');\n callback(message.result);\n pendingCallbacksRef.current.delete('grouping');\n } else {\n console.warn('[PivotEngine] No callback registered for grouping result - ignoring duplicate message');\n }\n break;\n }\n\n case 'sortResult': {\n const callback = pendingCallbacksRef.current.get('sort');\n if (callback) {\n console.log('[PivotEngine] Calling sort callback and deleting');\n callback(message.result);\n pendingCallbacksRef.current.delete('sort');\n } else {\n console.warn('[PivotEngine] No callback registered for sort result - ignoring duplicate message');\n }\n break;\n }\n }\n };\n\n worker.onerror = (error) => {\n console.error('[PivotEngine] Worker error:', error);\n // enable synchronous fallback so UI can still function without worker\n fallbackRef.current = true;\n workerRef.current = null;\n // if we already built store/indexes, mark ready so UI can use fallback\n if (storeRef.current) {\n try {\n indexesRef.current = buildIndexes(storeRef.current, indexFields);\n } catch (e) {\n console.error('[PivotEngine] Failed to build indexes in fallback:', e);\n indexesRef.current = null;\n }\n setReady(true);\n }\n };\n\n return () => {\n worker.terminate();\n };\n }, []);\n\n useEffect(() => {\n if (!workerRef.current) {\n console.warn('[PivotEngine] Worker not available in data effect');\n return;\n }\n\n console.log('[PivotEngine] Building indexes for', data.length, 'items');\n setReady(false);\n\n const store = buildStore(data, fieldExtractors);\n storeRef.current = store;\n console.log('[PivotEngine] Store built with', store.items.length, 'items and', store.fields.size, 'fields');\n\n // compute indexes locally for immediate fallback and cache\n try {\n indexesRef.current = buildIndexes(store, indexFields);\n } catch (e) {\n console.error('[PivotEngine] buildIndexes failed:', e);\n indexesRef.current = null;\n }\n\n if (workerRef.current) {\n // Convert Map to array for serialization\n const fieldsArray = Array.from(store.fields.entries());\n const serializableStore = {\n ...store,\n fields: fieldsArray,\n };\n\n const message: WorkerInMessage = {\n type: 'buildIndexes',\n store: serializableStore as unknown as PivotStore,\n fields: indexFields,\n };\n\n console.log('[PivotEngine] Posting buildIndexes with', fieldsArray.length, 'fields');\n workerRef.current.postMessage(message);\n } else {\n // no worker available, mark ready to allow fallback synchronous usage\n setReady(true);\n }\n }, [data, fieldExtractors, indexFields]);\n\n const applyFiltersCallback = useCallback(\n (filters: FilterSpec[]): Promise<FilterResult> => {\n return new Promise((resolve) => {\n // If worker is not available, use synchronous fallback using local indexes\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n const indexes = indexesRef.current;\n if (store && indexes) {\n const result = applyFilters(store, indexes, filters);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback applyFilters error:', e);\n }\n\n // if fallback not possible, return empty result\n resolve({ visibleIds: new Uint32Array(0), count: 0 });\n return;\n }\n\n pendingCallbacksRef.current.set('filter', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'applyFilters',\n filters,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n const computeGroupingCallback = useCallback(\n (visibleIds: Uint32Array, groupBy: GroupSpec): Promise<GroupingResult> => {\n console.log('[PivotEngine] computeGroupingCallback called with', visibleIds.length, 'visibleIds');\n \n // Check if there's already a pending grouping request\n if (pendingCallbacksRef.current.has('grouping')) {\n console.warn('[PivotEngine] Grouping already in progress, ignoring duplicate request');\n return Promise.resolve({ groups: [] });\n }\n \n return new Promise((resolve) => {\n // synchronous fallback if worker unavailable\n if (!workerRef.current || fallbackRef.current) {\n console.log('[PivotEngine] Using synchronous fallback for grouping');\n try {\n const store = storeRef.current;\n const indexes = indexesRef.current;\n if (store && indexes) {\n const result = computeGrouping(store, indexes, visibleIds, groupBy);\n console.log('[PivotEngine] Fallback grouping result:', result);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback computeGrouping error:', e);\n }\n\n console.warn('[PivotEngine] No store/indexes for fallback, returning empty');\n resolve({ groups: [] });\n return;\n }\n\n console.log('[PivotEngine] Setting grouping callback and posting to worker');\n pendingCallbacksRef.current.set('grouping', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'computeGrouping',\n visibleIds,\n groupBy,\n };\n\n workerRef.current.postMessage(message);\n console.log('[PivotEngine] Message posted to worker');\n });\n },\n [ready]\n );\n\n const sortIdsCallback = useCallback(\n (visibleIds: Uint32Array, sortBy: string): Promise<Uint32Array> => {\n return new Promise((resolve) => {\n // synchronous fallback if worker unavailable\n if (!workerRef.current || fallbackRef.current) {\n try {\n const store = storeRef.current;\n if (store) {\n const result = sortIds(store, visibleIds, sortBy);\n resolve(result);\n return;\n }\n } catch (e) {\n console.error('[PivotEngine] fallback sortIds error:', e);\n }\n\n resolve(visibleIds);\n return;\n }\n\n pendingCallbacksRef.current.set('sort', resolve as (result: unknown) => void);\n\n const message: WorkerInMessage = {\n type: 'sort',\n ids: visibleIds,\n sortBy,\n };\n\n workerRef.current.postMessage(message);\n });\n },\n [ready]\n );\n\n return {\n ready,\n applyFilters: applyFiltersCallback,\n computeGrouping: computeGroupingCallback,\n sortIds: sortIdsCallback,\n };\n}\n"],"names":["useState","useRef","useEffect","buildIndexes","store","buildStore","useCallback","applyFilters","computeGrouping","sortIds"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  var PivotViewer = require('./PivotViewer.js');
4
+ var types = require('./types.js');
4
5
 
5
6
 
6
7
 
7
8
  exports.PivotViewer = PivotViewer.PivotViewer;
8
9
  exports.PivotViewerOptimized = PivotViewer.PivotViewer;
10
+ exports.getPropertyPath = types.getPropertyPath;
11
+ exports.getValueByPath = types.getValueByPath;
9
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ function getPropertyPath(accessor) {
4
+ const fnStr = accessor.toString();
5
+ const match = fnStr.match(/(?:=>|return)\s*[a-zA-Z_$][a-zA-Z0-9_$]*\.([a-zA-Z_$][a-zA-Z0-9_$.]*)/);
6
+ return match ? match[1] : '';
7
+ }
8
+ function getValueByPath(item, path) {
9
+ const parts = path.split('.');
10
+ let value = item;
11
+ for (const part of parts) {
12
+ if (value === null || value === undefined) {
13
+ return undefined;
14
+ }
15
+ value = value[part];
16
+ }
17
+ return value;
18
+ }
19
+
20
+ exports.getPropertyPath = getPropertyPath;
21
+ exports.getValueByPath = getValueByPath;
22
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../PivotViewer/types.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\n\nexport type PivotPrimitive = string | number | boolean | Date | null | undefined;\n\n/**\n * Type-safe property accessor for accessing properties, including nested ones\n */\nexport type PropertyAccessor<TItem> = (item: TItem) => unknown;\n\n/**\n * Extract property path from a property accessor function\n * Supports nested properties like item => item.address.city\n */\nexport function getPropertyPath<TItem>(accessor: PropertyAccessor<TItem>): string {\n const fnStr = accessor.toString();\n // Match patterns like: item => item.prop or item => item.prop.nested or (item) => item.prop\n const match = fnStr.match(/(?:=>|return)\\s*[a-zA-Z_$][a-zA-Z0-9_$]*\\.([a-zA-Z_$][a-zA-Z0-9_$.]*)/);\n return match ? match[1] : '';\n}\n\n/**\n * Get the value from an item using a property path string\n * Supports nested properties like \"address.city\"\n */\nexport function getValueByPath<TItem>(item: TItem, path: string): unknown {\n const parts = path.split('.');\n let value: unknown = item;\n for (const part of parts) {\n if (value === null || value === undefined) {\n return undefined;\n }\n value = value[part];\n }\n return value;\n}\n\nexport interface PivotGroup<TItem extends object> {\n key: string;\n label: string;\n value: PivotPrimitive;\n items: TItem[];\n count?: number;\n}\n\nexport interface PivotDimension<TItem extends object> {\n key: string;\n label: string;\n getValue: (item: TItem) => PivotPrimitive;\n formatValue?: (value: PivotPrimitive) => string;\n sort?: (a: PivotGroup<TItem>, b: PivotGroup<TItem>) => number;\n}\n\nexport interface PivotFilterOption {\n key: string;\n label: string;\n value: PivotPrimitive;\n count: number;\n}\n\nexport interface PivotFilter<TItem extends object> {\n key: string;\n label: string;\n getValue: (item: TItem) => PivotPrimitive;\n multi?: boolean;\n options?: PivotFilterOption[];\n sort?: (a: PivotFilterOption, b: PivotFilterOption) => number;\n /** For numeric filters, enables range picker with histogram */\n type?: 'string' | 'number' | 'date';\n /** Number of buckets for the histogram in range filters */\n buckets?: number;\n}\n\nexport interface PivotViewerProps<TItem extends object> {\n data: TItem[];\n dimensions: PivotDimension<TItem>[];\n filters?: PivotFilter<TItem>[];\n defaultDimensionKey?: string;\n cardRenderer?: (item: TItem) => ReactNode;\n getItemId?: (item: TItem, index: number) => string | number;\n searchFields?: PropertyAccessor<TItem>[];\n className?: string;\n emptyContent?: ReactNode;\n isLoading?: boolean;\n}\n\nexport type FilterState = Record<string, Set<string>>;\n\nexport type RangeFilterState = Record<string, [number, number] | null>;\n"],"names":[],"mappings":";;AAgBM,SAAU,eAAe,CAAQ,QAAiC,EAAA;AACpE,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE;IAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,uEAAuE,CAAC;AAClG,IAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;AAChC;AAMM,SAAU,cAAc,CAAQ,IAAW,EAAE,IAAY,EAAA;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC7B,IAAI,KAAK,GAAY,IAAI;AACzB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACvC,YAAA,OAAO,SAAS;QACpB;AACA,QAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IACvB;AACA,IAAA,OAAO,KAAK;AAChB;;;;;"}
@@ -8,11 +8,16 @@ var ReadModelView = require('./ReadModelView.js');
8
8
  var EventsView = require('./EventsView.js');
9
9
  require('./TimeMachine.css');
10
10
 
11
+ var ViewModes;
12
+ (function (ViewModes) {
13
+ ViewModes["ReadModel"] = "ReadModel";
14
+ ViewModes["Events"] = "Events";
15
+ })(ViewModes || (ViewModes = {}));
11
16
  const TimeMachine = ({ versions, currentVersionIndex = 0, onVersionChange, scrollSensitivity = 50, }) => {
12
17
  const [selectedIndex, setSelectedIndex] = React.useState(currentVersionIndex);
13
18
  const [hoveredIndex, setHoveredIndex] = React.useState(null);
14
19
  const [isHoveringCard, setIsHoveringCard] = React.useState(false);
15
- const [viewMode, setViewMode] = React.useState('readmodel');
20
+ const [viewMode, setViewMode] = React.useState(ViewModes.ReadModel);
16
21
  const containerRef = React.useRef(null);
17
22
  const scrollAccumulatorRef = React.useRef(0);
18
23
  const handleVersionSelect = React.useCallback((index) => {
@@ -23,7 +28,7 @@ const TimeMachine = ({ versions, currentVersionIndex = 0, onVersionChange, scrol
23
28
  setHoveredIndex(index);
24
29
  }, []);
25
30
  React.useEffect(() => {
26
- if (viewMode !== 'readmodel') {
31
+ if (viewMode !== ViewModes.ReadModel) {
27
32
  return;
28
33
  }
29
34
  const container = containerRef.current;
@@ -52,7 +57,7 @@ const TimeMachine = ({ versions, currentVersionIndex = 0, onVersionChange, scrol
52
57
  };
53
58
  }, [versions.length, selectedIndex, onVersionChange, scrollSensitivity, isHoveringCard, viewMode]);
54
59
  const allEvents = versions.flatMap(version => version.events || []);
55
- return (jsxRuntime.jsxs("div", { className: "time-machine", ref: containerRef, children: [jsxRuntime.jsxs("div", { className: "view-switcher", children: [jsxRuntime.jsx("button", { className: `view-button ${viewMode === 'readmodel' ? 'active' : ''}`, onClick: () => setViewMode('readmodel'), "aria-label": "Read Model View", title: "Read Model View", children: jsxRuntime.jsx("i", { className: "pi pi-box" }) }), jsxRuntime.jsx("button", { className: `view-button ${viewMode === 'events' ? 'active' : ''}`, onClick: () => setViewMode('events'), "aria-label": "Events View", title: "Events View", children: jsxRuntime.jsx("i", { className: "pi pi-list" }) })] }), viewMode === 'readmodel' ? (jsxRuntime.jsx(ReadModelView.ReadModelView, { versions: versions, selectedIndex: selectedIndex, hoveredIndex: hoveredIndex, onVersionSelect: handleVersionSelect, onHoveringCardChange: setIsHoveringCard })) : (jsxRuntime.jsx(EventsView.EventsView, { events: allEvents })), viewMode === 'readmodel' && (jsxRuntime.jsx(Timeline, { versions: versions, selectedIndex: selectedIndex, hoveredIndex: hoveredIndex, onSelect: handleVersionSelect, onHover: handleTimelineHover })), viewMode === 'readmodel' && (jsxRuntime.jsxs("div", { className: "navigation-controls", children: [jsxRuntime.jsx("button", { className: "nav-button prev", disabled: selectedIndex === 0, onClick: () => handleVersionSelect(Math.max(0, selectedIndex - 1)), "aria-label": "Previous version", children: "\u2039" }), jsxRuntime.jsx("button", { className: "nav-button next", disabled: selectedIndex === versions.length - 1, onClick: () => handleVersionSelect(Math.min(versions.length - 1, selectedIndex + 1)), "aria-label": "Next version", children: "\u203A" })] }))] }));
60
+ return (jsxRuntime.jsxs("div", { className: "time-machine", ref: containerRef, children: [jsxRuntime.jsxs("div", { className: "view-switcher", children: [jsxRuntime.jsx("button", { className: `view-button ${viewMode === ViewModes.ReadModel ? 'active' : ''}`, onClick: () => setViewMode(ViewModes.ReadModel), "aria-label": "Read Model View", title: "Read Model View", children: jsxRuntime.jsx("i", { className: "pi pi-box" }) }), jsxRuntime.jsx("button", { className: `view-button ${viewMode === ViewModes.Events ? 'active' : ''}`, onClick: () => setViewMode(ViewModes.Events), "aria-label": "Events View", title: "Events View", children: jsxRuntime.jsx("i", { className: "pi pi-list" }) })] }), viewMode === ViewModes.ReadModel ? (jsxRuntime.jsx(ReadModelView.ReadModelView, { versions: versions, selectedIndex: selectedIndex, hoveredIndex: hoveredIndex, onVersionSelect: handleVersionSelect, onHoveringCardChange: setIsHoveringCard })) : (jsxRuntime.jsx(EventsView.EventsView, { events: allEvents })), viewMode === ViewModes.ReadModel && (jsxRuntime.jsx(Timeline, { versions: versions, selectedIndex: selectedIndex, hoveredIndex: hoveredIndex, onSelect: handleVersionSelect, onHover: handleTimelineHover })), viewMode === ViewModes.ReadModel && (jsxRuntime.jsxs("div", { className: "navigation-controls", children: [jsxRuntime.jsx("button", { className: "nav-button prev", disabled: selectedIndex === 0, onClick: () => handleVersionSelect(Math.max(0, selectedIndex - 1)), "aria-label": "Previous version", children: "\u2039" }), jsxRuntime.jsx("button", { className: "nav-button next", disabled: selectedIndex === versions.length - 1, onClick: () => handleVersionSelect(Math.min(versions.length - 1, selectedIndex + 1)), "aria-label": "Next version", children: "\u203A" })] }))] }));
56
61
  };
57
62
  const Timeline = ({ versions, selectedIndex, hoveredIndex, onSelect, onHover, }) => {
58
63
  const getMagnification = (index, hoverIdx) => {
@@ -1 +1 @@
1
- {"version":3,"file":"TimeMachine.js","sources":["../../../TimeMachine/TimeMachine.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { Version } from './types';\nimport { ReadModelView } from './ReadModelView';\nimport { EventsView } from './EventsView';\nimport './TimeMachine.css';\n\ntype ViewMode = 'readmodel' | 'events';\n\ninterface TimeMachineProps {\n versions: Version[];\n currentVersionIndex?: number;\n onVersionChange?: (index: number) => void;\n /** Scroll sensitivity - higher values require more scrolling to change versions */\n scrollSensitivity?: number;\n}\n\nexport const TimeMachine: React.FC<TimeMachineProps> = ({\n versions,\n currentVersionIndex = 0,\n onVersionChange,\n scrollSensitivity = 50,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(currentVersionIndex);\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n const [isHoveringCard, setIsHoveringCard] = useState(false);\n const [viewMode, setViewMode] = useState<ViewMode>('readmodel');\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollAccumulatorRef = useRef(0);\n\n const handleVersionSelect = useCallback((index: number) => {\n setSelectedIndex(index);\n onVersionChange?.(index);\n }, [onVersionChange]);\n\n const handleTimelineHover = useCallback((index: number | null) => {\n setHoveredIndex(index);\n }, []);\n\n // Handle trackpad two-finger scroll gesture\n useEffect(() => {\n if (viewMode !== 'readmodel') {\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n // Only handle navigation when not hovering over a card\n if (isHoveringCard) {\n return; // Allow normal scrolling within cards\n }\n\n // Prevent default scrolling behavior\n e.preventDefault();\n\n // Use deltaX for horizontal scroll, fallback to deltaY for vertical\n // Most trackpads send horizontal delta for two-finger swipe\n const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n\n // Accumulate scroll delta\n scrollAccumulatorRef.current += delta;\n\n // Check if we've accumulated enough scroll to change version\n if (Math.abs(scrollAccumulatorRef.current) >= scrollSensitivity) {\n const direction = scrollAccumulatorRef.current > 0 ? 1 : -1;\n const newIndex = Math.max(0, Math.min(versions.length - 1, selectedIndex + direction));\n\n if (newIndex !== selectedIndex) {\n setSelectedIndex(newIndex);\n onVersionChange?.(newIndex);\n }\n\n // Reset accumulator after version change\n scrollAccumulatorRef.current = 0;\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [versions.length, selectedIndex, onVersionChange, scrollSensitivity, isHoveringCard, viewMode]);\n\n // Calculate the display index - either hovered or selected\n // (not used in this component; ReadModelView computes its own display index)\n void hoveredIndex;\n void selectedIndex;\n\n // Get all events from all versions\n const allEvents = versions.flatMap(version => version.events || []);\n\n return (\n <div className=\"time-machine\" ref={containerRef}>\n {/* View Switcher */}\n <div className=\"view-switcher\">\n <button\n className={`view-button ${viewMode === 'readmodel' ? 'active' : ''}`}\n onClick={() => setViewMode('readmodel')}\n aria-label=\"Read Model View\"\n title=\"Read Model View\"\n >\n <i className=\"pi pi-box\" />\n </button>\n <button\n className={`view-button ${viewMode === 'events' ? 'active' : ''}`}\n onClick={() => setViewMode('events')}\n aria-label=\"Events View\"\n title=\"Events View\"\n >\n <i className=\"pi pi-list\" />\n </button>\n </div>\n\n {/* Render the appropriate view */}\n {viewMode === 'readmodel' ? (\n <ReadModelView\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onVersionSelect={handleVersionSelect}\n onHoveringCardChange={setIsHoveringCard}\n />\n ) : (\n <EventsView events={allEvents} />\n )}\n\n {/* Timeline - only show in ReadModel view */}\n {viewMode === 'readmodel' && (\n <Timeline\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onSelect={handleVersionSelect}\n onHover={handleTimelineHover}\n />\n )}\n\n {/* Navigation arrows - only show in ReadModel view */}\n {viewMode === 'readmodel' && (\n <div className=\"navigation-controls\">\n <button\n className=\"nav-button prev\"\n disabled={selectedIndex === 0}\n onClick={() => handleVersionSelect(Math.max(0, selectedIndex - 1))}\n aria-label=\"Previous version\"\n >\n ‹\n </button>\n <button\n className=\"nav-button next\"\n disabled={selectedIndex === versions.length - 1}\n onClick={() => handleVersionSelect(Math.min(versions.length - 1, selectedIndex + 1))}\n aria-label=\"Next version\"\n >\n ›\n </button>\n </div>\n )}\n </div>\n );\n};\n\ninterface TimelineProps {\n versions: Version[];\n selectedIndex: number;\n hoveredIndex: number | null;\n onSelect: (index: number) => void;\n onHover: (index: number | null) => void;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({\n versions,\n selectedIndex,\n hoveredIndex,\n onSelect,\n onHover,\n}) => {\n const getMagnification = (index: number, hoverIdx: number | null): number => {\n if (hoverIdx === null) return 1;\n const distance = Math.abs(index - hoverIdx);\n // Fish-eye effect: items close to hover get magnified\n if (distance === 0) return 2.0;\n if (distance === 1) return 1.6;\n if (distance === 2) return 1.3;\n if (distance === 3) return 1.1;\n return 1;\n };\n\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n };\n\n return (\n <div\n className=\"timeline\"\n onMouseLeave={() => onHover(null)}\n >\n <div className=\"timeline-track\">\n {versions.map((version, index) => {\n const magnification = getMagnification(index, hoveredIndex);\n const isSelected = index === selectedIndex;\n const isHovered = index === hoveredIndex;\n\n return (\n <div\n key={version.id}\n className={`timeline-entry ${isSelected ? 'selected' : ''} ${isHovered ? 'hovered' : ''}`}\n style={{\n '--magnification': magnification,\n } as React.CSSProperties}\n onMouseEnter={() => onHover(index)}\n onClick={() => onSelect(index)}\n >\n <div className=\"timeline-tick\"></div>\n <div className=\"timeline-label\">\n <span className=\"timeline-date\">{formatDate(version.timestamp)}</span>\n <span className=\"timeline-time\">{formatTime(version.timestamp)}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TimeMachine;\n"],"names":["useState","useRef","useCallback","useEffect","_jsxs","_jsx","ReadModelView","EventsView"],"mappings":"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"}
1
+ {"version":3,"file":"TimeMachine.js","sources":["../../../TimeMachine/TimeMachine.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react';\nimport type { Version } from './types';\nimport { ReadModelView } from './ReadModelView';\nimport { EventsView } from './EventsView';\nimport './TimeMachine.css';\n\nenum ViewModes {\n ReadModel = 'ReadModel',\n Events = 'Events',\n}\n\ninterface TimeMachineProps {\n versions: Version[];\n currentVersionIndex?: number;\n onVersionChange?: (index: number) => void;\n /** Scroll sensitivity - higher values require more scrolling to change versions */\n scrollSensitivity?: number;\n}\n\nexport const TimeMachine: React.FC<TimeMachineProps> = ({\n versions,\n currentVersionIndex = 0,\n onVersionChange,\n scrollSensitivity = 50,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(currentVersionIndex);\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n const [isHoveringCard, setIsHoveringCard] = useState(false);\n const [viewMode, setViewMode] = useState<ViewModes>(ViewModes.ReadModel);\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollAccumulatorRef = useRef(0);\n\n const handleVersionSelect = useCallback((index: number) => {\n setSelectedIndex(index);\n onVersionChange?.(index);\n }, [onVersionChange]);\n\n const handleTimelineHover = useCallback((index: number | null) => {\n setHoveredIndex(index);\n }, []);\n\n // Handle trackpad two-finger scroll gesture\n useEffect(() => {\n if (viewMode !== ViewModes.ReadModel) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n // Only handle navigation when not hovering over a card\n if (isHoveringCard) {\n return; // Allow normal scrolling within cards\n }\n\n // Prevent default scrolling behavior\n e.preventDefault();\n\n // Use deltaX for horizontal scroll, fallback to deltaY for vertical\n // Most trackpads send horizontal delta for two-finger swipe\n const delta = Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n\n // Accumulate scroll delta\n scrollAccumulatorRef.current += delta;\n\n // Check if we've accumulated enough scroll to change version\n if (Math.abs(scrollAccumulatorRef.current) >= scrollSensitivity) {\n const direction = scrollAccumulatorRef.current > 0 ? 1 : -1;\n const newIndex = Math.max(0, Math.min(versions.length - 1, selectedIndex + direction));\n\n if (newIndex !== selectedIndex) {\n setSelectedIndex(newIndex);\n onVersionChange?.(newIndex);\n }\n\n // Reset accumulator after version change\n scrollAccumulatorRef.current = 0;\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n container.removeEventListener('wheel', handleWheel);\n };\n }, [versions.length, selectedIndex, onVersionChange, scrollSensitivity, isHoveringCard, viewMode]);\n\n // Calculate the display index - either hovered or selected\n // (not used in this component; ReadModelView computes its own display index)\n void hoveredIndex;\n void selectedIndex;\n\n // Get all events from all versions\n const allEvents = versions.flatMap(version => version.events || []);\n\n return (\n <div className=\"time-machine\" ref={containerRef}>\n {/* View Switcher */}\n <div className=\"view-switcher\">\n <button\n className={`view-button ${viewMode === ViewModes.ReadModel ? 'active' : ''}`}\n onClick={() => setViewMode(ViewModes.ReadModel)}\n aria-label=\"Read Model View\"\n title=\"Read Model View\"\n >\n <i className=\"pi pi-box\" />\n </button>\n <button\n className={`view-button ${viewMode === ViewModes.Events ? 'active' : ''}`}\n onClick={() => setViewMode(ViewModes.Events)}\n aria-label=\"Events View\"\n title=\"Events View\"\n >\n <i className=\"pi pi-list\" />\n </button>\n </div>\n\n {/* Render the appropriate view */}\n {viewMode === ViewModes.ReadModel ? (\n <ReadModelView\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onVersionSelect={handleVersionSelect}\n onHoveringCardChange={setIsHoveringCard}\n />\n ) : (\n <EventsView events={allEvents} />\n )}\n\n {/* Timeline - only show in ReadModel view */}\n {viewMode === ViewModes.ReadModel && (\n <Timeline\n versions={versions}\n selectedIndex={selectedIndex}\n hoveredIndex={hoveredIndex}\n onSelect={handleVersionSelect}\n onHover={handleTimelineHover}\n />\n )}\n\n {/* Navigation arrows - only show in ReadModel view */}\n {viewMode === ViewModes.ReadModel && (\n <div className=\"navigation-controls\">\n <button\n className=\"nav-button prev\"\n disabled={selectedIndex === 0}\n onClick={() => handleVersionSelect(Math.max(0, selectedIndex - 1))}\n aria-label=\"Previous version\"\n >\n ‹\n </button>\n <button\n className=\"nav-button next\"\n disabled={selectedIndex === versions.length - 1}\n onClick={() => handleVersionSelect(Math.min(versions.length - 1, selectedIndex + 1))}\n aria-label=\"Next version\"\n >\n ›\n </button>\n </div>\n )}\n </div>\n );\n};\n\ninterface TimelineProps {\n versions: Version[];\n selectedIndex: number;\n hoveredIndex: number | null;\n onSelect: (index: number) => void;\n onHover: (index: number | null) => void;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({\n versions,\n selectedIndex,\n hoveredIndex,\n onSelect,\n onHover,\n}) => {\n const getMagnification = (index: number, hoverIdx: number | null): number => {\n if (hoverIdx === null) return 1;\n const distance = Math.abs(index - hoverIdx);\n // Fish-eye effect: items close to hover get magnified\n if (distance === 0) return 2.0;\n if (distance === 1) return 1.6;\n if (distance === 2) return 1.3;\n if (distance === 3) return 1.1;\n return 1;\n };\n\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n };\n\n const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n };\n\n return (\n <div\n className=\"timeline\"\n onMouseLeave={() => onHover(null)}\n >\n <div className=\"timeline-track\">\n {versions.map((version, index) => {\n const magnification = getMagnification(index, hoveredIndex);\n const isSelected = index === selectedIndex;\n const isHovered = index === hoveredIndex;\n\n return (\n <div\n key={version.id}\n className={`timeline-entry ${isSelected ? 'selected' : ''} ${isHovered ? 'hovered' : ''}`}\n style={{\n '--magnification': magnification,\n } as React.CSSProperties}\n onMouseEnter={() => onHover(index)}\n onClick={() => onSelect(index)}\n >\n <div className=\"timeline-tick\"></div>\n <div className=\"timeline-label\">\n <span className=\"timeline-date\">{formatDate(version.timestamp)}</span>\n <span className=\"timeline-time\">{formatTime(version.timestamp)}</span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default TimeMachine;\n"],"names":["useState","useRef","useCallback","useEffect","_jsxs","_jsx","ReadModelView","EventsView"],"mappings":";;;;;;;;;;AASA,IAAK,SAGJ;AAHD,CAAA,UAAK,SAAS,EAAA;AACZ,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAHI,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;AAaP,MAAM,WAAW,GAA+B,CAAC,EACtD,QAAQ,EACR,mBAAmB,GAAG,CAAC,EACvB,eAAe,EACf,iBAAiB,GAAG,EAAE,GACvB,KAAI;IACH,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAC,mBAAmB,CAAC;IACvE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IACrE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;AAC3D,IAAA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAY,SAAS,CAAC,SAAS,CAAC;AACxE,IAAA,MAAM,YAAY,GAAGC,YAAM,CAAiB,IAAI,CAAC;AACjD,IAAA,MAAM,oBAAoB,GAAGA,YAAM,CAAC,CAAC,CAAC;AAEtC,IAAA,MAAM,mBAAmB,GAAGC,iBAAW,CAAC,CAAC,KAAa,KAAI;QACxD,gBAAgB,CAAC,KAAK,CAAC;AACvB,QAAA,eAAe,GAAG,KAAK,CAAC;AAC1B,IAAA,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;AAErB,IAAA,MAAM,mBAAmB,GAAGA,iBAAW,CAAC,CAAC,KAAoB,KAAI;QAC/D,eAAe,CAAC,KAAK,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC;IAGNC,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,QAAQ,KAAK,SAAS,CAAC,SAAS,EAAE;YACpC;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,CAAC,CAAa,KAAI;YAEpC,IAAI,cAAc,EAAE;gBAClB;YACF;YAGA,CAAC,CAAC,cAAc,EAAE;AAIlB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;AAG3E,YAAA,oBAAoB,CAAC,OAAO,IAAI,KAAK;YAGrC,IAAI,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,iBAAiB,EAAE;AAC/D,gBAAA,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC,CAAC;AAEtF,gBAAA,IAAI,QAAQ,KAAK,aAAa,EAAE;oBAC9B,gBAAgB,CAAC,QAAQ,CAAC;AAC1B,oBAAA,eAAe,GAAG,QAAQ,CAAC;gBAC7B;AAGA,gBAAA,oBAAoB,CAAC,OAAO,GAAG,CAAC;YAClC;AACF,QAAA,CAAC;AAED,QAAA,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEpE,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;AACrD,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AAQlG,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AAEnE,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,cAAc,EAAC,GAAG,EAAE,YAAY,EAAA,QAAA,EAAA,CAE7CA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAC5BC,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,YAAA,EAAe,QAAQ,KAAK,SAAS,CAAC,SAAS,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EAC5E,OAAO,EAAE,MAAM,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAA,YAAA,EACpC,iBAAiB,EAC5B,KAAK,EAAC,iBAAiB,EAAA,QAAA,EAEvBA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,WAAW,EAAA,CAAG,EAAA,CACpB,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,YAAA,EAAe,QAAQ,KAAK,SAAS,CAAC,MAAM,GAAG,QAAQ,GAAG,EAAE,CAAA,CAAE,EACzE,OAAO,EAAE,MAAM,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAA,YAAA,EACjC,aAAa,EACxB,KAAK,EAAC,aAAa,EAAA,QAAA,EAEnBA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,YAAY,EAAA,CAAG,EAAA,CACrB,CAAA,EAAA,CACL,EAGL,QAAQ,KAAK,SAAS,CAAC,SAAS,IAC/BA,cAAA,CAACC,2BAAa,EAAA,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,mBAAmB,EACpC,oBAAoB,EAAE,iBAAiB,EAAA,CACvC,KAEFD,cAAA,CAACE,qBAAU,EAAA,EAAC,MAAM,EAAE,SAAS,EAAA,CAAI,CAClC,EAGA,QAAQ,KAAK,SAAS,CAAC,SAAS,KAC/BF,cAAA,CAAC,QAAQ,EAAA,EACP,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,mBAAmB,EAAA,CAC5B,CACH,EAGA,QAAQ,KAAK,SAAS,CAAC,SAAS,KAC/BD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAClCC,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iBAAiB,EAC3B,QAAQ,EAAE,aAAa,KAAK,CAAC,EAC7B,OAAO,EAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,EAAA,YAAA,EACvD,kBAAkB,EAAA,QAAA,EAAA,QAAA,EAAA,CAGtB,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,iBAAiB,EAC3B,QAAQ,EAAE,aAAa,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAC/C,OAAO,EAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,EAAA,YAAA,EACzE,cAAc,EAAA,QAAA,EAAA,QAAA,EAAA,CAGlB,CAAA,EAAA,CACL,CACP,CAAA,EAAA,CACG;AAEV;AAUA,MAAM,QAAQ,GAA4B,CAAC,EACzC,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,OAAO,GACR,KAAI;AACH,IAAA,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,QAAuB,KAAY;QAC1E,IAAI,QAAQ,KAAK,IAAI;AAAE,YAAA,OAAO,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC;QAE3C,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;QAC9B,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,GAAG;AAC9B,QAAA,OAAO,CAAC;AACV,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,IAAU,KAAY;AACxC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACtC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,IAAU,KAAY;AACxC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACtC,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,QACEA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,UAAU,EACpB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAA,QAAA,EAEjCA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAC5B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;gBAC/B,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC;AAC3D,gBAAA,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa;AAC1C,gBAAA,MAAM,SAAS,GAAG,KAAK,KAAK,YAAY;gBAExC,QACED,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAE,CAAA,eAAA,EAAkB,UAAU,GAAG,UAAU,GAAG,EAAE,CAAA,CAAA,EAAI,SAAS,GAAG,SAAS,GAAG,EAAE,CAAA,CAAE,EACzF,KAAK,EAAE;AACL,wBAAA,iBAAiB,EAAE,aAAa;AACV,qBAAA,EACxB,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAA,QAAA,EAAA,CAE9BC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,CAAO,EACrCD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAA,CAAQ,EACtEA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAA,CAAQ,CAAA,EAAA,CAClE,CAAA,EAAA,EAZD,OAAO,CAAC,EAAE,CAaX;AAEV,YAAA,CAAC,CAAC,EAAA,CACE,EAAA,CACF;AAEV,CAAC;;;;;"}
@@ -24,7 +24,7 @@ export interface CommandDialogProps<TCommand, TResponse = object> {
24
24
  width?: string;
25
25
  }
26
26
  interface CommandDialogContextValue<TCommand = unknown> {
27
- onSuccess: (result: ICommandResult<any>) => void | Promise<void>;
27
+ onSuccess: (result: ICommandResult<unknown>) => void | Promise<void>;
28
28
  onCancel: () => void;
29
29
  confirmLabel: string;
30
30
  cancelLabel: string;
@@ -36,7 +36,7 @@ interface CommandDialogContextValue<TCommand = unknown> {
36
36
  }
37
37
  export declare const useCommandDialogContext: <TCommand = unknown>() => CommandDialogContextValue<TCommand>;
38
38
  export declare const CommandDialog: {
39
- <TCommand extends object = any, TResponse = object>(props: CommandDialogProps<TCommand, TResponse>): import("react/jsx-runtime").JSX.Element;
39
+ <TCommand extends object = object, TResponse = object>(props: CommandDialogProps<TCommand, TResponse>): import("react/jsx-runtime").JSX.Element;
40
40
  Fields: (props: {
41
41
  children: React.ReactNode;
42
42
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"CommandDialog.d.ts","sourceRoot":"","sources":["../../../CommandDialog/CommandDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAsC,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGvG,MAAM,MAAM,cAAc,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;AAC1I,MAAM,MAAM,mBAAmB,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAEjI,MAAM,WAAW,kBAAkB,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM;IAC5D,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,yBAAyB,CAAC,QAAQ,GAAG,OAAO;IAClD,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CACrD;AAID,eAAO,MAAM,uBAAuB,GAAI,QAAQ,GAAG,OAAO,OAKpC,yBAAyB,CAAC,QAAQ,CACvD,CAAC;AA0GF,eAAO,MAAM,aAAa;KAvDM,QAAQ,SAAS,MAAM,QAAQ,SAAS,kBAAkB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC;oBAjBtF;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;CAwErB,CAAC"}
1
+ {"version":3,"file":"CommandDialog.d.ts","sourceRoot":"","sources":["../../../CommandDialog/CommandDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAsC,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGvG,MAAM,MAAM,cAAc,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;AAC1I,MAAM,MAAM,mBAAmB,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAEjI,MAAM,WAAW,kBAAkB,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM;IAC5D,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,yBAAyB,CAAC,QAAQ,GAAG,OAAO;IAClD,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CACrD;AAID,eAAO,MAAM,uBAAuB,GAAI,QAAQ,GAAG,OAAO,OAKpC,yBAAyB,CAAC,QAAQ,CACvD,CAAC;AA0GF,eAAO,MAAM,aAAa;KAvDM,QAAQ,SAAS,MAAM,WAAW,SAAS,kBAAkB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC;oBAjBzF;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;CAwErB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CommandDialog.js","sources":["../../../CommandDialog/CommandDialog.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ICommandResult } from '@cratis/arc/commands';\nimport { Constructor } from '@cratis/fundamentals';\nimport { Dialog } from 'primereact/dialog';\nimport { Button } from 'primereact/button';\nimport React, { createContext, useContext } from 'react';\nimport { CommandForm, useCommandFormContext, BeforeExecuteCallback } from '../CommandForm/CommandForm';\nimport { useCommandInstance } from '../CommandForm/CommandForm';\n\nexport type FieldValidator<TCommand> = (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;\nexport type FieldChangeCallback<TCommand> = (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;\n\nexport interface CommandDialogProps<TCommand, TResponse = object> {\n command: Constructor<TCommand>;\n initialValues?: Partial<TCommand>;\n currentValues?: Partial<TCommand> | undefined;\n visible: boolean;\n header: string;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmIcon?: string;\n cancelIcon?: string;\n onConfirm: (result: ICommandResult<TResponse>) => void | Promise<void>;\n onCancel: () => void;\n onFieldValidate?: FieldValidator<TCommand>;\n onFieldChange?: FieldChangeCallback<TCommand>;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n children?: React.ReactNode;\n style?: React.CSSProperties;\n width?: string;\n}\n\ninterface CommandDialogContextValue<TCommand = unknown> {\n onSuccess: (result: ICommandResult<any>) => void | Promise<void>;\n onCancel: () => void;\n confirmLabel: string;\n cancelLabel: string;\n confirmIcon: string;\n cancelIcon: string;\n onFieldValidate?: FieldValidator<TCommand>;\n onFieldChange?: FieldChangeCallback<TCommand>;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n}\n\nconst CommandDialogContext = createContext<CommandDialogContextValue<unknown> | undefined>(undefined);\n\nexport const useCommandDialogContext = <TCommand = unknown,>() => {\n const context = useContext(CommandDialogContext);\n if (!context) {\n throw new Error('useCommandDialogContext must be used within a CommandDialog');\n }\n return context as CommandDialogContextValue<TCommand>;\n};\n\nconst CommandDialogFormContent = () => {\n const command = useCommandInstance();\n const { setCommandResult, setCommandValues, isValid, onBeforeExecute } = useCommandFormContext();\n const { onSuccess: onConfirm, onCancel, confirmLabel, cancelLabel, confirmIcon, cancelIcon } = useCommandDialogContext();\n\n const handleConfirm = async () => {\n if (onBeforeExecute) {\n const transformedValues = onBeforeExecute(command);\n setCommandValues(transformedValues);\n }\n const result = await command.execute();\n if (result.isSuccess) {\n await onConfirm(result);\n } else {\n setCommandResult(result);\n }\n };\n\n const handleCancel = () => {\n onCancel();\n };\n\n return (\n <>\n <div className=\"card flex flex-wrap justify-content-center gap-3 mt-8\">\n <Button label={confirmLabel} icon={confirmIcon} onClick={handleConfirm} disabled={!isValid} />\n <Button label={cancelLabel} icon={cancelIcon} severity='secondary' onClick={handleCancel} />\n </div>\n </>\n );\n};\n\nconst CommandDialogFieldsWrapper = (props: { children: React.ReactNode }) => {\n React.Children.forEach(props.children, child => {\n if (React.isValidElement(child)) {\n const component = child.type as any;\n if (component.displayName !== 'CommandFormField') {\n throw new Error(`Only CommandFormField components are allowed as children of CommandDialog.Fields. Got: ${component.displayName || component.name || 'Unknown'}`);\n }\n }\n });\n\n return (\n <CommandForm.Fields>\n {props.children}\n </CommandForm.Fields>\n );\n};\n\nconst CommandDialogComponent = <TCommand extends object = any, TResponse = object>(props: CommandDialogProps<TCommand, TResponse>) => {\n const {\n command,\n initialValues,\n currentValues,\n visible,\n header,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n confirmIcon = 'pi pi-check',\n cancelIcon = 'pi pi-times',\n onConfirm,\n onCancel,\n onFieldValidate,\n onFieldChange,\n onBeforeExecute,\n children,\n style = { width: '50vw' },\n width\n } = props;\n\n const dialogStyle = width ? { ...style, width } : style;\n\n const contextValue: CommandDialogContextValue<TCommand> = {\n onSuccess: onConfirm,\n onCancel,\n confirmLabel,\n cancelLabel,\n confirmIcon,\n cancelIcon,\n onFieldValidate,\n onFieldChange,\n onBeforeExecute\n };\n\n return (\n <Dialog\n header={header}\n visible={visible}\n style={dialogStyle}\n onHide={onCancel}\n contentStyle={{ overflow: 'visible' }}\n >\n <CommandDialogContext.Provider value={contextValue}>\n <CommandForm command={command} initialValues={initialValues} currentValues={currentValues} onFieldValidate={onFieldValidate} onFieldChange={onFieldChange} onBeforeExecute={onBeforeExecute}>\n {children}\n <CommandDialogFormContent />\n </CommandForm>\n </CommandDialogContext.Provider>\n </Dialog>\n );\n};\n\nCommandDialogComponent.Fields = CommandDialogFieldsWrapper;\n\nexport const CommandDialog = CommandDialogComponent;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"CommandDialog.js","sources":["../../../CommandDialog/CommandDialog.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ICommandResult } from '@cratis/arc/commands';\nimport { Constructor } from '@cratis/fundamentals';\nimport { Dialog } from 'primereact/dialog';\nimport { Button } from 'primereact/button';\nimport React, { createContext, useContext } from 'react';\nimport { CommandForm, useCommandFormContext, BeforeExecuteCallback } from '../CommandForm/CommandForm';\nimport { useCommandInstance } from '../CommandForm/CommandForm';\n\nexport type FieldValidator<TCommand> = (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;\nexport type FieldChangeCallback<TCommand> = (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;\n\nexport interface CommandDialogProps<TCommand, TResponse = object> {\n command: Constructor<TCommand>;\n initialValues?: Partial<TCommand>;\n currentValues?: Partial<TCommand> | undefined;\n visible: boolean;\n header: string;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmIcon?: string;\n cancelIcon?: string;\n onConfirm: (result: ICommandResult<TResponse>) => void | Promise<void>;\n onCancel: () => void;\n onFieldValidate?: FieldValidator<TCommand>;\n onFieldChange?: FieldChangeCallback<TCommand>;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n children?: React.ReactNode;\n style?: React.CSSProperties;\n width?: string;\n}\n\ninterface CommandDialogContextValue<TCommand = unknown> {\n onSuccess: (result: ICommandResult<unknown>) => void | Promise<void>;\n onCancel: () => void;\n confirmLabel: string;\n cancelLabel: string;\n confirmIcon: string;\n cancelIcon: string;\n onFieldValidate?: FieldValidator<TCommand>;\n onFieldChange?: FieldChangeCallback<TCommand>;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n}\n\nconst CommandDialogContext = createContext<CommandDialogContextValue<unknown> | undefined>(undefined);\n\nexport const useCommandDialogContext = <TCommand = unknown,>() => {\n const context = useContext(CommandDialogContext);\n if (!context) {\n throw new Error('useCommandDialogContext must be used within a CommandDialog');\n }\n return context as CommandDialogContextValue<TCommand>;\n};\n\nconst CommandDialogFormContent = <TCommand extends { execute: () => Promise<ICommandResult<unknown>> }>() => {\n const command = useCommandInstance<TCommand>();\n const { setCommandResult, setCommandValues, isValid, onBeforeExecute } = useCommandFormContext<TCommand>();\n const { onSuccess: onConfirm, onCancel, confirmLabel, cancelLabel, confirmIcon, cancelIcon } = useCommandDialogContext<TCommand>();\n\n const handleConfirm = async () => {\n if (onBeforeExecute) {\n const transformedValues = onBeforeExecute(command);\n setCommandValues(transformedValues);\n }\n const result = await command.execute();\n if (result.isSuccess) {\n await onConfirm(result);\n } else {\n setCommandResult(result);\n }\n };\n\n const handleCancel = () => {\n onCancel();\n };\n\n return (\n <>\n <div className=\"card flex flex-wrap justify-content-center gap-3 mt-8\">\n <Button label={confirmLabel} icon={confirmIcon} onClick={handleConfirm} disabled={!isValid} />\n <Button label={cancelLabel} icon={cancelIcon} severity='secondary' onClick={handleCancel} />\n </div>\n </>\n );\n};\n\nconst CommandDialogFieldsWrapper = (props: { children: React.ReactNode }) => {\n React.Children.forEach(props.children, child => {\n if (React.isValidElement(child)) {\n const component = child.type as React.ComponentType<unknown>;\n if (component.displayName !== 'CommandFormField') {\n throw new Error(`Only CommandFormField components are allowed as children of CommandDialog.Fields. Got: ${component.displayName || component.name || 'Unknown'}`);\n }\n }\n });\n\n return (\n <CommandForm.Fields>\n {props.children}\n </CommandForm.Fields>\n );\n};\n\nconst CommandDialogComponent = <TCommand extends object = object, TResponse = object>(props: CommandDialogProps<TCommand, TResponse>) => {\n const {\n command,\n initialValues,\n currentValues,\n visible,\n header,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n confirmIcon = 'pi pi-check',\n cancelIcon = 'pi pi-times',\n onConfirm,\n onCancel,\n onFieldValidate,\n onFieldChange,\n onBeforeExecute,\n children,\n style = { width: '50vw' },\n width\n } = props;\n\n const dialogStyle = width ? { ...style, width } : style;\n\n const contextValue: CommandDialogContextValue<TCommand> = {\n onSuccess: onConfirm,\n onCancel,\n confirmLabel,\n cancelLabel,\n confirmIcon,\n cancelIcon,\n onFieldValidate,\n onFieldChange,\n onBeforeExecute\n };\n\n return (\n <Dialog\n header={header}\n visible={visible}\n style={dialogStyle}\n onHide={onCancel}\n contentStyle={{ overflow: 'visible' }}\n >\n <CommandDialogContext.Provider value={contextValue}>\n <CommandForm command={command} initialValues={initialValues} currentValues={currentValues} onFieldValidate={onFieldValidate} onFieldChange={onFieldChange} onBeforeExecute={onBeforeExecute}>\n {children}\n <CommandDialogFormContent />\n </CommandForm>\n </CommandDialogContext.Provider>\n </Dialog>\n );\n};\n\nCommandDialogComponent.Fields = CommandDialogFieldsWrapper;\n\nexport const CommandDialog = CommandDialogComponent;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -28,10 +28,10 @@ interface CommandFormContextValue<TCommand> {
28
28
  setCustomFieldError: (fieldName: string, error: string | undefined) => void;
29
29
  }
30
30
  export declare const useCommandFormContext: <TCommand>() => CommandFormContextValue<TCommand>;
31
- export declare const useCommandInstance: <TCommand = any>() => TCommand;
31
+ export declare const useCommandInstance: <TCommand = unknown>() => TCommand;
32
32
  export declare const useSetCommandResult: () => (result: ICommandResult<unknown>) => void;
33
33
  export declare const CommandForm: {
34
- <TCommand extends object = any>(props: CommandFormProps<TCommand>): import("react/jsx-runtime").JSX.Element;
34
+ <TCommand extends object = object>(props: CommandFormProps<TCommand>): import("react/jsx-runtime").JSX.Element;
35
35
  Fields: {
36
36
  (props: {
37
37
  children: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.d.ts","sourceRoot":"","sources":["../../../CommandForm/CommandForm.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAc,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAoE,MAAM,OAAO,CAAC;AAIzF,MAAM,MAAM,qBAAqB,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAE7E,MAAM,WAAW,gBAAgB,CAAC,QAAQ,SAAS,MAAM;IACrD,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC9C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACrH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrG,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAED,UAAU,uBAAuB,CAAC,QAAQ;IACtC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,eAAe,EAAE,QAAQ,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACrH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrG,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC/E;AAID,eAAO,MAAM,qBAAqB,GAAI,QAAQ,OAKxB,uBAAuB,CAAC,QAAQ,CACrD,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,GAAG,GAAG,OAEnB,QAC7B,CAAC;AAGF,eAAO,MAAM,mBAAmB,iBA5BD,cAAc,CAAC,OAAO,CAAC,KAAK,IA+B1D,CAAC;AA8MF,eAAO,MAAM,WAAW;KA5GM,QAAQ,SAAS,MAAM,eAAe,gBAAgB,CAAC,QAAQ,CAAC;;gBAhGrD;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE;;;;iBAkM1B;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE;;;CAU1B,CAAC"}
1
+ {"version":3,"file":"CommandForm.d.ts","sourceRoot":"","sources":["../../../CommandForm/CommandForm.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAc,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAoE,MAAM,OAAO,CAAC;AAIzF,MAAM,MAAM,qBAAqB,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAE7E,MAAM,WAAW,gBAAgB,CAAC,QAAQ,SAAS,MAAM;IACrD,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC9C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACrH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrG,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AAED,UAAU,uBAAuB,CAAC,QAAQ;IACtC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,eAAe,EAAE,QAAQ,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACrH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrG,eAAe,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAClD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC/E;AAID,eAAO,MAAM,qBAAqB,GAAI,QAAQ,OAKxB,uBAAuB,CAAC,QAAQ,CACrD,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,GAAG,OAAO,OAEvB,QAC7B,CAAC;AAGF,eAAO,MAAM,mBAAmB,iBA5BD,cAAc,CAAC,OAAO,CAAC,KAAK,IA+B1D,CAAC;AAkNF,eAAO,MAAM,WAAW;KA/GM,QAAQ,SAAS,MAAM,kBAAkB,gBAAgB,CAAC,QAAQ,CAAC;;gBAjGxD;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE;;;;iBAsM1B;YAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;SAAE;;;CAU1B,CAAC"}
@@ -97,6 +97,8 @@ const getCommandFormFields = (props) => {
97
97
  return { fieldsOrColumns: hasColumns ? columns : fields, otherChildren, initialValuesFromFields };
98
98
  };
99
99
  function getPropertyNameFromAccessor(accessor) {
100
+ if (typeof accessor !== 'function')
101
+ return '';
100
102
  const fnStr = accessor.toString();
101
103
  const match = fnStr.match(/\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);
102
104
  return match ? match[1] : '';
@@ -107,7 +109,7 @@ const CommandFormComponent = (props) => {
107
109
  if (!props.currentValues)
108
110
  return {};
109
111
  const tempCommand = new props.command();
110
- const commandProperties = tempCommand.properties || [];
112
+ const commandProperties = (tempCommand.properties || []);
111
113
  const extracted = {};
112
114
  commandProperties.forEach((propertyName) => {
113
115
  if (props.currentValues[propertyName] !== undefined) {
@@ -121,7 +123,9 @@ const CommandFormComponent = (props) => {
121
123
  ...initialValuesFromFields,
122
124
  ...props.initialValues
123
125
  }), [valuesFromCurrentValues, initialValuesFromFields, props.initialValues]);
124
- const [commandInstance, setCommandValues] = useCommand(props.command, mergedInitialValues);
126
+ const useCommandResult = useCommand(props.command, mergedInitialValues);
127
+ const commandInstance = useCommandResult[0];
128
+ const setCommandValues = useCommandResult[1];
125
129
  const [commandResult, setCommandResult] = useState(undefined);
126
130
  const [fieldValidities, setFieldValidities] = useState({});
127
131
  const [customFieldErrors, setCustomFieldErrors] = useState({});
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.js","sources":["../../../CommandForm/CommandForm.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { CommandFormFields, ColumnInfo } from './CommandFormFields';\nimport { Constructor } from '@cratis/fundamentals';\nimport { useCommand, SetCommandValues } from '@cratis/arc.react/commands';\nimport { ICommandResult } from '@cratis/arc/commands';\nimport React, { createContext, useContext, useMemo, useState, useCallback } from 'react';\nimport type { CommandFormFieldProps } from './CommandFormField';\nimport { Panel } from 'primereact/panel';\n\nexport type BeforeExecuteCallback<TCommand> = (values: TCommand) => TCommand;\n\nexport interface CommandFormProps<TCommand extends object> {\n command: Constructor<TCommand>;\n initialValues?: Partial<TCommand>;\n currentValues?: Partial<TCommand> | undefined;\n onFieldValidate?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;\n onFieldChange?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n children?: React.ReactNode;\n}\n\ninterface CommandFormContextValue<TCommand> {\n command: Constructor<TCommand>;\n commandInstance: TCommand;\n setCommandValues: SetCommandValues<TCommand>;\n commandResult?: ICommandResult<unknown>;\n setCommandResult: (result: ICommandResult<unknown>) => void;\n getFieldError: (propertyName: string) => string | undefined;\n isValid: boolean;\n setFieldValidity: (fieldName: string, isValid: boolean) => void;\n onFieldValidate?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;\n onFieldChange?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n customFieldErrors: Record<string, string>;\n setCustomFieldError: (fieldName: string, error: string | undefined) => void;\n}\n\nconst CommandFormContext = createContext<CommandFormContextValue<any> | undefined>(undefined);\n\nexport const useCommandFormContext = <TCommand,>() => {\n const context = useContext(CommandFormContext);\n if (!context) {\n throw new Error('useCommandFormContext must be used within a CommandForm');\n }\n return context as CommandFormContextValue<TCommand>;\n};\n\n// Hook to get just the command instance for easier access\nexport const useCommandInstance = <TCommand = any>() => {\n const { commandInstance } = useCommandFormContext<any>();\n return commandInstance as TCommand;\n};\n\n// Hook to get setCommandResult for easier access\nexport const useSetCommandResult = () => {\n const { setCommandResult } = useCommandFormContext();\n return setCommandResult;\n};\n\nconst CommandFormFieldsWrapper = (props: { children: React.ReactNode }) => {\n React.Children.forEach(props.children, child => {\n if (React.isValidElement(child)) {\n const component = child.type as any;\n if (component.displayName !== 'CommandFormField') {\n throw new Error(`Only CommandFormField components are allowed as children of CommandForm.Fields. Got: ${component.displayName || component.name || 'Unknown'}`);\n }\n }\n });\n\n return <></>;\n};\n\nCommandFormFieldsWrapper.displayName = 'CommandFormFieldsWrapper';\n\nconst getCommandFormFields = <TCommand,>(props: { children?: React.ReactNode }): { fieldsOrColumns: React.ReactElement[] | ColumnInfo[], otherChildren: React.ReactNode[], initialValuesFromFields: Partial<TCommand> } => {\n if (!props.children) {\n return { fieldsOrColumns: [], otherChildren: [], initialValuesFromFields: {} };\n }\n let fields: React.ReactElement<CommandFormFieldProps<any>>[] = [];\n const columns: ColumnInfo[] = [];\n let hasColumns = false;\n const otherChildren: React.ReactNode[] = [];\n let initialValuesFromFields: Partial<TCommand> = {};\n\n const extractInitialValue = (field: React.ReactElement) => {\n const fieldProps = field.props as any;\n if (fieldProps.currentValue !== undefined && fieldProps.value) {\n const propertyAccessor = fieldProps.value;\n const propertyName = getPropertyNameFromAccessor(propertyAccessor);\n if (propertyName) {\n initialValuesFromFields = { ...initialValuesFromFields, [propertyName]: fieldProps.currentValue } as Partial<TCommand>;\n }\n }\n };\n\n React.Children.toArray(props.children).forEach(child => {\n if (!React.isValidElement(child)) {\n otherChildren.push(child);\n return;\n }\n\n const component = child.type as any;\n\n // Check if child is a CommandFormColumn\n if (component.displayName === 'CommandFormColumn') {\n hasColumns = true;\n const childProps = child.props as { children?: React.ReactNode };\n const columnFields = React.Children.toArray(childProps.children).filter(child => {\n if (React.isValidElement(child)) {\n const comp = child.type as any;\n if (comp.displayName === 'CommandFormField') {\n extractInitialValue(child as React.ReactElement);\n return true;\n }\n }\n return false;\n }) as React.ReactElement[];\n columns.push({ fields: columnFields as React.ReactElement<CommandFormFieldProps<any>>[] });\n }\n // Check if child is a CommandFormField (direct child)\n else if (component.displayName === 'CommandFormField') {\n extractInitialValue(child as React.ReactElement);\n fields.push(child as React.ReactElement<CommandFormFieldProps<any>>);\n }\n // Check if child is Fields wrapper (backwards compatibility)\n else if (component === CommandFormFieldsWrapper || component.displayName === 'CommandFormFieldsWrapper') {\n const childProps = child.props as { children: React.ReactNode };\n const relevantChildren = React.Children.toArray(childProps.children).filter(child => {\n if (React.isValidElement(child)) {\n const component = child.type as any;\n if (component.displayName === 'CommandFormField') {\n extractInitialValue(child as React.ReactElement);\n return true;\n }\n }\n return false;\n }) as React.ReactElement[];\n fields = [...fields, ...(relevantChildren as React.ReactElement<CommandFormFieldProps<any>>[])];\n }\n // Everything else is not a field, keep it as other children\n else {\n otherChildren.push(child);\n }\n });\n\n return { fieldsOrColumns: hasColumns ? columns : fields, otherChildren, initialValuesFromFields };\n};\n\n// Helper function to extract property name from accessor function\nfunction getPropertyNameFromAccessor<T>(accessor: (obj: T) => unknown): string {\n const fnStr = accessor.toString();\n const match = fnStr.match(/\\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);\n return match ? match[1] : '';\n}\n\nconst CommandFormComponent = <TCommand extends object = any>(props: CommandFormProps<TCommand>) => {\n const { fieldsOrColumns, otherChildren, initialValuesFromFields } = useMemo(() => getCommandFormFields<TCommand>(props), [props.children]);\n\n // Extract matching properties from currentValues\n const valuesFromCurrentValues = useMemo(() => {\n if (!props.currentValues) return {};\n\n const tempCommand = new props.command();\n const commandProperties = (tempCommand as any).properties || [];\n const extracted: Partial<TCommand> = {};\n\n commandProperties.forEach((propertyName: string) => {\n if ((props.currentValues as any)[propertyName] !== undefined) {\n (extracted as any)[propertyName] = (props.currentValues as any)[propertyName];\n }\n });\n\n return extracted;\n }, [props.currentValues, props.command]);\n\n // Merge initialValues prop with values extracted from field currentValue props and currentValues\n const mergedInitialValues = useMemo(() => ({\n ...valuesFromCurrentValues,\n ...initialValuesFromFields,\n ...props.initialValues\n }), [valuesFromCurrentValues, initialValuesFromFields, props.initialValues]);\n\n // useCommand returns [instance, setter] for the typed command. Provide generics so commandInstance is TCommand.\n const [commandInstance, setCommandValues] = useCommand<any>(props.command as Constructor<any>, mergedInitialValues as Partial<any>);\n const [commandResult, setCommandResult] = useState<ICommandResult<unknown> | undefined>(undefined);\n const [fieldValidities, setFieldValidities] = useState<Record<string, boolean>>({});\n const [customFieldErrors, setCustomFieldErrors] = useState<Record<string, string>>({});\n\n // Update command values when mergedInitialValues changes (e.g., when data loads asynchronously)\n React.useEffect(() => {\n if (mergedInitialValues && Object.keys(mergedInitialValues).length > 0) {\n setCommandValues(mergedInitialValues as TCommand);\n }\n }, [mergedInitialValues, setCommandValues]);\n\n const isValid = Object.values(fieldValidities).every(valid => valid);\n\n const setFieldValidity = useCallback((fieldName: string, isFieldValid: boolean) => {\n setFieldValidities(prev => ({ ...prev, [fieldName]: isFieldValid }));\n }, []);\n\n const setCustomFieldError = useCallback((fieldName: string, error: string | undefined) => {\n setCustomFieldErrors(prev => {\n if (error === undefined) {\n const newErrors = { ...prev };\n delete newErrors[fieldName];\n return newErrors;\n }\n return { ...prev, [fieldName]: error };\n });\n }, []);\n\n const getFieldError = (propertyName: string): string | undefined => {\n // Check custom field errors first\n if (customFieldErrors[propertyName]) {\n return customFieldErrors[propertyName];\n }\n\n if (!commandResult || !commandResult.validationResults) {\n return undefined;\n }\n\n for (const validationResult of commandResult.validationResults) {\n if (validationResult.members && validationResult.members.includes(propertyName)) {\n return validationResult.message;\n }\n }\n\n return undefined;\n };\n\n const exceptionMessages = commandResult?.exceptionMessages || [];\n const hasColumns = fieldsOrColumns.length > 0 && 'fields' in fieldsOrColumns[0];\n\n return (\n <CommandFormContext.Provider value={{ command: props.command, commandInstance, setCommandValues, commandResult, setCommandResult, getFieldError, isValid, setFieldValidity, onFieldValidate: props.onFieldValidate, onFieldChange: props.onFieldChange, onBeforeExecute: props.onBeforeExecute, customFieldErrors, setCustomFieldError }}>\n <CommandFormFields fields={hasColumns ? undefined : (fieldsOrColumns as React.ReactElement<CommandFormFieldProps<any>>[])} columns={hasColumns ? fieldsOrColumns as ColumnInfo[] : undefined} />\n {exceptionMessages.length > 0 && (\n <div className=\"card flex flex-row gap-3 mt-3\">\n <Panel header=\"The server responded with\" className=\"w-full\">\n <ul>\n {exceptionMessages.map((msg, idx) => (\n <li key={idx}>{msg}</li>\n ))}\n </ul>\n </Panel>\n </div>\n )}\n {otherChildren}\n </CommandFormContext.Provider>\n );\n};\n\nconst CommandFormColumnComponent = (_props: { children: React.ReactNode }) => {\n void _props;\n return <></>;\n};\n\nCommandFormColumnComponent.displayName = 'CommandFormColumn';\n\nCommandFormComponent.Fields = CommandFormFieldsWrapper;\nCommandFormComponent.Column = CommandFormColumnComponent;\n\nexport const CommandForm = CommandFormComponent;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"CommandForm.js","sources":["../../../CommandForm/CommandForm.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { CommandFormFields, ColumnInfo } from './CommandFormFields';\nimport { Constructor } from '@cratis/fundamentals';\nimport { useCommand, SetCommandValues } from '@cratis/arc.react/commands';\nimport { ICommandResult } from '@cratis/arc/commands';\nimport { Command } from '@cratis/arc/commands';\nimport React, { createContext, useContext, useMemo, useState, useCallback } from 'react';\nimport type { CommandFormFieldProps } from './CommandFormField';\nimport { Panel } from 'primereact/panel';\n\nexport type BeforeExecuteCallback<TCommand> = (values: TCommand) => TCommand;\n\nexport interface CommandFormProps<TCommand extends object> {\n command: Constructor<TCommand>;\n initialValues?: Partial<TCommand>;\n currentValues?: Partial<TCommand> | undefined;\n onFieldValidate?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;\n onFieldChange?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n children?: React.ReactNode;\n}\n\ninterface CommandFormContextValue<TCommand> {\n command: Constructor<TCommand>;\n commandInstance: TCommand;\n setCommandValues: SetCommandValues<TCommand>;\n commandResult?: ICommandResult<unknown>;\n setCommandResult: (result: ICommandResult<unknown>) => void;\n getFieldError: (propertyName: string) => string | undefined;\n isValid: boolean;\n setFieldValidity: (fieldName: string, isValid: boolean) => void;\n onFieldValidate?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => string | undefined;\n onFieldChange?: (command: TCommand, fieldName: string, oldValue: unknown, newValue: unknown) => void;\n onBeforeExecute?: BeforeExecuteCallback<TCommand>;\n customFieldErrors: Record<string, string>;\n setCustomFieldError: (fieldName: string, error: string | undefined) => void;\n}\n\nconst CommandFormContext = createContext<CommandFormContextValue<unknown> | undefined>(undefined);\n\nexport const useCommandFormContext = <TCommand,>() => {\n const context = useContext(CommandFormContext);\n if (!context) {\n throw new Error('useCommandFormContext must be used within a CommandForm');\n }\n return context as CommandFormContextValue<TCommand>;\n};\n\n// Hook to get just the command instance for easier access\nexport const useCommandInstance = <TCommand = unknown>() => {\n const { commandInstance } = useCommandFormContext<TCommand>();\n return commandInstance as TCommand;\n};\n\n// Hook to get setCommandResult for easier access\nexport const useSetCommandResult = () => {\n const { setCommandResult } = useCommandFormContext();\n return setCommandResult;\n};\n\nconst CommandFormFieldsWrapper = (props: { children: React.ReactNode }) => {\n React.Children.forEach(props.children, child => {\n if (React.isValidElement(child)) {\n const component = child.type as React.ComponentType<unknown>;\n if (component.displayName !== 'CommandFormField') {\n throw new Error(`Only CommandFormField components are allowed as children of CommandForm.Fields. Got: ${component.displayName || component.name || 'Unknown'}`);\n }\n }\n });\n\n return <></>;\n};\n\nCommandFormFieldsWrapper.displayName = 'CommandFormFieldsWrapper';\n\nconst getCommandFormFields = <TCommand,>(props: { children?: React.ReactNode }): { fieldsOrColumns: React.ReactElement[] | ColumnInfo[], otherChildren: React.ReactNode[], initialValuesFromFields: Partial<TCommand> } => {\n if (!props.children) {\n return { fieldsOrColumns: [], otherChildren: [], initialValuesFromFields: {} };\n }\n let fields: React.ReactElement<CommandFormFieldProps<unknown>>[] = [];\n const columns: ColumnInfo[] = [];\n let hasColumns = false;\n const otherChildren: React.ReactNode[] = [];\n let initialValuesFromFields: Partial<TCommand> = {};\n\n const extractInitialValue = (field: React.ReactElement) => {\n const fieldProps = field.props as Record<string, unknown>;\n if (fieldProps.currentValue !== undefined && fieldProps.value) {\n const propertyAccessor = fieldProps.value;\n const propertyName = getPropertyNameFromAccessor(propertyAccessor);\n if (propertyName) {\n initialValuesFromFields = { ...initialValuesFromFields, [propertyName]: fieldProps.currentValue } as Partial<TCommand>;\n }\n }\n };\n\n React.Children.toArray(props.children).forEach(child => {\n if (!React.isValidElement(child)) {\n otherChildren.push(child);\n return;\n }\n\n const component = child.type as React.ComponentType<unknown>;\n\n // Check if child is a CommandFormColumn\n if (component.displayName === 'CommandFormColumn') {\n hasColumns = true;\n const childProps = child.props as { children?: React.ReactNode };\n const columnFields = React.Children.toArray(childProps.children).filter(child => {\n if (React.isValidElement(child)) {\n const comp = child.type as React.ComponentType<unknown>;\n if (comp.displayName === 'CommandFormField') {\n extractInitialValue(child as React.ReactElement);\n return true;\n }\n }\n return false;\n }) as React.ReactElement[];\n columns.push({ fields: columnFields as React.ReactElement<CommandFormFieldProps<unknown>>[] });\n }\n // Check if child is a CommandFormField (direct child)\n else if (component.displayName === 'CommandFormField') {\n extractInitialValue(child as React.ReactElement);\n fields.push(child as React.ReactElement<CommandFormFieldProps<unknown>>);\n }\n // Check if child is Fields wrapper (backwards compatibility)\n else if (component === CommandFormFieldsWrapper || component.displayName === 'CommandFormFieldsWrapper') {\n const childProps = child.props as { children: React.ReactNode };\n const relevantChildren = React.Children.toArray(childProps.children).filter(child => {\n if (React.isValidElement(child)) {\n const component = child.type as React.ComponentType<unknown>;\n if (component.displayName === 'CommandFormField') {\n extractInitialValue(child as React.ReactElement);\n return true;\n }\n }\n return false;\n }) as React.ReactElement[];\n fields = [...fields, ...(relevantChildren as React.ReactElement<CommandFormFieldProps<unknown>>[])];\n }\n // Everything else is not a field, keep it as other children\n else {\n otherChildren.push(child);\n }\n });\n\n return { fieldsOrColumns: hasColumns ? columns : fields, otherChildren, initialValuesFromFields };\n};\n\n// Helper function to extract property name from accessor function\nfunction getPropertyNameFromAccessor<T = unknown>(accessor: ((obj: T) => unknown) | unknown): string {\n if (typeof accessor !== 'function') return '';\n const fnStr = accessor.toString();\n const match = fnStr.match(/\\.([a-zA-Z_$][a-zA-Z0-9_$]*)/);\n return match ? match[1] : '';\n}\n\nconst CommandFormComponent = <TCommand extends object = object>(props: CommandFormProps<TCommand>) => {\n const { fieldsOrColumns, otherChildren, initialValuesFromFields } = useMemo(() => getCommandFormFields<TCommand>(props), [props.children]);\n\n // Extract matching properties from currentValues\n const valuesFromCurrentValues = useMemo(() => {\n if (!props.currentValues) return {};\n\n const tempCommand = new props.command();\n const commandProperties = ((tempCommand as Record<string, unknown>).properties || []) as string[];\n const extracted: Partial<TCommand> = {};\n\n commandProperties.forEach((propertyName: string) => {\n if ((props.currentValues as Record<string, unknown>)[propertyName] !== undefined) {\n (extracted as Record<string, unknown>)[propertyName] = (props.currentValues as Record<string, unknown>)[propertyName];\n }\n });\n\n return extracted;\n }, [props.currentValues, props.command]);\n\n // Merge initialValues prop with values extracted from field currentValue props and currentValues\n const mergedInitialValues = useMemo(() => ({\n ...valuesFromCurrentValues,\n ...initialValuesFromFields,\n ...props.initialValues\n }), [valuesFromCurrentValues, initialValuesFromFields, props.initialValues]);\n\n // useCommand returns [instance, setter] for the typed command. Provide generics so commandInstance is TCommand.\n // Using type assertion through unknown to work around generic constraint mismatch\n const useCommandResult = useCommand(props.command as unknown as Constructor<Command<Partial<TCommand>, object>>, mergedInitialValues);\n const commandInstance = useCommandResult[0] as unknown as TCommand;\n const setCommandValues = useCommandResult[1] as SetCommandValues<TCommand>;\n const [commandResult, setCommandResult] = useState<ICommandResult<unknown> | undefined>(undefined);\n const [fieldValidities, setFieldValidities] = useState<Record<string, boolean>>({});\n const [customFieldErrors, setCustomFieldErrors] = useState<Record<string, string>>({});\n\n // Update command values when mergedInitialValues changes (e.g., when data loads asynchronously)\n React.useEffect(() => {\n if (mergedInitialValues && Object.keys(mergedInitialValues).length > 0) {\n setCommandValues(mergedInitialValues as TCommand);\n }\n }, [mergedInitialValues, setCommandValues]);\n\n const isValid = Object.values(fieldValidities).every(valid => valid);\n\n const setFieldValidity = useCallback((fieldName: string, isFieldValid: boolean) => {\n setFieldValidities(prev => ({ ...prev, [fieldName]: isFieldValid }));\n }, []);\n\n const setCustomFieldError = useCallback((fieldName: string, error: string | undefined) => {\n setCustomFieldErrors(prev => {\n if (error === undefined) {\n const newErrors = { ...prev };\n delete newErrors[fieldName];\n return newErrors;\n }\n return { ...prev, [fieldName]: error };\n });\n }, []);\n\n const getFieldError = (propertyName: string): string | undefined => {\n // Check custom field errors first\n if (customFieldErrors[propertyName]) {\n return customFieldErrors[propertyName];\n }\n\n if (!commandResult || !commandResult.validationResults) {\n return undefined;\n }\n\n for (const validationResult of commandResult.validationResults) {\n if (validationResult.members && validationResult.members.includes(propertyName)) {\n return validationResult.message;\n }\n }\n\n return undefined;\n };\n\n const exceptionMessages = commandResult?.exceptionMessages || [];\n const hasColumns = fieldsOrColumns.length > 0 && 'fields' in fieldsOrColumns[0];\n\n return (\n <CommandFormContext.Provider value={{ command: props.command, commandInstance, setCommandValues, commandResult, setCommandResult, getFieldError, isValid, setFieldValidity, onFieldValidate: props.onFieldValidate, onFieldChange: props.onFieldChange, onBeforeExecute: props.onBeforeExecute, customFieldErrors, setCustomFieldError }}>\n <CommandFormFields fields={hasColumns ? undefined : (fieldsOrColumns as React.ReactElement<CommandFormFieldProps<unknown>>[])} columns={hasColumns ? fieldsOrColumns as ColumnInfo[] : undefined} />\n {exceptionMessages.length > 0 && (\n <div className=\"card flex flex-row gap-3 mt-3\">\n <Panel header=\"The server responded with\" className=\"w-full\">\n <ul>\n {exceptionMessages.map((msg, idx) => (\n <li key={idx}>{msg}</li>\n ))}\n </ul>\n </Panel>\n </div>\n )}\n {otherChildren}\n </CommandFormContext.Provider>\n );\n};\n\nconst CommandFormColumnComponent = (_props: { children: React.ReactNode }) => {\n void _props;\n return <></>;\n};\n\nCommandFormColumnComponent.displayName = 'CommandFormColumn';\n\nCommandFormComponent.Fields = CommandFormFieldsWrapper;\nCommandFormComponent.Column = CommandFormColumnComponent;\n\nexport const CommandForm = CommandFormComponent;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -4,4 +4,5 @@ declare const meta: Meta<typeof CommandForm>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof CommandForm>;
6
6
  export declare const Default: Story;
7
+ export declare const UserRegistration: Story;
7
8
  //# sourceMappingURL=CommandForm.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.stories.d.ts","sourceRoot":"","sources":["../../../CommandForm/CommandForm.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAGlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAC1C,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC"}
1
+ {"version":3,"file":"CommandForm.stories.d.ts","sourceRoot":"","sources":["../../../CommandForm/CommandForm.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAa5C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAGlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAQ1C,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAwF9B,CAAC"}
@@ -1,12 +1,45 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
2
3
  import { CommandForm } from './CommandForm';
4
+ import { ValidationMessage } from './ValidationMessage';
5
+ import { UserRegistrationCommand } from './UserRegistrationCommand';
6
+ import { InputTextField, NumberField, TextAreaField, CheckboxField, RangeField, SelectField } from './fields';
7
+ import { Button } from 'primereact/button';
3
8
  const meta = {
4
9
  title: 'CommandForm/CommandForm',
5
10
  component: CommandForm,
6
11
  };
7
12
  export default meta;
13
+ const roleOptions = [
14
+ { id: 'user', name: 'User' },
15
+ { id: 'admin', name: 'Administrator' },
16
+ { id: 'moderator', name: 'Moderator' }
17
+ ];
8
18
  export const Default = {
9
19
  args: {},
10
20
  render: (args) => (_jsx("div", { className: "storybook-wrapper", children: _jsx(CommandForm, { ...args }) }))
11
21
  };
22
+ export const UserRegistration = {
23
+ render: () => {
24
+ const [result, setResult] = useState('');
25
+ const handleSubmit = () => {
26
+ setResult('Form submitted successfully!');
27
+ };
28
+ return (_jsxs("div", { className: "p-8 w-[800px] mx-auto", children: [_jsx("h2", { className: "text-2xl font-bold mb-6", children: "User Registration Form" }), _jsx("h3", { className: "text-xl font-semibold mb-4 mt-6", children: "Account Information" }), _jsxs(CommandForm, { command: UserRegistrationCommand, initialValues: {
29
+ username: '',
30
+ email: '',
31
+ password: '',
32
+ confirmPassword: '',
33
+ age: 18,
34
+ bio: '',
35
+ favoriteColor: '#3b82f6',
36
+ birthDate: '',
37
+ agreeToTerms: false,
38
+ experienceLevel: 50,
39
+ role: ''
40
+ }, onFieldChange: (cmd, fieldName, oldValue, newValue) => {
41
+ console.log(`Field ${fieldName} changed from`, oldValue, 'to', newValue);
42
+ }, children: [_jsx(InputTextField, { value: c => c.username, title: "Username", placeholder: "Enter username" }), _jsx(ValidationMessage, { value: c => c.username }), _jsx(InputTextField, { value: c => c.email, title: "Email Address", type: "email", placeholder: "Enter email" }), _jsx(ValidationMessage, { value: c => c.email }), _jsx(InputTextField, { value: c => c.password, title: "Password", type: "password", placeholder: "Enter password" }), _jsx(ValidationMessage, { value: c => c.password }), _jsx(InputTextField, { value: c => c.confirmPassword, title: "Confirm Password", type: "password", placeholder: "Confirm password" }), _jsx(ValidationMessage, { value: c => c.confirmPassword }), _jsx("h3", { className: "text-xl font-semibold mb-0 mt-6", children: "Personal Information" }), _jsx(NumberField, { value: c => c.age, title: "Age", placeholder: "Enter age", min: 13, max: 120 }), _jsx(ValidationMessage, { value: c => c.age }), _jsx(InputTextField, { value: c => c.birthDate, title: "Birth Date", type: "date", placeholder: "Select birth date" }), _jsx(ValidationMessage, { value: c => c.birthDate }), _jsx(TextAreaField, { value: c => c.bio, title: "Bio", placeholder: "Tell us about yourself", rows: 4, required: false }), _jsx(ValidationMessage, { value: c => c.bio }), _jsx(InputTextField, { value: c => c.favoriteColor, title: "Favorite Color", type: "color" }), _jsx(ValidationMessage, { value: c => c.favoriteColor }), _jsx("h3", { className: "text-xl font-semibold mb-0 mt-6", children: "Preferences" }), _jsx(SelectField, { value: c => c.role, title: "Role", options: roleOptions, optionIdField: "id", optionLabelField: "name", placeholder: "Select a role" }), _jsx(ValidationMessage, { value: c => c.role }), _jsx(RangeField, { value: c => c.experienceLevel, title: "Experience Level", min: 0, max: 100, step: 10 }), _jsx(ValidationMessage, { value: c => c.experienceLevel }), _jsx(CheckboxField, { value: c => c.agreeToTerms, title: "Terms & Conditions", label: "I agree to the terms and conditions" }), _jsx(ValidationMessage, { value: c => c.agreeToTerms })] }), _jsxs("div", { className: "flex gap-2 mt-6", children: [_jsx(Button, { label: "Submit", onClick: handleSubmit, severity: "success" }), _jsx(Button, { label: "Cancel", onClick: () => setResult(''), severity: "secondary" })] }), result && (_jsx("div", { className: "bg-green-100 p-4 rounded-lg mt-4 border border-green-300", children: _jsx("p", { className: "text-green-800 font-semibold m-0", children: result }) }))] }));
43
+ }
44
+ };
12
45
  //# sourceMappingURL=CommandForm.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.stories.js","sourceRoot":"","sources":["../../../CommandForm/CommandForm.stories.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,IAAI,GAA6B;IACrC,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,MAAM,CAAC,MAAM,OAAO,GAAU;IAC1B,IAAI,EAAE,EAEL;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CACd,cAAK,SAAS,EAAC,mBAAmB,YAC9B,KAAC,WAAW,OAAK,IAAI,GAAI,GACvB,CACT;CACJ,CAAC"}
1
+ {"version":3,"file":"CommandForm.stories.js","sourceRoot":"","sources":["../../../CommandForm/CommandForm.stories.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import type { CommandFormFieldProps } from './CommandFormField';
3
3
  export interface ColumnInfo {
4
- fields: React.ReactElement<CommandFormFieldProps<any>>[];
4
+ fields: React.ReactElement<CommandFormFieldProps<unknown>>[];
5
5
  }
6
6
  export interface CommandFormFieldsProps {
7
- fields?: React.ReactElement<CommandFormFieldProps<any>>[];
7
+ fields?: React.ReactElement<CommandFormFieldProps<unknown>>[];
8
8
  columns?: ColumnInfo[];
9
9
  }
10
10
  export declare const CommandFormFields: (props: CommandFormFieldsProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"CommandFormFields.d.ts","sourceRoot":"","sources":["../../../CommandForm/CommandFormFields.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC1D,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CAC1B;AAyED,eAAO,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,4CA8C9D,CAAC"}
1
+ {"version":3,"file":"CommandFormFields.d.ts","sourceRoot":"","sources":["../../../CommandForm/CommandFormFields.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,WAAW,UAAU;IACvB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;CAChE;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CAC1B;AAkFD,eAAO,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,4CA8C9D,CAAC"}