@cratis/components 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +24 -0
- package/CommandDialog/CommandDialog.stories.tsx +25 -0
- package/CommandDialog/CommandDialog.tsx +161 -0
- package/CommandDialog/index.ts +4 -0
- package/CommandForm/CommandForm.stories.tsx +24 -0
- package/CommandForm/CommandForm.tsx +266 -0
- package/CommandForm/CommandFormField.tsx +27 -0
- package/CommandForm/CommandFormFields.tsx +142 -0
- package/CommandForm/DatePickerField.tsx +57 -0
- package/CommandForm/DropdownField.tsx +65 -0
- package/CommandForm/InputTextField.tsx +62 -0
- package/CommandForm/SliderField.tsx +68 -0
- package/CommandForm/index.ts +10 -0
- package/Common/ErrorBoundary.stories.tsx +10 -0
- package/Common/ErrorBoundary.tsx +41 -0
- package/Common/FormElement.stories.tsx +10 -0
- package/Common/FormElement.tsx +20 -0
- package/Common/Page.stories.tsx +10 -0
- package/Common/Page.tsx +21 -0
- package/Common/index.ts +6 -0
- package/DataPage/DataPage.stories.tsx +10 -0
- package/DataPage/DataPage.tsx +191 -0
- package/DataPage/index.ts +4 -0
- package/DataTables/DataTableForObservableQuery.stories.tsx +10 -0
- package/DataTables/DataTableForObservableQuery.tsx +97 -0
- package/DataTables/DataTableForQuery.stories.tsx +10 -0
- package/DataTables/DataTableForQuery.tsx +97 -0
- package/DataTables/index.ts +5 -0
- package/Dialogs/BusyIndicatorDialog.stories.tsx +26 -0
- package/Dialogs/BusyIndicatorDialog.tsx +26 -0
- package/Dialogs/ConfirmationDialog.stories.tsx +36 -0
- package/Dialogs/ConfirmationDialog.tsx +75 -0
- package/Dialogs/index.ts +5 -0
- package/Dropdown/Dropdown.tsx +23 -0
- package/Dropdown/index.ts +4 -0
- package/PivotViewer/PivotViewer.stories.tsx +24 -0
- package/PivotViewer/PivotViewer.tsx +791 -0
- package/PivotViewer/components/AxisLabels.tsx +69 -0
- package/PivotViewer/components/DetailPanel.tsx +108 -0
- package/PivotViewer/components/FilterPanel.tsx +189 -0
- package/PivotViewer/components/FilterPanelContainer.tsx +10 -0
- package/PivotViewer/components/PivotCanvas.tsx +660 -0
- package/PivotViewer/components/PivotViewerMain.tsx +229 -0
- package/PivotViewer/components/RangeHistogramFilter.tsx +220 -0
- package/PivotViewer/components/Spinner.tsx +21 -0
- package/PivotViewer/components/Toolbar.tsx +130 -0
- package/PivotViewer/components/ToolbarContainer.tsx +10 -0
- package/PivotViewer/components/index.ts +12 -0
- package/PivotViewer/components/pivot/animation.ts +108 -0
- package/PivotViewer/components/pivot/buckets.ts +152 -0
- package/PivotViewer/components/pivot/colorResolver.ts +67 -0
- package/PivotViewer/components/pivot/constants.ts +46 -0
- package/PivotViewer/components/pivot/sprites.ts +265 -0
- package/PivotViewer/components/pivot/visibility.ts +319 -0
- package/PivotViewer/constants.ts +9 -0
- package/PivotViewer/engine/layout.ts +149 -0
- package/PivotViewer/engine/pivot.worker.ts +86 -0
- package/PivotViewer/engine/store.ts +437 -0
- package/PivotViewer/engine/types.ts +255 -0
- package/PivotViewer/hooks/index.ts +13 -0
- package/PivotViewer/hooks/useContainerDimensions.ts +45 -0
- package/PivotViewer/hooks/useDimensionState.ts +53 -0
- package/PivotViewer/hooks/useFilterOptions.ts +36 -0
- package/PivotViewer/hooks/useFilterPanelDrag.ts +49 -0
- package/PivotViewer/hooks/useFilterState.ts +106 -0
- package/PivotViewer/hooks/useFilteredData.ts +119 -0
- package/PivotViewer/hooks/usePanning.ts +163 -0
- package/PivotViewer/hooks/usePivotEngine.ts +252 -0
- package/PivotViewer/hooks/useSelectedItem.ts +402 -0
- package/PivotViewer/hooks/useWheelZoom.ts +114 -0
- package/PivotViewer/hooks/useZoomState.ts +34 -0
- package/PivotViewer/index.ts +7 -0
- package/PivotViewer/types.ts +59 -0
- package/PivotViewer/utils/animations.ts +249 -0
- package/PivotViewer/utils/constants.ts +20 -0
- package/PivotViewer/utils/index.ts +6 -0
- package/PivotViewer/utils/selection.ts +292 -0
- package/PivotViewer/utils/utils.ts +259 -0
- package/README.md +1 -0
- package/TimeMachine/EventsView.stories.tsx +10 -0
- package/TimeMachine/EventsView.tsx +119 -0
- package/TimeMachine/Properties.stories.tsx +10 -0
- package/TimeMachine/Properties.tsx +98 -0
- package/TimeMachine/ReadModelView.stories.tsx +10 -0
- package/TimeMachine/ReadModelView.tsx +143 -0
- package/TimeMachine/TimeMachine.stories.tsx +10 -0
- package/TimeMachine/TimeMachine.tsx +244 -0
- package/TimeMachine/index.ts +8 -0
- package/TimeMachine/types.ts +23 -0
- package/dist/cjs/CommandDialog/CommandDialog.js +71 -0
- package/dist/cjs/CommandDialog/CommandDialog.js.map +1 -0
- package/dist/cjs/CommandDialog/index.js +9 -0
- package/dist/cjs/CommandDialog/index.js.map +1 -0
- package/dist/cjs/CommandForm/CommandForm.js +179 -0
- package/dist/cjs/CommandForm/CommandForm.js.map +1 -0
- package/dist/cjs/CommandForm/CommandFormField.js +11 -0
- package/dist/cjs/CommandForm/CommandFormField.js.map +1 -0
- package/dist/cjs/CommandForm/CommandFormFields.js +67 -0
- package/dist/cjs/CommandForm/CommandFormFields.js.map +1 -0
- package/dist/cjs/CommandForm/DatePickerField.js +31 -0
- package/dist/cjs/CommandForm/DatePickerField.js.map +1 -0
- package/dist/cjs/CommandForm/DropdownField.js +31 -0
- package/dist/cjs/CommandForm/DropdownField.js.map +1 -0
- package/dist/cjs/CommandForm/InputTextField.js +32 -0
- package/dist/cjs/CommandForm/InputTextField.js.map +1 -0
- package/dist/cjs/CommandForm/SliderField.js +34 -0
- package/dist/cjs/CommandForm/SliderField.js.map +1 -0
- package/dist/cjs/CommandForm/index.js +23 -0
- package/dist/cjs/CommandForm/index.js.map +1 -0
- package/dist/cjs/Common/Page.js +10 -0
- package/dist/cjs/Common/Page.js.map +1 -0
- package/dist/cjs/DataPage/DataPage.js +64 -0
- package/dist/cjs/DataPage/DataPage.js.map +1 -0
- package/dist/cjs/DataPage/index.js +11 -0
- package/dist/cjs/DataPage/index.js.map +1 -0
- package/dist/cjs/DataTables/DataTableForObservableQuery.js +17 -0
- package/dist/cjs/DataTables/DataTableForObservableQuery.js.map +1 -0
- package/dist/cjs/DataTables/DataTableForQuery.js +17 -0
- package/dist/cjs/DataTables/DataTableForQuery.js.map +1 -0
- package/dist/cjs/DataTables/index.js +10 -0
- package/dist/cjs/DataTables/index.js.map +1 -0
- package/dist/cjs/Dialogs/BusyIndicatorDialog.js +13 -0
- package/dist/cjs/Dialogs/BusyIndicatorDialog.js.map +1 -0
- package/dist/cjs/Dialogs/ConfirmationDialog.js +33 -0
- package/dist/cjs/Dialogs/ConfirmationDialog.js.map +1 -0
- package/dist/cjs/Dialogs/index.js +10 -0
- package/dist/cjs/Dialogs/index.js.map +1 -0
- package/dist/cjs/Dropdown/Dropdown.js +15 -0
- package/dist/cjs/Dropdown/Dropdown.js.map +1 -0
- package/dist/cjs/Dropdown/index.js +8 -0
- package/dist/cjs/Dropdown/index.js.map +1 -0
- package/dist/cjs/PivotViewer/PivotViewer.js +525 -0
- package/dist/cjs/PivotViewer/PivotViewer.js.map +1 -0
- package/dist/cjs/PivotViewer/components/AxisLabels.js +27 -0
- package/dist/cjs/PivotViewer/components/AxisLabels.js.map +1 -0
- package/dist/cjs/PivotViewer/components/DetailPanel.js +35 -0
- package/dist/cjs/PivotViewer/components/DetailPanel.js.map +1 -0
- package/dist/cjs/PivotViewer/components/FilterPanel.js +59 -0
- package/dist/cjs/PivotViewer/components/FilterPanel.js.map +1 -0
- package/dist/cjs/PivotViewer/components/FilterPanelContainer.js +11 -0
- package/dist/cjs/PivotViewer/components/FilterPanelContainer.js.map +1 -0
- package/dist/cjs/PivotViewer/components/PivotCanvas.js +394 -0
- package/dist/cjs/PivotViewer/components/PivotCanvas.js.map +1 -0
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js +81 -0
- package/dist/cjs/PivotViewer/components/PivotViewerMain.js.map +1 -0
- package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js +124 -0
- package/dist/cjs/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
- package/dist/cjs/PivotViewer/components/Spinner.js +11 -0
- package/dist/cjs/PivotViewer/components/Spinner.js.map +1 -0
- package/dist/cjs/PivotViewer/components/Toolbar.js +12 -0
- package/dist/cjs/PivotViewer/components/Toolbar.js.map +1 -0
- package/dist/cjs/PivotViewer/components/ToolbarContainer.js +11 -0
- package/dist/cjs/PivotViewer/components/ToolbarContainer.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/animation.js +82 -0
- package/dist/cjs/PivotViewer/components/pivot/animation.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/buckets.js +124 -0
- package/dist/cjs/PivotViewer/components/pivot/buckets.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/colorResolver.js +64 -0
- package/dist/cjs/PivotViewer/components/pivot/colorResolver.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/constants.js +19 -0
- package/dist/cjs/PivotViewer/components/pivot/constants.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/sprites.js +227 -0
- package/dist/cjs/PivotViewer/components/pivot/sprites.js.map +1 -0
- package/dist/cjs/PivotViewer/components/pivot/visibility.js +223 -0
- package/dist/cjs/PivotViewer/components/pivot/visibility.js.map +1 -0
- package/dist/cjs/PivotViewer/constants.js +16 -0
- package/dist/cjs/PivotViewer/constants.js.map +1 -0
- package/dist/cjs/PivotViewer/engine/layout.js +95 -0
- package/dist/cjs/PivotViewer/engine/layout.js.map +1 -0
- package/dist/cjs/PivotViewer/engine/store.js +336 -0
- package/dist/cjs/PivotViewer/engine/store.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js +30 -0
- package/dist/cjs/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useDimensionState.js +43 -0
- package/dist/cjs/PivotViewer/hooks/useDimensionState.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useFilterOptions.js +24 -0
- package/dist/cjs/PivotViewer/hooks/useFilterOptions.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useFilterState.js +96 -0
- package/dist/cjs/PivotViewer/hooks/useFilterState.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/usePanning.js +120 -0
- package/dist/cjs/PivotViewer/hooks/usePanning.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js +183 -0
- package/dist/cjs/PivotViewer/hooks/usePivotEngine.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useWheelZoom.js +93 -0
- package/dist/cjs/PivotViewer/hooks/useWheelZoom.js.map +1 -0
- package/dist/cjs/PivotViewer/hooks/useZoomState.js +31 -0
- package/dist/cjs/PivotViewer/hooks/useZoomState.js.map +1 -0
- package/dist/cjs/PivotViewer/index.js +9 -0
- package/dist/cjs/PivotViewer/index.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/animations.js +144 -0
- package/dist/cjs/PivotViewer/utils/animations.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/constants.js +12 -0
- package/dist/cjs/PivotViewer/utils/constants.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/selection.js +136 -0
- package/dist/cjs/PivotViewer/utils/selection.js.map +1 -0
- package/dist/cjs/PivotViewer/utils/utils.js +150 -0
- package/dist/cjs/PivotViewer/utils/utils.js.map +1 -0
- package/dist/cjs/TimeMachine/EventsView.js +57 -0
- package/dist/cjs/TimeMachine/EventsView.js.map +1 -0
- package/dist/cjs/TimeMachine/Properties.js +58 -0
- package/dist/cjs/TimeMachine/Properties.js.map +1 -0
- package/dist/cjs/TimeMachine/ReadModelView.js +40 -0
- package/dist/cjs/TimeMachine/ReadModelView.js.map +1 -0
- package/dist/cjs/TimeMachine/TimeMachine.js +98 -0
- package/dist/cjs/TimeMachine/TimeMachine.js.map +1 -0
- package/dist/cjs/TimeMachine/index.js +14 -0
- package/dist/cjs/TimeMachine/index.js.map +1 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/useOverlayZIndex.js +24 -0
- package/dist/cjs/useOverlayZIndex.js.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.d.ts +45 -0
- package/dist/esm/CommandDialog/CommandDialog.d.ts.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.js +68 -0
- package/dist/esm/CommandDialog/CommandDialog.js.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.d.ts +7 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.d.ts.map +1 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.js +12 -0
- package/dist/esm/CommandDialog/CommandDialog.stories.js.map +1 -0
- package/dist/esm/CommandDialog/index.d.ts +2 -0
- package/dist/esm/CommandDialog/index.d.ts.map +1 -0
- package/dist/esm/CommandDialog/index.js +2 -0
- package/dist/esm/CommandDialog/index.js.map +1 -0
- package/dist/esm/CommandForm/CommandForm.d.ts +49 -0
- package/dist/esm/CommandForm/CommandForm.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandForm.js +174 -0
- package/dist/esm/CommandForm/CommandForm.js.map +1 -0
- package/dist/esm/CommandForm/CommandForm.stories.d.ts +7 -0
- package/dist/esm/CommandForm/CommandForm.stories.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandForm.stories.js +12 -0
- package/dist/esm/CommandForm/CommandForm.stories.js.map +1 -0
- package/dist/esm/CommandForm/CommandFormField.d.ts +18 -0
- package/dist/esm/CommandForm/CommandFormField.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandFormField.js +9 -0
- package/dist/esm/CommandForm/CommandFormField.js.map +1 -0
- package/dist/esm/CommandForm/CommandFormFields.d.ts +11 -0
- package/dist/esm/CommandForm/CommandFormFields.d.ts.map +1 -0
- package/dist/esm/CommandForm/CommandFormFields.js +65 -0
- package/dist/esm/CommandForm/CommandFormFields.js.map +1 -0
- package/dist/esm/CommandForm/DatePickerField.d.ts +20 -0
- package/dist/esm/CommandForm/DatePickerField.d.ts.map +1 -0
- package/dist/esm/CommandForm/DatePickerField.js +29 -0
- package/dist/esm/CommandForm/DatePickerField.js.map +1 -0
- package/dist/esm/CommandForm/DropdownField.d.ts +24 -0
- package/dist/esm/CommandForm/DropdownField.d.ts.map +1 -0
- package/dist/esm/CommandForm/DropdownField.js +29 -0
- package/dist/esm/CommandForm/DropdownField.js.map +1 -0
- package/dist/esm/CommandForm/InputTextField.d.ts +20 -0
- package/dist/esm/CommandForm/InputTextField.d.ts.map +1 -0
- package/dist/esm/CommandForm/InputTextField.js +30 -0
- package/dist/esm/CommandForm/InputTextField.js.map +1 -0
- package/dist/esm/CommandForm/SliderField.d.ts +23 -0
- package/dist/esm/CommandForm/SliderField.d.ts.map +1 -0
- package/dist/esm/CommandForm/SliderField.js +32 -0
- package/dist/esm/CommandForm/SliderField.js.map +1 -0
- package/dist/esm/CommandForm/index.d.ts +8 -0
- package/dist/esm/CommandForm/index.d.ts.map +1 -0
- package/dist/esm/CommandForm/index.js +8 -0
- package/dist/esm/CommandForm/index.js.map +1 -0
- package/dist/esm/Common/ErrorBoundary.d.ts +16 -0
- package/dist/esm/Common/ErrorBoundary.d.ts.map +1 -0
- package/dist/esm/Common/ErrorBoundary.js +21 -0
- package/dist/esm/Common/ErrorBoundary.js.map +1 -0
- package/dist/esm/Common/ErrorBoundary.stories.d.ts +8 -0
- package/dist/esm/Common/ErrorBoundary.stories.d.ts.map +1 -0
- package/dist/esm/Common/ErrorBoundary.stories.js +6 -0
- package/dist/esm/Common/ErrorBoundary.stories.js.map +1 -0
- package/dist/esm/Common/FormElement.d.ts +6 -0
- package/dist/esm/Common/FormElement.d.ts.map +1 -0
- package/dist/esm/Common/FormElement.js +5 -0
- package/dist/esm/Common/FormElement.js.map +1 -0
- package/dist/esm/Common/FormElement.stories.d.ts +8 -0
- package/dist/esm/Common/FormElement.stories.d.ts.map +1 -0
- package/dist/esm/Common/FormElement.stories.js +6 -0
- package/dist/esm/Common/FormElement.stories.js.map +1 -0
- package/dist/esm/Common/Page.d.ts +8 -0
- package/dist/esm/Common/Page.d.ts.map +1 -0
- package/dist/esm/Common/Page.js +8 -0
- package/dist/esm/Common/Page.js.map +1 -0
- package/dist/esm/Common/Page.stories.d.ts +8 -0
- package/dist/esm/Common/Page.stories.d.ts.map +1 -0
- package/dist/esm/Common/Page.stories.js +6 -0
- package/dist/esm/Common/Page.stories.js.map +1 -0
- package/dist/esm/Common/index.d.ts +4 -0
- package/dist/esm/Common/index.d.ts.map +1 -0
- package/dist/esm/Common/index.js +4 -0
- package/dist/esm/Common/index.js.map +1 -0
- package/dist/esm/DataPage/DataPage.d.ts +41 -0
- package/dist/esm/DataPage/DataPage.d.ts.map +1 -0
- package/dist/esm/DataPage/DataPage.js +59 -0
- package/dist/esm/DataPage/DataPage.js.map +1 -0
- package/dist/esm/DataPage/DataPage.stories.d.ts +8 -0
- package/dist/esm/DataPage/DataPage.stories.d.ts.map +1 -0
- package/dist/esm/DataPage/DataPage.stories.js +6 -0
- package/dist/esm/DataPage/DataPage.stories.js.map +1 -0
- package/dist/esm/DataPage/index.d.ts +2 -0
- package/dist/esm/DataPage/index.d.ts.map +1 -0
- package/dist/esm/DataPage/index.js +2 -0
- package/dist/esm/DataPage/index.js.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts +17 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.js +15 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.js.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts +8 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.js +6 -0
- package/dist/esm/DataTables/DataTableForObservableQuery.stories.js.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.d.ts +17 -0
- package/dist/esm/DataTables/DataTableForQuery.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.js +15 -0
- package/dist/esm/DataTables/DataTableForQuery.js.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.d.ts +8 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.js +6 -0
- package/dist/esm/DataTables/DataTableForQuery.stories.js.map +1 -0
- package/dist/esm/DataTables/index.d.ts +3 -0
- package/dist/esm/DataTables/index.d.ts.map +1 -0
- package/dist/esm/DataTables/index.js +3 -0
- package/dist/esm/DataTables/index.js.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts +3 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.d.ts.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.js +11 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.js.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts +7 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.d.ts.map +1 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js +15 -0
- package/dist/esm/Dialogs/BusyIndicatorDialog.stories.js.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.d.ts +2 -0
- package/dist/esm/Dialogs/ConfirmationDialog.d.ts.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.js +31 -0
- package/dist/esm/Dialogs/ConfirmationDialog.js.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts +7 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.d.ts.map +1 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.js +20 -0
- package/dist/esm/Dialogs/ConfirmationDialog.stories.js.map +1 -0
- package/dist/esm/Dialogs/index.d.ts +3 -0
- package/dist/esm/Dialogs/index.d.ts.map +1 -0
- package/dist/esm/Dialogs/index.js +3 -0
- package/dist/esm/Dialogs/index.js.map +1 -0
- package/dist/esm/Dropdown/Dropdown.d.ts +5 -0
- package/dist/esm/Dropdown/Dropdown.d.ts.map +1 -0
- package/dist/esm/Dropdown/Dropdown.js +13 -0
- package/dist/esm/Dropdown/Dropdown.js.map +1 -0
- package/dist/esm/Dropdown/index.d.ts +2 -0
- package/dist/esm/Dropdown/index.d.ts.map +1 -0
- package/dist/esm/Dropdown/index.js +2 -0
- package/dist/esm/Dropdown/index.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts +4 -0
- package/dist/esm/PivotViewer/PivotViewer.d.ts.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.js +523 -0
- package/dist/esm/PivotViewer/PivotViewer.js.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts +7 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.d.ts.map +1 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.js +12 -0
- package/dist/esm/PivotViewer/PivotViewer.stories.js.map +1 -0
- package/dist/esm/PivotViewer/components/AxisLabels.d.ts +13 -0
- package/dist/esm/PivotViewer/components/AxisLabels.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/AxisLabels.js +25 -0
- package/dist/esm/PivotViewer/components/AxisLabels.js.map +1 -0
- package/dist/esm/PivotViewer/components/DetailPanel.d.ts +6 -0
- package/dist/esm/PivotViewer/components/DetailPanel.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/DetailPanel.js +33 -0
- package/dist/esm/PivotViewer/components/DetailPanel.js.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanel.d.ts +27 -0
- package/dist/esm/PivotViewer/components/FilterPanel.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanel.js +57 -0
- package/dist/esm/PivotViewer/components/FilterPanel.js.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts +4 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.js +9 -0
- package/dist/esm/PivotViewer/components/FilterPanelContainer.js.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +29 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.js +373 -0
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts +43 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.js +79 -0
- package/dist/esm/PivotViewer/components/PivotViewerMain.js.map +1 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts +11 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.js +122 -0
- package/dist/esm/PivotViewer/components/RangeHistogramFilter.js.map +1 -0
- package/dist/esm/PivotViewer/components/Spinner.d.ts +3 -0
- package/dist/esm/PivotViewer/components/Spinner.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/Spinner.js +9 -0
- package/dist/esm/PivotViewer/components/Spinner.js.map +1 -0
- package/dist/esm/PivotViewer/components/Toolbar.d.ts +21 -0
- package/dist/esm/PivotViewer/components/Toolbar.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/Toolbar.js +10 -0
- package/dist/esm/PivotViewer/components/Toolbar.js.map +1 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts +4 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.js +9 -0
- package/dist/esm/PivotViewer/components/ToolbarContainer.js.map +1 -0
- package/dist/esm/PivotViewer/components/index.d.ts +9 -0
- package/dist/esm/PivotViewer/components/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/index.js +8 -0
- package/dist/esm/PivotViewer/components/index.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/animation.d.ts +29 -0
- package/dist/esm/PivotViewer/components/pivot/animation.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/animation.js +79 -0
- package/dist/esm/PivotViewer/components/pivot/animation.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.d.ts +6 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.js +102 -0
- package/dist/esm/PivotViewer/components/pivot/buckets.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts +4 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.js +61 -0
- package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/constants.d.ts +38 -0
- package/dist/esm/PivotViewer/components/pivot/constants.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/constants.js +14 -0
- package/dist/esm/PivotViewer/components/pivot/constants.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts +6 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.js +203 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts +26 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.js +221 -0
- package/dist/esm/PivotViewer/components/pivot/visibility.js.map +1 -0
- package/dist/esm/PivotViewer/constants.d.ts +7 -0
- package/dist/esm/PivotViewer/constants.d.ts.map +1 -0
- package/dist/esm/PivotViewer/constants.js +9 -0
- package/dist/esm/PivotViewer/constants.js.map +1 -0
- package/dist/esm/PivotViewer/engine/layout.d.ts +3 -0
- package/dist/esm/PivotViewer/engine/layout.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/layout.js +93 -0
- package/dist/esm/PivotViewer/engine/layout.js.map +1 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.d.ts +2 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.js +58 -0
- package/dist/esm/PivotViewer/engine/pivot.worker.js.map +1 -0
- package/dist/esm/PivotViewer/engine/store.d.ts +9 -0
- package/dist/esm/PivotViewer/engine/store.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/store.js +328 -0
- package/dist/esm/PivotViewer/engine/store.js.map +1 -0
- package/dist/esm/PivotViewer/engine/types.d.ts +125 -0
- package/dist/esm/PivotViewer/engine/types.d.ts.map +1 -0
- package/dist/esm/PivotViewer/engine/types.js +2 -0
- package/dist/esm/PivotViewer/engine/types.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/index.d.ts +11 -0
- package/dist/esm/PivotViewer/hooks/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/index.js +11 -0
- package/dist/esm/PivotViewer/hooks/index.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts +5 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.js +28 -0
- package/dist/esm/PivotViewer/hooks/useContainerDimensions.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts +11 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.js +41 -0
- package/dist/esm/PivotViewer/hooks/useDimensionState.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts +12 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.js +22 -0
- package/dist/esm/PivotViewer/hooks/useFilterOptions.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js +42 -0
- package/dist/esm/PivotViewer/hooks/useFilterPanelDrag.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.d.ts +11 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.js +94 -0
- package/dist/esm/PivotViewer/hooks/useFilterState.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.js +85 -0
- package/dist/esm/PivotViewer/hooks/useFilteredData.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePanning.d.ts +10 -0
- package/dist/esm/PivotViewer/hooks/usePanning.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePanning.js +118 -0
- package/dist/esm/PivotViewer/hooks/usePanning.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts +14 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js +180 -0
- package/dist/esm/PivotViewer/hooks/usePivotEngine.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts +8 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.js +322 -0
- package/dist/esm/PivotViewer/hooks/useSelectedItem.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts +2 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.js +91 -0
- package/dist/esm/PivotViewer/hooks/useWheelZoom.js.map +1 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.d.ts +9 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.js +29 -0
- package/dist/esm/PivotViewer/hooks/useZoomState.js.map +1 -0
- package/dist/esm/PivotViewer/index.d.ts +4 -0
- package/dist/esm/PivotViewer/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/index.js +2 -0
- package/dist/esm/PivotViewer/index.js.map +1 -0
- package/dist/esm/PivotViewer/types.d.ts +47 -0
- package/dist/esm/PivotViewer/types.d.ts.map +1 -0
- package/dist/esm/PivotViewer/types.js +2 -0
- package/dist/esm/PivotViewer/types.js.map +1 -0
- package/dist/esm/PivotViewer/utils/animations.d.ts +54 -0
- package/dist/esm/PivotViewer/utils/animations.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/animations.js +139 -0
- package/dist/esm/PivotViewer/utils/animations.js.map +1 -0
- package/dist/esm/PivotViewer/utils/constants.d.ts +13 -0
- package/dist/esm/PivotViewer/utils/constants.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/constants.js +7 -0
- package/dist/esm/PivotViewer/utils/constants.js.map +1 -0
- package/dist/esm/PivotViewer/utils/index.d.ts +4 -0
- package/dist/esm/PivotViewer/utils/index.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/index.js +4 -0
- package/dist/esm/PivotViewer/utils/index.js.map +1 -0
- package/dist/esm/PivotViewer/utils/selection.d.ts +50 -0
- package/dist/esm/PivotViewer/utils/selection.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/selection.js +134 -0
- package/dist/esm/PivotViewer/utils/selection.js.map +1 -0
- package/dist/esm/PivotViewer/utils/utils.d.ts +24 -0
- package/dist/esm/PivotViewer/utils/utils.d.ts.map +1 -0
- package/dist/esm/PivotViewer/utils/utils.js +138 -0
- package/dist/esm/PivotViewer/utils/utils.js.map +1 -0
- package/dist/esm/TimeMachine/EventsView.d.ts +9 -0
- package/dist/esm/TimeMachine/EventsView.d.ts.map +1 -0
- package/dist/esm/TimeMachine/EventsView.js +55 -0
- package/dist/esm/TimeMachine/EventsView.js.map +1 -0
- package/dist/esm/TimeMachine/EventsView.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/EventsView.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/EventsView.stories.js +6 -0
- package/dist/esm/TimeMachine/EventsView.stories.js.map +1 -0
- package/dist/esm/TimeMachine/Properties.d.ts +9 -0
- package/dist/esm/TimeMachine/Properties.d.ts.map +1 -0
- package/dist/esm/TimeMachine/Properties.js +56 -0
- package/dist/esm/TimeMachine/Properties.js.map +1 -0
- package/dist/esm/TimeMachine/Properties.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/Properties.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/Properties.stories.js +6 -0
- package/dist/esm/TimeMachine/Properties.stories.js.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.d.ts +12 -0
- package/dist/esm/TimeMachine/ReadModelView.d.ts.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.js +38 -0
- package/dist/esm/TimeMachine/ReadModelView.js.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.js +6 -0
- package/dist/esm/TimeMachine/ReadModelView.stories.js.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.d.ts +12 -0
- package/dist/esm/TimeMachine/TimeMachine.d.ts.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.js +93 -0
- package/dist/esm/TimeMachine/TimeMachine.js.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.d.ts +8 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.d.ts.map +1 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.js +6 -0
- package/dist/esm/TimeMachine/TimeMachine.stories.js.map +1 -0
- package/dist/esm/TimeMachine/index.d.ts +6 -0
- package/dist/esm/TimeMachine/index.d.ts.map +1 -0
- package/dist/esm/TimeMachine/index.js +5 -0
- package/dist/esm/TimeMachine/index.js.map +1 -0
- package/dist/esm/TimeMachine/types.d.ts +19 -0
- package/dist/esm/TimeMachine/types.d.ts.map +1 -0
- package/dist/esm/TimeMachine/types.js +2 -0
- package/dist/esm/TimeMachine/types.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/useOverlayZIndex.d.ts +2 -0
- package/dist/esm/useOverlayZIndex.d.ts.map +1 -0
- package/dist/esm/useOverlayZIndex.js +22 -0
- package/dist/esm/useOverlayZIndex.js.map +1 -0
- package/dist/esm/vite.config.d.ts +3 -0
- package/dist/esm/vite.config.d.ts.map +1 -0
- package/dist/esm/vite.config.js +76 -0
- package/dist/esm/vite.config.js.map +1 -0
- package/global.d.ts +11 -0
- package/index.ts +22 -0
- package/package.json +160 -0
- package/useOverlayZIndex.ts +32 -0
- package/vite.config.ts +80 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hook to track container dimensions using ResizeObserver.
|
|
8
|
+
*
|
|
9
|
+
* @param containerRef - Ref to the container element.
|
|
10
|
+
* @param dependency - Optional dependency to trigger updates.
|
|
11
|
+
* @returns Dimensions of the container.
|
|
12
|
+
*/
|
|
13
|
+
export function useContainerDimensions(
|
|
14
|
+
containerRef: React.RefObject<HTMLDivElement>,
|
|
15
|
+
dependency?: unknown
|
|
16
|
+
) {
|
|
17
|
+
const [dimensions, setDimensions] = useState({ width: 1200, height: 600 });
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const container = containerRef.current;
|
|
21
|
+
if (!container) return;
|
|
22
|
+
|
|
23
|
+
const updateDimensions = () => {
|
|
24
|
+
setDimensions({
|
|
25
|
+
width: container.clientWidth,
|
|
26
|
+
height: container.clientHeight,
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Initial dimensions
|
|
31
|
+
updateDimensions();
|
|
32
|
+
|
|
33
|
+
// Observe for resize changes
|
|
34
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
35
|
+
updateDimensions();
|
|
36
|
+
});
|
|
37
|
+
resizeObserver.observe(container);
|
|
38
|
+
|
|
39
|
+
return () => {
|
|
40
|
+
resizeObserver.disconnect();
|
|
41
|
+
};
|
|
42
|
+
}, [containerRef, dependency]);
|
|
43
|
+
|
|
44
|
+
return dimensions;
|
|
45
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useMemo, useState, useEffect, useCallback } from 'react';
|
|
5
|
+
import type { PivotDimension } from '../types';
|
|
6
|
+
|
|
7
|
+
export type PivotDimensionFilter = string | null;
|
|
8
|
+
|
|
9
|
+
export function useDimensionState<TItem extends object>(
|
|
10
|
+
dimensions: PivotDimension<TItem>[],
|
|
11
|
+
defaultDimensionKey?: string
|
|
12
|
+
) {
|
|
13
|
+
const dimensionMap = useMemo(() => {
|
|
14
|
+
const map = new Map<string, PivotDimension<TItem>>();
|
|
15
|
+
dimensions.forEach((dimension) => map.set(dimension.key, dimension));
|
|
16
|
+
return map;
|
|
17
|
+
}, [dimensions]);
|
|
18
|
+
|
|
19
|
+
const initialDimension = useMemo(() => {
|
|
20
|
+
if (defaultDimensionKey && dimensionMap.has(defaultDimensionKey)) {
|
|
21
|
+
return defaultDimensionKey;
|
|
22
|
+
}
|
|
23
|
+
return dimensions[0]?.key ?? '';
|
|
24
|
+
}, [defaultDimensionKey, dimensionMap, dimensions]);
|
|
25
|
+
|
|
26
|
+
const [activeDimensionKey, setActiveDimensionKey] = useState(initialDimension);
|
|
27
|
+
const [dimensionFilter, setDimensionFilter] = useState<string | null>(null);
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
setActiveDimensionKey((previous) => {
|
|
31
|
+
if (previous && dimensionMap.has(previous)) {
|
|
32
|
+
return previous;
|
|
33
|
+
}
|
|
34
|
+
return initialDimension;
|
|
35
|
+
});
|
|
36
|
+
setDimensionFilter(null);
|
|
37
|
+
}, [dimensionMap, initialDimension]);
|
|
38
|
+
|
|
39
|
+
const activeDimension = dimensionMap.get(activeDimensionKey) ?? dimensions[0];
|
|
40
|
+
|
|
41
|
+
const handleAxisLabelClick = useCallback((groupKey: string) => {
|
|
42
|
+
setDimensionFilter((prev) => (prev === groupKey ? null : groupKey));
|
|
43
|
+
}, []);
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
dimensionMap,
|
|
47
|
+
activeDimensionKey,
|
|
48
|
+
setActiveDimensionKey,
|
|
49
|
+
activeDimension,
|
|
50
|
+
dimensionFilter,
|
|
51
|
+
handleAxisLabelClick,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import type { PivotFilter, PivotFilterOption, PivotPrimitive } from '../types';
|
|
6
|
+
import { applyFilters, computeFilterOptions, computeNumericRange } from '../utils/utils';
|
|
7
|
+
import type { FilterState, RangeFilterState } from '../types';
|
|
8
|
+
|
|
9
|
+
export function useFilterOptions<TItem extends object>(
|
|
10
|
+
data: TItem[],
|
|
11
|
+
filters: PivotFilter<TItem>[] | undefined,
|
|
12
|
+
filterState: FilterState,
|
|
13
|
+
rangeFilterState: RangeFilterState
|
|
14
|
+
) {
|
|
15
|
+
return useMemo(() => {
|
|
16
|
+
if (!filters?.length) {
|
|
17
|
+
return [] as {
|
|
18
|
+
filter: PivotFilter<TItem>;
|
|
19
|
+
options: PivotFilterOption[];
|
|
20
|
+
numericRange?: { min: number; max: number; values: PivotPrimitive[] };
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return filters.map((filter) => {
|
|
25
|
+
const baseData = applyFilters(data, filters, filterState, rangeFilterState, filter.key);
|
|
26
|
+
|
|
27
|
+
if (filter.type === 'number') {
|
|
28
|
+
const numericRange = computeNumericRange(baseData, filter);
|
|
29
|
+
return { filter, options: [], numericRange };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const options = computeFilterOptions(baseData, filter);
|
|
33
|
+
return { filter, options };
|
|
34
|
+
});
|
|
35
|
+
}, [data, filters, filterState, rangeFilterState]);
|
|
36
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
5
|
+
|
|
6
|
+
export function useFilterPanelDrag() {
|
|
7
|
+
const [filterPanelPos, setFilterPanelPos] = useState({ x: 16, y: 88 });
|
|
8
|
+
const [isDraggingPanel, setIsDraggingPanel] = useState(false);
|
|
9
|
+
const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });
|
|
10
|
+
|
|
11
|
+
const handleFilterPanelDragStart = useCallback((e: React.MouseEvent) => {
|
|
12
|
+
(e as any).preventDefault?.();
|
|
13
|
+
setIsDraggingPanel(true);
|
|
14
|
+
setDragOffset({
|
|
15
|
+
x: e.clientX - filterPanelPos.x,
|
|
16
|
+
y: e.clientY - filterPanelPos.y,
|
|
17
|
+
});
|
|
18
|
+
}, [filterPanelPos]);
|
|
19
|
+
|
|
20
|
+
const handleFilterPanelDrag = useCallback((e: MouseEvent) => {
|
|
21
|
+
if (!isDraggingPanel) return;
|
|
22
|
+
setFilterPanelPos({
|
|
23
|
+
x: Math.max(0, e.clientX - dragOffset.x),
|
|
24
|
+
y: Math.max(60, e.clientY - dragOffset.y),
|
|
25
|
+
});
|
|
26
|
+
}, [isDraggingPanel, dragOffset]);
|
|
27
|
+
|
|
28
|
+
const handleFilterPanelDragEnd = useCallback(() => {
|
|
29
|
+
setIsDraggingPanel(false);
|
|
30
|
+
}, []);
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (isDraggingPanel) {
|
|
34
|
+
document.addEventListener('mousemove', handleFilterPanelDrag);
|
|
35
|
+
document.addEventListener('mouseup', handleFilterPanelDragEnd);
|
|
36
|
+
return () => {
|
|
37
|
+
document.removeEventListener('mousemove', handleFilterPanelDrag);
|
|
38
|
+
document.removeEventListener('mouseup', handleFilterPanelDragEnd);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}, [isDraggingPanel, handleFilterPanelDrag, handleFilterPanelDragEnd]);
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
filterPanelPos,
|
|
46
|
+
isDraggingPanel,
|
|
47
|
+
handleFilterPanelDragStart,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
5
|
+
import { buildFilterState, buildRangeFilterState } from '../utils/utils';
|
|
6
|
+
import { FilterState, RangeFilterState, PivotFilter } from '../types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Hook to manage filter state.
|
|
10
|
+
*/
|
|
11
|
+
export function useFilterState<TItem extends object>(
|
|
12
|
+
filters: PivotFilter<TItem>[] | undefined
|
|
13
|
+
) {
|
|
14
|
+
const [filterState, setFilterState] = useState<FilterState>(() => buildFilterState(filters));
|
|
15
|
+
const [rangeFilterState, setRangeFilterState] = useState<RangeFilterState>(() => buildRangeFilterState(filters));
|
|
16
|
+
const [expandedFilterKey, setExpandedFilterKey] = useState<string | null>(filters?.[0]?.key ?? null);
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
setFilterState((prev) => {
|
|
20
|
+
const next = buildFilterState(filters);
|
|
21
|
+
if (!filters) return next;
|
|
22
|
+
|
|
23
|
+
filters.forEach((filter) => {
|
|
24
|
+
if (prev[filter.key]) {
|
|
25
|
+
next[filter.key] = new Set(prev[filter.key]);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return next;
|
|
30
|
+
});
|
|
31
|
+
setRangeFilterState((prev) => {
|
|
32
|
+
const next = buildRangeFilterState(filters);
|
|
33
|
+
if (!filters) return next;
|
|
34
|
+
filters.forEach((filter) => {
|
|
35
|
+
if (filter.type === 'number' && filter.key in prev) {
|
|
36
|
+
next[filter.key] = prev[filter.key];
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return next;
|
|
40
|
+
});
|
|
41
|
+
}, [filters]);
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (!filters?.length) {
|
|
45
|
+
setExpandedFilterKey(null);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
setExpandedFilterKey((current) => {
|
|
50
|
+
if (current && filters.some((filter) => filter.key === current)) {
|
|
51
|
+
return current;
|
|
52
|
+
}
|
|
53
|
+
return filters[0]?.key ?? null;
|
|
54
|
+
});
|
|
55
|
+
}, [filters]);
|
|
56
|
+
|
|
57
|
+
const handleToggleFilter = useCallback((filterKey: string, optionKey: string, multi: boolean | undefined) => {
|
|
58
|
+
setFilterState((prev) => {
|
|
59
|
+
const next: FilterState = { ...prev };
|
|
60
|
+
const current = new Set(prev[filterKey] ?? []);
|
|
61
|
+
|
|
62
|
+
if (multi) {
|
|
63
|
+
if (current.has(optionKey)) {
|
|
64
|
+
current.delete(optionKey);
|
|
65
|
+
} else {
|
|
66
|
+
current.add(optionKey);
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
if (current.has(optionKey)) {
|
|
70
|
+
current.clear();
|
|
71
|
+
} else {
|
|
72
|
+
current.clear();
|
|
73
|
+
current.add(optionKey);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
next[filterKey] = current;
|
|
78
|
+
return next;
|
|
79
|
+
});
|
|
80
|
+
}, []);
|
|
81
|
+
|
|
82
|
+
const handleClearFilter = useCallback((filterKey: string) => {
|
|
83
|
+
setFilterState((prev) => {
|
|
84
|
+
const next: FilterState = { ...prev };
|
|
85
|
+
next[filterKey] = new Set();
|
|
86
|
+
return next;
|
|
87
|
+
});
|
|
88
|
+
}, []);
|
|
89
|
+
|
|
90
|
+
const handleRangeChange = useCallback((filterKey: string, range: [number, number] | null) => {
|
|
91
|
+
setRangeFilterState((prev) => ({
|
|
92
|
+
...prev,
|
|
93
|
+
[filterKey]: range,
|
|
94
|
+
}));
|
|
95
|
+
}, []);
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
filterState,
|
|
99
|
+
rangeFilterState,
|
|
100
|
+
expandedFilterKey,
|
|
101
|
+
setExpandedFilterKey,
|
|
102
|
+
handleToggleFilter,
|
|
103
|
+
handleClearFilter,
|
|
104
|
+
handleRangeChange,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import type { PivotDimension, PivotFilter, PivotGroup } from '../types';
|
|
6
|
+
import { applyFilters, groupData, toKey } from '../utils/utils';
|
|
7
|
+
import type { FilterState, RangeFilterState } from '../utils/utils';
|
|
8
|
+
|
|
9
|
+
export function useFilteredData<TItem extends object>(
|
|
10
|
+
data: TItem[],
|
|
11
|
+
filters: PivotFilter<TItem>[] | undefined,
|
|
12
|
+
filterState: FilterState,
|
|
13
|
+
rangeFilterState: RangeFilterState,
|
|
14
|
+
activeDimension: PivotDimension<TItem> | undefined,
|
|
15
|
+
dimensionFilter: string | null,
|
|
16
|
+
searchTerm: string,
|
|
17
|
+
searchFields?: (keyof TItem)[]
|
|
18
|
+
) {
|
|
19
|
+
const filteredData = useMemo(() => {
|
|
20
|
+
let dataWithFilters = applyFilters(data, filters, filterState, rangeFilterState);
|
|
21
|
+
|
|
22
|
+
if (dimensionFilter && activeDimension) {
|
|
23
|
+
dataWithFilters = dataWithFilters.filter((item) => {
|
|
24
|
+
const value = activeDimension.getValue(item);
|
|
25
|
+
const key = toKey(value);
|
|
26
|
+
return key === dimensionFilter;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!searchTerm) {
|
|
31
|
+
return dataWithFilters;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Optimize search by using indexOf instead of includes for better performance
|
|
35
|
+
return dataWithFilters.filter((item) => {
|
|
36
|
+
if (searchFields && searchFields.length) {
|
|
37
|
+
for (const field of searchFields) {
|
|
38
|
+
const value = item[field];
|
|
39
|
+
if (value !== undefined && String(value).toLowerCase().indexOf(searchTerm) !== -1) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Fallback to JSON stringify - less efficient but comprehensive
|
|
47
|
+
return JSON.stringify(item).toLowerCase().indexOf(searchTerm) !== -1;
|
|
48
|
+
});
|
|
49
|
+
}, [data, filters, filterState, rangeFilterState, dimensionFilter, activeDimension, searchFields, searchTerm]);
|
|
50
|
+
|
|
51
|
+
const allGroupsForBuckets = useMemo(() => {
|
|
52
|
+
if (!activeDimension) {
|
|
53
|
+
return [] as PivotGroup<TItem>[];
|
|
54
|
+
}
|
|
55
|
+
const dataWithoutDimensionFilter = applyFilters(data, filters, filterState, rangeFilterState);
|
|
56
|
+
return groupData(dataWithoutDimensionFilter, activeDimension);
|
|
57
|
+
}, [data, filters, filterState, rangeFilterState, activeDimension]);
|
|
58
|
+
|
|
59
|
+
const groupedGroups = useMemo(() => {
|
|
60
|
+
if (!activeDimension) {
|
|
61
|
+
return [] as PivotGroup<TItem>[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (dimensionFilter) {
|
|
65
|
+
const filteredGroup = allGroupsForBuckets.find((group) => group.key === dimensionFilter);
|
|
66
|
+
return filteredGroup ? [filteredGroup] : [];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return groupData(filteredData, activeDimension);
|
|
70
|
+
}, [filteredData, activeDimension, dimensionFilter, allGroupsForBuckets]);
|
|
71
|
+
|
|
72
|
+
const collectionGroup = useMemo(() => {
|
|
73
|
+
if (filteredData.length === 0) {
|
|
74
|
+
return [] as PivotGroup<TItem>[];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Sort by active dimension when in collection mode
|
|
78
|
+
const sortedData = activeDimension
|
|
79
|
+
? [...filteredData].sort((a, b) => {
|
|
80
|
+
const valueA = activeDimension.getValue(a);
|
|
81
|
+
const valueB = activeDimension.getValue(b);
|
|
82
|
+
|
|
83
|
+
// Handle null/undefined
|
|
84
|
+
if (valueA == null && valueB == null) return 0;
|
|
85
|
+
if (valueA == null) return 1;
|
|
86
|
+
if (valueB == null) return -1;
|
|
87
|
+
|
|
88
|
+
// Handle dates
|
|
89
|
+
if (valueA instanceof Date && valueB instanceof Date) {
|
|
90
|
+
return valueA.getTime() - valueB.getTime();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Handle numbers
|
|
94
|
+
if (typeof valueA === 'number' && typeof valueB === 'number') {
|
|
95
|
+
return valueA - valueB;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Handle strings
|
|
99
|
+
return String(valueA).localeCompare(String(valueB));
|
|
100
|
+
})
|
|
101
|
+
: filteredData;
|
|
102
|
+
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
key: 'collection-all',
|
|
106
|
+
label: 'All Events',
|
|
107
|
+
value: null,
|
|
108
|
+
items: sortedData,
|
|
109
|
+
} as PivotGroup<TItem>,
|
|
110
|
+
];
|
|
111
|
+
}, [filteredData, activeDimension]);
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
filteredData,
|
|
115
|
+
allGroupsForBuckets,
|
|
116
|
+
groupedGroups,
|
|
117
|
+
collectionGroup,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useState, useRef, useCallback } from 'react';
|
|
5
|
+
|
|
6
|
+
export function usePanning(
|
|
7
|
+
containerRef: React.RefObject<HTMLDivElement | null>,
|
|
8
|
+
onBackgroundClick?: () => void,
|
|
9
|
+
onScrollChange?: (scroll: { x: number; y: number }) => void
|
|
10
|
+
) {
|
|
11
|
+
const [isPanning, setIsPanning] = useState(false);
|
|
12
|
+
const panStartRef = useRef<{ x: number; y: number; scrollLeft: number; scrollTop: number } | null>(null);
|
|
13
|
+
const velocityRef = useRef({ x: 0, y: 0 });
|
|
14
|
+
const lastMouseRef = useRef<{ x: number; y: number; time: number } | null>(null);
|
|
15
|
+
const inertiaAnimationRef = useRef<number | null>(null);
|
|
16
|
+
const didDragRef = useRef(false);
|
|
17
|
+
const clickedOnBackgroundRef = useRef(false);
|
|
18
|
+
|
|
19
|
+
const stopInertia = useCallback(() => {
|
|
20
|
+
if (inertiaAnimationRef.current) {
|
|
21
|
+
cancelAnimationFrame(inertiaAnimationRef.current);
|
|
22
|
+
inertiaAnimationRef.current = null;
|
|
23
|
+
}
|
|
24
|
+
}, []);
|
|
25
|
+
|
|
26
|
+
const handlePanStart = useCallback((e: React.MouseEvent | MouseEvent, isExplicitlyOnCard?: boolean) => {
|
|
27
|
+
const container = containerRef.current;
|
|
28
|
+
if (!container) return;
|
|
29
|
+
|
|
30
|
+
stopInertia();
|
|
31
|
+
|
|
32
|
+
const target = e.target as HTMLElement;
|
|
33
|
+
// Check if explicitly on card (from Pixi) or via DOM (fallback)
|
|
34
|
+
const isOnCard = isExplicitlyOnCard ?? !!target.closest('.pv-card');
|
|
35
|
+
|
|
36
|
+
clickedOnBackgroundRef.current = !isOnCard;
|
|
37
|
+
didDragRef.current = false;
|
|
38
|
+
velocityRef.current = { x: 0, y: 0 };
|
|
39
|
+
|
|
40
|
+
if (e.button === 1 || (e.button === 0 && (e.altKey || !isOnCard))) {
|
|
41
|
+
if (!isOnCard) {
|
|
42
|
+
(e as any).preventDefault?.();
|
|
43
|
+
}
|
|
44
|
+
setIsPanning(true);
|
|
45
|
+
panStartRef.current = {
|
|
46
|
+
x: e.clientX,
|
|
47
|
+
y: e.clientY,
|
|
48
|
+
scrollLeft: container.scrollLeft,
|
|
49
|
+
scrollTop: container.scrollTop,
|
|
50
|
+
};
|
|
51
|
+
lastMouseRef.current = { x: e.clientX, y: e.clientY, time: performance.now() };
|
|
52
|
+
}
|
|
53
|
+
}, [containerRef, stopInertia]);
|
|
54
|
+
|
|
55
|
+
const handlePanMove = useCallback((e: React.MouseEvent | MouseEvent) => {
|
|
56
|
+
const panStart = panStartRef.current;
|
|
57
|
+
if (!isPanning || !panStart) return;
|
|
58
|
+
|
|
59
|
+
const dx = e.clientX - panStart.x;
|
|
60
|
+
const dy = e.clientY - panStart.y;
|
|
61
|
+
|
|
62
|
+
// Mark as dragged if moved more than 3 pixels
|
|
63
|
+
if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {
|
|
64
|
+
didDragRef.current = true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Camera moves opposite to drag direction
|
|
68
|
+
const newCameraX = panStart.scrollLeft - dx;
|
|
69
|
+
const newCameraY = panStart.scrollTop - dy;
|
|
70
|
+
|
|
71
|
+
// Update camera position
|
|
72
|
+
// Update container scroll directly so the visual camera follows the drag
|
|
73
|
+
const container = containerRef.current;
|
|
74
|
+
if (container) {
|
|
75
|
+
container.scrollLeft = Math.max(0, Math.round(newCameraX));
|
|
76
|
+
container.scrollTop = Math.max(0, Math.round(newCameraY));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Also notify parent about scroll change (keeps external state in sync)
|
|
80
|
+
if (onScrollChange) {
|
|
81
|
+
onScrollChange({ x: container ? container.scrollLeft : newCameraX, y: container ? container.scrollTop : newCameraY });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Track velocity for inertia
|
|
85
|
+
const now = performance.now();
|
|
86
|
+
const last = lastMouseRef.current;
|
|
87
|
+
if (last) {
|
|
88
|
+
const dt = now - last.time;
|
|
89
|
+
if (dt > 0 && dt < 50) {
|
|
90
|
+
const instantVx = (last.x - e.clientX) / dt;
|
|
91
|
+
const instantVy = (last.y - e.clientY) / dt;
|
|
92
|
+
velocityRef.current = {
|
|
93
|
+
x: velocityRef.current.x * 0.5 + instantVx * 0.5,
|
|
94
|
+
y: velocityRef.current.y * 0.5 + instantVy * 0.5,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
lastMouseRef.current = { x: e.clientX, y: e.clientY, time: now };
|
|
99
|
+
}, [isPanning, containerRef, onScrollChange]);
|
|
100
|
+
|
|
101
|
+
const handlePanEnd = useCallback(() => {
|
|
102
|
+
const wasPanning = isPanning;
|
|
103
|
+
const velocity = { ...velocityRef.current };
|
|
104
|
+
|
|
105
|
+
setIsPanning(false);
|
|
106
|
+
panStartRef.current = null;
|
|
107
|
+
|
|
108
|
+
// If clicked on background and didn't drag, trigger deselect
|
|
109
|
+
if (clickedOnBackgroundRef.current && !didDragRef.current && onBackgroundClick) {
|
|
110
|
+
onBackgroundClick();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (!wasPanning) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const container = containerRef.current;
|
|
118
|
+
if (!container) {
|
|
119
|
+
lastMouseRef.current = null;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const speed = Math.sqrt(velocity.x * velocity.x + velocity.y * velocity.y);
|
|
124
|
+
|
|
125
|
+
// Start inertia if moving fast enough
|
|
126
|
+
if (speed > 0.3) {
|
|
127
|
+
let vx = velocity.x * 16;
|
|
128
|
+
let vy = velocity.y * 16;
|
|
129
|
+
|
|
130
|
+
const animate = () => {
|
|
131
|
+
const currentSpeed = Math.sqrt(vx * vx + vy * vy);
|
|
132
|
+
|
|
133
|
+
if (currentSpeed < 0.5) {
|
|
134
|
+
inertiaAnimationRef.current = null;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
container.scrollLeft += vx;
|
|
139
|
+
container.scrollTop += vy;
|
|
140
|
+
|
|
141
|
+
// Decay
|
|
142
|
+
vx *= 0.95;
|
|
143
|
+
vy *= 0.95;
|
|
144
|
+
|
|
145
|
+
inertiaAnimationRef.current = requestAnimationFrame(animate);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
inertiaAnimationRef.current = requestAnimationFrame(animate);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
lastMouseRef.current = null;
|
|
152
|
+
}, [isPanning, containerRef, onBackgroundClick]);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
isPanning,
|
|
156
|
+
handlePanStart,
|
|
157
|
+
handlePanMove,
|
|
158
|
+
handlePanEnd,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|