@cratis/components 0.1.13 → 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.
- package/dist/cjs/PivotViewer/PivotViewer.js +57 -378
- package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/cjs/PivotViewer/hooks/useAnimationModeTracking.js +37 -0
- package/dist/cjs/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useCardSelection.js +64 -0
- package/dist/cjs/PivotViewer/hooks/useCardSelection.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useCurrentFilters.js +52 -0
- package/dist/cjs/PivotViewer/hooks/useCurrentFilters.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js +63 -0
- package/dist/cjs/PivotViewer/hooks/useDetailPanelClose.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useFieldExtractors.js +50 -0
- package/dist/cjs/PivotViewer/hooks/useFieldExtractors.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useScrollSync.js +21 -0
- package/dist/cjs/PivotViewer/hooks/useScrollSync.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useViewModeScrollHandling.js +42 -0
- package/dist/cjs/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/cardPosition.js +67 -0
- package/dist/cjs/PivotViewer/utils/cardPosition.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/constants.js +4 -0
- package/dist/cjs/PivotViewer/utils/constants.js.map +1 -1
- package/dist/cjs/PivotViewer/utils/idResolution.js +34 -0
- package/dist/cjs/PivotViewer/utils/idResolution.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.js +57 -378
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/index.d.ts +7 -0
- package/dist/esm/PivotViewer/hooks/index.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/index.js +7 -0
- package/dist/esm/PivotViewer/hooks/index.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.d.ts +2 -0
- package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js +35 -0
- package/dist/esm/PivotViewer/hooks/useAnimationModeTracking.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts +37 -0
- package/dist/esm/PivotViewer/hooks/useCardSelection.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useCardSelection.js +62 -0
- package/dist/esm/PivotViewer/hooks/useCardSelection.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useCurrentFilters.d.ts +5 -0
- package/dist/esm/PivotViewer/hooks/useCurrentFilters.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useCurrentFilters.js +49 -0
- package/dist/esm/PivotViewer/hooks/useCurrentFilters.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useDetailPanelClose.d.ts +27 -0
- package/dist/esm/PivotViewer/hooks/useDetailPanelClose.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js +61 -0
- package/dist/esm/PivotViewer/hooks/useDetailPanelClose.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFieldExtractors.d.ts +7 -0
- package/dist/esm/PivotViewer/hooks/useFieldExtractors.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFieldExtractors.js +48 -0
- package/dist/esm/PivotViewer/hooks/useFieldExtractors.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useScrollSync.d.ts +3 -0
- package/dist/esm/PivotViewer/hooks/useScrollSync.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useScrollSync.js +19 -0
- package/dist/esm/PivotViewer/hooks/useScrollSync.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.d.ts +16 -0
- package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js +40 -0
- package/dist/esm/PivotViewer/hooks/useViewModeScrollHandling.js.map +1 -0
- package/dist/esm/PivotViewer/utils/cardPosition.d.ts +18 -0
- package/dist/esm/PivotViewer/utils/cardPosition.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/cardPosition.js +63 -0
- package/dist/esm/PivotViewer/utils/cardPosition.js.map +1 -0
- package/dist/esm/PivotViewer/utils/constants.js +3 -1
- package/dist/esm/PivotViewer/utils/constants.js.map +1 -1
- package/dist/esm/PivotViewer/utils/idResolution.d.ts +13 -0
- package/dist/esm/PivotViewer/utils/idResolution.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/idResolution.js +31 -0
- package/dist/esm/PivotViewer/utils/idResolution.js.map +1 -0
- package/dist/esm/PivotViewer/utils/index.d.ts +2 -0
- package/dist/esm/PivotViewer/utils/index.d.ts.map +1 -1
- package/dist/esm/PivotViewer/utils/index.js +2 -0
- package/dist/esm/PivotViewer/utils/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -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
|
-
|
|
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 =
|
|
145
|
-
|
|
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
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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);
|