@mui/x-data-grid 7.7.1 → 7.9.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/CHANGELOG.md +166 -1
- package/DataGrid/useDataGridComponent.d.ts +0 -1
- package/DataGrid/useDataGridProps.js +9 -2
- package/components/GridFooter.d.ts +1 -1
- package/components/GridLoadingOverlay.d.ts +15 -3
- package/components/GridLoadingOverlay.js +48 -4
- package/components/GridNoResultsOverlay.d.ts +1 -1
- package/components/GridNoRowsOverlay.d.ts +1 -1
- package/components/GridRow.js +2 -1
- package/components/GridRowCount.d.ts +1 -1
- package/components/GridSelectedRowCount.d.ts +1 -1
- package/components/GridSkeletonLoadingOverlay.d.ts +3 -0
- package/components/GridSkeletonLoadingOverlay.js +181 -0
- package/components/base/GridOverlays.d.ts +11 -1
- package/components/base/GridOverlays.js +25 -39
- package/components/cell/GridActionsCellItem.d.ts +3 -3
- package/components/cell/GridSkeletonCell.d.ts +13 -6
- package/components/cell/GridSkeletonCell.js +61 -19
- package/components/columnHeaders/GridColumnHeaderItem.js +3 -3
- package/components/columnHeaders/GridColumnHeaderSortIcon.d.ts +1 -0
- package/components/columnHeaders/GridColumnHeaderSortIcon.js +11 -6
- package/components/containers/GridFooterContainer.d.ts +1 -1
- package/components/containers/GridOverlay.d.ts +1 -1
- package/components/containers/GridRootStyles.d.ts +0 -1
- package/components/containers/GridRootStyles.js +19 -2
- package/components/containers/GridToolbarContainer.d.ts +1 -1
- package/components/panel/GridPanel.d.ts +1 -1
- package/components/toolbar/GridToolbarExportContainer.d.ts +1 -1
- package/components/virtualization/GridMainContainer.d.ts +1 -1
- package/components/virtualization/GridVirtualScroller.js +7 -5
- package/components/virtualization/GridVirtualScrollerContent.d.ts +1 -1
- package/components/virtualization/GridVirtualScrollerRenderZone.d.ts +1 -1
- package/constants/defaultGridSlotsComponents.js +2 -1
- package/constants/gridClasses.d.ts +14 -0
- package/constants/gridClasses.js +1 -1
- package/hooks/core/pipeProcessing/useGridRegisterPipeApplier.d.ts +2 -1
- package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +2 -2
- package/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.d.ts +2 -2
- package/hooks/core/useGridInitialization.d.ts +1 -1
- package/hooks/core/useGridLocaleText.d.ts +1 -1
- package/hooks/core/useGridLoggerFactory.d.ts +1 -1
- package/hooks/features/clipboard/useGridClipboard.d.ts +1 -1
- package/hooks/features/columnGrouping/useGridColumnGrouping.d.ts +1 -1
- package/hooks/features/columnResize/useGridColumnResize.d.ts +1 -1
- package/hooks/features/density/useGridDensity.d.ts +1 -1
- package/hooks/features/dimensions/useGridDimensions.js +15 -15
- package/hooks/features/editing/useGridCellEditing.d.ts +1 -1
- package/hooks/features/editing/useGridEditing.d.ts +1 -1
- package/hooks/features/editing/useGridRowEditing.d.ts +1 -1
- package/hooks/features/export/serializers/csvSerializer.d.ts +0 -1
- package/hooks/features/export/useGridCsvExport.d.ts +1 -1
- package/hooks/features/export/useGridPrintExport.d.ts +1 -1
- package/hooks/features/export/useGridPrintExport.js +9 -8
- package/hooks/features/filter/gridFilterUtils.d.ts +1 -1
- package/hooks/features/filter/useGridFilter.d.ts +1 -1
- package/hooks/features/focus/useGridFocus.d.ts +1 -1
- package/hooks/features/headerFiltering/useGridHeaderFiltering.d.ts +1 -1
- package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.d.ts +1 -1
- package/hooks/features/overlays/useGridOverlays.d.ts +11 -0
- package/hooks/features/overlays/useGridOverlays.js +35 -0
- package/hooks/features/pagination/gridPaginationUtils.d.ts +1 -1
- package/hooks/features/pagination/index.d.ts +1 -1
- package/hooks/features/pagination/useGridPaginationMeta.d.ts +1 -1
- package/hooks/features/pagination/useGridPaginationModel.d.ts +2 -2
- package/hooks/features/pagination/useGridRowCount.d.ts +1 -1
- package/hooks/features/preferencesPanel/useGridPreferencesPanel.d.ts +1 -1
- package/hooks/features/rowSelection/useGridRowSelection.d.ts +1 -1
- package/hooks/features/rows/gridRowsInterfaces.d.ts +10 -2
- package/hooks/features/rows/gridRowsSelector.d.ts +2 -1
- package/hooks/features/rows/gridRowsSelector.js +1 -0
- package/hooks/features/rows/gridRowsUtils.d.ts +8 -6
- package/hooks/features/rows/gridRowsUtils.js +30 -6
- package/hooks/features/rows/useGridRows.d.ts +2 -2
- package/hooks/features/rows/useGridRows.js +39 -21
- package/hooks/features/rows/useGridRowsMeta.d.ts +1 -1
- package/hooks/features/scroll/useGridScroll.d.ts +1 -1
- package/hooks/features/sorting/useGridSorting.d.ts +1 -1
- package/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
- package/hooks/utils/index.d.ts +0 -1
- package/hooks/utils/index.js +0 -1
- package/hooks/utils/useGridApiEventHandler.d.ts +2 -2
- package/hooks/utils/useGridApiRef.d.ts +1 -1
- package/hooks/utils/useGridInitializeState.d.ts +1 -1
- package/hooks/utils/useGridRootProps.d.ts +1 -1
- package/hooks/utils/useGridSelector.d.ts +1 -1
- package/hooks/utils/useGridVisibleRows.d.ts +2 -2
- package/index.js +1 -1
- package/internals/index.d.ts +2 -0
- package/internals/index.js +1 -0
- package/internals/utils/propValidation.js +1 -1
- package/models/api/gridApiCommon.d.ts +2 -2
- package/models/api/gridInfiniteLoaderApi.d.ts +0 -1
- package/models/api/gridRowApi.d.ts +14 -0
- package/models/gridColumnGrouping.d.ts +0 -1
- package/models/gridDataSource.d.ts +87 -0
- package/models/gridDataSource.js +1 -0
- package/models/gridRows.d.ts +10 -0
- package/models/gridSlotsComponent.d.ts +5 -0
- package/models/gridSlotsComponentsProps.d.ts +7 -2
- package/models/props/DataGridProps.d.ts +2 -0
- package/modern/DataGrid/useDataGridProps.js +9 -2
- package/modern/components/GridLoadingOverlay.js +48 -4
- package/modern/components/GridRow.js +2 -1
- package/modern/components/GridSkeletonLoadingOverlay.js +181 -0
- package/modern/components/base/GridOverlays.js +25 -39
- package/modern/components/cell/GridSkeletonCell.js +61 -19
- package/modern/components/columnHeaders/GridColumnHeaderItem.js +3 -3
- package/modern/components/columnHeaders/GridColumnHeaderSortIcon.js +11 -6
- package/modern/components/containers/GridRootStyles.js +19 -2
- package/modern/components/virtualization/GridVirtualScroller.js +7 -5
- package/modern/constants/defaultGridSlotsComponents.js +2 -1
- package/modern/constants/gridClasses.js +1 -1
- package/modern/hooks/features/dimensions/useGridDimensions.js +15 -15
- package/modern/hooks/features/export/useGridPrintExport.js +9 -8
- package/modern/hooks/features/overlays/useGridOverlays.js +35 -0
- package/modern/hooks/features/rows/gridRowsSelector.js +1 -0
- package/modern/hooks/features/rows/gridRowsUtils.js +30 -6
- package/modern/hooks/features/rows/useGridRows.js +39 -21
- package/modern/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
- package/modern/hooks/utils/index.js +0 -1
- package/modern/index.js +1 -1
- package/modern/internals/index.js +1 -0
- package/modern/internals/utils/propValidation.js +1 -1
- package/modern/models/gridDataSource.js +1 -0
- package/modern/utils/utils.js +10 -2
- package/node/DataGrid/useDataGridProps.js +9 -2
- package/node/components/GridLoadingOverlay.js +48 -4
- package/node/components/GridRow.js +2 -1
- package/node/components/GridSkeletonLoadingOverlay.js +189 -0
- package/node/components/base/GridOverlays.js +25 -39
- package/node/components/cell/GridSkeletonCell.js +60 -18
- package/node/components/columnHeaders/GridColumnHeaderItem.js +3 -3
- package/node/components/columnHeaders/GridColumnHeaderSortIcon.js +11 -6
- package/node/components/containers/GridRootStyles.js +19 -2
- package/node/components/virtualization/GridVirtualScroller.js +6 -4
- package/node/constants/defaultGridSlotsComponents.js +1 -0
- package/node/constants/gridClasses.js +1 -1
- package/node/hooks/features/dimensions/useGridDimensions.js +15 -15
- package/node/hooks/features/export/useGridPrintExport.js +9 -8
- package/node/hooks/features/overlays/useGridOverlays.js +42 -0
- package/node/hooks/features/rows/gridRowsSelector.js +2 -1
- package/node/hooks/features/rows/gridRowsUtils.js +31 -6
- package/node/hooks/features/rows/useGridRows.js +37 -19
- package/node/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
- package/node/hooks/utils/index.js +0 -12
- package/node/index.js +1 -1
- package/node/internals/index.js +7 -0
- package/node/internals/utils/propValidation.js +1 -1
- package/node/models/gridDataSource.js +5 -0
- package/node/utils/utils.js +11 -3
- package/package.json +5 -4
- package/utils/cleanupTracking/TimerBasedCleanupTracking.d.ts +0 -1
- package/utils/domUtils.d.ts +0 -1
- package/utils/getPublicApiRef.d.ts +1 -2
- package/utils/keyboardUtils.d.ts +1 -1
- package/utils/utils.d.ts +8 -1
- package/utils/utils.js +10 -2
- package/utils/warning.d.ts +1 -1
- package/hooks/utils/useResizeObserver.d.ts +0 -2
- package/hooks/utils/useResizeObserver.js +0 -36
- package/modern/hooks/utils/useResizeObserver.js +0 -36
- package/node/hooks/utils/useResizeObserver.js +0 -44
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { styled } from '@mui/system';
|
|
5
|
+
import useForkRef from '@mui/utils/useForkRef';
|
|
6
|
+
import composeClasses from '@mui/utils/composeClasses';
|
|
7
|
+
import { useGridApiContext } from '../hooks/utils/useGridApiContext';
|
|
8
|
+
import { useGridRootProps } from '../hooks/utils/useGridRootProps';
|
|
9
|
+
import { GridPinnedColumnPosition, gridColumnPositionsSelector, gridColumnsTotalWidthSelector, gridDimensionsSelector, gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, useGridApiEventHandler, useGridSelector } from '../hooks';
|
|
10
|
+
import { getDataGridUtilityClass, gridClasses } from '../constants/gridClasses';
|
|
11
|
+
import { getPinnedCellOffset } from '../internals/utils/getPinnedCellOffset';
|
|
12
|
+
import { shouldCellShowLeftBorder, shouldCellShowRightBorder } from '../utils/cellBorderUtils';
|
|
13
|
+
import { escapeOperandAttributeSelector } from '../utils/domUtils';
|
|
14
|
+
import { GridScrollbarFillerCell } from './GridScrollbarFillerCell';
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
const SkeletonOverlay = styled('div', {
|
|
17
|
+
name: 'MuiDataGrid',
|
|
18
|
+
slot: 'SkeletonLoadingOverlay',
|
|
19
|
+
overridesResolver: (props, styles) => styles.skeletonLoadingOverlay
|
|
20
|
+
})({
|
|
21
|
+
minWidth: '100%',
|
|
22
|
+
width: 'max-content',
|
|
23
|
+
// prevents overflow: clip; cutting off the x axis
|
|
24
|
+
height: '100%',
|
|
25
|
+
overflow: 'clip' // y axis is hidden while the x axis is allowed to overflow
|
|
26
|
+
});
|
|
27
|
+
const useUtilityClasses = ownerState => {
|
|
28
|
+
const {
|
|
29
|
+
classes
|
|
30
|
+
} = ownerState;
|
|
31
|
+
const slots = {
|
|
32
|
+
root: ['skeletonLoadingOverlay']
|
|
33
|
+
};
|
|
34
|
+
return composeClasses(slots, getDataGridUtilityClass, classes);
|
|
35
|
+
};
|
|
36
|
+
const getColIndex = el => parseInt(el.getAttribute('data-colindex'), 10);
|
|
37
|
+
const GridSkeletonLoadingOverlay = /*#__PURE__*/React.forwardRef(function GridSkeletonLoadingOverlay(props, forwardedRef) {
|
|
38
|
+
const rootProps = useGridRootProps();
|
|
39
|
+
const {
|
|
40
|
+
slots
|
|
41
|
+
} = rootProps;
|
|
42
|
+
const classes = useUtilityClasses({
|
|
43
|
+
classes: rootProps.classes
|
|
44
|
+
});
|
|
45
|
+
const ref = React.useRef(null);
|
|
46
|
+
const handleRef = useForkRef(ref, forwardedRef);
|
|
47
|
+
const apiRef = useGridApiContext();
|
|
48
|
+
const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
|
|
49
|
+
const viewportHeight = dimensions?.viewportInnerSize.height ?? 0;
|
|
50
|
+
const skeletonRowsCount = Math.ceil(viewportHeight / dimensions.rowHeight);
|
|
51
|
+
const totalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector);
|
|
52
|
+
const positions = useGridSelector(apiRef, gridColumnPositionsSelector);
|
|
53
|
+
const inViewportCount = React.useMemo(() => positions.filter(value => value <= totalWidth).length, [totalWidth, positions]);
|
|
54
|
+
const allVisibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
|
|
55
|
+
const columns = React.useMemo(() => allVisibleColumns.slice(0, inViewportCount), [allVisibleColumns, inViewportCount]);
|
|
56
|
+
const pinnedColumns = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
|
|
57
|
+
const getPinnedStyle = React.useCallback((computedWidth, index, position) => {
|
|
58
|
+
const pinnedOffset = getPinnedCellOffset(position, computedWidth, index, positions, dimensions);
|
|
59
|
+
return {
|
|
60
|
+
[position]: pinnedOffset
|
|
61
|
+
};
|
|
62
|
+
}, [dimensions, positions]);
|
|
63
|
+
const getPinnedPosition = React.useCallback(field => {
|
|
64
|
+
if (pinnedColumns.left.findIndex(col => col.field === field) !== -1) {
|
|
65
|
+
return GridPinnedColumnPosition.LEFT;
|
|
66
|
+
}
|
|
67
|
+
if (pinnedColumns.right.findIndex(col => col.field === field) !== -1) {
|
|
68
|
+
return GridPinnedColumnPosition.RIGHT;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}, [pinnedColumns.left, pinnedColumns.right]);
|
|
72
|
+
const children = React.useMemo(() => {
|
|
73
|
+
const array = [];
|
|
74
|
+
for (let i = 0; i < skeletonRowsCount; i += 1) {
|
|
75
|
+
const rowCells = [];
|
|
76
|
+
for (let colIndex = 0; colIndex < columns.length; colIndex += 1) {
|
|
77
|
+
const column = columns[colIndex];
|
|
78
|
+
const pinnedPosition = getPinnedPosition(column.field);
|
|
79
|
+
const isPinnedLeft = pinnedPosition === GridPinnedColumnPosition.LEFT;
|
|
80
|
+
const isPinnedRight = pinnedPosition === GridPinnedColumnPosition.RIGHT;
|
|
81
|
+
const sectionLength = pinnedPosition ? pinnedColumns[pinnedPosition].length // pinned section
|
|
82
|
+
: columns.length - pinnedColumns.left.length - pinnedColumns.right.length; // middle section
|
|
83
|
+
const sectionIndex = pinnedPosition ? pinnedColumns[pinnedPosition].findIndex(col => col.field === column.field) // pinned section
|
|
84
|
+
: colIndex - pinnedColumns.left.length; // middle section
|
|
85
|
+
const pinnedStyle = pinnedPosition && getPinnedStyle(column.computedWidth, colIndex, pinnedPosition);
|
|
86
|
+
const gridHasFiller = dimensions.columnsTotalWidth < dimensions.viewportOuterSize.width;
|
|
87
|
+
const showRightBorder = shouldCellShowRightBorder(pinnedPosition, sectionIndex, sectionLength, rootProps.showCellVerticalBorder, gridHasFiller);
|
|
88
|
+
const showLeftBorder = shouldCellShowLeftBorder(pinnedPosition, sectionIndex);
|
|
89
|
+
const isLastColumn = colIndex === columns.length - 1;
|
|
90
|
+
const isFirstPinnedRight = isPinnedRight && sectionIndex === 0;
|
|
91
|
+
const hasFillerBefore = isFirstPinnedRight && gridHasFiller;
|
|
92
|
+
const hasFillerAfter = isLastColumn && !isFirstPinnedRight && gridHasFiller;
|
|
93
|
+
const expandedWidth = dimensions.viewportOuterSize.width - dimensions.columnsTotalWidth;
|
|
94
|
+
const emptyCellWidth = Math.max(0, expandedWidth);
|
|
95
|
+
const emptyCell = /*#__PURE__*/_jsx(slots.skeletonCell, {
|
|
96
|
+
width: emptyCellWidth,
|
|
97
|
+
empty: true
|
|
98
|
+
}, `skeleton-filler-column-${i}`);
|
|
99
|
+
const scrollbarWidth = dimensions.hasScrollY ? dimensions.scrollbarSize : 0;
|
|
100
|
+
const hasScrollbarFiller = isLastColumn && scrollbarWidth !== 0;
|
|
101
|
+
if (hasFillerBefore) {
|
|
102
|
+
rowCells.push(emptyCell);
|
|
103
|
+
}
|
|
104
|
+
rowCells.push( /*#__PURE__*/_jsx(slots.skeletonCell, {
|
|
105
|
+
field: column.field,
|
|
106
|
+
type: column.type,
|
|
107
|
+
align: column.align,
|
|
108
|
+
width: "var(--width)",
|
|
109
|
+
height: dimensions.rowHeight,
|
|
110
|
+
"data-colindex": colIndex,
|
|
111
|
+
className: clsx(isPinnedLeft && gridClasses['cell--pinnedLeft'], isPinnedRight && gridClasses['cell--pinnedRight'], showRightBorder && gridClasses['cell--withRightBorder'], showLeftBorder && gridClasses['cell--withLeftBorder']),
|
|
112
|
+
style: _extends({
|
|
113
|
+
'--width': `${column.computedWidth}px`
|
|
114
|
+
}, pinnedStyle)
|
|
115
|
+
}, `skeleton-column-${i}-${column.field}`));
|
|
116
|
+
if (hasFillerAfter) {
|
|
117
|
+
rowCells.push(emptyCell);
|
|
118
|
+
}
|
|
119
|
+
if (hasScrollbarFiller) {
|
|
120
|
+
rowCells.push( /*#__PURE__*/_jsx(GridScrollbarFillerCell, {
|
|
121
|
+
pinnedRight: pinnedColumns.right.length > 0
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
array.push( /*#__PURE__*/_jsx("div", {
|
|
126
|
+
className: clsx(gridClasses.row, gridClasses.rowSkeleton, i === 0 && gridClasses['row--firstVisible']),
|
|
127
|
+
children: rowCells
|
|
128
|
+
}, `skeleton-row-${i}`));
|
|
129
|
+
}
|
|
130
|
+
return array;
|
|
131
|
+
}, [slots, columns, pinnedColumns, skeletonRowsCount, rootProps.showCellVerticalBorder, dimensions.columnsTotalWidth, dimensions.viewportOuterSize.width, dimensions.rowHeight, dimensions.hasScrollY, dimensions.scrollbarSize, getPinnedPosition, getPinnedStyle]);
|
|
132
|
+
|
|
133
|
+
// Sync the column resize of the overlay columns with the grid
|
|
134
|
+
const handleColumnResize = params => {
|
|
135
|
+
const {
|
|
136
|
+
colDef,
|
|
137
|
+
width
|
|
138
|
+
} = params;
|
|
139
|
+
const cells = ref.current?.querySelectorAll(`[data-field="${escapeOperandAttributeSelector(colDef.field)}"]`);
|
|
140
|
+
if (!cells) {
|
|
141
|
+
throw new Error('MUI X: Expected skeleton cells to be defined with `data-field` attribute.');
|
|
142
|
+
}
|
|
143
|
+
const resizedColIndex = columns.findIndex(col => col.field === colDef.field);
|
|
144
|
+
const pinnedPosition = getPinnedPosition(colDef.field);
|
|
145
|
+
const isPinnedLeft = pinnedPosition === GridPinnedColumnPosition.LEFT;
|
|
146
|
+
const isPinnedRight = pinnedPosition === GridPinnedColumnPosition.RIGHT;
|
|
147
|
+
const currentWidth = getComputedStyle(cells[0]).getPropertyValue('--width');
|
|
148
|
+
const delta = parseInt(currentWidth, 10) - width;
|
|
149
|
+
if (cells) {
|
|
150
|
+
cells.forEach(element => {
|
|
151
|
+
element.style.setProperty('--width', `${width}px`);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (isPinnedLeft) {
|
|
155
|
+
const pinnedCells = ref.current?.querySelectorAll(`.${gridClasses['cell--pinnedLeft']}`);
|
|
156
|
+
pinnedCells?.forEach(element => {
|
|
157
|
+
const colIndex = getColIndex(element);
|
|
158
|
+
if (colIndex > resizedColIndex) {
|
|
159
|
+
element.style.left = `${parseInt(getComputedStyle(element).left, 10) - delta}px`;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (isPinnedRight) {
|
|
164
|
+
const pinnedCells = ref.current?.querySelectorAll(`.${gridClasses['cell--pinnedRight']}`);
|
|
165
|
+
pinnedCells?.forEach(element => {
|
|
166
|
+
const colIndex = getColIndex(element);
|
|
167
|
+
if (colIndex < resizedColIndex) {
|
|
168
|
+
element.style.right = `${parseInt(getComputedStyle(element).right, 10) + delta}px`;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
useGridApiEventHandler(apiRef, 'columnResize', handleColumnResize);
|
|
174
|
+
return /*#__PURE__*/_jsx(SkeletonOverlay, _extends({
|
|
175
|
+
className: classes.root,
|
|
176
|
+
ref: handleRef
|
|
177
|
+
}, props, {
|
|
178
|
+
children: children
|
|
179
|
+
}));
|
|
180
|
+
});
|
|
181
|
+
export { GridSkeletonLoadingOverlay };
|
|
@@ -5,8 +5,6 @@ import { styled } from '@mui/system';
|
|
|
5
5
|
import { unstable_composeClasses as composeClasses } from '@mui/utils';
|
|
6
6
|
import clsx from 'clsx';
|
|
7
7
|
import { useGridSelector } from '../../hooks/utils/useGridSelector';
|
|
8
|
-
import { gridExpandedRowCountSelector } from '../../hooks/features/filter/gridFilterSelector';
|
|
9
|
-
import { gridRowCountSelector, gridRowsLoadingSelector } from '../../hooks/features/rows/gridRowsSelector';
|
|
10
8
|
import { gridDimensionsSelector } from '../../hooks/features/dimensions';
|
|
11
9
|
import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
|
|
12
10
|
import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
|
|
@@ -17,11 +15,14 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
17
15
|
const GridOverlayWrapperRoot = styled('div', {
|
|
18
16
|
name: 'MuiDataGrid',
|
|
19
17
|
slot: 'OverlayWrapper',
|
|
20
|
-
shouldForwardProp: prop => prop !== 'overlayType',
|
|
18
|
+
shouldForwardProp: prop => prop !== 'overlayType' && prop !== 'loadingOverlayVariant',
|
|
21
19
|
overridesResolver: (props, styles) => styles.overlayWrapper
|
|
22
20
|
})(({
|
|
23
|
-
overlayType
|
|
24
|
-
|
|
21
|
+
overlayType,
|
|
22
|
+
loadingOverlayVariant
|
|
23
|
+
}) =>
|
|
24
|
+
// Skeleton overlay should flow with the scroll container and not be sticky
|
|
25
|
+
loadingOverlayVariant !== 'skeleton' ? {
|
|
25
26
|
position: 'sticky',
|
|
26
27
|
// To stay in place while scrolling
|
|
27
28
|
top: 'var(--DataGrid-headersTotalHeight)',
|
|
@@ -32,11 +33,11 @@ const GridOverlayWrapperRoot = styled('div', {
|
|
|
32
33
|
// To stay above the content instead of shifting it down
|
|
33
34
|
zIndex: overlayType === 'loadingOverlay' ? 5 // Should be above pinned columns, pinned rows, and detail panel
|
|
34
35
|
: 4 // Should be above pinned columns and detail panel
|
|
35
|
-
})
|
|
36
|
+
} : {});
|
|
36
37
|
const GridOverlayWrapperInner = styled('div', {
|
|
37
38
|
name: 'MuiDataGrid',
|
|
38
39
|
slot: 'OverlayWrapperInner',
|
|
39
|
-
shouldForwardProp: prop => prop !== 'overlayType',
|
|
40
|
+
shouldForwardProp: prop => prop !== 'overlayType' && prop !== 'loadingOverlayVariant',
|
|
40
41
|
overridesResolver: (props, styles) => styles.overlayWrapperInner
|
|
41
42
|
})({});
|
|
42
43
|
const useUtilityClasses = ownerState => {
|
|
@@ -61,9 +62,9 @@ function GridOverlayWrapper(props) {
|
|
|
61
62
|
const classes = useUtilityClasses(_extends({}, props, {
|
|
62
63
|
classes: rootProps.classes
|
|
63
64
|
}));
|
|
64
|
-
return /*#__PURE__*/_jsx(GridOverlayWrapperRoot, {
|
|
65
|
-
className: clsx(classes.root)
|
|
66
|
-
|
|
65
|
+
return /*#__PURE__*/_jsx(GridOverlayWrapperRoot, _extends({
|
|
66
|
+
className: clsx(classes.root)
|
|
67
|
+
}, props, {
|
|
67
68
|
children: /*#__PURE__*/_jsx(GridOverlayWrapperInner, _extends({
|
|
68
69
|
className: clsx(classes.inner),
|
|
69
70
|
style: {
|
|
@@ -71,42 +72,27 @@ function GridOverlayWrapper(props) {
|
|
|
71
72
|
width: dimensions.viewportOuterSize.width
|
|
72
73
|
}
|
|
73
74
|
}, props))
|
|
74
|
-
});
|
|
75
|
+
}));
|
|
75
76
|
}
|
|
76
|
-
process.env.NODE_ENV !== "production" ?
|
|
77
|
+
process.env.NODE_ENV !== "production" ? GridOverlays.propTypes = {
|
|
77
78
|
// ----------------------------- Warning --------------------------------
|
|
78
79
|
// | These PropTypes are generated from the TypeScript type definitions |
|
|
79
80
|
// | To update them edit the TypeScript types and run "pnpm proptypes" |
|
|
80
81
|
// ----------------------------------------------------------------------
|
|
81
|
-
|
|
82
|
+
loadingOverlayVariant: PropTypes.oneOf(['circular-progress', 'linear-progress', 'skeleton']),
|
|
83
|
+
overlayType: PropTypes.oneOf(['loadingOverlay', 'noResultsOverlay', 'noRowsOverlay'])
|
|
82
84
|
} : void 0;
|
|
83
|
-
export function GridOverlays() {
|
|
84
|
-
const
|
|
85
|
+
export function GridOverlays(props) {
|
|
86
|
+
const {
|
|
87
|
+
overlayType
|
|
88
|
+
} = props;
|
|
85
89
|
const rootProps = useGridRootProps();
|
|
86
|
-
|
|
87
|
-
const visibleRowCount = useGridSelector(apiRef, gridExpandedRowCountSelector);
|
|
88
|
-
const loading = useGridSelector(apiRef, gridRowsLoadingSelector);
|
|
89
|
-
const showNoRowsOverlay = !loading && totalRowCount === 0;
|
|
90
|
-
const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
|
|
91
|
-
let overlay = null;
|
|
92
|
-
let overlayType = '';
|
|
93
|
-
if (showNoRowsOverlay) {
|
|
94
|
-
overlay = /*#__PURE__*/_jsx(rootProps.slots.noRowsOverlay, _extends({}, rootProps.slotProps?.noRowsOverlay));
|
|
95
|
-
overlayType = 'noRowsOverlay';
|
|
96
|
-
}
|
|
97
|
-
if (showNoResultsOverlay) {
|
|
98
|
-
overlay = /*#__PURE__*/_jsx(rootProps.slots.noResultsOverlay, _extends({}, rootProps.slotProps?.noResultsOverlay));
|
|
99
|
-
overlayType = 'noResultsOverlay';
|
|
100
|
-
}
|
|
101
|
-
if (loading) {
|
|
102
|
-
overlay = /*#__PURE__*/_jsx(rootProps.slots.loadingOverlay, _extends({}, rootProps.slotProps?.loadingOverlay));
|
|
103
|
-
overlayType = 'loadingOverlay';
|
|
104
|
-
}
|
|
105
|
-
if (overlay === null) {
|
|
90
|
+
if (!overlayType) {
|
|
106
91
|
return null;
|
|
107
92
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
const Overlay = rootProps.slots?.[overlayType];
|
|
94
|
+
const overlayProps = rootProps.slotProps?.[overlayType];
|
|
95
|
+
return /*#__PURE__*/_jsx(GridOverlayWrapper, _extends({}, props, {
|
|
96
|
+
children: /*#__PURE__*/_jsx(Overlay, _extends({}, overlayProps))
|
|
97
|
+
}));
|
|
112
98
|
}
|
|
@@ -1,52 +1,88 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["field", "align", "width", "height"];
|
|
3
|
+
const _excluded = ["field", "type", "align", "width", "height", "empty", "style", "className"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import Skeleton from '@mui/material/Skeleton';
|
|
7
7
|
import { unstable_composeClasses as composeClasses, unstable_capitalize as capitalize } from '@mui/utils';
|
|
8
|
+
import clsx from 'clsx';
|
|
8
9
|
import { fastMemo } from '../../utils/fastMemo';
|
|
9
|
-
import {
|
|
10
|
+
import { createRandomNumberGenerator } from '../../utils/utils';
|
|
10
11
|
import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
|
|
11
12
|
import { getDataGridUtilityClass } from '../../constants/gridClasses';
|
|
12
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
-
const
|
|
14
|
+
const CIRCULAR_CONTENT_SIZE = '1.3em';
|
|
15
|
+
const CONTENT_HEIGHT = '1.2em';
|
|
16
|
+
const DEFAULT_CONTENT_WIDTH_RANGE = [40, 80];
|
|
17
|
+
const CONTENT_WIDTH_RANGE_BY_TYPE = {
|
|
18
|
+
number: [40, 60],
|
|
19
|
+
string: [40, 80],
|
|
20
|
+
date: [40, 60],
|
|
21
|
+
dateTime: [60, 80],
|
|
22
|
+
singleSelect: [40, 80]
|
|
23
|
+
};
|
|
14
24
|
const useUtilityClasses = ownerState => {
|
|
15
25
|
const {
|
|
16
26
|
align,
|
|
17
|
-
classes
|
|
27
|
+
classes,
|
|
28
|
+
empty
|
|
18
29
|
} = ownerState;
|
|
19
30
|
const slots = {
|
|
20
|
-
root: ['cell', 'cellSkeleton', `cell--text${capitalize(align)}`, '
|
|
31
|
+
root: ['cell', 'cellSkeleton', `cell--text${align ? capitalize(align) : 'Left'}`, empty && 'cellEmpty']
|
|
21
32
|
};
|
|
22
33
|
return composeClasses(slots, getDataGridUtilityClass, classes);
|
|
23
34
|
};
|
|
35
|
+
const randomNumberGenerator = createRandomNumberGenerator(12345);
|
|
24
36
|
function GridSkeletonCell(props) {
|
|
25
37
|
const {
|
|
38
|
+
field,
|
|
39
|
+
type,
|
|
26
40
|
align,
|
|
27
41
|
width,
|
|
28
|
-
height
|
|
42
|
+
height,
|
|
43
|
+
empty = false,
|
|
44
|
+
style,
|
|
45
|
+
className
|
|
29
46
|
} = props,
|
|
30
47
|
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
31
48
|
const rootProps = useGridRootProps();
|
|
32
49
|
const ownerState = {
|
|
33
50
|
classes: rootProps.classes,
|
|
34
|
-
align
|
|
51
|
+
align,
|
|
52
|
+
empty
|
|
35
53
|
};
|
|
36
54
|
const classes = useUtilityClasses(ownerState);
|
|
37
|
-
|
|
55
|
+
|
|
56
|
+
// Memo prevents the non-circular skeleton widths changing to random widths on every render
|
|
57
|
+
const skeletonProps = React.useMemo(() => {
|
|
58
|
+
const isCircularContent = type === 'boolean' || type === 'actions';
|
|
59
|
+
if (isCircularContent) {
|
|
60
|
+
return {
|
|
61
|
+
variant: 'circular',
|
|
62
|
+
width: CIRCULAR_CONTENT_SIZE,
|
|
63
|
+
height: CIRCULAR_CONTENT_SIZE
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The width of the skeleton is a random number between the min and max values
|
|
68
|
+
// The min and max values are determined by the type of the column
|
|
69
|
+
const [min, max] = type ? CONTENT_WIDTH_RANGE_BY_TYPE[type] ?? DEFAULT_CONTENT_WIDTH_RANGE : DEFAULT_CONTENT_WIDTH_RANGE;
|
|
70
|
+
return {
|
|
71
|
+
variant: 'text',
|
|
72
|
+
width: `${Math.round(randomNumberGenerator(min, max))}%`,
|
|
73
|
+
height: CONTENT_HEIGHT
|
|
74
|
+
};
|
|
75
|
+
}, [type]);
|
|
38
76
|
return /*#__PURE__*/_jsx("div", _extends({
|
|
39
|
-
|
|
40
|
-
|
|
77
|
+
"data-field": field,
|
|
78
|
+
className: clsx(classes.root, className),
|
|
79
|
+
style: _extends({
|
|
41
80
|
height,
|
|
42
81
|
maxWidth: width,
|
|
43
82
|
minWidth: width
|
|
44
|
-
}
|
|
83
|
+
}, style)
|
|
45
84
|
}, other, {
|
|
46
|
-
children: /*#__PURE__*/_jsx(Skeleton, {
|
|
47
|
-
width: `${contentWidth}%`,
|
|
48
|
-
height: 25
|
|
49
|
-
})
|
|
85
|
+
children: !empty && /*#__PURE__*/_jsx(Skeleton, _extends({}, skeletonProps))
|
|
50
86
|
}));
|
|
51
87
|
}
|
|
52
88
|
process.env.NODE_ENV !== "production" ? GridSkeletonCell.propTypes = {
|
|
@@ -54,10 +90,16 @@ process.env.NODE_ENV !== "production" ? GridSkeletonCell.propTypes = {
|
|
|
54
90
|
// | These PropTypes are generated from the TypeScript type definitions |
|
|
55
91
|
// | To update them edit the TypeScript types and run "pnpm proptypes" |
|
|
56
92
|
// ----------------------------------------------------------------------
|
|
57
|
-
align: PropTypes.string
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
93
|
+
align: PropTypes.string,
|
|
94
|
+
/**
|
|
95
|
+
* If `true`, the cell will not display the skeleton but still reserve the cell space.
|
|
96
|
+
* @default false
|
|
97
|
+
*/
|
|
98
|
+
empty: PropTypes.bool,
|
|
99
|
+
field: PropTypes.string,
|
|
100
|
+
height: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.number]),
|
|
101
|
+
type: PropTypes.oneOf(['actions', 'boolean', 'custom', 'date', 'dateTime', 'number', 'singleSelect', 'string']),
|
|
102
|
+
width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])
|
|
61
103
|
} : void 0;
|
|
62
104
|
const Memoized = fastMemo(GridSkeletonCell);
|
|
63
105
|
export { Memoized as GridSkeletonCell };
|
|
@@ -5,7 +5,6 @@ import clsx from 'clsx';
|
|
|
5
5
|
import { unstable_composeClasses as composeClasses, unstable_useId as useId } from '@mui/utils';
|
|
6
6
|
import { fastMemo } from '../../utils/fastMemo';
|
|
7
7
|
import { useGridPrivateApiContext } from '../../hooks/utils/useGridPrivateApiContext';
|
|
8
|
-
import { GridColumnHeaderSortIcon } from './GridColumnHeaderSortIcon';
|
|
9
8
|
import { ColumnHeaderMenuIcon } from './ColumnHeaderMenuIcon';
|
|
10
9
|
import { GridColumnHeaderMenu } from '../menu/columnMenu/GridColumnHeaderMenu';
|
|
11
10
|
import { gridClasses, getDataGridUtilityClass } from '../../constants/gridClasses';
|
|
@@ -142,12 +141,13 @@ function GridColumnHeaderItem(props) {
|
|
|
142
141
|
children: [!rootProps.disableColumnFilter && /*#__PURE__*/_jsx(rootProps.slots.columnHeaderFilterIconButton, _extends({
|
|
143
142
|
field: colDef.field,
|
|
144
143
|
counter: filterItemsCounter
|
|
145
|
-
}, rootProps.slotProps?.columnHeaderFilterIconButton)), showSortIcon && /*#__PURE__*/_jsx(
|
|
144
|
+
}, rootProps.slotProps?.columnHeaderFilterIconButton)), showSortIcon && /*#__PURE__*/_jsx(rootProps.slots.columnHeaderSortIcon, _extends({
|
|
145
|
+
field: colDef.field,
|
|
146
146
|
direction: sortDirection,
|
|
147
147
|
index: sortIndex,
|
|
148
148
|
sortingOrder: sortingOrder,
|
|
149
149
|
disabled: !colDef.sortable
|
|
150
|
-
})]
|
|
150
|
+
}, rootProps.slotProps?.columnHeaderSortIcon))]
|
|
151
151
|
});
|
|
152
152
|
React.useLayoutEffect(() => {
|
|
153
153
|
const columnMenuState = apiRef.current.state.columnMenu;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
1
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
+
const _excluded = ["direction", "index", "sortingOrder", "disabled"];
|
|
2
4
|
import * as React from 'react';
|
|
3
5
|
import PropTypes from 'prop-types';
|
|
4
6
|
import { unstable_composeClasses as composeClasses } from '@mui/utils';
|
|
@@ -35,11 +37,12 @@ function getIcon(icons, direction, className, sortingOrder) {
|
|
|
35
37
|
}
|
|
36
38
|
function GridColumnHeaderSortIconRaw(props) {
|
|
37
39
|
const {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
direction,
|
|
41
|
+
index,
|
|
42
|
+
sortingOrder,
|
|
43
|
+
disabled
|
|
44
|
+
} = props,
|
|
45
|
+
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
43
46
|
const apiRef = useGridApiContext();
|
|
44
47
|
const rootProps = useGridRootProps();
|
|
45
48
|
const ownerState = _extends({}, props, {
|
|
@@ -56,13 +59,14 @@ function GridColumnHeaderSortIconRaw(props) {
|
|
|
56
59
|
title: apiRef.current.getLocaleText('columnHeaderSortIconLabel'),
|
|
57
60
|
size: "small",
|
|
58
61
|
disabled: disabled
|
|
59
|
-
}, rootProps.slotProps?.baseIconButton, {
|
|
62
|
+
}, rootProps.slotProps?.baseIconButton, other, {
|
|
60
63
|
children: iconElement
|
|
61
64
|
}));
|
|
62
65
|
return /*#__PURE__*/_jsxs(GridIconButtonContainer, {
|
|
63
66
|
children: [index != null && /*#__PURE__*/_jsx(Badge, {
|
|
64
67
|
badgeContent: index,
|
|
65
68
|
color: "default",
|
|
69
|
+
overlap: "circular",
|
|
66
70
|
children: iconButton
|
|
67
71
|
}), index == null && iconButton]
|
|
68
72
|
});
|
|
@@ -75,6 +79,7 @@ process.env.NODE_ENV !== "production" ? GridColumnHeaderSortIconRaw.propTypes =
|
|
|
75
79
|
// ----------------------------------------------------------------------
|
|
76
80
|
direction: PropTypes.oneOf(['asc', 'desc']),
|
|
77
81
|
disabled: PropTypes.bool,
|
|
82
|
+
field: PropTypes.string.isRequired,
|
|
78
83
|
index: PropTypes.number,
|
|
79
84
|
sortingOrder: PropTypes.arrayOf(PropTypes.oneOf(['asc', 'desc'])).isRequired
|
|
80
85
|
} : void 0;
|
|
@@ -141,6 +141,8 @@ export const GridRootStyles = styled('div', {
|
|
|
141
141
|
[`& .${c.treeDataGroupingCell}`]: styles.treeDataGroupingCell
|
|
142
142
|
}, {
|
|
143
143
|
[`& .${c.treeDataGroupingCellToggle}`]: styles.treeDataGroupingCellToggle
|
|
144
|
+
}, {
|
|
145
|
+
[`& .${c.treeDataGroupingCellLoadingContainer}`]: styles.treeDataGroupingCellLoadingContainer
|
|
144
146
|
}, {
|
|
145
147
|
[`& .${c.detailPanelToggleCell}`]: styles.detailPanelToggleCell
|
|
146
148
|
}, {
|
|
@@ -159,7 +161,7 @@ export const GridRootStyles = styled('div', {
|
|
|
159
161
|
const selectedOpacity = (t.vars || t).palette.action.selectedOpacity;
|
|
160
162
|
const selectedBackground = t.vars ? `rgba(${t.vars.palette.primary.mainChannel} / ${selectedOpacity})` : alpha(t.palette.primary.main, selectedOpacity);
|
|
161
163
|
const selectedHoverBackground = t.vars ? `rgba(${t.vars.palette.primary.mainChannel} / calc(
|
|
162
|
-
${t.vars.palette.action.selectedOpacity} +
|
|
164
|
+
${t.vars.palette.action.selectedOpacity} +
|
|
163
165
|
${t.vars.palette.action.hoverOpacity}
|
|
164
166
|
))` : alpha(t.palette.primary.main, t.palette.action.selectedOpacity + t.palette.action.hoverOpacity);
|
|
165
167
|
const pinnedHoverBackground = t.vars ? hoverColor : blend(pinnedBackground, hoverColor, hoverOpacity);
|
|
@@ -423,6 +425,9 @@ export const GridRootStyles = styled('div', {
|
|
|
423
425
|
backgroundColor: 'transparent'
|
|
424
426
|
}
|
|
425
427
|
},
|
|
428
|
+
[`&.${c.rowSkeleton}:hover`]: {
|
|
429
|
+
backgroundColor: 'transparent'
|
|
430
|
+
},
|
|
426
431
|
'&.Mui-selected': selectedStyles
|
|
427
432
|
},
|
|
428
433
|
[`& .${c['container--top']}, & .${c['container--bottom']}`]: {
|
|
@@ -608,6 +613,12 @@ export const GridRootStyles = styled('div', {
|
|
|
608
613
|
alignSelf: 'stretch',
|
|
609
614
|
marginRight: t.spacing(2)
|
|
610
615
|
},
|
|
616
|
+
[`& .${c.treeDataGroupingCellLoadingContainer}`]: {
|
|
617
|
+
display: 'flex',
|
|
618
|
+
alignItems: 'center',
|
|
619
|
+
justifyContent: 'center',
|
|
620
|
+
height: '100%'
|
|
621
|
+
},
|
|
611
622
|
[`& .${c.groupingCriteriaCell}`]: {
|
|
612
623
|
display: 'flex',
|
|
613
624
|
alignItems: 'center',
|
|
@@ -623,7 +634,7 @@ export const GridRootStyles = styled('div', {
|
|
|
623
634
|
minWidth: 'calc(var(--DataGrid-hasScrollY) * var(--DataGrid-scrollbarSize))',
|
|
624
635
|
alignSelf: 'stretch',
|
|
625
636
|
[`&.${c['scrollbarFiller--borderTop']}`]: {
|
|
626
|
-
borderTop: '1px solid var(--
|
|
637
|
+
borderTop: '1px solid var(--rowBorderColor)'
|
|
627
638
|
},
|
|
628
639
|
[`&.${c['scrollbarFiller--pinnedRight']}`]: {
|
|
629
640
|
backgroundColor: 'var(--DataGrid-pinnedBackground)',
|
|
@@ -636,6 +647,12 @@ export const GridRootStyles = styled('div', {
|
|
|
636
647
|
},
|
|
637
648
|
[`& .${c['filler--borderTop']}`]: {
|
|
638
649
|
borderTop: '1px solid var(--DataGrid-rowBorderColor)'
|
|
650
|
+
},
|
|
651
|
+
/* Hide grid rows and vertical scrollbar when skeleton overlay is visible */
|
|
652
|
+
[`& .${c['main--hasSkeletonLoadingOverlay']}`]: {
|
|
653
|
+
[`& .${c.virtualScrollerContent}, & .${c['scrollbar--vertical']}, & .${c.pinnedRows}`]: {
|
|
654
|
+
display: 'none'
|
|
655
|
+
}
|
|
639
656
|
}
|
|
640
657
|
});
|
|
641
658
|
return gridStyle;
|
|
@@ -9,7 +9,8 @@ import { useGridSelector } from '../../hooks/utils/useGridSelector';
|
|
|
9
9
|
import { getDataGridUtilityClass } from '../../constants/gridClasses';
|
|
10
10
|
import { gridDimensionsSelector } from '../../hooks/features/dimensions';
|
|
11
11
|
import { useGridVirtualScroller } from '../../hooks/features/virtualization/useGridVirtualScroller';
|
|
12
|
-
import {
|
|
12
|
+
import { useGridOverlays } from '../../hooks/features/overlays/useGridOverlays';
|
|
13
|
+
import { GridOverlays as Overlays } from '../base/GridOverlays';
|
|
13
14
|
import { GridHeaders } from '../GridHeaders';
|
|
14
15
|
import { GridMainContainer as Container } from './GridMainContainer';
|
|
15
16
|
import { GridTopContainer as TopContainer } from './GridTopContainer';
|
|
@@ -19,12 +20,12 @@ import { GridVirtualScrollerFiller as SpaceFiller } from './GridVirtualScrollerF
|
|
|
19
20
|
import { GridVirtualScrollerRenderZone as RenderZone } from './GridVirtualScrollerRenderZone';
|
|
20
21
|
import { GridVirtualScrollbar as Scrollbar } from './GridVirtualScrollbar';
|
|
21
22
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
22
|
-
const useUtilityClasses = (ownerState, dimensions) => {
|
|
23
|
+
const useUtilityClasses = (ownerState, dimensions, loadingOverlayVariant) => {
|
|
23
24
|
const {
|
|
24
25
|
classes
|
|
25
26
|
} = ownerState;
|
|
26
27
|
const slots = {
|
|
27
|
-
root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight'],
|
|
28
|
+
root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight', loadingOverlayVariant === 'skeleton' && 'main--hasSkeletonLoadingOverlay'],
|
|
28
29
|
scroller: ['virtualScroller']
|
|
29
30
|
};
|
|
30
31
|
return composeClasses(slots, getDataGridUtilityClass, classes);
|
|
@@ -51,7 +52,8 @@ function GridVirtualScroller(props) {
|
|
|
51
52
|
const apiRef = useGridApiContext();
|
|
52
53
|
const rootProps = useGridRootProps();
|
|
53
54
|
const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
|
|
54
|
-
const
|
|
55
|
+
const overlaysProps = useGridOverlays();
|
|
56
|
+
const classes = useUtilityClasses(rootProps, dimensions, overlaysProps.loadingOverlayVariant);
|
|
55
57
|
const virtualScroller = useGridVirtualScroller();
|
|
56
58
|
const {
|
|
57
59
|
getContainerProps,
|
|
@@ -79,7 +81,7 @@ function GridVirtualScroller(props) {
|
|
|
79
81
|
position: "top",
|
|
80
82
|
virtualScroller: virtualScroller
|
|
81
83
|
})]
|
|
82
|
-
}), /*#__PURE__*/_jsx(
|
|
84
|
+
}), /*#__PURE__*/_jsx(Overlays, _extends({}, overlaysProps)), /*#__PURE__*/_jsx(Content, _extends({}, getContentProps(), {
|
|
83
85
|
children: /*#__PURE__*/_jsxs(RenderZone, _extends({}, getRenderZoneProps(), {
|
|
84
86
|
children: [rows, /*#__PURE__*/_jsx(rootProps.slots.detailPanels, {
|
|
85
87
|
virtualScroller: virtualScroller
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
-
import { GridSkeletonCell, GridColumnsPanel, GridFilterPanel, GridFooter, GridLoadingOverlay, GridNoRowsOverlay, GridPagination, GridPanel, GridRow, GridColumnHeaderFilterIconButton, GridRowCount, GridColumnsManagement } from '../components';
|
|
2
|
+
import { GridSkeletonCell, GridColumnsPanel, GridFilterPanel, GridFooter, GridLoadingOverlay, GridNoRowsOverlay, GridPagination, GridPanel, GridRow, GridColumnHeaderFilterIconButton, GridRowCount, GridColumnsManagement, GridColumnHeaderSortIcon } from '../components';
|
|
3
3
|
import { GridCell } from '../components/cell/GridCell';
|
|
4
4
|
import { GridColumnHeaders } from '../components/GridColumnHeaders';
|
|
5
5
|
import { GridColumnMenu } from '../components/menu/columnMenu/GridColumnMenu';
|
|
@@ -14,6 +14,7 @@ export const DATA_GRID_DEFAULT_SLOTS_COMPONENTS = _extends({}, materialSlots, {
|
|
|
14
14
|
cell: GridCell,
|
|
15
15
|
skeletonCell: GridSkeletonCell,
|
|
16
16
|
columnHeaderFilterIconButton: GridColumnHeaderFilterIconButton,
|
|
17
|
+
columnHeaderSortIcon: GridColumnHeaderSortIcon,
|
|
17
18
|
columnMenu: GridColumnMenu,
|
|
18
19
|
columnHeaders: GridColumnHeaders,
|
|
19
20
|
detailPanels: GridDetailPanels,
|
|
@@ -2,4 +2,4 @@ import { unstable_generateUtilityClasses as generateUtilityClasses, unstable_gen
|
|
|
2
2
|
export function getDataGridUtilityClass(slot) {
|
|
3
3
|
return generateUtilityClass('MuiDataGrid', slot);
|
|
4
4
|
}
|
|
5
|
-
export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
|
|
5
|
+
export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'main--hasSkeletonLoadingOverlay', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'rowSkeleton', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'treeDataGroupingCellLoadingContainer', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
|