@cratis/components 0.1.10 → 0.1.12
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/CommandForm/CommandFormFields.js +9 -3
- package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -1
- package/dist/cjs/CommandForm/ValidationMessage.js +24 -0
- package/dist/cjs/CommandForm/ValidationMessage.js.map +1 -0
- package/dist/cjs/CommandForm/asCommandFormField.js +47 -0
- package/dist/cjs/CommandForm/asCommandFormField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/CheckboxField.js +13 -0
- package/dist/cjs/CommandForm/fields/CheckboxField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/DropdownField.js +13 -0
- package/dist/cjs/CommandForm/fields/DropdownField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/InputTextField.js +13 -0
- package/dist/cjs/CommandForm/fields/InputTextField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/NumberField.js +13 -0
- package/dist/cjs/CommandForm/fields/NumberField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/SliderField.js +17 -0
- package/dist/cjs/CommandForm/fields/SliderField.js.map +1 -0
- package/dist/cjs/CommandForm/fields/TextAreaField.js +13 -0
- package/dist/cjs/CommandForm/fields/TextAreaField.js.map +1 -0
- package/dist/cjs/CommandForm/index.js +15 -7
- package/dist/cjs/CommandForm/index.js.map +1 -1
- package/dist/cjs/PivotViewer/PivotViewer.js +14 -0
- package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotCanvas.js +33 -10
- package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js +1 -1
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/sprites.js +79 -15
- package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/cjs/PivotViewer/components/pivot/visibility.js +36 -10
- package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/cjs/PivotViewer/engine/layout.js +2 -1
- package/dist/cjs/PivotViewer/engine/layout.js.map +1 -1
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +37 -2
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -1
- package/dist/cjs/PivotViewer/index.js +3 -0
- package/dist/cjs/PivotViewer/index.js.map +1 -1
- package/dist/cjs/PivotViewer/types.js +22 -0
- package/dist/cjs/PivotViewer/types.js.map +1 -0
- package/dist/cjs/TimeMachine/TimeMachine.js +8 -3
- package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -1
- package/dist/esm/CommandForm/CommandForm.stories.d.ts +1 -0
- package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -1
- package/dist/esm/CommandForm/CommandForm.stories.js +34 -1
- package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -1
- package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -1
- package/dist/esm/CommandForm/CommandFormFields.js +9 -3
- package/dist/esm/CommandForm/CommandFormFields.js.map +1 -1
- package/dist/esm/CommandForm/UserRegistrationCommand.d.ts +63 -0
- package/dist/esm/CommandForm/UserRegistrationCommand.d.ts.map +1 -0
- package/dist/esm/CommandForm/UserRegistrationCommand.js +143 -0
- package/dist/esm/CommandForm/UserRegistrationCommand.js.map +1 -0
- package/dist/esm/CommandForm/ValidationMessage.d.ts +8 -0
- package/dist/esm/CommandForm/ValidationMessage.d.ts.map +1 -0
- package/dist/esm/CommandForm/ValidationMessage.js +22 -0
- package/dist/esm/CommandForm/ValidationMessage.js.map +1 -0
- package/dist/esm/CommandForm/asCommandFormField.d.ts +32 -0
- package/dist/esm/CommandForm/asCommandFormField.d.ts.map +1 -0
- package/dist/esm/CommandForm/asCommandFormField.js +45 -0
- package/dist/esm/CommandForm/asCommandFormField.js.map +1 -0
- package/dist/esm/CommandForm/fields/CheckboxField.d.ts +10 -0
- package/dist/esm/CommandForm/fields/CheckboxField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/CheckboxField.js +11 -0
- package/dist/esm/CommandForm/fields/CheckboxField.js.map +1 -0
- package/dist/esm/CommandForm/fields/DropdownField.d.ts +15 -0
- package/dist/esm/CommandForm/fields/DropdownField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/DropdownField.js +11 -0
- package/dist/esm/CommandForm/fields/DropdownField.js.map +1 -0
- package/dist/esm/CommandForm/fields/InputTextField.d.ts +11 -0
- package/dist/esm/CommandForm/fields/InputTextField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/InputTextField.js +11 -0
- package/dist/esm/CommandForm/fields/InputTextField.js.map +1 -0
- package/dist/esm/CommandForm/fields/NumberField.d.ts +13 -0
- package/dist/esm/CommandForm/fields/NumberField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/NumberField.js +11 -0
- package/dist/esm/CommandForm/fields/NumberField.js.map +1 -0
- package/dist/esm/CommandForm/fields/SliderField.d.ts +12 -0
- package/dist/esm/CommandForm/fields/SliderField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/SliderField.js +15 -0
- package/dist/esm/CommandForm/fields/SliderField.js.map +1 -0
- package/dist/esm/CommandForm/fields/TextAreaField.d.ts +12 -0
- package/dist/esm/CommandForm/fields/TextAreaField.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/TextAreaField.js +11 -0
- package/dist/esm/CommandForm/fields/TextAreaField.js.map +1 -0
- package/dist/esm/CommandForm/fields/index.d.ts +7 -0
- package/dist/esm/CommandForm/fields/index.d.ts.map +1 -0
- package/dist/esm/CommandForm/fields/index.js +7 -0
- package/dist/esm/CommandForm/fields/index.js.map +1 -0
- package/dist/esm/CommandForm/index.d.ts +3 -4
- package/dist/esm/CommandForm/index.d.ts.map +1 -1
- package/dist/esm/CommandForm/index.js +8 -4
- package/dist/esm/CommandForm/index.js.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.js +14 -0
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +1 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -1
- package/dist/esm/PivotViewer/PivotViewer.stories.js +43 -3
- package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.js +33 -10
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.js +1 -1
- package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/sprites.js +79 -15
- package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/pivot/visibility.js +36 -10
- package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -1
- package/dist/esm/PivotViewer/engine/layout.js +2 -1
- package/dist/esm/PivotViewer/engine/layout.js.map +1 -1
- package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -1
- package/dist/esm/PivotViewer/engine/pivot.worker.js +22 -7
- package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +2 -2
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/useFilteredData.js +4 -2
- package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -1
- package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -1
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js +37 -2
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -1
- package/dist/esm/PivotViewer/index.d.ts +2 -1
- package/dist/esm/PivotViewer/index.d.ts.map +1 -1
- package/dist/esm/PivotViewer/index.js +1 -0
- package/dist/esm/PivotViewer/index.js.map +1 -1
- package/dist/esm/PivotViewer/types.d.ts +4 -1
- package/dist/esm/PivotViewer/types.d.ts.map +1 -1
- package/dist/esm/PivotViewer/types.js +19 -2
- package/dist/esm/PivotViewer/types.js.map +1 -1
- package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -1
- package/dist/esm/TimeMachine/TimeMachine.js +8 -3
- package/dist/esm/TimeMachine/TimeMachine.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +29 -29
- package/dist/cjs/CommandForm/DatePickerField.js +0 -31
- package/dist/cjs/CommandForm/DatePickerField.js.map +0 -1
- package/dist/cjs/CommandForm/DropdownField.js +0 -31
- package/dist/cjs/CommandForm/DropdownField.js.map +0 -1
- package/dist/cjs/CommandForm/InputTextField.js +0 -32
- package/dist/cjs/CommandForm/InputTextField.js.map +0 -1
- package/dist/cjs/CommandForm/SliderField.js +0 -34
- package/dist/cjs/CommandForm/SliderField.js.map +0 -1
- package/dist/esm/CommandForm/DatePickerField.d.ts +0 -20
- package/dist/esm/CommandForm/DatePickerField.d.ts.map +0 -1
- package/dist/esm/CommandForm/DatePickerField.js +0 -29
- package/dist/esm/CommandForm/DatePickerField.js.map +0 -1
- package/dist/esm/CommandForm/DropdownField.d.ts +0 -24
- package/dist/esm/CommandForm/DropdownField.d.ts.map +0 -1
- package/dist/esm/CommandForm/DropdownField.js +0 -29
- package/dist/esm/CommandForm/DropdownField.js.map +0 -1
- package/dist/esm/CommandForm/InputTextField.d.ts +0 -20
- package/dist/esm/CommandForm/InputTextField.d.ts.map +0 -1
- package/dist/esm/CommandForm/InputTextField.js +0 -30
- package/dist/esm/CommandForm/InputTextField.js.map +0 -1
- package/dist/esm/CommandForm/SliderField.d.ts +0 -23
- package/dist/esm/CommandForm/SliderField.d.ts.map +0 -1
- package/dist/esm/CommandForm/SliderField.js +0 -32
- package/dist/esm/CommandForm/SliderField.js.map +0 -1
|
@@ -186,9 +186,11 @@ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRende
|
|
|
186
186
|
setVisibleIds(result.visibleIds);
|
|
187
187
|
});
|
|
188
188
|
}, [ready, currentFilters, engineApplyFilters]);
|
|
189
|
+
const lastGroupingRequest = useRef(null);
|
|
189
190
|
useEffect(() => {
|
|
190
191
|
if (!ready || visibleIds.length === 0) {
|
|
191
192
|
setGrouping({ groups: [] });
|
|
193
|
+
lastGroupingRequest.current = null;
|
|
192
194
|
return;
|
|
193
195
|
}
|
|
194
196
|
if (viewMode === 'collection') {
|
|
@@ -216,9 +218,21 @@ function PivotViewer({ data, dimensions, filters, defaultDimensionKey, cardRende
|
|
|
216
218
|
}]
|
|
217
219
|
});
|
|
218
220
|
}
|
|
221
|
+
lastGroupingRequest.current = null;
|
|
219
222
|
return;
|
|
220
223
|
}
|
|
224
|
+
const lastRequest = lastGroupingRequest.current;
|
|
225
|
+
if (lastRequest &&
|
|
226
|
+
lastRequest.viewMode === viewMode &&
|
|
227
|
+
lastRequest.groupBy.field === currentGroupBy.field &&
|
|
228
|
+
lastRequest.visibleIds === visibleIds) {
|
|
229
|
+
console.log('[PivotViewer] Skipping duplicate grouping request');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
lastGroupingRequest.current = { viewMode, groupBy: currentGroupBy, visibleIds };
|
|
233
|
+
console.log('[PivotViewer] Computing grouping for', visibleIds.length, 'items');
|
|
221
234
|
computeGrouping(visibleIds, currentGroupBy).then((result) => {
|
|
235
|
+
console.log('[PivotViewer] Grouping result received:', result.groups.length, 'groups');
|
|
222
236
|
setGrouping(result);
|
|
223
237
|
});
|
|
224
238
|
}, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PivotViewer.js","sources":["../../../PivotViewer/PivotViewer.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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { PivotViewerProps } from './types';\nimport type { FilterSpec, GroupSpec, FieldValue, GroupingResult, ItemId } from './engine/types';\nimport { usePivotEngine } from './hooks/usePivotEngine';\nimport { computeLayout } from './engine/layout';\nimport { useFilterState } from './hooks/useFilterState';\nimport { useDimensionState } from './hooks/useDimensionState';\nimport { useZoomState } from './hooks/useZoomState';\nimport { handleCardSelection } from './utils/selection';\nimport { animateZoomAndScroll, smoothScrollTo } from './utils/animations';\nimport {\n BASE_CARD_WIDTH,\n BASE_CARD_HEIGHT,\n CARDS_PER_COLUMN,\n GROUP_SPACING,\n} from './constants';\nimport { ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER, DETAIL_PANEL_WIDTH } from './utils/constants';\nimport { calculateCenterScrollPosition } from './utils/animations';\nimport './PivotViewer.css';\nimport { PivotViewerMain } from './components/PivotViewerMain';\nimport { FilterPanelContainer } from './components/FilterPanelContainer';\nimport { ToolbarContainer } from './components/ToolbarContainer';\nimport { usePanning, useWheelZoom, useFilterOptions } from './hooks';\nimport { useContainerDimensions } from './hooks/useContainerDimensions';\nimport type { ViewMode } from './components/Toolbar';\n\nexport function PivotViewer<TItem extends object>({\n data,\n dimensions,\n filters,\n defaultDimensionKey,\n cardRenderer,\n getItemId,\n searchFields,\n className,\n emptyContent,\n isLoading = false,\n}: PivotViewerProps<TItem>) {\n // Refs\n const containerRef = useRef<HTMLDivElement>(null!);\n const filterButtonRef = useRef<HTMLButtonElement>(null!);\n const axisLabelsRef = useRef<HTMLDivElement>(null!);\n const spacerRef = useRef<HTMLDivElement>(null!);\n\n // State\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('collection');\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState<TItem | null>(null);\n const [isZooming, setIsZooming] = useState(false);\n const [visibleIds, setVisibleIds] = useState<Uint32Array>(new Uint32Array(0));\n const [grouping, setGrouping] = useState<GroupingResult>({ groups: [] });\n const [hoveredGroupIndex, setHoveredGroupIndex] = useState<number | null>(null);\n const [preSelectionState, setPreSelectionState] = useState<{ zoom: number; scrollLeft: number; scrollTop: number } | null>(null);\n const [, setAnimationMode] = useState<'layout' | 'filter'>('layout');\n const [scrollPosition, setScrollPosition] = useState({ x: 0, y: 0 });\n\n // Filter hooks\n const {\n filterState,\n rangeFilterState,\n expandedFilterKey,\n setExpandedFilterKey,\n handleToggleFilter,\n handleClearFilter,\n handleRangeChange,\n } = useFilterState(filters);\n\n // Dimension hooks\n const {\n activeDimensionKey,\n setActiveDimensionKey,\n activeDimension,\n dimensionFilter,\n handleAxisLabelClick,\n } = useDimensionState(dimensions, defaultDimensionKey);\n\n // Track what type of change triggered the update (for animation mode)\n const prevFilterStateRef = useRef(filterState);\n const prevRangeFilterStateRef = useRef(rangeFilterState);\n const prevSearchRef = useRef(search);\n const prevDimensionRef = useRef(activeDimensionKey);\n const prevViewModeRef = useRef(viewMode);\n const isFirstRenderRef = useRef(true);\n\n // Zoom and pan hooks\n const {\n zoomLevel,\n setZoomLevel,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\n } = useZoomState(1);\n\n const {\n isPanning,\n handlePanStart,\n handlePanMove,\n handlePanEnd,\n } = usePanning(containerRef, undefined, setScrollPosition);\n\n useWheelZoom(containerRef, zoomLevel, setZoomLevel);\n\n // Track container dimensions for responsive layout\n const containerDimensions = useContainerDimensions(containerRef, isLoading);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: container.scrollLeft,\n y: container.scrollTop,\n });\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Zoom reset removed to persist zoom level across view changes\n\n\n // Track what type of change triggered the update for animation mode\n useEffect(() => {\n // Skip the first render\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n\n const filterChanged = prevFilterStateRef.current !== filterState;\n const rangeChanged = prevRangeFilterStateRef.current !== rangeFilterState;\n const searchChanged = prevSearchRef.current !== search;\n const dimensionChanged = prevDimensionRef.current !== activeDimensionKey;\n const viewModeChanged = prevViewModeRef.current !== viewMode;\n\n // If filters or search changed, use filter animation (fade/scale)\n // If dimension or view mode changed, use layout animation (fly)\n if (filterChanged || rangeChanged || searchChanged) {\n setAnimationMode('filter');\n } else if (dimensionChanged || viewModeChanged) {\n setAnimationMode('layout');\n }\n\n prevFilterStateRef.current = filterState;\n prevRangeFilterStateRef.current = rangeFilterState;\n prevSearchRef.current = search;\n prevDimensionRef.current = activeDimensionKey;\n prevViewModeRef.current = viewMode;\n }, [filterState, rangeFilterState, search, activeDimensionKey, viewMode]);\n\n // Sync axis labels scroll with container scroll\n useEffect(() => {\n const container = containerRef.current;\n const axisLabels = axisLabelsRef.current;\n\n if (!container || !axisLabels || viewMode !== 'grouped') return;\n\n const handleScroll = () => {\n axisLabels.scrollLeft = container.scrollLeft;\n };\n\n // Sync immediately\n handleScroll();\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [viewMode]);\n\n // Build field extractors for the columnar store\n const fieldExtractors = useMemo(() => {\n const extractors = new Map<string, (item: TItem) => FieldValue>();\n\n for (const dim of dimensions) {\n extractors.set(dim.key, (item) => {\n const val = dim.getValue(item);\n if (val instanceof Date) return val.getTime();\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {\n return val;\n }\n return String(val);\n });\n }\n\n if (filters) {\n for (const filter of filters) {\n extractors.set(filter.key, (item) => {\n const val = filter.getValue(item);\n if (val instanceof Date) return val.getTime();\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {\n return val;\n }\n return String(val);\n });\n }\n }\n\n return extractors;\n }, [dimensions, filters]);\n\n const indexFields = useMemo(() => {\n const fields = new Set<string>();\n\n for (const dim of dimensions) {\n fields.add(dim.key);\n }\n\n if (filters) {\n for (const filter of filters) {\n fields.add(filter.key);\n }\n }\n\n return Array.from(fields);\n }, [dimensions, filters]);\n\n // Initialize the Web Worker engine\n const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine({\n data,\n fieldExtractors,\n indexFields,\n });\n\n // Build filter specs from UI state\n const currentFilters = useMemo((): FilterSpec[] => {\n const specs: FilterSpec[] = [];\n\n // Search filter\n const searchTerm = search.trim().toLowerCase();\n if (searchTerm && searchFields && searchFields.length > 0) {\n // TODO: Implement search in worker\n // For now, search will be handled client-side after worker filtering\n }\n\n // Categorical filters\n for (const [key, values] of Object.entries(filterState)) {\n const valueSet = values as Set<string>;\n if (valueSet.size > 0) {\n specs.push({\n field: key,\n type: 'categorical',\n values: valueSet,\n });\n }\n }\n\n // Range filters\n for (const [key, range] of Object.entries(rangeFilterState)) {\n if (range && (range[0] !== null || range[1] !== null)) {\n const min = range[0] ?? -Infinity;\n const max = range[1] ?? Infinity;\n specs.push({\n field: key,\n type: 'numeric',\n range: { min, max },\n });\n }\n }\n\n // Dimension filter (bucket filter)\n if (dimensionFilter && activeDimension) {\n specs.push({\n field: activeDimension.key,\n type: 'categorical',\n values: new Set([dimensionFilter]),\n });\n }\n\n return specs;\n }, [filterState, rangeFilterState, search, searchFields, dimensionFilter, activeDimension]);\n\n const currentGroupBy = useMemo((): GroupSpec => {\n return {\n field: activeDimensionKey || dimensions[0]?.key || '',\n buckets: 10,\n };\n }, [activeDimensionKey, dimensions]);\n\n // Apply filters\n useEffect(() => {\n if (!ready) return;\n\n engineApplyFilters(currentFilters).then((result) => {\n setVisibleIds(result.visibleIds);\n });\n }, [ready, currentFilters, engineApplyFilters]);\n\n // Compute grouping\n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setGrouping({ groups: [] });\n return;\n }\n\n if (viewMode === 'collection') {\n // In collection mode, create a single group with all items\n // Sort items if activeDimensionKey is set\n if (activeDimensionKey) {\n sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: sortedIds,\n count: sortedIds.length\n }]\n });\n });\n } else {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: visibleIds,\n count: visibleIds.length\n }]\n });\n }\n return;\n }\n\n computeGrouping(visibleIds, currentGroupBy).then((result) => {\n setGrouping(result);\n });\n }, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);\n\n // Compute layout\n const layout = useMemo(() => {\n // Calculate layout at base dimensions (zoom is applied as transform)\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n const containerWidth = containerDimensions.width / zoomLevel;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const containerHeight = viewMode === 'collection'\n ? containerDimensions.height / zoomLevel\n : containerDimensions.height;\n\n const result = computeLayout(grouping, {\n viewMode,\n cardWidth,\n cardHeight,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth,\n containerHeight,\n });\n\n return result;\n }, [grouping, viewMode, zoomLevel, containerDimensions.width, containerDimensions.height]);\n\n const resolveId = useCallback((item: TItem, index: number): ItemId => {\n if (getItemId) {\n const id = getItemId(item, index);\n return typeof id === 'number' ? id : index;\n }\n const id = (item as Record<string, unknown>)['id'];\n return typeof id === 'number' ? id : index;\n }, [getItemId]);\n\n // Scroll positioning when switching view modes or grouping changes\n const lastProcessedViewMode = useRef(viewMode);\n const lastProcessedGrouping = useRef(grouping);\n\n useEffect(() => {\n const viewModeChanged = lastProcessedViewMode.current !== viewMode;\n const groupingChanged = lastProcessedGrouping.current !== grouping;\n\n if (!viewModeChanged && !groupingChanged) return;\n\n lastProcessedViewMode.current = viewMode;\n lastProcessedGrouping.current = grouping;\n\n const container = containerRef.current;\n if (!container) return;\n\n // If we have a selected item, we want to keep it centered in the new layout\n if (selectedItem) {\n // Resolve ID\n let itemId = resolveId(selectedItem, 0);\n\n // Ensure ID type matches layout\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) itemId = numId;\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) itemId = strId;\n }\n\n const position = layout.positions.get(itemId);\n if (position) {\n const cardPosition = {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n\n const detailWidth = viewMode === 'collection' ? 0 : DETAIL_PANEL_WIDTH;\n\n const { scrollLeft, scrollTop } = calculateCenterScrollPosition(\n container,\n cardPosition,\n zoomLevel,\n detailWidth,\n layout.totalHeight\n );\n\n container.scrollTo({ left: scrollLeft, top: scrollTop });\n\n // Clear pre-selection state as we've moved to a new context\n setPreSelectionState(null);\n }\n } else if (viewMode === 'grouped') {\n // Default behavior for grouped view: scroll to bottom\n // Use a small timeout to ensure the spacer has been resized\n setTimeout(() => {\n container.scrollTop = container.scrollHeight;\n // Sync scroll position state immediately to avoid stale values on first click\n setScrollPosition({ x: container.scrollLeft, y: container.scrollTop });\n }, 0);\n }\n }, [viewMode, grouping, layout, selectedItem, resolveId, zoomLevel]);\n\n const handleCardClick = useCallback((item: TItem, e: MouseEvent, id?: number | string) => {\n if (isPanning) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Use the passed ID (index) if available, otherwise fallback to resolveId\n // Note: resolveId might be unreliable for looking up layout positions if IDs are strings\n let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);\n\n // Ensure itemId matches layout keys type (number vs string)\n // If layout has number keys and itemId is string, try converting\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) {\n itemId = numId;\n }\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) {\n itemId = strId;\n }\n }\n\n const selectedId = selectedItem ? (data.indexOf(selectedItem) !== -1 ? data.indexOf(selectedItem) : resolveId(selectedItem, 0)) : null;\n\n // Get card position from layout\n const position = layout.positions.get(itemId);\n\n const cardPosition = position ? {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n } : null;\n\n // Calculate target position for animation\n let targetCardPosition: { x: number; y: number; width: number; height: number } | null = null;\n let getCardPositionAtZoom: ((zoom: number) => { x: number; y: number; width: number; height: number } | null) | undefined = undefined;\n let targetTotalHeight = layout.totalHeight;\n\n if (viewMode === 'grouped' && cardPosition) {\n // Calculate target zoom (logic duplicated from zoomAndCenterCard)\n const targetZoom = Math.min(ZOOM_MAX, Math.max(MIN_ZOOM_ON_SELECT, zoomLevel * ZOOM_MULTIPLIER));\n\n // Calculate target layout\n const targetContainerWidth = containerDimensions.width / targetZoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const targetContainerHeight = containerDimensions.height;\n\n const targetLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: targetContainerWidth,\n containerHeight: targetContainerHeight,\n });\n\n targetTotalHeight = targetLayout.totalHeight;\n\n const targetPos = targetLayout.positions.get(itemId);\n if (targetPos) {\n targetCardPosition = {\n x: targetPos.x,\n y: targetPos.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n }\n\n // Provide callback for accurate position during animation\n getCardPositionAtZoom = (zoom: number) => {\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n const pos = currentLayout.positions.get(itemId);\n return pos ? { x: pos.x, y: pos.y, width: BASE_CARD_WIDTH, height: BASE_CARD_HEIGHT } : null;\n };\n }\n\n // Callback to get layout size at a specific zoom level (for spacer updates)\n const getLayoutSizeAtZoom = (zoom: number) => {\n if (viewMode === 'collection') {\n return { width: layout.totalWidth, height: layout.totalHeight };\n }\n\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n return { width: currentLayout.totalWidth, height: currentLayout.totalHeight };\n };\n\n handleCardSelection({\n item,\n itemId,\n selectedItemId: selectedId,\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer: spacerRef.current,\n preSelectionState,\n startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n viewMode,\n zoomLevel,\n totalHeight: targetTotalHeight,\n });\n }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions, scrollPosition]);\n\n const closeDetail = useCallback(() => {\n const container = containerRef.current;\n if (!container || !selectedItem) {\n setSelectedItem(null);\n return;\n }\n\n // Try to find the index of the selected item in the data array\n // This is more reliable than resolveId for layout lookup\n const index = data.indexOf(selectedItem);\n let itemId: string | number = index !== -1 ? index : resolveId(selectedItem, 0);\n\n // Ensure itemId matches layout keys type (number vs string)\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) {\n itemId = numId;\n }\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) {\n itemId = strId;\n }\n }\n\n // Get card position from layout\n const position = layout.positions.get(itemId);\n const cardPosition = position ? {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n } : null;\n\n if (!preSelectionState) {\n setSelectedItem(null);\n return;\n }\n\n // Collection mode: just scroll back\n if (viewMode === 'collection') {\n setSelectedItem(null);\n smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);\n setPreSelectionState(null);\n return;\n }\n\n // Grouped mode: animate zoom out if zoom changed\n const zoomChanged = Math.abs(preSelectionState.zoom - zoomLevel) > 0.001;\n\n if (!zoomChanged || !cardPosition) {\n setSelectedItem(null);\n smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);\n setPreSelectionState(null);\n return;\n }\n\n // Calculate target position for animation (zooming out)\n let targetCardPosition: { x: number; y: number; width: number; height: number } | null = null;\n let getCardPositionAtZoom: ((zoom: number) => { x: number; y: number; width: number; height: number } | null) | undefined = undefined;\n\n if (viewMode === 'grouped') {\n const targetZoom = preSelectionState.zoom;\n\n const targetContainerWidth = containerDimensions.width / targetZoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const targetContainerHeight = containerDimensions.height;\n\n const targetLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: targetContainerWidth,\n containerHeight: targetContainerHeight,\n });\n\n const targetPos = targetLayout.positions.get(itemId);\n if (targetPos) {\n targetCardPosition = {\n x: targetPos.x,\n y: targetPos.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n }\n\n // Provide callback for accurate position during animation\n getCardPositionAtZoom = (zoom: number) => {\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n const pos = currentLayout.positions.get(itemId);\n return pos ? { x: pos.x, y: pos.y, width: BASE_CARD_WIDTH, height: BASE_CARD_HEIGHT } : null;\n };\n }\n\n setIsZooming(true);\n\n animateZoomAndScroll({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n startZoom: zoomLevel,\n targetZoom: preSelectionState.zoom,\n targetScrollLeft: preSelectionState.scrollLeft,\n targetScrollTop: preSelectionState.scrollTop,\n onUpdate: setZoomLevel,\n onComplete: () => {\n setIsZooming(false);\n setSelectedItem(null);\n setPreSelectionState(null);\n },\n });\n }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions]);\n\n // Use base card dimensions - zoom is applied as transform in canvas\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n\n // Calculate filter options\n const filterOptions = useFilterOptions(data, filters, filterState, rangeFilterState);\n\n const hasFilters = Boolean(filters && filters.length > 0);\n const activeFilterCount = Object.values(filterState).reduce((sum: number, vals) => sum + (vals as Set<string>).size, 0) +\n Object.values(rangeFilterState).filter(r => r !== null).length;\n\n const viewerClassName = [\n 'pivot-viewer',\n className,\n hasFilters ? (filtersOpen ? 'filters-open' : 'filters-closed') : 'no-filters',\n viewMode === 'grouped' ? 'bucket-mode' : 'collection-mode',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={viewerClassName}>\n <FilterPanelContainer\n isOpen={filtersOpen && hasFilters}\n search={search}\n filterState={filterState}\n rangeFilterState={rangeFilterState}\n expandedFilterKey={expandedFilterKey}\n filterOptions={filterOptions}\n anchorRef={filterButtonRef}\n onClose={() => setFiltersOpen(false)}\n onSearchChange={setSearch}\n onFilterToggle={handleToggleFilter}\n onFilterClear={handleClearFilter}\n onRangeChange={handleRangeChange}\n onExpandedFilterChange={setExpandedFilterKey}\n />\n\n <main className=\"pv-main\">\n <ToolbarContainer\n hasFilters={hasFilters}\n filtersOpen={filtersOpen}\n filteredCount={visibleIds.length}\n viewMode={viewMode}\n zoomLevel={zoomLevel}\n activeDimensionKey={activeDimensionKey}\n dimensions={dimensions}\n activeFilterCount={activeFilterCount}\n onFiltersToggle={() => setFiltersOpen((prev) => !prev)}\n onViewModeChange={setViewMode}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomSlider={handleZoomSlider}\n onDimensionChange={setActiveDimensionKey}\n filterButtonRef={filterButtonRef}\n />\n\n <PivotViewerMain\n data={data}\n ready={ready}\n isLoading={isLoading}\n visibleIds={visibleIds}\n grouping={grouping}\n layout={layout}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n scrollPosition={scrollPosition}\n containerDimensions={containerDimensions}\n selectedItem={selectedItem}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n viewMode={viewMode}\n cardRenderer={cardRenderer}\n resolveId={resolveId}\n emptyContent={emptyContent}\n dimensionFilter={dimensionFilter}\n onCardClick={handleCardClick}\n onPanStart={handlePanStart as (e: React.MouseEvent) => void}\n onPanMove={handlePanMove as (e: React.MouseEvent) => void}\n onPanEnd={handlePanEnd}\n onGroupHover={setHoveredGroupIndex}\n onAxisLabelClick={handleAxisLabelClick}\n onCloseDetail={closeDetail}\n containerRef={containerRef}\n axisLabelsRef={axisLabelsRef}\n spacerRef={spacerRef}\n />\n </main>\n </div>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PivotViewer.js","sources":["../../../PivotViewer/PivotViewer.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 { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { PivotViewerProps } from './types';\nimport type { FilterSpec, GroupSpec, FieldValue, GroupingResult, ItemId } from './engine/types';\nimport { usePivotEngine } from './hooks/usePivotEngine';\nimport { computeLayout } from './engine/layout';\nimport { useFilterState } from './hooks/useFilterState';\nimport { useDimensionState } from './hooks/useDimensionState';\nimport { useZoomState } from './hooks/useZoomState';\nimport { handleCardSelection } from './utils/selection';\nimport { animateZoomAndScroll, smoothScrollTo } from './utils/animations';\nimport {\n BASE_CARD_WIDTH,\n BASE_CARD_HEIGHT,\n CARDS_PER_COLUMN,\n GROUP_SPACING,\n} from './constants';\nimport { ZOOM_MAX, MIN_ZOOM_ON_SELECT, ZOOM_MULTIPLIER, DETAIL_PANEL_WIDTH } from './utils/constants';\nimport { calculateCenterScrollPosition } from './utils/animations';\nimport './PivotViewer.css';\nimport { PivotViewerMain } from './components/PivotViewerMain';\nimport { FilterPanelContainer } from './components/FilterPanelContainer';\nimport { ToolbarContainer } from './components/ToolbarContainer';\nimport { usePanning, useWheelZoom, useFilterOptions } from './hooks';\nimport { useContainerDimensions } from './hooks/useContainerDimensions';\nimport type { ViewMode } from './components/Toolbar';\n\nexport function PivotViewer<TItem extends object>({\n data,\n dimensions,\n filters,\n defaultDimensionKey,\n cardRenderer,\n getItemId,\n searchFields,\n className,\n emptyContent,\n isLoading = false,\n}: PivotViewerProps<TItem>) {\n // Refs\n const containerRef = useRef<HTMLDivElement>(null!);\n const filterButtonRef = useRef<HTMLButtonElement>(null!);\n const axisLabelsRef = useRef<HTMLDivElement>(null!);\n const spacerRef = useRef<HTMLDivElement>(null!);\n\n // State\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('collection');\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const [selectedItem, setSelectedItem] = useState<TItem | null>(null);\n const [isZooming, setIsZooming] = useState(false);\n const [visibleIds, setVisibleIds] = useState<Uint32Array>(new Uint32Array(0));\n const [grouping, setGrouping] = useState<GroupingResult>({ groups: [] });\n const [hoveredGroupIndex, setHoveredGroupIndex] = useState<number | null>(null);\n const [preSelectionState, setPreSelectionState] = useState<{ zoom: number; scrollLeft: number; scrollTop: number } | null>(null);\n const [, setAnimationMode] = useState<'layout' | 'filter'>('layout');\n const [scrollPosition, setScrollPosition] = useState({ x: 0, y: 0 });\n\n // Filter hooks\n const {\n filterState,\n rangeFilterState,\n expandedFilterKey,\n setExpandedFilterKey,\n handleToggleFilter,\n handleClearFilter,\n handleRangeChange,\n } = useFilterState(filters);\n\n // Dimension hooks\n const {\n activeDimensionKey,\n setActiveDimensionKey,\n activeDimension,\n dimensionFilter,\n handleAxisLabelClick,\n } = useDimensionState(dimensions, defaultDimensionKey);\n\n // Track what type of change triggered the update (for animation mode)\n const prevFilterStateRef = useRef(filterState);\n const prevRangeFilterStateRef = useRef(rangeFilterState);\n const prevSearchRef = useRef(search);\n const prevDimensionRef = useRef(activeDimensionKey);\n const prevViewModeRef = useRef(viewMode);\n const isFirstRenderRef = useRef(true);\n\n // Zoom and pan hooks\n const {\n zoomLevel,\n setZoomLevel,\n handleZoomIn,\n handleZoomOut,\n handleZoomSlider,\n } = useZoomState(1);\n\n const {\n isPanning,\n handlePanStart,\n handlePanMove,\n handlePanEnd,\n } = usePanning(containerRef, undefined, setScrollPosition);\n\n useWheelZoom(containerRef, zoomLevel, setZoomLevel);\n\n // Track container dimensions for responsive layout\n const containerDimensions = useContainerDimensions(containerRef, isLoading);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: container.scrollLeft,\n y: container.scrollTop,\n });\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, []);\n\n // Zoom reset removed to persist zoom level across view changes\n\n\n // Track what type of change triggered the update for animation mode\n useEffect(() => {\n // Skip the first render\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n\n const filterChanged = prevFilterStateRef.current !== filterState;\n const rangeChanged = prevRangeFilterStateRef.current !== rangeFilterState;\n const searchChanged = prevSearchRef.current !== search;\n const dimensionChanged = prevDimensionRef.current !== activeDimensionKey;\n const viewModeChanged = prevViewModeRef.current !== viewMode;\n\n // If filters or search changed, use filter animation (fade/scale)\n // If dimension or view mode changed, use layout animation (fly)\n if (filterChanged || rangeChanged || searchChanged) {\n setAnimationMode('filter');\n } else if (dimensionChanged || viewModeChanged) {\n setAnimationMode('layout');\n }\n\n prevFilterStateRef.current = filterState;\n prevRangeFilterStateRef.current = rangeFilterState;\n prevSearchRef.current = search;\n prevDimensionRef.current = activeDimensionKey;\n prevViewModeRef.current = viewMode;\n }, [filterState, rangeFilterState, search, activeDimensionKey, viewMode]);\n\n // Sync axis labels scroll with container scroll\n useEffect(() => {\n const container = containerRef.current;\n const axisLabels = axisLabelsRef.current;\n\n if (!container || !axisLabels || viewMode !== 'grouped') return;\n\n const handleScroll = () => {\n axisLabels.scrollLeft = container.scrollLeft;\n };\n\n // Sync immediately\n handleScroll();\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [viewMode]);\n\n // Build field extractors for the columnar store\n const fieldExtractors = useMemo(() => {\n const extractors = new Map<string, (item: TItem) => FieldValue>();\n\n for (const dim of dimensions) {\n extractors.set(dim.key, (item) => {\n const val = dim.getValue(item);\n if (val instanceof Date) return val.getTime();\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {\n return val;\n }\n return String(val);\n });\n }\n\n if (filters) {\n for (const filter of filters) {\n extractors.set(filter.key, (item) => {\n const val = filter.getValue(item);\n if (val instanceof Date) return val.getTime();\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean' || val === null) {\n return val;\n }\n return String(val);\n });\n }\n }\n\n return extractors;\n }, [dimensions, filters]);\n\n const indexFields = useMemo(() => {\n const fields = new Set<string>();\n\n for (const dim of dimensions) {\n fields.add(dim.key);\n }\n\n if (filters) {\n for (const filter of filters) {\n fields.add(filter.key);\n }\n }\n\n return Array.from(fields);\n }, [dimensions, filters]);\n\n // Initialize the Web Worker engine\n const { ready, applyFilters: engineApplyFilters, computeGrouping, sortIds } = usePivotEngine({\n data,\n fieldExtractors,\n indexFields,\n });\n\n // Build filter specs from UI state\n const currentFilters = useMemo((): FilterSpec[] => {\n const specs: FilterSpec[] = [];\n\n // Search filter\n const searchTerm = search.trim().toLowerCase();\n if (searchTerm && searchFields && searchFields.length > 0) {\n // TODO: Implement search in worker\n // For now, search will be handled client-side after worker filtering\n }\n\n // Categorical filters\n for (const [key, values] of Object.entries(filterState)) {\n const valueSet = values as Set<string>;\n if (valueSet.size > 0) {\n specs.push({\n field: key,\n type: 'categorical',\n values: valueSet,\n });\n }\n }\n\n // Range filters\n for (const [key, range] of Object.entries(rangeFilterState)) {\n if (range && (range[0] !== null || range[1] !== null)) {\n const min = range[0] ?? -Infinity;\n const max = range[1] ?? Infinity;\n specs.push({\n field: key,\n type: 'numeric',\n range: { min, max },\n });\n }\n }\n\n // Dimension filter (bucket filter)\n if (dimensionFilter && activeDimension) {\n specs.push({\n field: activeDimension.key,\n type: 'categorical',\n values: new Set([dimensionFilter]),\n });\n }\n\n return specs;\n }, [filterState, rangeFilterState, search, searchFields, dimensionFilter, activeDimension]);\n\n const currentGroupBy = useMemo((): GroupSpec => {\n return {\n field: activeDimensionKey || dimensions[0]?.key || '',\n buckets: 10,\n };\n }, [activeDimensionKey, dimensions]);\n\n // Apply filters\n useEffect(() => {\n if (!ready) return;\n\n engineApplyFilters(currentFilters).then((result) => {\n setVisibleIds(result.visibleIds);\n });\n }, [ready, currentFilters, engineApplyFilters]);\n\n // Compute grouping\n const lastGroupingRequest = useRef<{ viewMode: ViewMode; groupBy: GroupSpec; visibleIds: Uint32Array } | null>(null);\n \n useEffect(() => {\n if (!ready || visibleIds.length === 0) {\n setGrouping({ groups: [] });\n lastGroupingRequest.current = null;\n return;\n }\n\n if (viewMode === 'collection') {\n // In collection mode, create a single group with all items\n // Sort items if activeDimensionKey is set\n if (activeDimensionKey) {\n sortIds(visibleIds, activeDimensionKey).then((sortedIds) => {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: sortedIds,\n count: sortedIds.length\n }]\n });\n });\n } else {\n setGrouping({\n groups: [{\n key: 'all',\n label: 'All Items',\n value: 'all',\n ids: visibleIds,\n count: visibleIds.length\n }]\n });\n }\n lastGroupingRequest.current = null;\n return;\n }\n\n // Check if this is the same request as last time to prevent duplicate computations\n const lastRequest = lastGroupingRequest.current;\n if (lastRequest &&\n lastRequest.viewMode === viewMode &&\n lastRequest.groupBy.field === currentGroupBy.field &&\n lastRequest.visibleIds === visibleIds) {\n console.log('[PivotViewer] Skipping duplicate grouping request');\n return;\n }\n\n lastGroupingRequest.current = { viewMode, groupBy: currentGroupBy, visibleIds };\n \n console.log('[PivotViewer] Computing grouping for', visibleIds.length, 'items');\n computeGrouping(visibleIds, currentGroupBy).then((result) => {\n console.log('[PivotViewer] Grouping result received:', result.groups.length, 'groups');\n setGrouping(result);\n });\n }, [ready, visibleIds, currentGroupBy, viewMode, computeGrouping, sortIds, activeDimensionKey]);\n\n // Compute layout\n const layout = useMemo(() => {\n // Calculate layout at base dimensions (zoom is applied as transform)\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n const containerWidth = containerDimensions.width / zoomLevel;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const containerHeight = viewMode === 'collection'\n ? containerDimensions.height / zoomLevel\n : containerDimensions.height;\n\n const result = computeLayout(grouping, {\n viewMode,\n cardWidth,\n cardHeight,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth,\n containerHeight,\n });\n\n return result;\n }, [grouping, viewMode, zoomLevel, containerDimensions.width, containerDimensions.height]);\n\n const resolveId = useCallback((item: TItem, index: number): ItemId => {\n if (getItemId) {\n const id = getItemId(item, index);\n return typeof id === 'number' ? id : index;\n }\n const id = (item as Record<string, unknown>)['id'];\n return typeof id === 'number' ? id : index;\n }, [getItemId]);\n\n // Scroll positioning when switching view modes or grouping changes\n const lastProcessedViewMode = useRef(viewMode);\n const lastProcessedGrouping = useRef(grouping);\n\n useEffect(() => {\n const viewModeChanged = lastProcessedViewMode.current !== viewMode;\n const groupingChanged = lastProcessedGrouping.current !== grouping;\n\n if (!viewModeChanged && !groupingChanged) return;\n\n lastProcessedViewMode.current = viewMode;\n lastProcessedGrouping.current = grouping;\n\n const container = containerRef.current;\n if (!container) return;\n\n // If we have a selected item, we want to keep it centered in the new layout\n if (selectedItem) {\n // Resolve ID\n let itemId = resolveId(selectedItem, 0);\n\n // Ensure ID type matches layout\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) itemId = numId;\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) itemId = strId;\n }\n\n const position = layout.positions.get(itemId);\n if (position) {\n const cardPosition = {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n\n const detailWidth = viewMode === 'collection' ? 0 : DETAIL_PANEL_WIDTH;\n\n const { scrollLeft, scrollTop } = calculateCenterScrollPosition(\n container,\n cardPosition,\n zoomLevel,\n detailWidth,\n layout.totalHeight\n );\n\n container.scrollTo({ left: scrollLeft, top: scrollTop });\n\n // Clear pre-selection state as we've moved to a new context\n setPreSelectionState(null);\n }\n } else if (viewMode === 'grouped') {\n // Default behavior for grouped view: scroll to bottom\n // Use a small timeout to ensure the spacer has been resized\n setTimeout(() => {\n container.scrollTop = container.scrollHeight;\n // Sync scroll position state immediately to avoid stale values on first click\n setScrollPosition({ x: container.scrollLeft, y: container.scrollTop });\n }, 0);\n }\n }, [viewMode, grouping, layout, selectedItem, resolveId, zoomLevel]);\n\n const handleCardClick = useCallback((item: TItem, e: MouseEvent, id?: number | string) => {\n if (isPanning) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Use the passed ID (index) if available, otherwise fallback to resolveId\n // Note: resolveId might be unreliable for looking up layout positions if IDs are strings\n let itemId = (id !== undefined && id !== null) ? id : resolveId(item, 0);\n\n // Ensure itemId matches layout keys type (number vs string)\n // If layout has number keys and itemId is string, try converting\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) {\n itemId = numId;\n }\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) {\n itemId = strId;\n }\n }\n\n const selectedId = selectedItem ? (data.indexOf(selectedItem) !== -1 ? data.indexOf(selectedItem) : resolveId(selectedItem, 0)) : null;\n\n // Get card position from layout\n const position = layout.positions.get(itemId);\n\n const cardPosition = position ? {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n } : null;\n\n // Calculate target position for animation\n let targetCardPosition: { x: number; y: number; width: number; height: number } | null = null;\n let getCardPositionAtZoom: ((zoom: number) => { x: number; y: number; width: number; height: number } | null) | undefined = undefined;\n let targetTotalHeight = layout.totalHeight;\n\n if (viewMode === 'grouped' && cardPosition) {\n // Calculate target zoom (logic duplicated from zoomAndCenterCard)\n const targetZoom = Math.min(ZOOM_MAX, Math.max(MIN_ZOOM_ON_SELECT, zoomLevel * ZOOM_MULTIPLIER));\n\n // Calculate target layout\n const targetContainerWidth = containerDimensions.width / targetZoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const targetContainerHeight = containerDimensions.height;\n\n const targetLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: targetContainerWidth,\n containerHeight: targetContainerHeight,\n });\n\n targetTotalHeight = targetLayout.totalHeight;\n\n const targetPos = targetLayout.positions.get(itemId);\n if (targetPos) {\n targetCardPosition = {\n x: targetPos.x,\n y: targetPos.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n }\n\n // Provide callback for accurate position during animation\n getCardPositionAtZoom = (zoom: number) => {\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n const pos = currentLayout.positions.get(itemId);\n return pos ? { x: pos.x, y: pos.y, width: BASE_CARD_WIDTH, height: BASE_CARD_HEIGHT } : null;\n };\n }\n\n // Callback to get layout size at a specific zoom level (for spacer updates)\n const getLayoutSizeAtZoom = (zoom: number) => {\n if (viewMode === 'collection') {\n return { width: layout.totalWidth, height: layout.totalHeight };\n }\n\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n return { width: currentLayout.totalWidth, height: currentLayout.totalHeight };\n };\n\n handleCardSelection({\n item,\n itemId,\n selectedItemId: selectedId,\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n getLayoutSizeAtZoom,\n spacer: spacerRef.current,\n preSelectionState,\n startScrollPosition: { x: scrollPosition.x, y: scrollPosition.y },\n setZoomLevel,\n setIsZooming,\n setSelectedItem,\n setPreSelectionState,\n viewMode,\n zoomLevel,\n totalHeight: targetTotalHeight,\n });\n }, [isPanning, selectedItem, zoomLevel, preSelectionState, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions, scrollPosition]);\n\n const closeDetail = useCallback(() => {\n const container = containerRef.current;\n if (!container || !selectedItem) {\n setSelectedItem(null);\n return;\n }\n\n // Try to find the index of the selected item in the data array\n // This is more reliable than resolveId for layout lookup\n const index = data.indexOf(selectedItem);\n let itemId: string | number = index !== -1 ? index : resolveId(selectedItem, 0);\n\n // Ensure itemId matches layout keys type (number vs string)\n if (typeof itemId === 'string' && !layout.positions.has(itemId)) {\n const numId = Number(itemId);\n if (!isNaN(numId) && layout.positions.has(numId)) {\n itemId = numId;\n }\n } else if (typeof itemId === 'number' && !layout.positions.has(itemId)) {\n const strId = String(itemId);\n if (layout.positions.has(strId)) {\n itemId = strId;\n }\n }\n\n // Get card position from layout\n const position = layout.positions.get(itemId);\n const cardPosition = position ? {\n x: position.x,\n y: position.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n } : null;\n\n if (!preSelectionState) {\n setSelectedItem(null);\n return;\n }\n\n // Collection mode: just scroll back\n if (viewMode === 'collection') {\n setSelectedItem(null);\n smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);\n setPreSelectionState(null);\n return;\n }\n\n // Grouped mode: animate zoom out if zoom changed\n const zoomChanged = Math.abs(preSelectionState.zoom - zoomLevel) > 0.001;\n\n if (!zoomChanged || !cardPosition) {\n setSelectedItem(null);\n smoothScrollTo(container, preSelectionState.scrollLeft, preSelectionState.scrollTop, true);\n setPreSelectionState(null);\n return;\n }\n\n // Calculate target position for animation (zooming out)\n let targetCardPosition: { x: number; y: number; width: number; height: number } | null = null;\n let getCardPositionAtZoom: ((zoom: number) => { x: number; y: number; width: number; height: number } | null) | undefined = undefined;\n\n if (viewMode === 'grouped') {\n const targetZoom = preSelectionState.zoom;\n\n const targetContainerWidth = containerDimensions.width / targetZoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const targetContainerHeight = containerDimensions.height;\n\n const targetLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: targetContainerWidth,\n containerHeight: targetContainerHeight,\n });\n\n const targetPos = targetLayout.positions.get(itemId);\n if (targetPos) {\n targetCardPosition = {\n x: targetPos.x,\n y: targetPos.y,\n width: BASE_CARD_WIDTH,\n height: BASE_CARD_HEIGHT\n };\n }\n\n // Provide callback for accurate position during animation\n getCardPositionAtZoom = (zoom: number) => {\n const currentContainerWidth = containerDimensions.width / zoom;\n // For grouped mode, use fixed container height to ensure stable layout during zoom\n const currentContainerHeight = containerDimensions.height;\n\n const currentLayout = computeLayout(grouping, {\n viewMode,\n cardWidth: BASE_CARD_WIDTH,\n cardHeight: BASE_CARD_HEIGHT,\n cardsPerColumn: CARDS_PER_COLUMN,\n groupSpacing: GROUP_SPACING,\n containerWidth: currentContainerWidth,\n containerHeight: currentContainerHeight,\n });\n\n const pos = currentLayout.positions.get(itemId);\n return pos ? { x: pos.x, y: pos.y, width: BASE_CARD_WIDTH, height: BASE_CARD_HEIGHT } : null;\n };\n }\n\n setIsZooming(true);\n\n animateZoomAndScroll({\n container,\n cardPosition,\n targetCardPosition,\n getCardPositionAtZoom,\n startZoom: zoomLevel,\n targetZoom: preSelectionState.zoom,\n targetScrollLeft: preSelectionState.scrollLeft,\n targetScrollTop: preSelectionState.scrollTop,\n onUpdate: setZoomLevel,\n onComplete: () => {\n setIsZooming(false);\n setSelectedItem(null);\n setPreSelectionState(null);\n },\n });\n }, [preSelectionState, selectedItem, zoomLevel, viewMode, resolveId, setZoomLevel, layout, grouping, containerDimensions]);\n\n // Use base card dimensions - zoom is applied as transform in canvas\n const cardWidth = BASE_CARD_WIDTH;\n const cardHeight = BASE_CARD_HEIGHT;\n\n // Calculate filter options\n const filterOptions = useFilterOptions(data, filters, filterState, rangeFilterState);\n\n const hasFilters = Boolean(filters && filters.length > 0);\n const activeFilterCount = Object.values(filterState).reduce((sum: number, vals) => sum + (vals as Set<string>).size, 0) +\n Object.values(rangeFilterState).filter(r => r !== null).length;\n\n const viewerClassName = [\n 'pivot-viewer',\n className,\n hasFilters ? (filtersOpen ? 'filters-open' : 'filters-closed') : 'no-filters',\n viewMode === 'grouped' ? 'bucket-mode' : 'collection-mode',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={viewerClassName}>\n <FilterPanelContainer\n isOpen={filtersOpen && hasFilters}\n search={search}\n filterState={filterState}\n rangeFilterState={rangeFilterState}\n expandedFilterKey={expandedFilterKey}\n filterOptions={filterOptions}\n anchorRef={filterButtonRef}\n onClose={() => setFiltersOpen(false)}\n onSearchChange={setSearch}\n onFilterToggle={handleToggleFilter}\n onFilterClear={handleClearFilter}\n onRangeChange={handleRangeChange}\n onExpandedFilterChange={setExpandedFilterKey}\n />\n\n <main className=\"pv-main\">\n <ToolbarContainer\n hasFilters={hasFilters}\n filtersOpen={filtersOpen}\n filteredCount={visibleIds.length}\n viewMode={viewMode}\n zoomLevel={zoomLevel}\n activeDimensionKey={activeDimensionKey}\n dimensions={dimensions}\n activeFilterCount={activeFilterCount}\n onFiltersToggle={() => setFiltersOpen((prev) => !prev)}\n onViewModeChange={setViewMode}\n onZoomIn={handleZoomIn}\n onZoomOut={handleZoomOut}\n onZoomSlider={handleZoomSlider}\n onDimensionChange={setActiveDimensionKey}\n filterButtonRef={filterButtonRef}\n />\n\n <PivotViewerMain\n data={data}\n ready={ready}\n isLoading={isLoading}\n visibleIds={visibleIds}\n grouping={grouping}\n layout={layout}\n cardWidth={cardWidth}\n cardHeight={cardHeight}\n zoomLevel={zoomLevel}\n scrollPosition={scrollPosition}\n containerDimensions={containerDimensions}\n selectedItem={selectedItem}\n hoveredGroupIndex={hoveredGroupIndex}\n isZooming={isZooming}\n viewMode={viewMode}\n cardRenderer={cardRenderer}\n resolveId={resolveId}\n emptyContent={emptyContent}\n dimensionFilter={dimensionFilter}\n onCardClick={handleCardClick}\n onPanStart={handlePanStart as (e: React.MouseEvent) => void}\n onPanMove={handlePanMove as (e: React.MouseEvent) => void}\n onPanEnd={handlePanEnd}\n onGroupHover={setHoveredGroupIndex}\n onAxisLabelClick={handleAxisLabelClick}\n onCloseDetail={closeDetail}\n containerRef={containerRef}\n axisLabelsRef={axisLabelsRef}\n spacerRef={spacerRef}\n />\n </main>\n </div>\n );\n}\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6BM,SAAU,WAAW,CAAuB,EAC9C,IAAI,EACJ,UAAU,EACV,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAS,GAAG,KAAK,GACK,EAAA;AAEtB,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAK,CAAC;AAClD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAoB,IAAK,CAAC;AACxD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAiB,IAAK,CAAC;AACnD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAiB,IAAK,CAAC;IAG/C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAW,YAAY,CAAC;IAEhE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC;IACpE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AACjD,IAAA,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAc,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;AAC7E,IAAA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAiB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;IAC/E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAiE,IAAI,CAAC;IAChI,MAAM,GAAG,gBAAgB,CAAC,GAAG,QAAQ,CAAsB,QAAQ,CAAC;AACpE,IAAA,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAGpE,MAAM,EACF,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GACpB,GAAG,cAAc,CAAC,OAAO,CAAC;AAG3B,IAAA,MAAM,EACF,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,oBAAoB,GACvB,GAAG,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,CAAC;AAGtD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAAC;AAC9C,IAAA,MAAM,uBAAuB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;AACpC,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACnD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;AACxC,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC;AAGrC,IAAA,MAAM,EACF,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,GACnB,GAAG,YAAY,CAAC,CAAC,CAAC;AAEnB,IAAA,MAAM,EACF,SAAS,EACT,cAAc,EACd,aAAa,EACb,YAAY,GACf,GAAG,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,iBAAiB,CAAC;AAE1D,IAAA,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC;IAGnD,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,YAAY,EAAE,SAAS,CAAC;IAE3E,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;QAEhB,MAAM,YAAY,GAAG,MAAK;AACtB,YAAA,iBAAiB,CAAC;gBACd,CAAC,EAAE,SAAS,CAAC,UAAU;gBACvB,CAAC,EAAE,SAAS,CAAC,SAAS;AACzB,aAAA,CAAC;AACN,QAAA,CAAC;AAED,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClD,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACtE,CAAC,EAAE,EAAE,CAAC;IAMN,SAAS,CAAC,MAAK;AAEX,QAAA,IAAI,gBAAgB,CAAC,OAAO,EAAE;AAC1B,YAAA,gBAAgB,CAAC,OAAO,GAAG,KAAK;YAChC;QACJ;AAEA,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,KAAK,WAAW;AAChE,QAAA,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,KAAK,gBAAgB;AACzE,QAAA,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,KAAK,MAAM;AACtD,QAAA,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,KAAK,kBAAkB;AACxE,QAAA,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,KAAK,QAAQ;AAI5D,QAAA,IAAI,aAAa,IAAI,YAAY,IAAI,aAAa,EAAE;YAChD,gBAAgB,CAAC,QAAQ,CAAC;QAC9B;AAAO,aAAA,IAAI,gBAAgB,IAAI,eAAe,EAAE;YAC5C,gBAAgB,CAAC,QAAQ,CAAC;QAC9B;AAEA,QAAA,kBAAkB,CAAC,OAAO,GAAG,WAAW;AACxC,QAAA,uBAAuB,CAAC,OAAO,GAAG,gBAAgB;AAClD,QAAA,aAAa,CAAC,OAAO,GAAG,MAAM;AAC9B,QAAA,gBAAgB,CAAC,OAAO,GAAG,kBAAkB;AAC7C,QAAA,eAAe,CAAC,OAAO,GAAG,QAAQ;AACtC,IAAA,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAGzE,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO;QAExC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,QAAQ,KAAK,SAAS;YAAE;QAEzD,MAAM,YAAY,GAAG,MAAK;AACtB,YAAA,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU;AAChD,QAAA,CAAC;AAGD,QAAA,YAAY,EAAE;AAEd,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;QAClD,OAAO,MAAM,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;AACtE,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAGd,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,MAAK;AACjC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuC;AAEjE,QAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;YAC1B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,KAAI;gBAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC9B,IAAI,GAAG,YAAY,IAAI;AAAE,oBAAA,OAAO,GAAG,CAAC,OAAO,EAAE;AAC7C,gBAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE;AAChG,oBAAA,OAAO,GAAG;gBACd;AACA,gBAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AACtB,YAAA,CAAC,CAAC;QACN;QAEA,IAAI,OAAO,EAAE;AACT,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC1B,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,KAAI;oBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACjC,IAAI,GAAG,YAAY,IAAI;AAAE,wBAAA,OAAO,GAAG,CAAC,OAAO,EAAE;AAC7C,oBAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE;AAChG,wBAAA,OAAO,GAAG;oBACd;AACA,oBAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AACtB,gBAAA,CAAC,CAAC;YACN;QACJ;AAEA,QAAA,OAAO,UAAU;AACrB,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAEzB,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAK;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU;AAEhC,QAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;AAC1B,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACvB;QAEA,IAAI,OAAO,EAAE;AACT,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC1B,gBAAA,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;YAC1B;QACJ;AAEA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7B,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAGzB,IAAA,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACzF,IAAI;QACJ,eAAe;QACf,WAAW;AACd,KAAA,CAAC;AAGF,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,MAAmB;QAC9C,MAAM,KAAK,GAAiB,EAAE;QAG9B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QAC9C,IAAI,UAAU,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAM3D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;YACrD,MAAM,QAAQ,GAAG,MAAqB;AACtC,YAAA,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;gBACnB,KAAK,CAAC,IAAI,CAAC;AACP,oBAAA,KAAK,EAAE,GAAG;AACV,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,MAAM,EAAE,QAAQ;AACnB,iBAAA,CAAC;YACN;QACJ;AAGA,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;AACzD,YAAA,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;gBACnD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACjC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ;gBAChC,KAAK,CAAC,IAAI,CAAC;AACP,oBAAA,KAAK,EAAE,GAAG;AACV,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;AACtB,iBAAA,CAAC;YACN;QACJ;AAGA,QAAA,IAAI,eAAe,IAAI,eAAe,EAAE;YACpC,KAAK,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,eAAe,CAAC,GAAG;AAC1B,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;AACrC,aAAA,CAAC;QACN;AAEA,QAAA,OAAO,KAAK;AAChB,IAAA,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;AAE3F,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,MAAgB;QAC3C,OAAO;YACH,KAAK,EAAE,kBAAkB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE;AACrD,YAAA,OAAO,EAAE,EAAE;SACd;AACL,IAAA,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAGpC,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,kBAAkB,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AAC/C,YAAA,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;AACpC,QAAA,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAG/C,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAA6E,IAAI,CAAC;IAEpH,SAAS,CAAC,MAAK;QACX,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,YAAA,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC3B,YAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI;YAClC;QACJ;AAEA,QAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;YAG3B,IAAI,kBAAkB,EAAE;gBACpB,OAAO,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;AACvD,oBAAA,WAAW,CAAC;AACR,wBAAA,MAAM,EAAE,CAAC;AACL,gCAAA,GAAG,EAAE,KAAK;AACV,gCAAA,KAAK,EAAE,WAAW;AAClB,gCAAA,KAAK,EAAE,KAAK;AACZ,gCAAA,GAAG,EAAE,SAAS;gCACd,KAAK,EAAE,SAAS,CAAC;6BACpB;AACJ,qBAAA,CAAC;AACN,gBAAA,CAAC,CAAC;YACN;iBAAO;AACH,gBAAA,WAAW,CAAC;AACR,oBAAA,MAAM,EAAE,CAAC;AACL,4BAAA,GAAG,EAAE,KAAK;AACV,4BAAA,KAAK,EAAE,WAAW;AAClB,4BAAA,KAAK,EAAE,KAAK;AACZ,4BAAA,GAAG,EAAE,UAAU;4BACf,KAAK,EAAE,UAAU,CAAC;yBACrB;AACJ,iBAAA,CAAC;YACN;AACA,YAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI;YAClC;QACJ;AAGA,QAAA,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO;AAC/C,QAAA,IAAI,WAAW;YACX,WAAW,CAAC,QAAQ,KAAK,QAAQ;AACjC,YAAA,WAAW,CAAC,OAAO,CAAC,KAAK,KAAK,cAAc,CAAC,KAAK;AAClD,YAAA,WAAW,CAAC,UAAU,KAAK,UAAU,EAAE;AACvC,YAAA,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC;YAChE;QACJ;AAEA,QAAA,mBAAmB,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE;QAE/E,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;QAC/E,eAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AACxD,YAAA,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtF,WAAW,CAAC,MAAM,CAAC;AACvB,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAG/F,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAK;QAExB,MAAM,SAAS,GAAG,eAAe;QACjC,MAAM,UAAU,GAAG,gBAAgB;AACnC,QAAA,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,GAAG,SAAS;AAE5D,QAAA,MAAM,eAAe,GAAG,QAAQ,KAAK;AACjC,cAAE,mBAAmB,CAAC,MAAM,GAAG;AAC/B,cAAE,mBAAmB,CAAC,MAAM;AAEhC,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE;YACnC,QAAQ;YACR,SAAS;YACT,UAAU;AACV,YAAA,cAAc,EAAE,gBAAgB;AAChC,YAAA,YAAY,EAAE,aAAa;YAC3B,cAAc;YACd,eAAe;AAClB,SAAA,CAAC;AAEF,QAAA,OAAO,MAAM;AACjB,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE1F,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,IAAW,EAAE,KAAa,KAAY;QACjE,IAAI,SAAS,EAAE;YACX,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;AACjC,YAAA,OAAO,OAAO,EAAE,KAAK,QAAQ,GAAG,EAAE,GAAG,KAAK;QAC9C;AACA,QAAA,MAAM,EAAE,GAAI,IAAgC,CAAC,IAAI,CAAC;AAClD,QAAA,OAAO,OAAO,EAAE,KAAK,QAAQ,GAAG,EAAE,GAAG,KAAK;AAC9C,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAGf,IAAA,MAAM,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC9C,IAAA,MAAM,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE9C,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,KAAK,QAAQ;AAClE,QAAA,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,KAAK,QAAQ;AAElE,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe;YAAE;AAE1C,QAAA,qBAAqB,CAAC,OAAO,GAAG,QAAQ;AACxC,QAAA,qBAAqB,CAAC,OAAO,GAAG,QAAQ;AAExC,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;QAGhB,IAAI,YAAY,EAAE;YAEd,IAAI,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;AAGvC,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC7D,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAC5B,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,MAAM,GAAG,KAAK;YACpE;AAAO,iBAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AACpE,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAC5B,gBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,MAAM,GAAG,KAAK;YACnD;YAEA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7C,IAAI,QAAQ,EAAE;AACV,gBAAA,MAAM,YAAY,GAAG;oBACjB,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACb,CAAC,EAAE,QAAQ,CAAC,CAAC;AACb,oBAAA,KAAK,EAAE,eAAe;AACtB,oBAAA,MAAM,EAAE;iBACX;AAED,gBAAA,MAAM,WAAW,GAAG,QAAQ,KAAK,YAAY,GAAG,CAAC,GAAG,kBAAkB;gBAEtE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,6BAA6B,CAC3D,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,MAAM,CAAC,WAAW,CACrB;AAED,gBAAA,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBAGxD,oBAAoB,CAAC,IAAI,CAAC;YAC9B;QACJ;AAAO,aAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;YAG/B,UAAU,CAAC,MAAK;AACZ,gBAAA,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY;AAE5C,gBAAA,iBAAiB,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;YAC1E,CAAC,EAAE,CAAC,CAAC;QACT;AACJ,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,IAAW,EAAE,CAAa,EAAE,EAAoB,KAAI;AACrF,QAAA,IAAI,SAAS;YAAE;AAEf,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS;YAAE;QAIhB,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AAIxE,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC7D,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAC5B,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC9C,MAAM,GAAG,KAAK;YAClB;QACJ;AAAO,aAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AACpE,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5B,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC7B,MAAM,GAAG,KAAK;YAClB;QACJ;AAEA,QAAA,MAAM,UAAU,GAAG,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,IAAI;QAGtI,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AAE7C,QAAA,MAAM,YAAY,GAAG,QAAQ,GAAG;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,CAAC,EAAE,QAAQ,CAAC,CAAC;AACb,YAAA,KAAK,EAAE,eAAe;AACtB,YAAA,MAAM,EAAE;SACX,GAAG,IAAI;QAGR,IAAI,kBAAkB,GAAmE,IAAI;QAC7F,IAAI,qBAAqB,GAAmG,SAAS;AACrI,QAAA,IAAI,iBAAiB,GAAG,MAAM,CAAC,WAAW;AAE1C,QAAA,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,EAAE;AAExC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,SAAS,GAAG,eAAe,CAAC,CAAC;AAGhG,YAAA,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,KAAK,GAAG,UAAU;AAEnE,YAAA,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,MAAM;AAExD,YAAA,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE;gBACzC,QAAQ;AACR,gBAAA,SAAS,EAAE,eAAe;AAC1B,gBAAA,UAAU,EAAE,gBAAgB;AAC5B,gBAAA,cAAc,EAAE,gBAAgB;AAChC,gBAAA,YAAY,EAAE,aAAa;AAC3B,gBAAA,cAAc,EAAE,oBAAoB;AACpC,gBAAA,eAAe,EAAE,qBAAqB;AACzC,aAAA,CAAC;AAEF,YAAA,iBAAiB,GAAG,YAAY,CAAC,WAAW;YAE5C,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YACpD,IAAI,SAAS,EAAE;AACX,gBAAA,kBAAkB,GAAG;oBACjB,CAAC,EAAE,SAAS,CAAC,CAAC;oBACd,CAAC,EAAE,SAAS,CAAC,CAAC;AACd,oBAAA,KAAK,EAAE,eAAe;AACtB,oBAAA,MAAM,EAAE;iBACX;YACL;AAGA,YAAA,qBAAqB,GAAG,CAAC,IAAY,KAAI;AACrC,gBAAA,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,KAAK,GAAG,IAAI;AAE9D,gBAAA,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,MAAM;AAEzD,gBAAA,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE;oBAC1C,QAAQ;AACR,oBAAA,SAAS,EAAE,eAAe;AAC1B,oBAAA,UAAU,EAAE,gBAAgB;AAC5B,oBAAA,cAAc,EAAE,gBAAgB;AAChC,oBAAA,YAAY,EAAE,aAAa;AAC3B,oBAAA,cAAc,EAAE,qBAAqB;AACrC,oBAAA,eAAe,EAAE,sBAAsB;AAC1C,iBAAA,CAAC;gBAEF,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/C,gBAAA,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI;AAChG,YAAA,CAAC;QACL;AAGA,QAAA,MAAM,mBAAmB,GAAG,CAAC,IAAY,KAAI;AACzC,YAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;AAC3B,gBAAA,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;YACnE;AAEA,YAAA,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,KAAK,GAAG,IAAI;AAE9D,YAAA,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,MAAM;AAEzD,YAAA,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE;gBAC1C,QAAQ;AACR,gBAAA,SAAS,EAAE,eAAe;AAC1B,gBAAA,UAAU,EAAE,gBAAgB;AAC5B,gBAAA,cAAc,EAAE,gBAAgB;AAChC,gBAAA,YAAY,EAAE,aAAa;AAC3B,gBAAA,cAAc,EAAE,qBAAqB;AACrC,gBAAA,eAAe,EAAE,sBAAsB;AAC1C,aAAA,CAAC;AAEF,YAAA,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,WAAW,EAAE;AACjF,QAAA,CAAC;AAED,QAAA,mBAAmB,CAAC;YAChB,IAAI;YACJ,MAAM;AACN,YAAA,cAAc,EAAE,UAAU;YAC1B,SAAS;YACT,YAAY;YACZ,kBAAkB;YAClB,qBAAqB;YACrB,mBAAmB;YACnB,MAAM,EAAE,SAAS,CAAC,OAAO;YACzB,iBAAiB;AACjB,YAAA,mBAAmB,EAAE,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE;YACjE,YAAY;YACZ,YAAY;YACZ,eAAe;YACf,oBAAoB;YACpB,QAAQ;YACR,SAAS;AACT,YAAA,WAAW,EAAE,iBAAiB;AACjC,SAAA,CAAC;IACN,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAErJ,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAK;AACjC,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO;AACtC,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE;YAC7B,eAAe,CAAC,IAAI,CAAC;YACrB;QACJ;QAIA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AACxC,QAAA,IAAI,MAAM,GAAoB,KAAK,KAAK,EAAE,GAAG,KAAK,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;AAG/E,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC7D,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AAC5B,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC9C,MAAM,GAAG,KAAK;YAClB;QACJ;AAAO,aAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AACpE,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5B,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC7B,MAAM,GAAG,KAAK;YAClB;QACJ;QAGA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AAC7C,QAAA,MAAM,YAAY,GAAG,QAAQ,GAAG;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC;YACb,CAAC,EAAE,QAAQ,CAAC,CAAC;AACb,YAAA,KAAK,EAAE,eAAe;AACtB,YAAA,MAAM,EAAE;SACX,GAAG,IAAI;QAER,IAAI,CAAC,iBAAiB,EAAE;YACpB,eAAe,CAAC,IAAI,CAAC;YACrB;QACJ;AAGA,QAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;YAC3B,eAAe,CAAC,IAAI,CAAC;AACrB,YAAA,cAAc,CAAC,SAAS,EAAE,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC;YAC1F,oBAAoB,CAAC,IAAI,CAAC;YAC1B;QACJ;AAGA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,KAAK;AAExE,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE;YAC/B,eAAe,CAAC,IAAI,CAAC;AACrB,YAAA,cAAc,CAAC,SAAS,EAAE,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC;YAC1F,oBAAoB,CAAC,IAAI,CAAC;YAC1B;QACJ;QAGA,IAAI,kBAAkB,GAAmE,IAAI;QAC7F,IAAI,qBAAqB,GAAmG,SAAS;AAErI,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AACxB,YAAA,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI;AAEzC,YAAA,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,KAAK,GAAG,UAAU;AAEnE,YAAA,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,MAAM;AAExD,YAAA,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE;gBACzC,QAAQ;AACR,gBAAA,SAAS,EAAE,eAAe;AAC1B,gBAAA,UAAU,EAAE,gBAAgB;AAC5B,gBAAA,cAAc,EAAE,gBAAgB;AAChC,gBAAA,YAAY,EAAE,aAAa;AAC3B,gBAAA,cAAc,EAAE,oBAAoB;AACpC,gBAAA,eAAe,EAAE,qBAAqB;AACzC,aAAA,CAAC;YAEF,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YACpD,IAAI,SAAS,EAAE;AACX,gBAAA,kBAAkB,GAAG;oBACjB,CAAC,EAAE,SAAS,CAAC,CAAC;oBACd,CAAC,EAAE,SAAS,CAAC,CAAC;AACd,oBAAA,KAAK,EAAE,eAAe;AACtB,oBAAA,MAAM,EAAE;iBACX;YACL;AAGA,YAAA,qBAAqB,GAAG,CAAC,IAAY,KAAI;AACrC,gBAAA,MAAM,qBAAqB,GAAG,mBAAmB,CAAC,KAAK,GAAG,IAAI;AAE9D,gBAAA,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,MAAM;AAEzD,gBAAA,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,EAAE;oBAC1C,QAAQ;AACR,oBAAA,SAAS,EAAE,eAAe;AAC1B,oBAAA,UAAU,EAAE,gBAAgB;AAC5B,oBAAA,cAAc,EAAE,gBAAgB;AAChC,oBAAA,YAAY,EAAE,aAAa;AAC3B,oBAAA,cAAc,EAAE,qBAAqB;AACrC,oBAAA,eAAe,EAAE,sBAAsB;AAC1C,iBAAA,CAAC;gBAEF,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/C,gBAAA,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI;AAChG,YAAA,CAAC;QACL;QAEA,YAAY,CAAC,IAAI,CAAC;AAElB,QAAA,oBAAoB,CAAC;YACjB,SAAS;YACT,YAAY;YACZ,kBAAkB;YAClB,qBAAqB;AACrB,YAAA,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,iBAAiB,CAAC,IAAI;YAClC,gBAAgB,EAAE,iBAAiB,CAAC,UAAU;YAC9C,eAAe,EAAE,iBAAiB,CAAC,SAAS;AAC5C,YAAA,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,MAAK;gBACb,YAAY,CAAC,KAAK,CAAC;gBACnB,eAAe,CAAC,IAAI,CAAC;gBACrB,oBAAoB,CAAC,IAAI,CAAC;YAC9B,CAAC;AACJ,SAAA,CAAC;IACN,CAAC,EAAE,CAAC,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAG1H,MAAM,SAAS,GAAG,eAAe;IACjC,MAAM,UAAU,GAAG,gBAAgB;AAGnC,IAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,CAAC;AAEpF,IAAA,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,IAAI,KAAK,GAAG,GAAI,IAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;AACnH,QAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM;AAElE,IAAA,MAAM,eAAe,GAAG;QACpB,cAAc;QACd,SAAS;AACT,QAAA,UAAU,IAAI,WAAW,GAAG,cAAc,GAAG,gBAAgB,IAAI,YAAY;QAC7E,QAAQ,KAAK,SAAS,GAAG,aAAa,GAAG,iBAAiB;AAC7D;SACI,MAAM,CAAC,OAAO;SACd,IAAI,CAAC,GAAG,CAAC;AAEd,IAAA,QACIA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,eAAe,EAAA,QAAA,EAAA,CAC3BC,GAAA,CAAC,oBAAoB,EAAA,EACjB,MAAM,EAAE,WAAW,IAAI,UAAU,EACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,MAAM,cAAc,CAAC,KAAK,CAAC,EACpC,cAAc,EAAE,SAAS,EACzB,cAAc,EAAE,kBAAkB,EAClC,aAAa,EAAE,iBAAiB,EAChC,aAAa,EAAE,iBAAiB,EAChC,sBAAsB,EAAE,oBAAoB,EAAA,CAC9C,EAEFD,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,CACrBC,GAAA,CAAC,gBAAgB,EAAA,EACb,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,UAAU,CAAC,MAAM,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,MAAM,cAAc,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EACtD,gBAAgB,EAAE,WAAW,EAC7B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,gBAAgB,EAC9B,iBAAiB,EAAE,qBAAqB,EACxC,eAAe,EAAE,eAAe,GAClC,EAEFA,GAAA,CAAC,eAAe,EAAA,EACZ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,mBAAmB,EAAE,mBAAmB,EACxC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,cAA+C,EAC3D,SAAS,EAAE,aAA8C,EACzD,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,oBAAoB,EAClC,gBAAgB,EAAE,oBAAoB,EACtC,aAAa,EAAE,WAAW,EAC1B,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EAAA,CACtB,CAAA,EAAA,CACC,CAAA,EAAA,CACL;AAEd;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PivotViewer.stories.d.ts","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.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;
|
|
1
|
+
{"version":3,"file":"PivotViewer.stories.d.ts","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.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;AAyB1C,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAkDhC,CAAC"}
|
|
@@ -1,12 +1,52 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { PivotViewer } from './PivotViewer';
|
|
3
3
|
const meta = {
|
|
4
4
|
title: 'PivotViewer/PivotViewer',
|
|
5
5
|
component: PivotViewer,
|
|
6
6
|
};
|
|
7
7
|
export default meta;
|
|
8
|
+
const sampleData = [
|
|
9
|
+
{ id: 1, name: 'Alice Johnson', age: 28, department: 'Engineering', address: { street: '123 Main St', city: 'Seattle', zipCode: '98101' } },
|
|
10
|
+
{ id: 2, name: 'Bob Smith', age: 35, department: 'Marketing', address: { street: '456 Oak Ave', city: 'Portland', zipCode: '97201' } },
|
|
11
|
+
{ id: 3, name: 'Charlie Brown', age: 42, department: 'Engineering', address: { street: '789 Pine Rd', city: 'Seattle', zipCode: '98102' } },
|
|
12
|
+
{ id: 4, name: 'Diana Prince', age: 31, department: 'Sales', address: { street: '321 Elm St', city: 'San Francisco', zipCode: '94102' } },
|
|
13
|
+
{ id: 5, name: 'Edward Norton', age: 29, department: 'Engineering', address: { street: '654 Maple Dr', city: 'Portland', zipCode: '97202' } },
|
|
14
|
+
];
|
|
8
15
|
export const Default = {
|
|
9
|
-
args: {
|
|
10
|
-
|
|
16
|
+
args: {
|
|
17
|
+
data: [],
|
|
18
|
+
dimensions: [],
|
|
19
|
+
},
|
|
20
|
+
render: (args) => (_jsx("div", { className: "storybook-wrapper", children: _jsx(PivotViewer, { ...args, data: [], dimensions: [] }) }))
|
|
21
|
+
};
|
|
22
|
+
export const WithTypeSafeSearch = {
|
|
23
|
+
render: () => {
|
|
24
|
+
const dimensions = [
|
|
25
|
+
{
|
|
26
|
+
key: 'department',
|
|
27
|
+
label: 'Department',
|
|
28
|
+
getValue: (item) => item.department,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
key: 'city',
|
|
32
|
+
label: 'City',
|
|
33
|
+
getValue: (item) => item.address.city,
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
const filters = [
|
|
37
|
+
{
|
|
38
|
+
key: 'age',
|
|
39
|
+
label: 'Age',
|
|
40
|
+
getValue: (item) => item.age,
|
|
41
|
+
type: 'number',
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
return (_jsx("div", { className: "storybook-wrapper", style: { height: '600px' }, children: _jsx(PivotViewer, { data: sampleData, dimensions: dimensions, filters: filters, searchFields: [
|
|
45
|
+
(item) => item.name,
|
|
46
|
+
(item) => item.department,
|
|
47
|
+
(item) => item.address.city,
|
|
48
|
+
(item) => item.address.street,
|
|
49
|
+
], cardRenderer: (item) => (_jsxs("div", { style: { padding: '8px' }, children: [_jsx("h3", { children: item.name }), _jsxs("p", { children: ["Age: ", item.age] }), _jsxs("p", { children: ["Department: ", item.department] }), _jsx("p", { children: item.address.city })] })), getItemId: (item) => item.id }) }));
|
|
50
|
+
},
|
|
11
51
|
};
|
|
12
52
|
//# sourceMappingURL=PivotViewer.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PivotViewer.stories.js","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.stories.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,IAAI,GAA6B;IACnC,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,WAAW;CACzB,CAAC;AAEF,eAAe,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"PivotViewer.stories.js","sourceRoot":"","sources":["../../../PivotViewer/PivotViewer.stories.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PivotCanvas.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/components/PivotCanvas.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM;IAEpD,KAAK,EAAE,KAAK,EAAE,CAAC;IAGf,MAAM,EAAE,YAAY,CAAC;IAGrB,QAAQ,EAAE,cAAc,CAAC;IAGzB,UAAU,EAAE,WAAW,CAAC;IAGxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,MAAM,CAAC;IAGlB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IAGvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,QAAQ,EAAE,QAAQ,CAAC;IAGnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC;IAG1C,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAG3D,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAGvE,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACtD;AAMD,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,EAAE,EAChD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,SAAS,EAAE,UAAkB,EAC7B,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,EAAE,gBAAgB,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"PivotCanvas.d.ts","sourceRoot":"","sources":["../../../../PivotViewer/components/PivotCanvas.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM;IAEpD,KAAK,EAAE,KAAK,EAAE,CAAC;IAGf,MAAM,EAAE,YAAY,CAAC;IAGrB,QAAQ,EAAE,cAAc,CAAC;IAGzB,UAAU,EAAE,WAAW,CAAC;IAGxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,MAAM,CAAC;IAGlB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAGb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IAGvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,QAAQ,EAAE,QAAQ,CAAC;IAGnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC;IAG1C,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;IAG3D,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAGvE,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACtD;AAMD,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,EAAE,EAChD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,SAAS,EAAE,UAAkB,EAC7B,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,EAAE,gBAAgB,CAAC,KAAK,CAAC,QA4kBzB"}
|
|
@@ -202,14 +202,14 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
|
|
|
202
202
|
};
|
|
203
203
|
}, [pixiReady, viewportWidth, viewportHeight]);
|
|
204
204
|
useEffect(() => {
|
|
205
|
-
if (!bucketsContainerRef.current || !pixiReady)
|
|
205
|
+
if (!bucketsContainerRef.current || !parentContainerRef.current || !pixiReady)
|
|
206
206
|
return;
|
|
207
207
|
updateBucketBackgrounds(bucketsContainerRef.current, parentContainerRef.current, grouping, layout, zoomLevel, cardColorsRef.current, viewMode);
|
|
208
208
|
needsRenderRef.current = true;
|
|
209
209
|
appRef.current?.renderer?.render(appRef.current.stage);
|
|
210
210
|
}, [grouping, layout, zoomLevel, viewMode, pixiReady]);
|
|
211
211
|
useEffect(() => {
|
|
212
|
-
if (!rootRef.current || !pixiReady) {
|
|
212
|
+
if (!rootRef.current || !parentContainerRef.current || !pixiReady) {
|
|
213
213
|
return;
|
|
214
214
|
}
|
|
215
215
|
const viewModeChanged = previousViewModeRef.current !== viewMode;
|
|
@@ -219,6 +219,17 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
|
|
|
219
219
|
lastViewChangeTimeRef.current = Date.now();
|
|
220
220
|
previousViewModeRef.current = viewMode;
|
|
221
221
|
prevGroupingRef.current = grouping;
|
|
222
|
+
console.log('[PivotCanvas] View mode or grouping changed - marking sprites for cleanup');
|
|
223
|
+
for (const sprite of spritesRef.current.values()) {
|
|
224
|
+
try {
|
|
225
|
+
if (sprite.container) {
|
|
226
|
+
sprite.container.visible = false;
|
|
227
|
+
}
|
|
228
|
+
sprite.__lastHiddenAt = Date.now();
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
}
|
|
232
|
+
}
|
|
222
233
|
}
|
|
223
234
|
if (spacerRef.current) {
|
|
224
235
|
const spacer = spacerRef.current;
|
|
@@ -255,6 +266,10 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
|
|
|
255
266
|
prevLayout: prevLayoutRef.current,
|
|
256
267
|
});
|
|
257
268
|
needsRenderRef.current = true;
|
|
269
|
+
if (appRef.current?.renderer && rootRef.current) {
|
|
270
|
+
appRef.current.renderer.render(appRef.current.stage);
|
|
271
|
+
needsRenderRef.current = false;
|
|
272
|
+
}
|
|
258
273
|
startAnimationLoop({
|
|
259
274
|
mountedRef,
|
|
260
275
|
appRef,
|
|
@@ -273,10 +288,14 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
|
|
|
273
288
|
return;
|
|
274
289
|
const effectivePanX = parentContainerRef.current ? parentContainerRef.current.scrollLeft : panX;
|
|
275
290
|
const effectivePanY = parentContainerRef.current ? parentContainerRef.current.scrollTop : panY;
|
|
276
|
-
rootRef.current.scale.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
291
|
+
if (rootRef.current.scale && bucketsContainerRef.current.scale) {
|
|
292
|
+
rootRef.current.scale.set(zoomLevel);
|
|
293
|
+
bucketsContainerRef.current.scale.set(zoomLevel);
|
|
294
|
+
}
|
|
295
|
+
if (rootRef.current.position && bucketsContainerRef.current.position) {
|
|
296
|
+
rootRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
297
|
+
bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
298
|
+
}
|
|
280
299
|
appRef.current?.renderer?.render(appRef.current.stage);
|
|
281
300
|
}, [zoomLevel, panX, panY]);
|
|
282
301
|
useEffect(() => {
|
|
@@ -308,12 +327,16 @@ function PivotCanvas({ items, layout, grouping, visibleIds, cardWidth, cardHeigh
|
|
|
308
327
|
lastScroll.x = effectivePanX;
|
|
309
328
|
lastScroll.y = effectivePanY;
|
|
310
329
|
if (rootRef.current && bucketsContainerRef.current) {
|
|
311
|
-
rootRef.current.scale.
|
|
312
|
-
|
|
330
|
+
if (rootRef.current.scale && bucketsContainerRef.current.scale) {
|
|
331
|
+
rootRef.current.scale.set(zoomLevel);
|
|
332
|
+
bucketsContainerRef.current.scale.set(zoomLevel);
|
|
333
|
+
}
|
|
313
334
|
const invScale = zoomLevel && zoomLevel !== 0 ? 1 / zoomLevel : 1;
|
|
314
335
|
void invScale;
|
|
315
|
-
rootRef.current.position.
|
|
316
|
-
|
|
336
|
+
if (rootRef.current.position && bucketsContainerRef.current.position) {
|
|
337
|
+
rootRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
338
|
+
bucketsContainerRef.current.position.set(-effectivePanX, -effectivePanY);
|
|
339
|
+
}
|
|
317
340
|
}
|
|
318
341
|
syncSpritesToViewport({
|
|
319
342
|
root: rootRef.current,
|