@cratis/components 4.21.0 → 4.22.0
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/MIGRATION.md +3 -3
- package/compat-manifest.json +16 -16
- package/dist/esm/Canvas/Canvas.d.ts +12 -81
- package/dist/esm/Canvas/Canvas.d.ts.map +1 -1
- package/dist/esm/Canvas/Canvas.js +83 -676
- package/dist/esm/Canvas/Canvas.js.map +1 -1
- package/dist/esm/Canvas/CanvasCaptureAttributes.d.ts +10 -0
- package/dist/esm/Canvas/CanvasCaptureAttributes.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasCaptureAttributes.js +4 -0
- package/dist/esm/Canvas/CanvasCaptureAttributes.js.map +1 -0
- package/dist/esm/Canvas/CanvasContext.d.ts +9 -0
- package/dist/esm/Canvas/CanvasContext.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasContext.js +4 -0
- package/dist/esm/Canvas/CanvasContext.js.map +1 -0
- package/dist/esm/Canvas/CanvasHandle.d.ts +13 -0
- package/dist/esm/Canvas/CanvasHandle.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasHandle.js +4 -0
- package/dist/esm/Canvas/CanvasHandle.js.map +1 -0
- package/dist/esm/Canvas/CanvasItem.js +4 -1
- package/dist/esm/Canvas/CanvasItem.js.map +1 -1
- package/dist/esm/Canvas/CanvasItemData.d.ts +10 -0
- package/dist/esm/Canvas/CanvasItemData.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemData.js +4 -0
- package/dist/esm/Canvas/CanvasItemData.js.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.d.ts +5 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.js +6 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.js.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.d.ts +26 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.js +4 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.js.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.d.ts +19 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.js +4 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.js.map +1 -0
- package/dist/esm/Canvas/WebKitGestureEvent.d.ts +13 -0
- package/dist/esm/Canvas/WebKitGestureEvent.d.ts.map +1 -0
- package/dist/esm/Canvas/WebKitGestureEvent.js +4 -0
- package/dist/esm/Canvas/WebKitGestureEvent.js.map +1 -0
- package/dist/esm/Canvas/canvasEasing.d.ts +8 -0
- package/dist/esm/Canvas/canvasEasing.d.ts.map +1 -0
- package/dist/esm/Canvas/canvasEasing.js +8 -0
- package/dist/esm/Canvas/canvasEasing.js.map +1 -0
- package/dist/esm/Canvas/canvasGestureTuning.d.ts +6 -0
- package/dist/esm/Canvas/canvasGestureTuning.d.ts.map +1 -0
- package/dist/esm/Canvas/canvasGestureTuning.js +7 -0
- package/dist/esm/Canvas/canvasGestureTuning.js.map +1 -0
- package/dist/esm/Canvas/index.js +2 -1
- package/dist/esm/Canvas/index.js.map +1 -1
- package/dist/esm/Canvas/shapes/Region/Region.js +4 -1
- package/dist/esm/Canvas/shapes/Region/Region.js.map +1 -1
- package/dist/esm/Canvas/useCanvasCamera.d.ts +37 -0
- package/dist/esm/Canvas/useCanvasCamera.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasCamera.js +79 -0
- package/dist/esm/Canvas/useCanvasCamera.js.map +1 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.d.ts +14 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.js +59 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.js.map +1 -0
- package/dist/esm/Canvas/useCanvasNavigation.d.ts +36 -0
- package/dist/esm/Canvas/useCanvasNavigation.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasNavigation.js +186 -0
- package/dist/esm/Canvas/useCanvasNavigation.js.map +1 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.d.ts +34 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.js +178 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.js.map +1 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.d.ts +23 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.js +146 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.js.map +1 -0
- package/dist/esm/Canvas/useLatestRef.d.ts +8 -0
- package/dist/esm/Canvas/useLatestRef.d.ts.map +1 -0
- package/dist/esm/Canvas/useLatestRef.js +12 -0
- package/dist/esm/Canvas/useLatestRef.js.map +1 -0
- package/dist/esm/Canvas/usePixiApplication.d.ts +32 -0
- package/dist/esm/Canvas/usePixiApplication.d.ts.map +1 -0
- package/dist/esm/Canvas/usePixiApplication.js +92 -0
- package/dist/esm/Canvas/usePixiApplication.js.map +1 -0
- package/dist/esm/Canvas/usePixiItems.d.ts +19 -0
- package/dist/esm/Canvas/usePixiItems.d.ts.map +1 -0
- package/dist/esm/Canvas/usePixiItems.js +49 -0
- package/dist/esm/Canvas/usePixiItems.js.map +1 -0
- package/dist/esm/Chat/ChatSidebar.d.ts.map +1 -1
- package/dist/esm/Chat/ChatSidebar.js +1 -1
- package/dist/esm/Chat/ChatSidebar.js.map +1 -1
- package/dist/esm/ClassNames/classNames.d.ts +7 -0
- package/dist/esm/ClassNames/classNames.d.ts.map +1 -0
- package/dist/esm/ClassNames/classNames.js +4 -0
- package/dist/esm/ClassNames/classNames.js.map +1 -0
- package/dist/esm/Common/Breadcrumbs.d.ts.map +1 -1
- package/dist/esm/Common/Breadcrumbs.js +1 -1
- package/dist/esm/Common/Breadcrumbs.js.map +1 -1
- package/dist/esm/Common/ComboBox.d.ts.map +1 -1
- package/dist/esm/Common/ComboBox.js +1 -1
- package/dist/esm/Common/ComboBox.js.map +1 -1
- package/dist/esm/Common/DatePickerInputImplementation.d.ts.map +1 -1
- package/dist/esm/Common/DatePickerInputImplementation.js +1 -1
- package/dist/esm/Common/DatePickerInputImplementation.js.map +1 -1
- package/dist/esm/Common/NumberInput.d.ts.map +1 -1
- package/dist/esm/Common/NumberInput.js +1 -1
- package/dist/esm/Common/NumberInput.js.map +1 -1
- package/dist/esm/Common/Tabs.d.ts.map +1 -1
- package/dist/esm/Common/Tabs.js +1 -1
- package/dist/esm/Common/Tabs.js.map +1 -1
- package/dist/esm/Common/TagGroup.d.ts.map +1 -1
- package/dist/esm/Common/TagGroup.js +1 -1
- package/dist/esm/Common/TagGroup.js.map +1 -1
- package/dist/esm/Common/ToggleGroup.d.ts.map +1 -1
- package/dist/esm/Common/ToggleGroup.js +1 -1
- package/dist/esm/Common/ToggleGroup.js.map +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.d.ts.map +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.js +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.js.map +1 -1
- package/dist/esm/DataTables/DataTableBody.d.ts +22 -0
- package/dist/esm/DataTables/DataTableBody.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableBody.js +10 -0
- package/dist/esm/DataTables/DataTableBody.js.map +1 -0
- package/dist/esm/DataTables/DataTableCore.d.ts +8 -48
- package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableCore.js +50 -278
- package/dist/esm/DataTables/DataTableCore.js.map +1 -1
- package/dist/esm/DataTables/DataTableHeaderCell.d.ts +25 -0
- package/dist/esm/DataTables/DataTableHeaderCell.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableHeaderCell.js +26 -0
- package/dist/esm/DataTables/DataTableHeaderCell.js.map +1 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.d.ts +12 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.js +4 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.js.map +1 -0
- package/dist/esm/DataTables/DataTableMessages.d.ts +12 -0
- package/dist/esm/DataTables/DataTableMessages.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableMessages.js +4 -0
- package/dist/esm/DataTables/DataTableMessages.js.map +1 -0
- package/dist/esm/DataTables/DataTableParts.d.ts +40 -0
- package/dist/esm/DataTables/DataTableParts.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableParts.js +4 -0
- package/dist/esm/DataTables/DataTableParts.js.map +1 -0
- package/dist/esm/DataTables/DataTableRow.d.ts +22 -0
- package/dist/esm/DataTables/DataTableRow.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableRow.js +25 -0
- package/dist/esm/DataTables/DataTableRow.js.map +1 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.d.ts +8 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.js +4 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.js.map +1 -0
- package/dist/esm/DataTables/DataTableSearch.d.ts +13 -0
- package/dist/esm/DataTables/DataTableSearch.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableSearch.js +7 -0
- package/dist/esm/DataTables/DataTableSearch.js.map +1 -0
- package/dist/esm/DataTables/DataTableState.d.ts +18 -0
- package/dist/esm/DataTables/DataTableState.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableState.js +4 -0
- package/dist/esm/DataTables/DataTableState.js.map +1 -0
- package/dist/esm/DataTables/DataTableStateProps.d.ts +20 -0
- package/dist/esm/DataTables/DataTableStateProps.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableStateProps.js +4 -0
- package/dist/esm/DataTables/DataTableStateProps.js.map +1 -0
- package/dist/esm/DataTables/ProcessedRow.d.ts +8 -0
- package/dist/esm/DataTables/ProcessedRow.d.ts.map +1 -0
- package/dist/esm/DataTables/ProcessedRow.js +4 -0
- package/dist/esm/DataTables/ProcessedRow.js.map +1 -0
- package/dist/esm/DataTables/RowProcessingState.d.ts +17 -0
- package/dist/esm/DataTables/RowProcessingState.d.ts.map +1 -0
- package/dist/esm/DataTables/RowProcessingState.js +4 -0
- package/dist/esm/DataTables/RowProcessingState.js.map +1 -0
- package/dist/esm/DataTables/RowSelection.d.ts +19 -0
- package/dist/esm/DataTables/RowSelection.d.ts.map +1 -0
- package/dist/esm/DataTables/RowSelection.js +4 -0
- package/dist/esm/DataTables/RowSelection.js.map +1 -0
- package/dist/esm/DataTables/RowSelectionSource.d.ts +16 -0
- package/dist/esm/DataTables/RowSelectionSource.d.ts.map +1 -0
- package/dist/esm/DataTables/RowSelectionSource.js +4 -0
- package/dist/esm/DataTables/RowSelectionSource.js.map +1 -0
- package/dist/esm/DataTables/matchesFilterEntry.d.ts +15 -0
- package/dist/esm/DataTables/matchesFilterEntry.d.ts.map +1 -0
- package/dist/esm/DataTables/matchesFilterEntry.js +70 -0
- package/dist/esm/DataTables/matchesFilterEntry.js.map +1 -0
- package/dist/esm/DataTables/processRows.d.ts +10 -0
- package/dist/esm/DataTables/processRows.d.ts.map +1 -0
- package/dist/esm/DataTables/processRows.js +42 -0
- package/dist/esm/DataTables/processRows.js.map +1 -0
- package/dist/esm/DataTables/useDataTableMessages.d.ts +9 -0
- package/dist/esm/DataTables/useDataTableMessages.d.ts.map +1 -0
- package/dist/esm/DataTables/useDataTableMessages.js +33 -0
- package/dist/esm/DataTables/useDataTableMessages.js.map +1 -0
- package/dist/esm/DataTables/useDataTableState.d.ts +10 -0
- package/dist/esm/DataTables/useDataTableState.d.ts.map +1 -0
- package/dist/esm/DataTables/useDataTableState.js +19 -0
- package/dist/esm/DataTables/useDataTableState.js.map +1 -0
- package/dist/esm/DataTables/useRowSelection.d.ts +9 -0
- package/dist/esm/DataTables/useRowSelection.d.ts.map +1 -0
- package/dist/esm/DataTables/useRowSelection.js +87 -0
- package/dist/esm/DataTables/useRowSelection.js.map +1 -0
- package/dist/esm/DataTables/valueAtPath.d.ts +10 -0
- package/dist/esm/DataTables/valueAtPath.d.ts.map +1 -0
- package/dist/esm/DataTables/valueAtPath.js +18 -0
- package/dist/esm/DataTables/valueAtPath.js.map +1 -0
- package/dist/esm/Dialogs/DialogImplementation.d.ts.map +1 -1
- package/dist/esm/Dialogs/DialogImplementation.js +1 -1
- package/dist/esm/Dialogs/DialogImplementation.js.map +1 -1
- package/dist/esm/Display/Message.d.ts +8 -1
- package/dist/esm/Display/Message.d.ts.map +1 -1
- package/dist/esm/Display/Message.js +1 -1
- package/dist/esm/Display/Message.js.map +1 -1
- package/dist/esm/Dropdown/DropdownImplementation.d.ts.map +1 -1
- package/dist/esm/Dropdown/DropdownImplementation.js +1 -1
- package/dist/esm/Dropdown/DropdownImplementation.js.map +1 -1
- package/dist/esm/Notifications/Toaster.d.ts.map +1 -1
- package/dist/esm/Notifications/Toaster.js +1 -1
- package/dist/esm/Notifications/Toaster.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +7 -50
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.js +34 -433
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvasProps.d.ts +51 -0
- package/dist/esm/PivotViewer/components/PivotCanvasProps.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvasProps.js +4 -0
- package/dist/esm/PivotViewer/components/PivotCanvasProps.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.d.ts +16 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.js +4 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.d.ts +19 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.js +4 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.d.ts +21 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.js +4 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.js +6 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.js +1 -1
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.d.ts +22 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.js +25 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.js +53 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.js +100 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.d.ts +7 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.js +35 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.js +123 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.d.ts +21 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.js +171 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.d.ts +13 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.js +31 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.js.map +1 -0
- package/dist/esm/TimeMachine/EventsView.d.ts.map +1 -1
- package/dist/esm/TimeMachine/EventsView.js +1 -1
- package/dist/esm/TimeMachine/EventsView.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,170 +1,61 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import React, { useId, useMemo
|
|
3
|
-
import 'react-aria-components/I18nProvider';
|
|
4
|
-
import 'ts-deepmerge';
|
|
5
|
-
import 'react-dom';
|
|
6
|
-
import { useCratisComponentsConfig } from '../configuration/CratisComponentsContext.js';
|
|
2
|
+
import React, { useId, useMemo } from 'react';
|
|
7
3
|
import { useCratisIcon } from '../configuration/useCratisIcon.js';
|
|
8
|
-
import '../
|
|
9
|
-
import '
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { DataTableStatus } from './DataTableStatus.js';
|
|
14
|
-
import { DataTableSortDirection } from './DataTableSortDirection.js';
|
|
4
|
+
import { classNames } from '../ClassNames/classNames.js';
|
|
5
|
+
import { DataTableHeaderCell } from './DataTableHeaderCell.js';
|
|
6
|
+
import { DataTableBody } from './DataTableBody.js';
|
|
7
|
+
import { DataTableRow } from './DataTableRow.js';
|
|
8
|
+
import { DataTableSearch } from './DataTableSearch.js';
|
|
15
9
|
import { DataTableRowProcessing } from './DataTableRowProcessing.js';
|
|
16
|
-
import {
|
|
10
|
+
import { DataTableStatus } from './DataTableStatus.js';
|
|
11
|
+
import { processRows } from './processRows.js';
|
|
12
|
+
import { useDataTableMessages } from './useDataTableMessages.js';
|
|
13
|
+
import { useDataTableState } from './useDataTableState.js';
|
|
14
|
+
import { useRowSelection } from './useRowSelection.js';
|
|
17
15
|
|
|
18
16
|
const useColumns = (children) => useMemo(() => React.Children.toArray(children).filter(React.isValidElement), [children]);
|
|
19
|
-
const asCellValue = (value) => typeof value === 'function' ? String(value) : value;
|
|
20
|
-
const valueAtPath = (row, path) => {
|
|
21
|
-
if (!path)
|
|
22
|
-
return undefined;
|
|
23
|
-
let current = row;
|
|
24
|
-
for (const segment of path.split('.')) {
|
|
25
|
-
if (current === null || typeof current !== 'object')
|
|
26
|
-
return undefined;
|
|
27
|
-
const record = current;
|
|
28
|
-
if (!Object.hasOwn(record, segment))
|
|
29
|
-
return undefined;
|
|
30
|
-
current = asCellValue(record[segment]);
|
|
31
|
-
}
|
|
32
|
-
return current;
|
|
33
|
-
};
|
|
34
|
-
const renderCellContent = (column, row) => {
|
|
35
|
-
if (column.body)
|
|
36
|
-
return column.body(row);
|
|
37
|
-
const value = valueAtPath(row, column.field);
|
|
38
|
-
return value == null ? '' : String(value);
|
|
39
|
-
};
|
|
40
|
-
const dateNumber = (value) => {
|
|
41
|
-
const date = value instanceof Date ? new Date(value.getTime()) : new Date(String(value));
|
|
42
|
-
return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);
|
|
43
|
-
};
|
|
44
|
-
const firstConstraint = (entry) => entry && 'constraints' in entry ? entry.constraints[0] : entry;
|
|
45
|
-
const builtInMatches = (value, constraint) => {
|
|
46
|
-
const filter = constraint.value;
|
|
47
|
-
const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;
|
|
48
|
-
if (filter === null || filter === undefined || filter === '')
|
|
49
|
-
return true;
|
|
50
|
-
const valueText = String(value ?? '').toLocaleLowerCase();
|
|
51
|
-
const filterText = String(filter).toLocaleLowerCase();
|
|
52
|
-
const valueNumber = typeof value === 'number' ? value : Number(value);
|
|
53
|
-
const filterNumber = typeof filter === 'number' ? filter : Number(filter);
|
|
54
|
-
switch (mode) {
|
|
55
|
-
case DataTableFilterMatchMode.StartsWith:
|
|
56
|
-
return valueText.startsWith(filterText);
|
|
57
|
-
case DataTableFilterMatchMode.Contains:
|
|
58
|
-
return valueText.includes(filterText);
|
|
59
|
-
case DataTableFilterMatchMode.NotContains:
|
|
60
|
-
return !valueText.includes(filterText);
|
|
61
|
-
case DataTableFilterMatchMode.EndsWith:
|
|
62
|
-
return valueText.endsWith(filterText);
|
|
63
|
-
case DataTableFilterMatchMode.Equals:
|
|
64
|
-
return Object.is(value, filter) || valueText === filterText;
|
|
65
|
-
case DataTableFilterMatchMode.NotEquals:
|
|
66
|
-
return !(Object.is(value, filter) || valueText === filterText);
|
|
67
|
-
case DataTableFilterMatchMode.In:
|
|
68
|
-
return Array.isArray(filter) && filter.some((item) => Object.is(item, value));
|
|
69
|
-
case DataTableFilterMatchMode.Between:
|
|
70
|
-
return (Array.isArray(filter) &&
|
|
71
|
-
filter.length >= 2 &&
|
|
72
|
-
valueNumber >= Number(filter[0]) &&
|
|
73
|
-
valueNumber <= Number(filter[1]));
|
|
74
|
-
case DataTableFilterMatchMode.LessThan:
|
|
75
|
-
return valueNumber < filterNumber;
|
|
76
|
-
case DataTableFilterMatchMode.LessThanOrEqual:
|
|
77
|
-
return valueNumber <= filterNumber;
|
|
78
|
-
case DataTableFilterMatchMode.GreaterThan:
|
|
79
|
-
return valueNumber > filterNumber;
|
|
80
|
-
case DataTableFilterMatchMode.GreaterThanOrEqual:
|
|
81
|
-
return valueNumber >= filterNumber;
|
|
82
|
-
case DataTableFilterMatchMode.DateIs:
|
|
83
|
-
return dateNumber(value) === dateNumber(filter);
|
|
84
|
-
case DataTableFilterMatchMode.DateIsNot:
|
|
85
|
-
return dateNumber(value) !== dateNumber(filter);
|
|
86
|
-
case DataTableFilterMatchMode.DateBefore:
|
|
87
|
-
return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);
|
|
88
|
-
case DataTableFilterMatchMode.DateAfter:
|
|
89
|
-
return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);
|
|
90
|
-
default:
|
|
91
|
-
return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
const matchesFilterEntry = (value, entry) => {
|
|
95
|
-
if (!('constraints' in entry))
|
|
96
|
-
return builtInMatches(value, entry);
|
|
97
|
-
if (entry.constraints.length === 0)
|
|
98
|
-
return true;
|
|
99
|
-
const matches = entry.constraints.map((constraint) => builtInMatches(value, constraint));
|
|
100
|
-
return entry.operator?.toLowerCase() === 'or'
|
|
101
|
-
? matches.some(Boolean)
|
|
102
|
-
: matches.every(Boolean);
|
|
103
|
-
};
|
|
104
|
-
const compareValues = (left, right) => {
|
|
105
|
-
if (typeof left === 'number' && typeof right === 'number')
|
|
106
|
-
return left - right;
|
|
107
|
-
if (left instanceof Date && right instanceof Date)
|
|
108
|
-
return left.getTime() - right.getTime();
|
|
109
|
-
return String(left ?? '').localeCompare(String(right ?? ''), undefined, {
|
|
110
|
-
numeric: true,
|
|
111
|
-
sensitivity: 'base',
|
|
112
|
-
});
|
|
113
|
-
};
|
|
114
|
-
const classNames = (...values) => values.filter(Boolean).join(' ');
|
|
115
17
|
const DataTableCore = ({ data, children, dataKey, emptyMessage, status = DataTableStatus.Ready, loadingMessage, failureMessage, unauthorizedMessage, selectionMode, selectionAriaLabel, selectAllAriaLabel, selection, onSelectionChange, selectedItems, onSelectedItemsChange, onRowClick, rowClassName, globalFilterFields, globalSearchPlaceholder, globalSearchAriaLabel, defaultFilters, filters: filtersProp, onFilter, globalFilter: globalFilterProp, onGlobalFilterChange, sort: sortProp, onSortChange, rowProcessing = DataTableRowProcessing.Loaded, scrollable, scrollHeight, className, style, pt, }) => {
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
18
|
+
const messages = useDataTableMessages({
|
|
19
|
+
selectionAriaLabel,
|
|
20
|
+
selectAllAriaLabel,
|
|
21
|
+
globalSearchPlaceholder,
|
|
22
|
+
globalSearchAriaLabel,
|
|
23
|
+
loadingMessage,
|
|
24
|
+
failureMessage,
|
|
25
|
+
unauthorizedMessage,
|
|
26
|
+
});
|
|
27
|
+
const { resolvedSelectionAriaLabel, resolvedSelectAllAriaLabel, resolvedGlobalSearchPlaceholder, resolvedGlobalSearchAriaLabel, } = messages;
|
|
126
28
|
const isBusy = status === DataTableStatus.Loading && data.length > 0;
|
|
127
29
|
const icon = useCratisIcon();
|
|
128
30
|
const sortAscendingIcon = icon('sortAscending', '▲');
|
|
129
31
|
const sortDescendingIcon = icon('sortDescending', '▼');
|
|
130
32
|
const columns = useColumns(children);
|
|
131
33
|
const selectionGroupName = useId();
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return sort.direction === 'ascending' ? comparison : -comparison;
|
|
158
|
-
});
|
|
159
|
-
}, [data, filters, globalFilter, globalFilterFields, sort, rowProcessing]);
|
|
160
|
-
const updateFilter = (field, constraint) => {
|
|
161
|
-
const next = { ...filters };
|
|
162
|
-
if (constraint)
|
|
163
|
-
next[field] = constraint;
|
|
164
|
-
else
|
|
165
|
-
delete next[field];
|
|
166
|
-
setFilters(next);
|
|
167
|
-
};
|
|
34
|
+
const { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort } = useDataTableState({
|
|
35
|
+
defaultFilters,
|
|
36
|
+
filters: filtersProp,
|
|
37
|
+
onFilter,
|
|
38
|
+
globalFilter: globalFilterProp,
|
|
39
|
+
onGlobalFilterChange,
|
|
40
|
+
sort: sortProp,
|
|
41
|
+
onSortChange,
|
|
42
|
+
});
|
|
43
|
+
const filteredRows = useMemo(() => processRows(data, {
|
|
44
|
+
filters,
|
|
45
|
+
globalFilter,
|
|
46
|
+
globalFilterFields,
|
|
47
|
+
sort,
|
|
48
|
+
rowProcessing,
|
|
49
|
+
}), [data, filters, globalFilter, globalFilterFields, sort, rowProcessing]);
|
|
50
|
+
const { dataKeyIdentity, isSelectedRow, isRowSelected, toggleRowSelection, allFilteredRowsSelected, selectAllRef, toggleSelectAll, } = useRowSelection({
|
|
51
|
+
data,
|
|
52
|
+
visibleRows: filteredRows.map(({ row }) => row),
|
|
53
|
+
dataKey,
|
|
54
|
+
selection,
|
|
55
|
+
selectedItems,
|
|
56
|
+
onSelectedItemsChange,
|
|
57
|
+
});
|
|
58
|
+
const isInteractive = Boolean(onRowClick) || selectionMode === 'single' || selectionMode === 'multiple';
|
|
168
59
|
const activateRow = (row, index, originalEvent) => {
|
|
169
60
|
onRowClick?.({ data: row, index });
|
|
170
61
|
if (selectionMode === 'single') {
|
|
@@ -174,138 +65,19 @@ const DataTableCore = ({ data, children, dataKey, emptyMessage, status = DataTab
|
|
|
174
65
|
toggleRowSelection(row);
|
|
175
66
|
}
|
|
176
67
|
};
|
|
177
|
-
|
|
178
|
-
const dataKeyCounts = useMemo(() => {
|
|
179
|
-
const counts = new Map();
|
|
180
|
-
if (!dataKey)
|
|
181
|
-
return counts;
|
|
182
|
-
for (const row of data) {
|
|
183
|
-
const identity = String(valueAtPath(row, dataKey));
|
|
184
|
-
counts.set(identity, (counts.get(identity) ?? 0) + 1);
|
|
185
|
-
}
|
|
186
|
-
return counts;
|
|
187
|
-
}, [data, dataKey]);
|
|
188
|
-
const firstLoadedIndexByDataKey = useMemo(() => {
|
|
189
|
-
const indices = new Map();
|
|
190
|
-
if (!dataKey)
|
|
191
|
-
return indices;
|
|
192
|
-
data.forEach((row, loadedIndex) => {
|
|
193
|
-
const identity = String(valueAtPath(row, dataKey));
|
|
194
|
-
if (!indices.has(identity))
|
|
195
|
-
indices.set(identity, loadedIndex);
|
|
196
|
-
});
|
|
197
|
-
return indices;
|
|
198
|
-
}, [data, dataKey]);
|
|
199
|
-
const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;
|
|
200
|
-
const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;
|
|
201
|
-
const isSelectedRow = (row, loadedIndex) => {
|
|
202
|
-
if (!selection)
|
|
203
|
-
return false;
|
|
204
|
-
if (!dataKey)
|
|
205
|
-
return loadedIndex === selectedLoadedIndex;
|
|
206
|
-
const identity = dataKeyIdentity(row);
|
|
207
|
-
if (identity !== selectedDataKey)
|
|
208
|
-
return false;
|
|
209
|
-
if ((dataKeyCounts.get(identity) ?? 0) <= 1)
|
|
210
|
-
return true;
|
|
211
|
-
if (selectedLoadedIndex >= 0)
|
|
212
|
-
return loadedIndex === selectedLoadedIndex;
|
|
213
|
-
return loadedIndex === firstLoadedIndexByDataKey.get(identity);
|
|
214
|
-
};
|
|
215
|
-
const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);
|
|
216
|
-
const isRowSelected = (row) => dataKey
|
|
217
|
-
? selectedItemsList.some((selected) => dataKeyIdentity(selected) === dataKeyIdentity(row))
|
|
218
|
-
: selectedItemsList.includes(row);
|
|
219
|
-
const toggleRowSelection = (row) => {
|
|
220
|
-
const next = isRowSelected(row)
|
|
221
|
-
? selectedItemsList.filter((selected) => dataKey
|
|
222
|
-
? dataKeyIdentity(selected) !== dataKeyIdentity(row)
|
|
223
|
-
: selected !== row)
|
|
224
|
-
: [...selectedItemsList, row];
|
|
225
|
-
onSelectedItemsChange?.(next);
|
|
226
|
-
};
|
|
227
|
-
const visibleRows = filteredRows.map(({ row }) => row);
|
|
228
|
-
const isVisibleRow = (row) => dataKey
|
|
229
|
-
? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))
|
|
230
|
-
: visibleRows.includes(row);
|
|
231
|
-
const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;
|
|
232
|
-
const allFilteredRowsSelected = visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;
|
|
233
|
-
const someFilteredRowsSelected = selectedVisibleCount > 0 && !allFilteredRowsSelected;
|
|
234
|
-
const selectAllRef = useRef(null);
|
|
235
|
-
useEffect(() => {
|
|
236
|
-
if (selectAllRef.current) {
|
|
237
|
-
selectAllRef.current.indeterminate = someFilteredRowsSelected;
|
|
238
|
-
}
|
|
239
|
-
}, [someFilteredRowsSelected]);
|
|
240
|
-
const toggleSelectAll = () => {
|
|
241
|
-
if (allFilteredRowsSelected) {
|
|
242
|
-
onSelectedItemsChange?.(selectedItemsList.filter((selected) => !isVisibleRow(selected)));
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
const additions = visibleRows.filter((row) => !isRowSelected(row));
|
|
246
|
-
onSelectedItemsChange?.([...selectedItemsList, ...additions]);
|
|
247
|
-
};
|
|
248
|
-
return (jsxs("div", { ...pt?.root, className: classNames('cratis-datatable', scrollable ? 'cratis-datatable--scrollable' : undefined, pt?.root?.className, className), style: { ...pt?.root?.style, ...style }, "data-cratis-part": 'root', "data-busy": isBusy || undefined, children: [!!globalFilterFields?.length && (jsx("div", { ...pt?.search, className: classNames('cratis-datatable-search', pt?.search?.className), "data-cratis-part": 'search', children: jsx("input", { ...pt?.searchInput, value: globalFilter, placeholder: resolvedGlobalSearchPlaceholder, "aria-label": resolvedGlobalSearchAriaLabel, className: classNames('cratis-datatable-search__input', pt?.searchInput?.className), "data-cratis-part": 'search-input', onChange: (event) => setGlobalFilter(event.target.value) }) })), jsx("div", { ...pt?.tableContainer, className: classNames('cratis-datatable__container', pt?.tableContainer?.className), style: {
|
|
68
|
+
return (jsxs("div", { ...pt?.root, className: classNames('cratis-datatable', scrollable ? 'cratis-datatable--scrollable' : undefined, pt?.root?.className, className), style: { ...pt?.root?.style, ...style }, "data-cratis-part": 'root', "data-busy": isBusy || undefined, children: [!!globalFilterFields?.length && (jsx(DataTableSearch, { parts: pt, value: globalFilter, placeholder: resolvedGlobalSearchPlaceholder, ariaLabel: resolvedGlobalSearchAriaLabel, onChange: setGlobalFilter })), jsx("div", { ...pt?.tableContainer, className: classNames('cratis-datatable__container', pt?.tableContainer?.className), style: {
|
|
249
69
|
...pt?.tableContainer?.style,
|
|
250
70
|
...(scrollable
|
|
251
71
|
? { maxHeight: scrollHeight ?? '100%', overflow: 'auto' }
|
|
252
72
|
: {}),
|
|
253
|
-
}, "data-cratis-part": 'table-container', children: jsxs("table", { ...pt?.table, className: classNames('cratis-datatable__table', pt?.table?.className), "data-cratis-part": 'table', "aria-busy": isBusy || undefined, children: [jsx("thead", { ...pt?.head, className: classNames('cratis-datatable__head', pt?.head?.className), "data-cratis-part": 'head', children: jsx("tr", { ...pt?.headerRow, className: classNames('cratis-datatable__header-row', pt?.headerRow?.className), "data-cratis-part": 'header-row', children: columns.map((column, index) => {
|
|
254
|
-
const field = column.props.filterField ?? column.props.field;
|
|
255
|
-
const ariaSort = sort && sort.field === column.props.field
|
|
256
|
-
? sort.direction
|
|
257
|
-
: undefined;
|
|
258
|
-
return (jsx("th", { ...pt?.headerCell, scope: 'col', "aria-label": column.props.selectionMode
|
|
259
|
-
? resolvedSelectionAriaLabel
|
|
260
|
-
: undefined, "aria-sort": ariaSort, style: {
|
|
261
|
-
...pt?.headerCell?.style,
|
|
262
|
-
...column.props.style,
|
|
263
|
-
...column.props.headerStyle,
|
|
264
|
-
}, className: classNames('cratis-datatable__header-cell', pt?.headerCell?.className, column.props.headerClassName), "data-cratis-part": 'header-cell', "data-selected": Boolean(ariaSort) || undefined, children: jsxs("div", { className: 'cratis-datatable-header-cell', "data-cratis-part": 'header-content', "data-selected": Boolean(ariaSort) || undefined, children: [column.props.selectionMode ===
|
|
265
|
-
'multiple' ? (jsx("input", { type: 'checkbox', "aria-label": resolvedSelectAllAriaLabel, "data-cratis-part": 'select-all', checked: allFilteredRowsSelected, ref: selectAllRef, onChange: toggleSelectAll })) : (column.props.selectionMode && (jsx("span", { className: 'cratis-datatable__sr-only', children: resolvedSelectionAriaLabel }))), column.props.sortable &&
|
|
266
|
-
column.props.field ? (jsxs("button", { type: 'button', className: 'cratis-datatable__sort', "data-cratis-part": 'sort', "data-pressed": Boolean(ariaSort) || undefined, onClick: () => setSort({
|
|
267
|
-
field: column.props
|
|
268
|
-
.field,
|
|
269
|
-
direction: sort?.field ===
|
|
270
|
-
column.props.field &&
|
|
271
|
-
sort?.direction ===
|
|
272
|
-
DataTableSortDirection.Ascending
|
|
273
|
-
? DataTableSortDirection.Descending
|
|
274
|
-
: DataTableSortDirection.Ascending,
|
|
275
|
-
}), children: [jsx("span", { children: column.props.header }), ariaSort && (jsx("span", { "aria-hidden": 'true', children: ariaSort === 'ascending'
|
|
276
|
-
? sortAscendingIcon
|
|
277
|
-
: sortDescendingIcon }))] })) : (column.props.header), column.props.filter && field && (jsx(ColumnFilterMenu, { field: field, dataType: column.props.dataType, placeholder: column.props.filterPlaceholder, showMatchModes: column.props.showFilterMatchModes, filterElement: column.props.filterElement, filterOptions: column.props.filterOptions, labels: column.props.filterLabels, pt: column.props.filterPt, constraint: firstConstraint(filters[field]), onApply: (constraint) => updateFilter(field, constraint), onClear: () => updateFilter(field, undefined) }))] }) }, index));
|
|
278
|
-
}) }) }), jsx("tbody", { ...pt?.body, className: classNames('cratis-datatable__body', pt?.body?.className), "data-cratis-part": 'body', children: status === DataTableStatus.Failed ||
|
|
279
|
-
status === DataTableStatus.Unauthorized ? (jsx("tr", { ...pt?.failureRow, className: classNames('cratis-datatable__failure-row', pt?.failureRow?.className), "data-cratis-part": 'failure-row', "data-reason": status, children: jsx("td", { ...pt?.failureCell, colSpan: Math.max(columns.length, 1), className: classNames('cratis-datatable__failure-cell', pt?.failureCell?.className), "data-cratis-part": 'failure-cell', children: jsx("div", { role: 'alert', children: status === DataTableStatus.Failed
|
|
280
|
-
? resolvedFailureMessage
|
|
281
|
-
: resolvedUnauthorizedMessage }) }) }, status)) : status === DataTableStatus.Loading && data.length === 0 ? (jsx("tr", { ...pt?.loadingRow, className: classNames('cratis-datatable__loading-row', pt?.loadingRow?.className), "data-cratis-part": 'loading-row', children: jsx("td", { ...pt?.loadingCell, colSpan: Math.max(columns.length, 1), className: classNames('cratis-datatable__loading-cell', pt?.loadingCell?.className), "data-cratis-part": 'loading-cell', children: jsx("div", { role: 'status', children: resolvedLoadingMessage }) }) }, status)) : filteredRows.length === 0 ? (jsx("tr", { ...pt?.emptyRow, className: classNames('cratis-datatable__empty-row', pt?.emptyRow?.className), "data-cratis-part": 'empty-row', children: jsx("td", { ...pt?.emptyCell, colSpan: Math.max(columns.length, 1), className: classNames('cratis-datatable__empty-cell', pt?.emptyCell?.className), "data-cratis-part": 'empty-cell', children: emptyMessage }) })) : (filteredRows.map(({ row, loadedIndex }) => {
|
|
73
|
+
}, "data-cratis-part": 'table-container', children: jsxs("table", { ...pt?.table, className: classNames('cratis-datatable__table', pt?.table?.className), "data-cratis-part": 'table', "aria-busy": isBusy || undefined, children: [jsx("thead", { ...pt?.head, className: classNames('cratis-datatable__head', pt?.head?.className), "data-cratis-part": 'head', children: jsx("tr", { ...pt?.headerRow, className: classNames('cratis-datatable__header-row', pt?.headerRow?.className), "data-cratis-part": 'header-row', children: columns.map((column, index) => (jsx(DataTableHeaderCell, { column: column, parts: pt, sort: sort, onSort: setSort, filters: filters, updateFilter: updateFilter, resolvedSelectionAriaLabel: resolvedSelectionAriaLabel, resolvedSelectAllAriaLabel: resolvedSelectAllAriaLabel, allFilteredRowsSelected: allFilteredRowsSelected, selectAllRef: selectAllRef, toggleSelectAll: toggleSelectAll, sortAscendingIcon: sortAscendingIcon, sortDescendingIcon: sortDescendingIcon }, index))) }) }), jsx(DataTableBody, { status: status, hasLoadedRows: data.length > 0, rowCount: filteredRows.length, columnCount: columns.length, parts: pt, messages: messages, emptyMessage: emptyMessage, renderRows: () => filteredRows.map(({ row, loadedIndex }) => {
|
|
282
74
|
const identity = dataKey
|
|
283
75
|
? dataKeyIdentity(row)
|
|
284
76
|
: 'loaded-row';
|
|
285
|
-
const rowKey = `${identity}::${loadedIndex}`;
|
|
286
77
|
const isSelected = selectionMode === 'single' &&
|
|
287
78
|
isSelectedRow(row, loadedIndex);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
selectionMode === 'multiple';
|
|
291
|
-
return (jsx("tr", { ...pt?.row, tabIndex: isInteractive ? 0 : pt?.row?.tabIndex, "aria-selected": selectionMode === 'single'
|
|
292
|
-
? isSelected
|
|
293
|
-
: undefined, className: classNames('cratis-datatable__row', pt?.row?.className, rowClassName?.(row)), "data-cratis-part": 'row', "data-selected": isSelected || undefined, "data-interactive": isInteractive || undefined, onClick: (event) => activateRow(row, loadedIndex, event), onKeyDown: (event) => {
|
|
294
|
-
if (event.target !== event.currentTarget ||
|
|
295
|
-
(event.key !== 'Enter' &&
|
|
296
|
-
event.key !== ' ')) {
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
event.preventDefault();
|
|
300
|
-
activateRow(row, loadedIndex, event);
|
|
301
|
-
}, children: columns.map((column, columnIndex) => (jsx("td", { ...pt?.cell, style: {
|
|
302
|
-
...pt?.cell?.style,
|
|
303
|
-
...column.props.style,
|
|
304
|
-
...column.props.bodyStyle,
|
|
305
|
-
}, className: classNames('cratis-datatable__cell', pt?.cell?.className, column.props.bodyClassName ??
|
|
306
|
-
column.props.className), "data-cratis-part": 'cell', "data-selected": isSelected || undefined, children: column.props.selectionMode ===
|
|
307
|
-
'multiple' ? (jsx("input", { type: 'checkbox', "aria-label": resolvedSelectionAriaLabel, checked: isRowSelected(row), onClick: (event) => event.stopPropagation(), onChange: () => toggleRowSelection(row) })) : column.props.selectionMode ? (jsx("input", { type: 'radio', name: selectionGroupName, readOnly: true, tabIndex: -1, "aria-label": resolvedSelectionAriaLabel, checked: isSelected })) : (renderCellContent(column.props, row)) }, columnIndex))) }, rowKey));
|
|
308
|
-
})) })] }) })] }));
|
|
79
|
+
return (jsx(DataTableRow, { row: row, columns: columns, parts: pt, selectionMode: selectionMode, isSelected: isSelected, isInteractive: isInteractive, isRowSelected: isRowSelected(row), rowClassName: rowClassName, resolvedSelectionAriaLabel: resolvedSelectionAriaLabel, selectionGroupName: selectionGroupName, onActivate: (event) => activateRow(row, loadedIndex, event), onToggleSelection: () => toggleRowSelection(row) }, `${identity}::${loadedIndex}`));
|
|
80
|
+
}) })] }) })] }));
|
|
309
81
|
};
|
|
310
82
|
|
|
311
83
|
export { DataTableCore };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTableCore.js","sources":["../../../DataTables/DataTableCore.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, {\n useEffect,\n useId,\n useMemo,\n useRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type TableHTMLAttributes,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport { useCratisIcon } from '../configuration/useCratisIcon';\nimport type { ColumnProps } from './Column';\nimport { ColumnFilterMenu } from './ColumnFilterMenu';\nimport type { DataTableSelectionChangeEvent } from './DataTableSelectionChangeEvent';\nimport {\n DataTableFilterMatchMode,\n type DataTableFilterConstraint,\n type DataTableFilterEntry,\n type DataTableFilterMeta,\n} from './DataTableFilterMeta';\nimport { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry';\nimport { DataTableStatus } from './DataTableStatus';\nimport type { DataTableSort } from './DataTableSort';\nimport { DataTableSortDirection } from './DataTableSortDirection';\nimport { DataTableRowProcessing } from './DataTableRowProcessing';\nimport { useControllableState } from './useControllableState';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/** Event emitted when a DataTable row is activated. */\nexport interface DataTableRowClickEvent<TData> {\n /** Activated row data. */\n data: TData;\n /** Loaded-page row index. */\n index: number;\n}\n\n/** Stable Cratis-owned parts for styling a {@link DataTableCore}. */\nexport interface DataTableParts {\n /** Outer table composition. */\n root?: HTMLAttributes<HTMLDivElement>;\n /** Loaded-page search wrapper. */\n search?: HTMLAttributes<HTMLDivElement>;\n /** Loaded-page search input. */\n searchInput?: React.InputHTMLAttributes<HTMLInputElement>;\n /** Scroll container. */\n tableContainer?: HTMLAttributes<HTMLDivElement>;\n /** Semantic table element. */\n table?: TableHTMLAttributes<HTMLTableElement>;\n /** Table head. */\n head?: HTMLAttributes<HTMLTableSectionElement>;\n /** Header row. */\n headerRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Header cell. */\n headerCell?: ThHTMLAttributes<HTMLTableCellElement>;\n /** Table body. */\n body?: HTMLAttributes<HTMLTableSectionElement>;\n /** Data row. */\n row?: HTMLAttributes<HTMLTableRowElement>;\n /** Data cell. */\n cell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Empty-state row. */\n emptyRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Empty-state cell. */\n emptyCell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Loading-state row. */\n loadingRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Loading-state cell. */\n loadingCell?: TdHTMLAttributes<HTMLTableCellElement>;\n /** Failed or unauthorized row. */\n failureRow?: HTMLAttributes<HTMLTableRowElement>;\n /** Failed or unauthorized cell. */\n failureCell?: TdHTMLAttributes<HTMLTableCellElement>;\n}\n\n/** Props for the semantic loaded-page DataTable renderer. */\nexport interface DataTableCoreProps<TData extends object> {\n /** Loaded page rows. */\n data: TData[];\n /** Declarative {@link Column} markers. */\n children?: ReactNode;\n /** Row property used as stable identity. Required to preserve selection across refreshed row objects. */\n dataKey?: string;\n /** Content shown when the loaded page has no matching rows. */\n emptyMessage: ReactNode;\n /** Table display state. Defaults to ready. */\n status?: DataTableStatus;\n /** Message shown while loading without rows. */\n loadingMessage?: ReactNode;\n /** Message shown for a failed query. */\n failureMessage?: ReactNode;\n /** Message shown for an unauthorized query. */\n unauthorizedMessage?: ReactNode;\n /**\n * Enables row selection. `'single'` selects one row at a time through row activation;\n * `'multiple'` adds per-row checkboxes and a select-all header checkbox, and reports through\n * {@link onSelectedItemsChange} rather than {@link onSelectionChange}.\n */\n selectionMode?: 'single' | 'multiple';\n /** Accessible name for row selection controls. Falls back to the provider's `dataTable.selectRow` message, then `'Select row'`. */\n selectionAriaLabel?: string;\n /** Accessible name for the select-all control. Falls back to the provider's `dataTable.selectAllRows` message, then `'Select all rows'`. */\n selectAllAriaLabel?: string;\n /** Controlled selected row. Applies to `selectionMode='single'`. */\n selection?: TData | null;\n /** Invoked when the single-row selection changes. */\n onSelectionChange?: (event: DataTableSelectionChangeEvent<TData>) => void;\n /** Controlled selected rows. Applies to `selectionMode='multiple'`. */\n selectedItems?: TData[];\n /** Invoked with the full set of selected rows when a multiple selection changes. */\n onSelectedItemsChange?: (items: TData[]) => void;\n /** Invoked when a row is clicked or keyboard activated. */\n onRowClick?: (event: DataTableRowClickEvent<TData>) => void;\n /** Builds an extra class name for one row. */\n rowClassName?: (rowData: TData) => string;\n /** Row fields searched on the loaded page. */\n globalFilterFields?: string[];\n /** Placeholder for the loaded-page search input. Falls back to the provider's `dataTable.search` message, then `'Search…'`. */\n globalSearchPlaceholder?: string;\n /** Accessible name for the loaded-page search input. Falls back to the provider's `dataTable.searchAriaLabel` message, then `'Search table'`. */\n globalSearchAriaLabel?: string;\n /** Initial per-field filter constraints. */\n defaultFilters?: DataTableFilterMeta;\n /** Controlled per-field filter constraints. Leave undefined to let the table keep its own. */\n filters?: DataTableFilterMeta;\n /** Invoked when applied field filters change. */\n onFilter?: (filters: DataTableFilterMeta) => void;\n /** Controlled search text. Leave undefined to let the table keep its own. */\n globalFilter?: string;\n /** Invoked when the search text changes. */\n onGlobalFilterChange?: (globalFilter: string) => void;\n /** Controlled sort; null means not sorted. Leave undefined to let the table keep its own. */\n sort?: DataTableSort | null;\n /** Invoked when a sortable column header changes the sort. */\n onSortChange?: (sort: DataTableSort | null) => void;\n /**\n * Whether the table filters and sorts the rows it is given (default:\n * {@link DataTableRowProcessing.Loaded}). Use {@link DataTableRowProcessing.None} when the\n * source already applied the controlled filter and sort state.\n */\n rowProcessing?: DataTableRowProcessing;\n /** Enables the bounded scroll container. */\n scrollable?: boolean;\n /** Scroll-container maximum height. */\n scrollHeight?: string;\n /** Extra class name for the table composition. */\n className?: string;\n /** Inline style for the table composition. */\n style?: CSSProperties;\n /** Cratis-owned per-part attributes. */\n pt?: DataTableParts;\n /**\n * @deprecated Cratis parts always merge. Remove this renderer-era option.\n */\n ptOptions?: object;\n /**\n * @deprecated Components always uses consumer-owned CSS. Customize through `pt` and CSS instead.\n */\n unstyled?: boolean;\n}\n\nconst useColumns = (children: ReactNode): React.ReactElement<ColumnProps<any>>[] =>\n useMemo(\n () =>\n React.Children.toArray(children).filter(\n React.isValidElement,\n ) as React.ReactElement<ColumnProps<any>>[],\n [children],\n );\n\ntype CellValue =\n string | number | boolean | bigint | symbol | Date | object | null | undefined;\n\nconst asCellValue = (value: unknown): CellValue =>\n typeof value === 'function' ? String(value) : (value as CellValue);\n\nconst valueAtPath = (\n row: Record<string, unknown>,\n path: string | undefined,\n): CellValue => {\n if (!path) return undefined;\n let current: CellValue = row;\n for (const segment of path.split('.')) {\n if (current === null || typeof current !== 'object') return undefined;\n const record = current as Record<string, unknown>;\n if (!Object.hasOwn(record, segment)) return undefined;\n current = asCellValue(record[segment]);\n }\n return current;\n};\n\nconst renderCellContent = (\n column: ColumnProps<any>,\n row: Record<string, unknown>,\n): ReactNode => {\n if (column.body) return column.body(row);\n const value = valueAtPath(row, column.field);\n return value == null ? '' : String(value);\n};\n\nconst dateNumber = (value: unknown) => {\n // A cloned Date is normalized in place so caller-owned Date instances (row\n // values and filter constraints alike) are never mutated by comparison.\n const date =\n value instanceof Date ? new Date(value.getTime()) : new Date(String(value));\n return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);\n};\n\nconst firstConstraint = (\n entry: DataTableFilterEntry | undefined,\n): DataTableFilterConstraint | undefined =>\n entry && 'constraints' in entry ? entry.constraints[0] : entry;\n\nconst builtInMatches = (\n value: unknown,\n constraint: DataTableFilterConstraint,\n): boolean => {\n const filter = constraint.value;\n const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;\n if (filter === null || filter === undefined || filter === '') return true;\n\n const valueText = String(value ?? '').toLocaleLowerCase();\n const filterText = String(filter).toLocaleLowerCase();\n const valueNumber = typeof value === 'number' ? value : Number(value);\n const filterNumber = typeof filter === 'number' ? filter : Number(filter);\n\n switch (mode) {\n case DataTableFilterMatchMode.StartsWith:\n return valueText.startsWith(filterText);\n case DataTableFilterMatchMode.Contains:\n return valueText.includes(filterText);\n case DataTableFilterMatchMode.NotContains:\n return !valueText.includes(filterText);\n case DataTableFilterMatchMode.EndsWith:\n return valueText.endsWith(filterText);\n case DataTableFilterMatchMode.Equals:\n return Object.is(value, filter) || valueText === filterText;\n case DataTableFilterMatchMode.NotEquals:\n return !(Object.is(value, filter) || valueText === filterText);\n case DataTableFilterMatchMode.In:\n return Array.isArray(filter) && filter.some((item) => Object.is(item, value));\n case DataTableFilterMatchMode.Between:\n return (\n Array.isArray(filter) &&\n filter.length >= 2 &&\n valueNumber >= Number(filter[0]) &&\n valueNumber <= Number(filter[1])\n );\n case DataTableFilterMatchMode.LessThan:\n return valueNumber < filterNumber;\n case DataTableFilterMatchMode.LessThanOrEqual:\n return valueNumber <= filterNumber;\n case DataTableFilterMatchMode.GreaterThan:\n return valueNumber > filterNumber;\n case DataTableFilterMatchMode.GreaterThanOrEqual:\n return valueNumber >= filterNumber;\n case DataTableFilterMatchMode.DateIs:\n return dateNumber(value) === dateNumber(filter);\n case DataTableFilterMatchMode.DateIsNot:\n return dateNumber(value) !== dateNumber(filter);\n case DataTableFilterMatchMode.DateBefore:\n return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);\n case DataTableFilterMatchMode.DateAfter:\n return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);\n default:\n return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;\n }\n};\n\nconst matchesFilterEntry = (value: unknown, entry: DataTableFilterEntry) => {\n if (!('constraints' in entry)) return builtInMatches(value, entry);\n if (entry.constraints.length === 0) return true;\n\n const matches = entry.constraints.map((constraint) =>\n builtInMatches(value, constraint),\n );\n return entry.operator?.toLowerCase() === 'or'\n ? matches.some(Boolean)\n : matches.every(Boolean);\n};\n\nconst compareValues = (left: unknown, right: unknown): number => {\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (left instanceof Date && right instanceof Date)\n return left.getTime() - right.getTime();\n return String(left ?? '').localeCompare(String(right ?? ''), undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n};\n\nconst classNames = (...values: Array<string | undefined>) =>\n values.filter(Boolean).join(' ');\n\n/** A semantic, renderer-independent data table over one already-loaded page. */\nexport const DataTableCore = <TData extends object>({\n data,\n children,\n dataKey,\n emptyMessage,\n status = DataTableStatus.Ready,\n loadingMessage,\n failureMessage,\n unauthorizedMessage,\n selectionMode,\n selectionAriaLabel,\n selectAllAriaLabel,\n selection,\n onSelectionChange,\n selectedItems,\n onSelectedItemsChange,\n onRowClick,\n rowClassName,\n globalFilterFields,\n globalSearchPlaceholder,\n globalSearchAriaLabel,\n defaultFilters,\n filters: filtersProp,\n onFilter,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n sort: sortProp,\n onSortChange,\n rowProcessing = DataTableRowProcessing.Loaded,\n scrollable,\n scrollHeight,\n className,\n style,\n pt,\n}: DataTableCoreProps<TData>) => {\n const { messages } = useCratisComponentsConfig();\n const dataTableMessages = messages?.dataTable;\n const resolvedSelectionAriaLabel =\n selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row';\n const resolvedSelectAllAriaLabel =\n selectAllAriaLabel ?? dataTableMessages?.selectAllRows ?? 'Select all rows';\n const resolvedGlobalSearchPlaceholder =\n globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…';\n const resolvedGlobalSearchAriaLabel =\n globalSearchAriaLabel ?? dataTableMessages?.searchAriaLabel ?? 'Search table';\n const resolvedLoadingMessage = loadingMessage ?? dataTableMessages?.loading ?? 'Loading…';\n const resolvedFailureMessage =\n failureMessage ?? dataTableMessages?.failed ?? 'Could not load data.';\n const resolvedUnauthorizedMessage =\n unauthorizedMessage ?? dataTableMessages?.unauthorized ??\n 'You are not authorized to view this data.';\n const isBusy = status === DataTableStatus.Loading && data.length > 0;\n const icon = useCratisIcon();\n const sortAscendingIcon = icon('sortAscending', '▲');\n const sortDescendingIcon = icon('sortDescending', '▼');\n const columns = useColumns(children);\n const selectionGroupName = useId();\n const [filters, setFilters] = useControllableState<DataTableFilterMeta>(filtersProp, defaultFilters ?? {}, onFilter);\n const [globalFilter, setGlobalFilter] = useControllableState(globalFilterProp, '', onGlobalFilterChange);\n const [sort, setSort] = useControllableState<DataTableSort | null>(sortProp, null, onSortChange);\n\n const filteredRows = useMemo(() => {\n if (rowProcessing === DataTableRowProcessing.None) {\n return data.map((row, loadedIndex) => ({ row, loadedIndex }));\n }\n const term = globalFilter.trim().toLocaleLowerCase();\n const rows = data\n .map((row, loadedIndex) => ({ row, loadedIndex }))\n .filter(({ row }) => {\n const rowValues = row as Record<string, unknown>;\n const matchesColumns = Object.entries(filters).every(([field, entry]) =>\n matchesFilterEntry(valueAtPath(rowValues, field), entry),\n );\n if (!matchesColumns) return false;\n if (!term || !globalFilterFields?.length) return true;\n return globalFilterFields.some((field) =>\n String(valueAtPath(rowValues, field) ?? '')\n .toLocaleLowerCase()\n .includes(term),\n );\n });\n\n if (!sort) return rows;\n return [...rows].sort((left, right) => {\n const comparison = compareValues(\n valueAtPath(left.row as Record<string, unknown>, sort.field),\n valueAtPath(right.row as Record<string, unknown>, sort.field),\n );\n return sort.direction === 'ascending' ? comparison : -comparison;\n });\n }, [data, filters, globalFilter, globalFilterFields, sort, rowProcessing]);\n\n const updateFilter = (\n field: string,\n constraint: DataTableFilterConstraint | undefined,\n ) => {\n const next = { ...filters };\n if (constraint) next[field] = constraint;\n else delete next[field];\n setFilters(next);\n };\n\n const activateRow = (\n row: TData,\n index: number,\n originalEvent: React.SyntheticEvent,\n ) => {\n onRowClick?.({ data: row, index });\n if (selectionMode === 'single') {\n onSelectionChange?.({ value: row, originalEvent });\n }\n if (selectionMode === 'multiple') {\n toggleRowSelection(row);\n }\n };\n\n const dataKeyIdentity = (row: TData) =>\n String(valueAtPath(row as Record<string, unknown>, dataKey!));\n const dataKeyCounts = useMemo(() => {\n const counts = new Map<string, number>();\n if (!dataKey) return counts;\n for (const row of data) {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n counts.set(identity, (counts.get(identity) ?? 0) + 1);\n }\n return counts;\n }, [data, dataKey]);\n const firstLoadedIndexByDataKey = useMemo(() => {\n const indices = new Map<string, number>();\n if (!dataKey) return indices;\n data.forEach((row, loadedIndex) => {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n if (!indices.has(identity)) indices.set(identity, loadedIndex);\n });\n return indices;\n }, [data, dataKey]);\n const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;\n const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;\n const isSelectedRow = (row: TData, loadedIndex: number) => {\n if (!selection) return false;\n if (!dataKey) return loadedIndex === selectedLoadedIndex;\n\n const identity = dataKeyIdentity(row);\n if (identity !== selectedDataKey) return false;\n if ((dataKeyCounts.get(identity) ?? 0) <= 1) return true;\n if (selectedLoadedIndex >= 0) return loadedIndex === selectedLoadedIndex;\n return loadedIndex === firstLoadedIndexByDataKey.get(identity);\n };\n\n // Membership is by dataKey when there is one, and by object identity otherwise. A table whose\n // rows are replaced wholesale on every refresh - which is every observable query - keeps its\n // selection only in the first case, which is why dataKey matters here as much as it does for\n // single selection.\n const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);\n const isRowSelected = (row: TData) =>\n dataKey\n ? selectedItemsList.some(\n (selected) => dataKeyIdentity(selected) === dataKeyIdentity(row),\n )\n : selectedItemsList.includes(row);\n\n const toggleRowSelection = (row: TData) => {\n const next = isRowSelected(row)\n ? selectedItemsList.filter((selected) =>\n dataKey\n ? dataKeyIdentity(selected) !== dataKeyIdentity(row)\n : selected !== row,\n )\n : [...selectedItemsList, row];\n onSelectedItemsChange?.(next);\n };\n\n // Select-all means the rows the user can currently see. A filtered table that silently selected\n // rows hidden behind the filter would act on more than it showed, which is the whole hazard of a\n // bulk action.\n const visibleRows = filteredRows.map(({ row }) => row);\n const isVisibleRow = (row: TData) =>\n dataKey\n ? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))\n : visibleRows.includes(row);\n const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;\n const allFilteredRowsSelected =\n visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;\n const someFilteredRowsSelected =\n selectedVisibleCount > 0 && !allFilteredRowsSelected;\n const selectAllRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someFilteredRowsSelected;\n }\n }, [someFilteredRowsSelected]);\n\n const toggleSelectAll = () => {\n if (allFilteredRowsSelected) {\n onSelectedItemsChange?.(\n selectedItemsList.filter((selected) => !isVisibleRow(selected)),\n );\n return;\n }\n const additions = visibleRows.filter((row) => !isRowSelected(row));\n onSelectedItemsChange?.([...selectedItemsList, ...additions]);\n };\n\n\n return (\n <div\n {...pt?.root}\n className={classNames(\n 'cratis-datatable',\n scrollable ? 'cratis-datatable--scrollable' : undefined,\n pt?.root?.className,\n className,\n )}\n style={{ ...pt?.root?.style, ...style }}\n data-cratis-part='root'\n data-busy={isBusy || undefined}\n >\n {!!globalFilterFields?.length && (\n <div\n {...pt?.search}\n className={classNames(\n 'cratis-datatable-search',\n pt?.search?.className,\n )}\n data-cratis-part='search'\n >\n <input\n {...pt?.searchInput}\n value={globalFilter}\n placeholder={resolvedGlobalSearchPlaceholder}\n aria-label={resolvedGlobalSearchAriaLabel}\n className={classNames(\n 'cratis-datatable-search__input',\n pt?.searchInput?.className,\n )}\n data-cratis-part='search-input'\n onChange={(event) => setGlobalFilter(event.target.value)}\n />\n </div>\n )}\n <div\n {...pt?.tableContainer}\n className={classNames(\n 'cratis-datatable__container',\n pt?.tableContainer?.className,\n )}\n style={{\n ...pt?.tableContainer?.style,\n ...(scrollable\n ? { maxHeight: scrollHeight ?? '100%', overflow: 'auto' }\n : {}),\n }}\n data-cratis-part='table-container'\n >\n <table\n {...pt?.table}\n className={classNames(\n 'cratis-datatable__table',\n pt?.table?.className,\n )}\n data-cratis-part='table'\n aria-busy={isBusy || undefined}\n >\n <thead\n {...pt?.head}\n className={classNames(\n 'cratis-datatable__head',\n pt?.head?.className,\n )}\n data-cratis-part='head'\n >\n <tr\n {...pt?.headerRow}\n className={classNames(\n 'cratis-datatable__header-row',\n pt?.headerRow?.className,\n )}\n data-cratis-part='header-row'\n >\n {columns.map((column, index) => {\n const field =\n column.props.filterField ?? column.props.field;\n const ariaSort =\n sort && sort.field === column.props.field\n ? sort.direction\n : undefined;\n return (\n <th\n key={index}\n {...pt?.headerCell}\n scope='col'\n aria-label={\n column.props.selectionMode\n ? resolvedSelectionAriaLabel\n : undefined\n }\n aria-sort={ariaSort}\n style={{\n ...pt?.headerCell?.style,\n ...column.props.style,\n ...column.props.headerStyle,\n }}\n className={classNames(\n 'cratis-datatable__header-cell',\n pt?.headerCell?.className,\n column.props.headerClassName,\n )}\n data-cratis-part='header-cell'\n data-selected={Boolean(ariaSort) || undefined}\n >\n <div\n className='cratis-datatable-header-cell'\n data-cratis-part='header-content'\n data-selected={Boolean(ariaSort) || undefined}\n >\n {column.props.selectionMode ===\n 'multiple' ? (\n <input\n type='checkbox'\n aria-label={\n resolvedSelectAllAriaLabel\n }\n data-cratis-part='select-all'\n checked={allFilteredRowsSelected}\n ref={selectAllRef}\n onChange={toggleSelectAll}\n />\n ) : (\n column.props.selectionMode && (\n <span className='cratis-datatable__sr-only'>\n {resolvedSelectionAriaLabel}\n </span>\n )\n )}\n {column.props.sortable &&\n column.props.field ? (\n <button\n type='button'\n className='cratis-datatable__sort'\n data-cratis-part='sort'\n data-pressed={\n Boolean(ariaSort) || undefined\n }\n onClick={() =>\n setSort({\n field: column.props\n .field as string,\n direction:\n sort?.field ===\n column.props.field &&\n sort?.direction ===\n DataTableSortDirection.Ascending\n ? DataTableSortDirection.Descending\n : DataTableSortDirection.Ascending,\n })\n }\n >\n <span>{column.props.header}</span>\n {ariaSort && (\n <span aria-hidden='true'>\n {ariaSort === 'ascending'\n ? sortAscendingIcon\n : sortDescendingIcon}\n </span>\n )}\n </button>\n ) : (\n column.props.header\n )}\n {column.props.filter && field && (\n <ColumnFilterMenu\n field={field}\n dataType={column.props.dataType}\n placeholder={\n column.props.filterPlaceholder\n }\n showMatchModes={\n column.props.showFilterMatchModes\n }\n filterElement={\n column.props.filterElement\n }\n filterOptions={\n column.props.filterOptions\n }\n labels={column.props.filterLabels}\n pt={column.props.filterPt}\n constraint={firstConstraint(\n filters[field],\n )}\n onApply={(constraint) =>\n updateFilter(field, constraint)\n }\n onClear={() =>\n updateFilter(field, undefined)\n }\n />\n )}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody\n {...pt?.body}\n className={classNames(\n 'cratis-datatable__body',\n pt?.body?.className,\n )}\n data-cratis-part='body'\n >\n {status === DataTableStatus.Failed ||\n status === DataTableStatus.Unauthorized ? (\n <tr\n key={status}\n {...pt?.failureRow}\n className={classNames(\n 'cratis-datatable__failure-row',\n pt?.failureRow?.className,\n )}\n data-cratis-part='failure-row'\n data-reason={status}\n >\n <td\n {...pt?.failureCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__failure-cell',\n pt?.failureCell?.className,\n )}\n data-cratis-part='failure-cell'\n >\n <div role='alert'>\n {status === DataTableStatus.Failed\n ? resolvedFailureMessage\n : resolvedUnauthorizedMessage}\n </div>\n </td>\n </tr>\n ) : status === DataTableStatus.Loading && data.length === 0 ? (\n <tr\n key={status}\n {...pt?.loadingRow}\n className={classNames(\n 'cratis-datatable__loading-row',\n pt?.loadingRow?.className,\n )}\n data-cratis-part='loading-row'\n >\n <td\n {...pt?.loadingCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__loading-cell',\n pt?.loadingCell?.className,\n )}\n data-cratis-part='loading-cell'\n >\n <div role='status'>{resolvedLoadingMessage}</div>\n </td>\n </tr>\n ) : filteredRows.length === 0 ? (\n <tr\n {...pt?.emptyRow}\n className={classNames(\n 'cratis-datatable__empty-row',\n pt?.emptyRow?.className,\n )}\n data-cratis-part='empty-row'\n >\n <td\n {...pt?.emptyCell}\n colSpan={Math.max(columns.length, 1)}\n className={classNames(\n 'cratis-datatable__empty-cell',\n pt?.emptyCell?.className,\n )}\n data-cratis-part='empty-cell'\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n filteredRows.map(({ row, loadedIndex }) => {\n const identity = dataKey\n ? dataKeyIdentity(row)\n : 'loaded-row';\n const rowKey = `${identity}::${loadedIndex}`;\n const isSelected =\n selectionMode === 'single' &&\n isSelectedRow(row, loadedIndex);\n const isInteractive =\n Boolean(onRowClick) ||\n selectionMode === 'single' ||\n selectionMode === 'multiple';\n return (\n <tr\n key={rowKey}\n {...pt?.row}\n tabIndex={isInteractive ? 0 : pt?.row?.tabIndex}\n aria-selected={\n selectionMode === 'single'\n ? isSelected\n : undefined\n }\n className={classNames(\n 'cratis-datatable__row',\n pt?.row?.className,\n rowClassName?.(row),\n )}\n data-cratis-part='row'\n data-selected={isSelected || undefined}\n data-interactive={isInteractive || undefined}\n onClick={(event) =>\n activateRow(row, loadedIndex, event)\n }\n onKeyDown={(event) => {\n if (\n event.target !== event.currentTarget ||\n (event.key !== 'Enter' &&\n event.key !== ' ')\n ) {\n return;\n }\n event.preventDefault();\n activateRow(row, loadedIndex, event);\n }}\n >\n {columns.map((column, columnIndex) => (\n <td\n key={columnIndex}\n {...pt?.cell}\n style={{\n ...pt?.cell?.style,\n ...column.props.style,\n ...column.props.bodyStyle,\n }}\n className={classNames(\n 'cratis-datatable__cell',\n pt?.cell?.className,\n column.props.bodyClassName ??\n column.props.className,\n )}\n data-cratis-part='cell'\n data-selected={isSelected || undefined}\n >\n {column.props.selectionMode ===\n 'multiple' ? (\n <input\n type='checkbox'\n aria-label={\n resolvedSelectionAriaLabel\n }\n checked={isRowSelected(row)}\n onClick={(event) =>\n event.stopPropagation()\n }\n onChange={() =>\n toggleRowSelection(row)\n }\n />\n ) : column.props.selectionMode ? (\n <input\n type='radio'\n name={selectionGroupName}\n readOnly\n tabIndex={-1}\n aria-label={\n resolvedSelectionAriaLabel\n }\n checked={isSelected}\n />\n ) : (\n renderCellContent(\n column.props,\n row as Record<string, unknown>,\n )\n )}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTableCore.js","sources":["../../../DataTables/DataTableCore.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport React, { useId, useMemo, type CSSProperties, type ReactNode } from 'react';\nimport { useCratisIcon } from '../configuration/useCratisIcon';\nimport type { ColumnProps } from './Column';\nimport { classNames } from '../ClassNames/classNames';\nimport type { DataTableFilterMeta } from './DataTableFilterMeta';\nimport { DataTableHeaderCell } from './DataTableHeaderCell';\nimport type { DataTableParts } from './DataTableParts';\nimport type { DataTableRowClickEvent } from './DataTableRowClickEvent';\nimport { DataTableBody } from './DataTableBody';\nimport { DataTableRow } from './DataTableRow';\nimport { DataTableSearch } from './DataTableSearch';\nimport { DataTableRowProcessing } from './DataTableRowProcessing';\nimport type { DataTableSelectionChangeEvent } from './DataTableSelectionChangeEvent';\nimport type { DataTableSort } from './DataTableSort';\nimport { DataTableStatus } from './DataTableStatus';\nimport { processRows } from './processRows';\nimport { useDataTableMessages } from './useDataTableMessages';\nimport { useDataTableState } from './useDataTableState';\nimport { useRowSelection } from './useRowSelection';\n\nexport type { DataTableParts } from './DataTableParts';\nexport type { DataTableRowClickEvent } from './DataTableRowClickEvent';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nconst useColumns = (children: React.ReactNode): React.ReactElement<ColumnProps<any>>[] =>\n useMemo(\n () =>\n React.Children.toArray(children).filter(\n React.isValidElement,\n ) as React.ReactElement<ColumnProps<any>>[],\n [children],\n );\n\n/** Props for the semantic loaded-page DataTable renderer. */\nexport interface DataTableCoreProps<TData extends object> {\n /** Loaded page rows. */\n data: TData[];\n /** Declarative {@link Column} markers. */\n children?: ReactNode;\n /** Row property used as stable identity. Required to preserve selection across refreshed row objects. */\n dataKey?: string;\n /** Content shown when the loaded page has no matching rows. */\n emptyMessage: ReactNode;\n /** Table display state. Defaults to ready. */\n status?: DataTableStatus;\n /** Message shown while loading without rows. */\n loadingMessage?: ReactNode;\n /** Message shown for a failed query. */\n failureMessage?: ReactNode;\n /** Message shown for an unauthorized query. */\n unauthorizedMessage?: ReactNode;\n /**\n * Enables row selection. `'single'` selects one row at a time through row activation;\n * `'multiple'` adds per-row checkboxes and a select-all header checkbox, and reports through\n * {@link onSelectedItemsChange} rather than {@link onSelectionChange}.\n */\n selectionMode?: 'single' | 'multiple';\n /** Accessible name for row selection controls. Falls back to the provider's `dataTable.selectRow` message, then `'Select row'`. */\n selectionAriaLabel?: string;\n /** Accessible name for the select-all control. Falls back to the provider's `dataTable.selectAllRows` message, then `'Select all rows'`. */\n selectAllAriaLabel?: string;\n /** Controlled selected row. Applies to `selectionMode='single'`. */\n selection?: TData | null;\n /** Invoked when the single-row selection changes. */\n onSelectionChange?: (event: DataTableSelectionChangeEvent<TData>) => void;\n /** Controlled selected rows. Applies to `selectionMode='multiple'`. */\n selectedItems?: TData[];\n /** Invoked with the full set of selected rows when a multiple selection changes. */\n onSelectedItemsChange?: (items: TData[]) => void;\n /** Invoked when a row is clicked or keyboard activated. */\n onRowClick?: (event: DataTableRowClickEvent<TData>) => void;\n /** Builds an extra class name for one row. */\n rowClassName?: (rowData: TData) => string;\n /** Row fields searched on the loaded page. */\n globalFilterFields?: string[];\n /** Placeholder for the loaded-page search input. Falls back to the provider's `dataTable.search` message, then `'Search…'`. */\n globalSearchPlaceholder?: string;\n /** Accessible name for the loaded-page search input. Falls back to the provider's `dataTable.searchAriaLabel` message, then `'Search table'`. */\n globalSearchAriaLabel?: string;\n /** Initial per-field filter constraints. */\n defaultFilters?: DataTableFilterMeta;\n /** Controlled per-field filter constraints. Leave undefined to let the table keep its own. */\n filters?: DataTableFilterMeta;\n /** Invoked when applied field filters change. */\n onFilter?: (filters: DataTableFilterMeta) => void;\n /** Controlled search text. Leave undefined to let the table keep its own. */\n globalFilter?: string;\n /** Invoked when the search text changes. */\n onGlobalFilterChange?: (globalFilter: string) => void;\n /** Controlled sort; null means not sorted. Leave undefined to let the table keep its own. */\n sort?: DataTableSort | null;\n /** Invoked when a sortable column header changes the sort. */\n onSortChange?: (sort: DataTableSort | null) => void;\n /**\n * Whether the table filters and sorts the rows it is given (default:\n * {@link DataTableRowProcessing.Loaded}). Use {@link DataTableRowProcessing.None} when the\n * source already applied the controlled filter and sort state.\n */\n rowProcessing?: DataTableRowProcessing;\n /** Enables the bounded scroll container. */\n scrollable?: boolean;\n /** Scroll-container maximum height. */\n scrollHeight?: string;\n /** Extra class name for the table composition. */\n className?: string;\n /** Inline style for the table composition. */\n style?: CSSProperties;\n /** Cratis-owned per-part attributes. */\n pt?: DataTableParts;\n /**\n * @deprecated Cratis parts always merge. Remove this renderer-era option.\n */\n ptOptions?: object;\n /**\n * @deprecated Components always uses consumer-owned CSS. Customize through `pt` and CSS instead.\n */\n unstyled?: boolean;\n}\n\n/** A semantic, renderer-independent data table over one already-loaded page. */\nexport const DataTableCore = <TData extends object>({\n data,\n children,\n dataKey,\n emptyMessage,\n status = DataTableStatus.Ready,\n loadingMessage,\n failureMessage,\n unauthorizedMessage,\n selectionMode,\n selectionAriaLabel,\n selectAllAriaLabel,\n selection,\n onSelectionChange,\n selectedItems,\n onSelectedItemsChange,\n onRowClick,\n rowClassName,\n globalFilterFields,\n globalSearchPlaceholder,\n globalSearchAriaLabel,\n defaultFilters,\n filters: filtersProp,\n onFilter,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n sort: sortProp,\n onSortChange,\n rowProcessing = DataTableRowProcessing.Loaded,\n scrollable,\n scrollHeight,\n className,\n style,\n pt,\n}: DataTableCoreProps<TData>) => {\n const messages = useDataTableMessages({\n selectionAriaLabel,\n selectAllAriaLabel,\n globalSearchPlaceholder,\n globalSearchAriaLabel,\n loadingMessage,\n failureMessage,\n unauthorizedMessage,\n });\n const {\n resolvedSelectionAriaLabel,\n resolvedSelectAllAriaLabel,\n resolvedGlobalSearchPlaceholder,\n resolvedGlobalSearchAriaLabel,\n } = messages;\n const isBusy = status === DataTableStatus.Loading && data.length > 0;\n const icon = useCratisIcon();\n const sortAscendingIcon = icon('sortAscending', '▲');\n const sortDescendingIcon = icon('sortDescending', '▼');\n const columns = useColumns(children);\n const selectionGroupName = useId();\n const { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort } =\n useDataTableState({\n defaultFilters,\n filters: filtersProp,\n onFilter,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n sort: sortProp,\n onSortChange,\n });\n\n const filteredRows = useMemo(\n () =>\n processRows(data, {\n filters,\n globalFilter,\n globalFilterFields,\n sort,\n rowProcessing,\n }),\n [data, filters, globalFilter, globalFilterFields, sort, rowProcessing],\n );\n const {\n dataKeyIdentity,\n isSelectedRow,\n isRowSelected,\n toggleRowSelection,\n allFilteredRowsSelected,\n selectAllRef,\n toggleSelectAll,\n } = useRowSelection({\n data,\n visibleRows: filteredRows.map(({ row }) => row),\n dataKey,\n selection,\n selectedItems,\n onSelectedItemsChange,\n });\n const isInteractive =\n Boolean(onRowClick) || selectionMode === 'single' || selectionMode === 'multiple';\n\n const activateRow = (\n row: TData,\n index: number,\n originalEvent: React.SyntheticEvent,\n ) => {\n onRowClick?.({ data: row, index });\n if (selectionMode === 'single') {\n onSelectionChange?.({ value: row, originalEvent });\n }\n if (selectionMode === 'multiple') {\n toggleRowSelection(row);\n }\n };\n\n return (\n <div\n {...pt?.root}\n className={classNames(\n 'cratis-datatable',\n scrollable ? 'cratis-datatable--scrollable' : undefined,\n pt?.root?.className,\n className,\n )}\n style={{ ...pt?.root?.style, ...style }}\n data-cratis-part='root'\n data-busy={isBusy || undefined}\n >\n {!!globalFilterFields?.length && (\n <DataTableSearch\n parts={pt}\n value={globalFilter}\n placeholder={resolvedGlobalSearchPlaceholder}\n ariaLabel={resolvedGlobalSearchAriaLabel}\n onChange={setGlobalFilter}\n />\n )}\n <div\n {...pt?.tableContainer}\n className={classNames(\n 'cratis-datatable__container',\n pt?.tableContainer?.className,\n )}\n style={{\n ...pt?.tableContainer?.style,\n ...(scrollable\n ? { maxHeight: scrollHeight ?? '100%', overflow: 'auto' }\n : {}),\n }}\n data-cratis-part='table-container'\n >\n <table\n {...pt?.table}\n className={classNames(\n 'cratis-datatable__table',\n pt?.table?.className,\n )}\n data-cratis-part='table'\n aria-busy={isBusy || undefined}\n >\n <thead\n {...pt?.head}\n className={classNames(\n 'cratis-datatable__head',\n pt?.head?.className,\n )}\n data-cratis-part='head'\n >\n <tr\n {...pt?.headerRow}\n className={classNames(\n 'cratis-datatable__header-row',\n pt?.headerRow?.className,\n )}\n data-cratis-part='header-row'\n >\n {columns.map((column, index) => (\n <DataTableHeaderCell\n key={index}\n column={column}\n parts={pt}\n sort={sort}\n onSort={setSort}\n filters={filters}\n updateFilter={updateFilter}\n resolvedSelectionAriaLabel={\n resolvedSelectionAriaLabel\n }\n resolvedSelectAllAriaLabel={\n resolvedSelectAllAriaLabel\n }\n allFilteredRowsSelected={allFilteredRowsSelected}\n selectAllRef={selectAllRef}\n toggleSelectAll={toggleSelectAll}\n sortAscendingIcon={sortAscendingIcon}\n sortDescendingIcon={sortDescendingIcon}\n />\n ))}\n </tr>\n </thead>\n <DataTableBody\n status={status}\n hasLoadedRows={data.length > 0}\n rowCount={filteredRows.length}\n columnCount={columns.length}\n parts={pt}\n messages={messages}\n emptyMessage={emptyMessage}\n renderRows={() =>\n filteredRows.map(({ row, loadedIndex }) => {\n const identity = dataKey\n ? dataKeyIdentity(row)\n : 'loaded-row';\n const isSelected =\n selectionMode === 'single' &&\n isSelectedRow(row, loadedIndex);\n return (\n <DataTableRow<TData>\n key={`${identity}::${loadedIndex}`}\n row={row}\n columns={columns}\n parts={pt}\n selectionMode={selectionMode}\n isSelected={isSelected}\n isInteractive={isInteractive}\n isRowSelected={isRowSelected(row)}\n rowClassName={rowClassName}\n resolvedSelectionAriaLabel={\n resolvedSelectionAriaLabel\n }\n selectionGroupName={selectionGroupName}\n onActivate={(event) =>\n activateRow(row, loadedIndex, event)\n }\n onToggleSelection={() => toggleRowSelection(row)}\n />\n );\n })\n }\n />\n </table>\n </div>\n </div>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;AA4BA,MAAM,UAAU,GAAG,CAAC,QAAyB,KACzC,OAAO,CACH,MACI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CACnC,KAAK,CAAC,cAAc,CACmB,EAC/C,CAAC,QAAQ,CAAC,CACb;AAyFE,MAAM,aAAa,GAAG,CAAuB,EAChD,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,MAAM,GAAG,eAAe,CAAC,KAAK,EAC9B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,YAAY,EAAE,gBAAgB,EAC9B,oBAAoB,EACpB,IAAI,EAAE,QAAQ,EACd,YAAY,EACZ,aAAa,GAAG,sBAAsB,CAAC,MAAM,EAC7C,UAAU,EACV,YAAY,EACZ,SAAS,EACT,KAAK,EACL,EAAE,GACsB,KAAI;IAC5B,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QAClC,kBAAkB;QAClB,kBAAkB;QAClB,uBAAuB;QACvB,qBAAqB;QACrB,cAAc;QACd,cAAc;QACd,mBAAmB;AACtB,KAAA,CAAC;IACF,MAAM,EACF,0BAA0B,EAC1B,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,GAChC,GAAG,QAAQ;AACZ,IAAA,MAAM,MAAM,GAAG,MAAM,KAAK,eAAe,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AACpE,IAAA,MAAM,IAAI,GAAG,aAAa,EAAE;IAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;IACpD,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;AACtD,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,IAAA,MAAM,kBAAkB,GAAG,KAAK,EAAE;AAClC,IAAA,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,GACzE,iBAAiB,CAAC;QACd,cAAc;AACd,QAAA,OAAO,EAAE,WAAW;QACpB,QAAQ;AACR,QAAA,YAAY,EAAE,gBAAgB;QAC9B,oBAAoB;AACpB,QAAA,IAAI,EAAE,QAAQ;QACd,YAAY;AACf,KAAA,CAAC;IAEN,MAAM,YAAY,GAAG,OAAO,CACxB,MACI,WAAW,CAAC,IAAI,EAAE;QACd,OAAO;QACP,YAAY;QACZ,kBAAkB;QAClB,IAAI;QACJ,aAAa;AAChB,KAAA,CAAC,EACN,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,CAAC,CACzE;AACD,IAAA,MAAM,EACF,eAAe,EACf,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,eAAe,GAClB,GAAG,eAAe,CAAC;QAChB,IAAI;AACJ,QAAA,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;QAC/C,OAAO;QACP,SAAS;QACT,aAAa;QACb,qBAAqB;AACxB,KAAA,CAAC;AACF,IAAA,MAAM,aAAa,GACf,OAAO,CAAC,UAAU,CAAC,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,UAAU;IAErF,MAAM,WAAW,GAAG,CAChB,GAAU,EACV,KAAa,EACb,aAAmC,KACnC;QACA,UAAU,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAClC,QAAA,IAAI,aAAa,KAAK,QAAQ,EAAE;YAC5B,iBAAiB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;QACtD;AACA,QAAA,IAAI,aAAa,KAAK,UAAU,EAAE;YAC9B,kBAAkB,CAAC,GAAG,CAAC;QAC3B;AACJ,IAAA,CAAC;IAED,QACIA,iBACQ,EAAE,EAAE,IAAI,EACZ,SAAS,EAAE,UAAU,CACjB,kBAAkB,EAClB,UAAU,GAAG,8BAA8B,GAAG,SAAS,EACvD,EAAE,EAAE,IAAI,EAAE,SAAS,EACnB,SAAS,CACZ,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,sBACtB,MAAM,EAAA,WAAA,EACZ,MAAM,IAAI,SAAS,EAAA,QAAA,EAAA,CAE7B,CAAC,CAAC,kBAAkB,EAAE,MAAM,KACzBC,GAAA,CAAC,eAAe,EAAA,EACZ,KAAK,EAAE,EAAE,EACT,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,+BAA+B,EAC5C,SAAS,EAAE,6BAA6B,EACxC,QAAQ,EAAE,eAAe,GAC3B,CACL,EACDA,gBACQ,EAAE,EAAE,cAAc,EACtB,SAAS,EAAE,UAAU,CACjB,6BAA6B,EAC7B,EAAE,EAAE,cAAc,EAAE,SAAS,CAChC,EACD,KAAK,EAAE;AACH,oBAAA,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK;AAC5B,oBAAA,IAAI;0BACE,EAAE,SAAS,EAAE,YAAY,IAAI,MAAM,EAAE,QAAQ,EAAE,MAAM;0BACrD,EAAE,CAAC;iBACZ,EAAA,kBAAA,EACgB,iBAAiB,YAElCD,IAAA,CAAA,OAAA,EAAA,EAAA,GACQ,EAAE,EAAE,KAAK,EACb,SAAS,EAAE,UAAU,CACjB,yBAAyB,EACzB,EAAE,EAAE,KAAK,EAAE,SAAS,CACvB,sBACgB,OAAO,EAAA,WAAA,EACb,MAAM,IAAI,SAAS,aAE9BC,GAAA,CAAA,OAAA,EAAA,EAAA,GACQ,EAAE,EAAE,IAAI,EACZ,SAAS,EAAE,UAAU,CACjB,wBAAwB,EACxB,EAAE,EAAE,IAAI,EAAE,SAAS,CACtB,EAAA,kBAAA,EACgB,MAAM,EAAA,QAAA,EAEvBA,GAAA,CAAA,IAAA,EAAA,EAAA,GACQ,EAAE,EAAE,SAAS,EACjB,SAAS,EAAE,UAAU,CACjB,8BAA8B,EAC9B,EAAE,EAAE,SAAS,EAAE,SAAS,CAC3B,EAAA,kBAAA,EACgB,YAAY,YAE5B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,MACvBA,IAAC,mBAAmB,EAAA,EAEhB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,EAAE,EACT,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,EAC1B,0BAA0B,EACtB,0BAA0B,EAE9B,0BAA0B,EACtB,0BAA0B,EAE9B,uBAAuB,EAAE,uBAAuB,EAChD,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,EAAE,kBAAkB,EAAA,EAjBjC,KAAK,CAkBZ,CACL,CAAC,GACD,EAAA,CACD,EACRA,IAAC,aAAa,EAAA,EACV,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAC9B,QAAQ,EAAE,YAAY,CAAC,MAAM,EAC7B,WAAW,EAAE,OAAO,CAAC,MAAM,EAC3B,KAAK,EAAE,EAAE,EACT,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MACR,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAI;gCACtC,MAAM,QAAQ,GAAG;AACb,sCAAE,eAAe,CAAC,GAAG;sCACnB,YAAY;AAClB,gCAAA,MAAM,UAAU,GACZ,aAAa,KAAK,QAAQ;AAC1B,oCAAA,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC;AACnC,gCAAA,QACIA,GAAA,CAAC,YAAY,EAAA,EAET,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,EACjC,YAAY,EAAE,YAAY,EAC1B,0BAA0B,EACtB,0BAA0B,EAE9B,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,CAAC,KAAK,KACd,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,EAExC,iBAAiB,EAAE,MAAM,kBAAkB,CAAC,GAAG,CAAC,EAAA,EAhB3C,GAAG,QAAQ,CAAA,EAAA,EAAK,WAAW,CAAA,CAAE,CAiBpC;AAEV,4BAAA,CAAC,CAAC,EAAA,CAER,CAAA,EAAA,CACE,EAAA,CACN,CAAA,EAAA,CACJ;AAEd;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ReactElement, ReactNode, RefObject } from 'react';
|
|
2
|
+
import type { ColumnProps } from './Column.js';
|
|
3
|
+
import type { DataTableFilterConstraint, DataTableFilterMeta } from './DataTableFilterMeta.js';
|
|
4
|
+
import type { DataTableParts } from './DataTableParts.js';
|
|
5
|
+
import type { DataTableSort } from './DataTableSort.js';
|
|
6
|
+
/** Props for {@link DataTableHeaderCell}. */
|
|
7
|
+
export interface DataTableHeaderCellProps {
|
|
8
|
+
column: ReactElement<ColumnProps<any>>;
|
|
9
|
+
/** The table's part attributes. */
|
|
10
|
+
parts?: DataTableParts;
|
|
11
|
+
sort: DataTableSort | null;
|
|
12
|
+
onSort: (sort: DataTableSort) => void;
|
|
13
|
+
filters: DataTableFilterMeta;
|
|
14
|
+
updateFilter: (field: string, constraint: DataTableFilterConstraint | undefined) => void;
|
|
15
|
+
resolvedSelectionAriaLabel: string;
|
|
16
|
+
resolvedSelectAllAriaLabel: string;
|
|
17
|
+
allFilteredRowsSelected: boolean;
|
|
18
|
+
selectAllRef: RefObject<HTMLInputElement | null>;
|
|
19
|
+
toggleSelectAll: () => void;
|
|
20
|
+
sortAscendingIcon: ReactNode;
|
|
21
|
+
sortDescendingIcon: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
/** One column header: its label, sort control, filter menu, and select-all or selection label. */
|
|
24
|
+
export declare const DataTableHeaderCell: ({ column, parts: pt, sort, onSort, filters, updateFilter, resolvedSelectionAriaLabel, resolvedSelectAllAriaLabel, allFilteredRowsSelected, selectAllRef, toggleSelectAll, sortAscendingIcon, sortDescendingIcon, }: DataTableHeaderCellProps) => import("react").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=DataTableHeaderCell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTableHeaderCell.d.ts","sourceRoot":"","sources":["../../../DataTables/DataTableHeaderCell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAU,CAAC;AAG5C,OAAO,KAAK,EACR,yBAAyB,EACzB,mBAAmB,EACtB,MAAM,0BAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAiB,CAAC;AAMrD,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,mCAAmC;IACnC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,YAAY,EAAE,CACV,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,yBAAyB,GAAG,SAAS,KAChD,IAAI,CAAC;IACV,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,uBAAuB,EAAE,OAAO,CAAC;IACjC,YAAY,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACjD,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,kBAAkB,EAAE,SAAS,CAAC;CACjC;AAED,kGAAkG;AAClG,eAAO,MAAM,mBAAmB,uNAc7B,wBAAwB,gCA6F1B,CAAC"}
|