@cratis/components 0.1.12 → 0.1.14

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 (148) 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.map +1 -1
  5. package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -1
  6. package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -1
  7. package/dist/cjs/PivotViewer/PivotViewer.js +57 -378
  8. package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
  9. package/dist/cjs/PivotViewer/components/PivotCanvas.js +3 -3
  10. package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
  11. package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
  12. package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  13. package/dist/cjs/PivotViewer/components/pivot/buckets.js.map +1 -1
  14. package/dist/cjs/PivotViewer/components/pivot/sprites.js +1 -1
  15. package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
  16. package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
  17. package/dist/cjs/PivotViewer/hooks/useAnimationModeTracking.js +37 -0
  18. package/dist/cjs/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -0
  19. package/dist/cjs/PivotViewer/hooks/useCardSelection.js +64 -0
  20. package/dist/cjs/PivotViewer/hooks/useCardSelection.js.map +1 -0
  21. package/dist/cjs/PivotViewer/hooks/useCurrentFilters.js +52 -0
  22. package/dist/cjs/PivotViewer/hooks/useCurrentFilters.js.map +1 -0
  23. package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js +63 -0
  24. package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js.map +1 -0
  25. package/dist/cjs/PivotViewer/hooks/useFieldExtractors.js +50 -0
  26. package/dist/cjs/PivotViewer/hooks/useFieldExtractors.js.map +1 -0
  27. package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -1
  28. package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  29. package/dist/cjs/PivotViewer/hooks/useScrollSync.js +21 -0
  30. package/dist/cjs/PivotViewer/hooks/useScrollSync.js.map +1 -0
  31. package/dist/cjs/PivotViewer/hooks/useViewModeScrollHandling.js +42 -0
  32. package/dist/cjs/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -0
  33. package/dist/cjs/PivotViewer/types.js.map +1 -1
  34. package/dist/cjs/PivotViewer/utils/cardPosition.js +67 -0
  35. package/dist/cjs/PivotViewer/utils/cardPosition.js.map +1 -0
  36. package/dist/cjs/PivotViewer/utils/constants.js +4 -0
  37. package/dist/cjs/PivotViewer/utils/constants.js.map +1 -1
  38. package/dist/cjs/PivotViewer/utils/idResolution.js +34 -0
  39. package/dist/cjs/PivotViewer/utils/idResolution.js.map +1 -0
  40. package/dist/esm/CommandDialog/CommandDialog.d.ts +2 -2
  41. package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -1
  42. package/dist/esm/CommandDialog/CommandDialog.js.map +1 -1
  43. package/dist/esm/CommandForm/CommandForm.d.ts +2 -2
  44. package/dist/esm/CommandForm/CommandForm.d.ts.map +1 -1
  45. package/dist/esm/CommandForm/CommandForm.js +6 -2
  46. package/dist/esm/CommandForm/CommandForm.js.map +1 -1
  47. package/dist/esm/CommandForm/CommandFormFields.d.ts +2 -2
  48. package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -1
  49. package/dist/esm/CommandForm/CommandFormFields.js.map +1 -1
  50. package/dist/esm/Common/ErrorBoundary.stories.d.ts +1 -1
  51. package/dist/esm/Common/ErrorBoundary.stories.js.map +1 -1
  52. package/dist/esm/Common/FormElement.stories.d.ts +1 -1
  53. package/dist/esm/Common/FormElement.stories.js.map +1 -1
  54. package/dist/esm/Common/Page.stories.d.ts +1 -1
  55. package/dist/esm/Common/Page.stories.js.map +1 -1
  56. package/dist/esm/DataPage/DataPage.stories.d.ts +1 -1
  57. package/dist/esm/DataPage/DataPage.stories.js.map +1 -1
  58. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +4 -4
  59. package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -1
  60. package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -1
  61. package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts +1 -1
  62. package/dist/esm/DataTables/DataTableForObservableQuery.stories.js.map +1 -1
  63. package/dist/esm/DataTables/DataTableForQuery.d.ts +4 -4
  64. package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -1
  65. package/dist/esm/DataTables/DataTableForQuery.js.map +1 -1
  66. package/dist/esm/DataTables/DataTableForQuery.stories.d.ts +1 -1
  67. package/dist/esm/DataTables/DataTableForQuery.stories.js.map +1 -1
  68. package/dist/esm/Dialogs/ConfirmationDialog.stories.js.map +1 -1
  69. package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
  70. package/dist/esm/PivotViewer/PivotViewer.js +57 -378
  71. package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
  72. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +2 -2
  73. package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
  74. package/dist/esm/PivotViewer/components/PivotCanvas.js +3 -3
  75. package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
  76. package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
  77. package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -1
  78. package/dist/esm/PivotViewer/components/pivot/buckets.js.map +1 -1
  79. package/dist/esm/PivotViewer/components/pivot/sprites.js +1 -1
  80. package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
  81. package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
  82. package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -1
  83. package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -1
  84. package/dist/esm/PivotViewer/hooks/index.d.ts +7 -0
  85. package/dist/esm/PivotViewer/hooks/index.d.ts.map +1 -1
  86. package/dist/esm/PivotViewer/hooks/index.js +7 -0
  87. package/dist/esm/PivotViewer/hooks/index.js.map +1 -1
  88. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.d.ts +2 -0
  89. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.d.ts.map +1 -0
  90. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js +35 -0
  91. package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -0
  92. package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts +37 -0
  93. package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts.map +1 -0
  94. package/dist/esm/PivotViewer/hooks/useCardSelection.js +62 -0
  95. package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -0
  96. package/dist/esm/PivotViewer/hooks/useCurrentFilters.d.ts +5 -0
  97. package/dist/esm/PivotViewer/hooks/useCurrentFilters.d.ts.map +1 -0
  98. package/dist/esm/PivotViewer/hooks/useCurrentFilters.js +49 -0
  99. package/dist/esm/PivotViewer/hooks/useCurrentFilters.js.map +1 -0
  100. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.d.ts +27 -0
  101. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.d.ts.map +1 -0
  102. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js +61 -0
  103. package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js.map +1 -0
  104. package/dist/esm/PivotViewer/hooks/useFieldExtractors.d.ts +7 -0
  105. package/dist/esm/PivotViewer/hooks/useFieldExtractors.d.ts.map +1 -0
  106. package/dist/esm/PivotViewer/hooks/useFieldExtractors.js +48 -0
  107. package/dist/esm/PivotViewer/hooks/useFieldExtractors.js.map +1 -0
  108. package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js.map +1 -1
  109. package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -1
  110. package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
  111. package/dist/esm/PivotViewer/hooks/useScrollSync.d.ts +3 -0
  112. package/dist/esm/PivotViewer/hooks/useScrollSync.d.ts.map +1 -0
  113. package/dist/esm/PivotViewer/hooks/useScrollSync.js +19 -0
  114. package/dist/esm/PivotViewer/hooks/useScrollSync.js.map +1 -0
  115. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.d.ts +16 -0
  116. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.d.ts.map +1 -0
  117. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js +40 -0
  118. package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -0
  119. package/dist/esm/PivotViewer/types.js.map +1 -1
  120. package/dist/esm/PivotViewer/utils/cardPosition.d.ts +18 -0
  121. package/dist/esm/PivotViewer/utils/cardPosition.d.ts.map +1 -0
  122. package/dist/esm/PivotViewer/utils/cardPosition.js +63 -0
  123. package/dist/esm/PivotViewer/utils/cardPosition.js.map +1 -0
  124. package/dist/esm/PivotViewer/utils/constants.js +3 -1
  125. package/dist/esm/PivotViewer/utils/constants.js.map +1 -1
  126. package/dist/esm/PivotViewer/utils/idResolution.d.ts +13 -0
  127. package/dist/esm/PivotViewer/utils/idResolution.d.ts.map +1 -0
  128. package/dist/esm/PivotViewer/utils/idResolution.js +31 -0
  129. package/dist/esm/PivotViewer/utils/idResolution.js.map +1 -0
  130. package/dist/esm/PivotViewer/utils/index.d.ts +2 -0
  131. package/dist/esm/PivotViewer/utils/index.d.ts.map +1 -1
  132. package/dist/esm/PivotViewer/utils/index.js +2 -0
  133. package/dist/esm/PivotViewer/utils/index.js.map +1 -1
  134. package/dist/esm/TimeMachine/EventsView.stories.d.ts +1 -1
  135. package/dist/esm/TimeMachine/EventsView.stories.js.map +1 -1
  136. package/dist/esm/TimeMachine/Properties.stories.d.ts +1 -1
  137. package/dist/esm/TimeMachine/Properties.stories.js.map +1 -1
  138. package/dist/esm/TimeMachine/ReadModelView.stories.d.ts +1 -1
  139. package/dist/esm/TimeMachine/ReadModelView.stories.js.map +1 -1
  140. package/dist/esm/TimeMachine/TimeMachine.stories.d.ts +1 -1
  141. package/dist/esm/TimeMachine/TimeMachine.stories.js.map +1 -1
  142. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  143. package/dist/esm/vite.config.js.map +1 -1
  144. package/dist/esm/vitest.setup.d.ts +2 -0
  145. package/dist/esm/vitest.setup.d.ts.map +1 -0
  146. package/dist/esm/vitest.setup.js +8 -0
  147. package/dist/esm/vitest.setup.js.map +1 -0
  148. package/package.json +2 -1
@@ -7,10 +7,7 @@ var layout = require('./engine/layout.js');
7
7
  var useFilterState = require('./hooks/useFilterState.js');
8
8
  var useDimensionState = require('./hooks/useDimensionState.js');
9
9
  var useZoomState = require('./hooks/useZoomState.js');
10
- var selection = require('./utils/selection.js');
11
- var animations = require('./utils/animations.js');
12
10
  var constants = require('./constants.js');
13
- var constants$1 = require('./utils/constants.js');
14
11
  require('./PivotViewer.css');
15
12
  var PivotViewerMain = require('./components/PivotViewerMain.js');
16
13
  var FilterPanelContainer = require('./components/FilterPanelContainer.js');
@@ -19,6 +16,13 @@ var useFilterOptions = require('./hooks/useFilterOptions.js');
19
16
  var usePanning = require('./hooks/usePanning.js');
20
17
  var useWheelZoom = require('./hooks/useWheelZoom.js');
21
18
  require('react-dom');
19
+ var useFieldExtractors = require('./hooks/useFieldExtractors.js');
20
+ var useCurrentFilters = require('./hooks/useCurrentFilters.js');
21
+ var useCardSelection = require('./hooks/useCardSelection.js');
22
+ var useDetailPanelClose = require('./hooks/useDetailPanelClose.js');
23
+ var useScrollSync = require('./hooks/useScrollSync.js');
24
+ var useAnimationModeTracking = require('./hooks/useAnimationModeTracking.js');
25
+ var useViewModeScrollHandling = require('./hooks/useViewModeScrollHandling.js');
22
26
  var useContainerDimensions = require('./hooks/useContainerDimensions.js');
23
27
 
24
28
  function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRenderer, getItemId, searchFields, className, emptyContent, isLoading = false, }) {
@@ -39,12 +43,6 @@ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRende
39
43
  const [scrollPosition, setScrollPosition] = React.useState({ x: 0, y: 0 });
40
44
  const { filterState, rangeFilterState, expandedFilterKey, setExpandedFilterKey, handleToggleFilter, handleClearFilter, handleRangeChange, } = useFilterState.useFilterState(filters);
41
45
  const { activeDimensionKey, setActiveDimensionKey, activeDimension, dimensionFilter, handleAxisLabelClick, } = useDimensionState.useDimensionState(dimensions, defaultDimensionKey);
42
- const prevFilterStateRef = React.useRef(filterState);
43
- const prevRangeFilterStateRef = React.useRef(rangeFilterState);
44
- const prevSearchRef = React.useRef(search);
45
- const prevDimensionRef = React.useRef(activeDimensionKey);
46
- const prevViewModeRef = React.useRef(viewMode);
47
- const isFirstRenderRef = React.useRef(true);
48
46
  const { zoomLevel, setZoomLevel, handleZoomIn, handleZoomOut, handleZoomSlider, } = useZoomState.useZoomState(1);
49
47
  const { isPanning, handlePanStart, handlePanMove, handlePanEnd, } = usePanning.usePanning(containerRef, undefined, setScrollPosition);
50
48
  useWheelZoom.useWheelZoom(containerRef, zoomLevel, setZoomLevel);
@@ -62,125 +60,14 @@ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRende
62
60
  container.addEventListener('scroll', handleScroll);
63
61
  return () => container.removeEventListener('scroll', handleScroll);
64
62
  }, []);
65
- React.useEffect(() => {
66
- if (isFirstRenderRef.current) {
67
- isFirstRenderRef.current = false;
68
- return;
69
- }
70
- const filterChanged = prevFilterStateRef.current !== filterState;
71
- const rangeChanged = prevRangeFilterStateRef.current !== rangeFilterState;
72
- const searchChanged = prevSearchRef.current !== search;
73
- const dimensionChanged = prevDimensionRef.current !== activeDimensionKey;
74
- const viewModeChanged = prevViewModeRef.current !== viewMode;
75
- if (filterChanged || rangeChanged || searchChanged) {
76
- setAnimationMode('filter');
77
- }
78
- else if (dimensionChanged || viewModeChanged) {
79
- setAnimationMode('layout');
80
- }
81
- prevFilterStateRef.current = filterState;
82
- prevRangeFilterStateRef.current = rangeFilterState;
83
- prevSearchRef.current = search;
84
- prevDimensionRef.current = activeDimensionKey;
85
- prevViewModeRef.current = viewMode;
86
- }, [filterState, rangeFilterState, search, activeDimensionKey, viewMode]);
87
- React.useEffect(() => {
88
- const container = containerRef.current;
89
- const axisLabels = axisLabelsRef.current;
90
- if (!container || !axisLabels || viewMode !== 'grouped')
91
- return;
92
- const handleScroll = () => {
93
- axisLabels.scrollLeft = container.scrollLeft;
94
- };
95
- handleScroll();
96
- container.addEventListener('scroll', handleScroll);
97
- return () => container.removeEventListener('scroll', handleScroll);
98
- }, [viewMode]);
99
- const fieldExtractors = React.useMemo(() => {
100
- const extractors = new Map();
101
- for (const dim of dimensions) {
102
- extractors.set(dim.key, (item) => {
103
- const val = dim.getValue(item);
104
- if (val instanceof Date)
105
- return val.getTime();
106
- if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {
107
- return val;
108
- }
109
- return String(val);
110
- });
111
- }
112
- if (filters) {
113
- for (const filter of filters) {
114
- extractors.set(filter.key, (item) => {
115
- const val = filter.getValue(item);
116
- if (val instanceof Date)
117
- return val.getTime();
118
- if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {
119
- return val;
120
- }
121
- return String(val);
122
- });
123
- }
124
- }
125
- return extractors;
126
- }, [dimensions, filters]);
127
- const indexFields = React.useMemo(() => {
128
- const fields = new Set();
129
- for (const dim of dimensions) {
130
- fields.add(dim.key);
131
- }
132
- if (filters) {
133
- for (const filter of filters) {
134
- fields.add(filter.key);
135
- }
136
- }
137
- return Array.from(fields);
138
- }, [dimensions, filters]);
63
+ const { fieldExtractors, indexFields } = useFieldExtractors.useFieldExtractors(dimensions, filters);
139
64
  const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine.usePivotEngine({
140
65
  data,
141
66
  fieldExtractors,
142
67
  indexFields,
143
68
  });
144
- const currentFilters = React.useMemo(() => {
145
- const specs = [];
146
- const searchTerm = search.trim().toLowerCase();
147
- if (searchTerm && searchFields && searchFields.length > 0) ;
148
- for (const [key, values] of Object.entries(filterState)) {
149
- const valueSet = values;
150
- if (valueSet.size > 0) {
151
- specs.push({
152
- field: key,
153
- type: 'categorical',
154
- values: valueSet,
155
- });
156
- }
157
- }
158
- for (const [key, range] of Object.entries(rangeFilterState)) {
159
- if (range && (range[0] !== null || range[1] !== null)) {
160
- const min = range[0] ?? -Infinity;
161
- const max = range[1] ?? Infinity;
162
- specs.push({
163
- field: key,
164
- type: 'numeric',
165
- range: { min, max },
166
- });
167
- }
168
- }
169
- if (dimensionFilter && activeDimension) {
170
- specs.push({
171
- field: activeDimension.key,
172
- type: 'categorical',
173
- values: new Set([dimensionFilter]),
174
- });
175
- }
176
- return specs;
177
- }, [filterState, rangeFilterState, search, searchFields, dimensionFilter, activeDimension]);
178
- const currentGroupBy = React.useMemo(() => {
179
- return {
180
- field: activeDimensionKey || dimensions[0]?.key || '',
181
- buckets: 10,
182
- };
183
- }, [activeDimensionKey, dimensions]);
69
+ const currentFilters = useCurrentFilters.useCurrentFilters(filters, filterState, rangeFilterState, search, searchFields, dimensionFilter, activeDimension);
70
+ const currentGroupBy = useCurrentFilters.useCurrentGroupBy(activeDimensionKey, dimensions);
184
71
  React.useEffect(() => {
185
72
  if (!ready)
186
73
  return;
@@ -226,7 +113,7 @@ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRende
226
113
  const lastRequest = lastGroupingRequest.current;
227
114
  if (lastRequest &&
228
115
  lastRequest.viewMode === viewMode &&
229
- lastRequest.groupBy.field === currentGroupBy.field &&
116
+ lastRequest.groupBy?.field === currentGroupBy.field &&
230
117
  lastRequest.visibleIds === visibleIds) {
231
118
  console.log('[PivotViewer] Skipping duplicate grouping request');
232
119
  return;
@@ -264,260 +151,52 @@ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRende
264
151
  const id = item['id'];
265
152
  return typeof id === 'number' ? id : index;
266
153
  }, [getItemId]);
267
- const lastProcessedViewMode = React.useRef(viewMode);
268
- const lastProcessedGrouping = React.useRef(grouping);
269
- React.useEffect(() => {
270
- const viewModeChanged = lastProcessedViewMode.current !== viewMode;
271
- const groupingChanged = lastProcessedGrouping.current !== grouping;
272
- if (!viewModeChanged && !groupingChanged)
273
- return;
274
- lastProcessedViewMode.current = viewMode;
275
- lastProcessedGrouping.current = grouping;
276
- const container = containerRef.current;
277
- if (!container)
278
- return;
279
- if (selectedItem) {
280
- let itemId = resolveId(selectedItem, 0);
281
- if (typeof itemId === 'string' && !layout$1.positions.has(itemId)) {
282
- const numId = Number(itemId);
283
- if (!isNaN(numId) && layout$1.positions.has(numId))
284
- itemId = numId;
285
- }
286
- else if (typeof itemId === 'number' && !layout$1.positions.has(itemId)) {
287
- const strId = String(itemId);
288
- if (layout$1.positions.has(strId))
289
- itemId = strId;
290
- }
291
- const position = layout$1.positions.get(itemId);
292
- if (position) {
293
- const cardPosition = {
294
- x: position.x,
295
- y: position.y,
296
- width: constants.BASE_CARD_WIDTH,
297
- height: constants.BASE_CARD_HEIGHT
298
- };
299
- const detailWidth = viewMode === 'collection' ? 0 : constants$1.DETAIL_PANEL_WIDTH;
300
- const { scrollLeft, scrollTop } = animations.calculateCenterScrollPosition(container, cardPosition, zoomLevel, detailWidth, layout$1.totalHeight);
301
- container.scrollTo({ left: scrollLeft, top: scrollTop });
302
- setPreSelectionState(null);
303
- }
304
- }
305
- else if (viewMode === 'grouped') {
306
- setTimeout(() => {
307
- container.scrollTop = container.scrollHeight;
308
- setScrollPosition({ x: container.scrollLeft, y: container.scrollTop });
309
- }, 0);
310
- }
311
- }, [viewMode, grouping, layout$1, selectedItem, resolveId, zoomLevel]);
312
- const handleCardClick = React.useCallback((item, e, id) => {
313
- if (isPanning)
314
- return;
315
- const container = containerRef.current;
316
- if (!container)
317
- return;
318
- let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);
319
- if (typeof itemId === 'string' && !layout$1.positions.has(itemId)) {
320
- const numId = Number(itemId);
321
- if (!isNaN(numId) && layout$1.positions.has(numId)) {
322
- itemId = numId;
323
- }
324
- }
325
- else if (typeof itemId === 'number' && !layout$1.positions.has(itemId)) {
326
- const strId = String(itemId);
327
- if (layout$1.positions.has(strId)) {
328
- itemId = strId;
329
- }
330
- }
331
- const selectedId = selectedItem ? (data.indexOf(selectedItem) !== -1 ? data.indexOf(selectedItem) : resolveId(selectedItem, 0)) : null;
332
- const position = layout$1.positions.get(itemId);
333
- const cardPosition = position ? {
334
- x: position.x,
335
- y: position.y,
336
- width: constants.BASE_CARD_WIDTH,
337
- height: constants.BASE_CARD_HEIGHT
338
- } : null;
339
- let targetCardPosition = null;
340
- let getCardPositionAtZoom = undefined;
341
- let targetTotalHeight = layout$1.totalHeight;
342
- if (viewMode === 'grouped' && cardPosition) {
343
- const targetZoom = Math.min(constants$1.ZOOM_MAX, Math.max(constants$1.MIN_ZOOM_ON_SELECT, zoomLevel * constants$1.ZOOM_MULTIPLIER));
344
- const targetContainerWidth = containerDimensions.width / targetZoom;
345
- const targetContainerHeight = containerDimensions.height;
346
- const targetLayout = layout.computeLayout(grouping, {
347
- viewMode,
348
- cardWidth: constants.BASE_CARD_WIDTH,
349
- cardHeight: constants.BASE_CARD_HEIGHT,
350
- cardsPerColumn: constants.CARDS_PER_COLUMN,
351
- groupSpacing: constants.GROUP_SPACING,
352
- containerWidth: targetContainerWidth,
353
- containerHeight: targetContainerHeight,
354
- });
355
- targetTotalHeight = targetLayout.totalHeight;
356
- const targetPos = targetLayout.positions.get(itemId);
357
- if (targetPos) {
358
- targetCardPosition = {
359
- x: targetPos.x,
360
- y: targetPos.y,
361
- width: constants.BASE_CARD_WIDTH,
362
- height: constants.BASE_CARD_HEIGHT
363
- };
364
- }
365
- getCardPositionAtZoom = (zoom) => {
366
- const currentContainerWidth = containerDimensions.width / zoom;
367
- const currentContainerHeight = containerDimensions.height;
368
- const currentLayout = layout.computeLayout(grouping, {
369
- viewMode,
370
- cardWidth: constants.BASE_CARD_WIDTH,
371
- cardHeight: constants.BASE_CARD_HEIGHT,
372
- cardsPerColumn: constants.CARDS_PER_COLUMN,
373
- groupSpacing: constants.GROUP_SPACING,
374
- containerWidth: currentContainerWidth,
375
- containerHeight: currentContainerHeight,
376
- });
377
- const pos = currentLayout.positions.get(itemId);
378
- return pos ? { x: pos.x, y: pos.y, width: constants.BASE_CARD_WIDTH, height: constants.BASE_CARD_HEIGHT } : null;
379
- };
380
- }
381
- const getLayoutSizeAtZoom = (zoom) => {
382
- if (viewMode === 'collection') {
383
- return { width: layout$1.totalWidth, height: layout$1.totalHeight };
384
- }
385
- const currentContainerWidth = containerDimensions.width / zoom;
386
- const currentContainerHeight = containerDimensions.height;
387
- const currentLayout = layout.computeLayout(grouping, {
388
- viewMode,
389
- cardWidth: constants.BASE_CARD_WIDTH,
390
- cardHeight: constants.BASE_CARD_HEIGHT,
391
- cardsPerColumn: constants.CARDS_PER_COLUMN,
392
- groupSpacing: constants.GROUP_SPACING,
393
- containerWidth: currentContainerWidth,
394
- containerHeight: currentContainerHeight,
395
- });
396
- return { width: currentLayout.totalWidth, height: currentLayout.totalHeight };
397
- };
398
- selection.handleCardSelection({
399
- item,
400
- itemId,
401
- selectedItemId: selectedId,
402
- container,
403
- cardPosition,
404
- targetCardPosition,
405
- getCardPositionAtZoom,
406
- getLayoutSizeAtZoom,
407
- spacer: spacerRef.current,
408
- preSelectionState,
409
- startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },
410
- setZoomLevel,
411
- setIsZooming,
412
- setSelectedItem,
413
- setPreSelectionState,
414
- viewMode,
415
- zoomLevel,
416
- totalHeight: targetTotalHeight,
417
- });
418
- }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout$1, grouping, containerDimensions, scrollPosition]);
419
- const closeDetail = React.useCallback(() => {
420
- const container = containerRef.current;
421
- if (!container || !selectedItem) {
422
- setSelectedItem(null);
423
- return;
424
- }
425
- const index = data.indexOf(selectedItem);
426
- let itemId = index !== -1 ? index : resolveId(selectedItem, 0);
427
- if (typeof itemId === 'string' && !layout$1.positions.has(itemId)) {
428
- const numId = Number(itemId);
429
- if (!isNaN(numId) && layout$1.positions.has(numId)) {
430
- itemId = numId;
431
- }
432
- }
433
- else if (typeof itemId === 'number' && !layout$1.positions.has(itemId)) {
434
- const strId = String(itemId);
435
- if (layout$1.positions.has(strId)) {
436
- itemId = strId;
437
- }
438
- }
439
- const position = layout$1.positions.get(itemId);
440
- const cardPosition = position ? {
441
- x: position.x,
442
- y: position.y,
443
- width: constants.BASE_CARD_WIDTH,
444
- height: constants.BASE_CARD_HEIGHT
445
- } : null;
446
- if (!preSelectionState) {
447
- setSelectedItem(null);
448
- return;
449
- }
450
- if (viewMode === 'collection') {
451
- setSelectedItem(null);
452
- animations.smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);
453
- setPreSelectionState(null);
454
- return;
455
- }
456
- const zoomChanged = Math.abs(preSelectionState.zoom - zoomLevel) > 0.001;
457
- if (!zoomChanged || !cardPosition) {
458
- setSelectedItem(null);
459
- animations.smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);
460
- setPreSelectionState(null);
461
- return;
462
- }
463
- let targetCardPosition = null;
464
- let getCardPositionAtZoom = undefined;
465
- if (viewMode === 'grouped') {
466
- const targetZoom = preSelectionState.zoom;
467
- const targetContainerWidth = containerDimensions.width / targetZoom;
468
- const targetContainerHeight = containerDimensions.height;
469
- const targetLayout = layout.computeLayout(grouping, {
470
- viewMode,
471
- cardWidth: constants.BASE_CARD_WIDTH,
472
- cardHeight: constants.BASE_CARD_HEIGHT,
473
- cardsPerColumn: constants.CARDS_PER_COLUMN,
474
- groupSpacing: constants.GROUP_SPACING,
475
- containerWidth: targetContainerWidth,
476
- containerHeight: targetContainerHeight,
477
- });
478
- const targetPos = targetLayout.positions.get(itemId);
479
- if (targetPos) {
480
- targetCardPosition = {
481
- x: targetPos.x,
482
- y: targetPos.y,
483
- width: constants.BASE_CARD_WIDTH,
484
- height: constants.BASE_CARD_HEIGHT
485
- };
486
- }
487
- getCardPositionAtZoom = (zoom) => {
488
- const currentContainerWidth = containerDimensions.width / zoom;
489
- const currentContainerHeight = containerDimensions.height;
490
- const currentLayout = layout.computeLayout(grouping, {
491
- viewMode,
492
- cardWidth: constants.BASE_CARD_WIDTH,
493
- cardHeight: constants.BASE_CARD_HEIGHT,
494
- cardsPerColumn: constants.CARDS_PER_COLUMN,
495
- groupSpacing: constants.GROUP_SPACING,
496
- containerWidth: currentContainerWidth,
497
- containerHeight: currentContainerHeight,
498
- });
499
- const pos = currentLayout.positions.get(itemId);
500
- return pos ? { x: pos.x, y: pos.y, width: constants.BASE_CARD_WIDTH, height: constants.BASE_CARD_HEIGHT } : null;
501
- };
502
- }
503
- setIsZooming(true);
504
- animations.animateZoomAndScroll({
505
- container,
506
- cardPosition,
507
- targetCardPosition,
508
- getCardPositionAtZoom,
509
- startZoom: zoomLevel,
510
- targetZoom: preSelectionState.zoom,
511
- targetScrollLeft: preSelectionState.scrollLeft,
512
- targetScrollTop: preSelectionState.scrollTop,
513
- onUpdate: setZoomLevel,
514
- onComplete: () => {
515
- setIsZooming(false);
516
- setSelectedItem(null);
517
- setPreSelectionState(null);
518
- },
519
- });
520
- }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout$1, grouping, containerDimensions]);
154
+ useAnimationModeTracking.useAnimationModeTracking(filterState, rangeFilterState, search, activeDimensionKey, viewMode, setAnimationMode);
155
+ useScrollSync.useScrollSync(containerRef, axisLabelsRef, viewMode);
156
+ useViewModeScrollHandling.useViewModeScrollHandling({
157
+ containerRef,
158
+ viewMode,
159
+ grouping,
160
+ layout: layout$1,
161
+ selectedItem,
162
+ zoomLevel,
163
+ resolveId,
164
+ data,
165
+ setPreSelectionState,
166
+ });
167
+ const handleCardClick = useCardSelection.useCardSelection({
168
+ data,
169
+ isPanning,
170
+ selectedItem,
171
+ zoomLevel,
172
+ viewMode,
173
+ layout: layout$1,
174
+ containerDimensions,
175
+ scrollPosition,
176
+ preSelectionState,
177
+ grouping,
178
+ getItemId,
179
+ resolveId,
180
+ setZoomLevel,
181
+ setIsZooming,
182
+ setSelectedItem,
183
+ setPreSelectionState,
184
+ });
185
+ const closeDetail = useDetailPanelClose.useDetailPanelClose({
186
+ selectedItem,
187
+ preSelectionState,
188
+ zoomLevel,
189
+ viewMode,
190
+ layout: layout$1,
191
+ containerDimensions,
192
+ grouping,
193
+ data,
194
+ resolveId,
195
+ setZoomLevel,
196
+ setIsZooming,
197
+ setSelectedItem,
198
+ setPreSelectionState,
199
+ });
521
200
  const cardWidth = constants.BASE_CARD_WIDTH;
522
201
  const cardHeight = constants.BASE_CARD_HEIGHT;
523
202
  const filterOptions = useFilterOptions.useFilterOptions(data, filters, filterState, rangeFilterState);