@mui/x-data-grid 7.0.0-beta.7 → 7.0.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 +195 -12
- package/DataGrid/DataGrid.js +13 -17
- package/DataGrid/useDataGridProps.js +3 -5
- package/README.md +1 -1
- package/components/GridFooter.js +2 -3
- package/components/GridHeader.js +1 -2
- package/components/GridPagination.d.ts +6 -5
- package/components/GridPagination.js +12 -4
- package/components/GridRow.js +13 -17
- package/components/base/GridFooterPlaceholder.js +1 -2
- package/components/base/GridOverlays.js +3 -6
- package/components/cell/GridActionsCell.js +4 -6
- package/components/cell/GridActionsCellItem.d.ts +8 -25
- package/components/cell/GridActionsCellItem.js +8 -5
- package/components/cell/GridBooleanCell.d.ts +1 -0
- package/components/cell/GridBooleanCell.js +3 -2
- package/components/cell/GridCell.js +7 -8
- package/components/cell/GridEditBooleanCell.js +1 -2
- package/components/cell/GridEditDateCell.js +2 -3
- package/components/cell/GridEditInputCell.js +2 -2
- package/components/cell/GridEditSingleSelectCell.js +5 -8
- package/components/columnHeaders/ColumnHeaderMenuIcon.js +2 -3
- package/components/columnHeaders/GridColumnGroupHeader.js +4 -5
- package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +2 -3
- package/components/columnHeaders/GridColumnHeaderItem.js +5 -6
- package/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
- package/components/columnHeaders/GridColumnHeaderTitle.js +2 -3
- package/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -1
- package/components/columnSelection/GridCellCheckboxRenderer.js +3 -5
- package/components/columnSelection/GridHeaderCheckbox.js +1 -2
- package/components/columnsManagement/GridColumnsManagement.js +17 -21
- package/components/containers/GridRoot.js +3 -3
- package/components/menu/GridMenu.js +4 -6
- package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
- package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +2 -3
- package/components/panel/GridColumnsPanel.js +1 -2
- package/components/panel/GridPanel.d.ts +1 -10
- package/components/panel/GridPanel.js +1 -2
- package/components/panel/GridPreferencesPanel.js +2 -3
- package/components/panel/filterPanel/GridFilterForm.js +24 -27
- package/components/panel/filterPanel/GridFilterInputBoolean.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputBoolean.js +6 -7
- package/components/panel/filterPanel/GridFilterInputDate.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputDate.js +3 -4
- package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +11 -15
- package/components/panel/filterPanel/GridFilterInputMultipleValue.js +10 -14
- package/components/panel/filterPanel/GridFilterInputSingleSelect.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputSingleSelect.js +10 -11
- package/components/panel/filterPanel/GridFilterInputValue.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputValue.js +5 -7
- package/components/panel/filterPanel/GridFilterPanel.js +5 -9
- package/components/panel/filterPanel/filterPanelUtils.js +1 -1
- package/components/toolbar/GridToolbarColumnsButton.js +3 -5
- package/components/toolbar/GridToolbarDensitySelector.js +8 -10
- package/components/toolbar/GridToolbarExport.js +2 -2
- package/components/toolbar/GridToolbarExportContainer.js +3 -5
- package/components/toolbar/GridToolbarFilterButton.js +3 -5
- package/components/toolbar/GridToolbarQuickFilter.js +4 -5
- package/components/virtualization/GridVirtualScrollerContent.js +1 -2
- package/components/virtualization/GridVirtualScrollerRenderZone.js +1 -2
- package/hooks/core/strategyProcessing/useGridStrategyProcessing.js +1 -2
- package/hooks/core/useGridApiInitialization.js +4 -6
- package/hooks/features/clipboard/useGridClipboard.js +6 -5
- package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -16
- package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +4 -8
- package/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -23
- package/hooks/features/columnHeaders/useGridColumnHeaders.js +6 -8
- package/hooks/features/columnMenu/useGridColumnMenuSlots.js +2 -2
- package/hooks/features/columnResize/useGridColumnResize.js +9 -19
- package/hooks/features/columns/gridColumnsSelector.js +1 -2
- package/hooks/features/columns/gridColumnsUtils.d.ts +0 -9
- package/hooks/features/columns/gridColumnsUtils.js +2 -22
- package/hooks/features/columns/useGridColumnSpanning.js +1 -2
- package/hooks/features/columns/useGridColumns.js +11 -19
- package/hooks/features/density/densitySelector.d.ts +4 -2
- package/hooks/features/density/densitySelector.js +8 -2
- package/hooks/features/density/densityState.d.ts +1 -4
- package/hooks/features/density/useGridDensity.d.ts +2 -4
- package/hooks/features/density/useGridDensity.js +21 -29
- package/hooks/features/dimensions/useGridDimensions.js +3 -5
- package/hooks/features/editing/useGridCellEditing.js +4 -6
- package/hooks/features/editing/useGridEditing.js +1 -2
- package/hooks/features/editing/useGridRowEditing.js +4 -6
- package/hooks/features/export/serializers/csvSerializer.d.ts +2 -0
- package/hooks/features/export/serializers/csvSerializer.js +25 -16
- package/hooks/features/export/useGridCsvExport.js +9 -10
- package/hooks/features/export/useGridPrintExport.js +9 -15
- package/hooks/features/export/utils.js +2 -3
- package/hooks/features/filter/gridFilterSelector.js +15 -22
- package/hooks/features/filter/gridFilterUtils.js +10 -16
- package/hooks/features/filter/useGridFilter.js +9 -15
- package/hooks/features/focus/useGridFocus.js +5 -6
- package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +1 -4
- package/hooks/features/headerFiltering/useGridHeaderFiltering.js +12 -17
- package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +1 -2
- package/hooks/features/pagination/gridPaginationSelector.js +1 -2
- package/hooks/features/pagination/useGridPagination.js +2 -3
- package/hooks/features/pagination/useGridPaginationModel.js +6 -11
- package/hooks/features/pagination/useGridRowCount.js +3 -6
- package/hooks/features/preferencesPanel/useGridPreferencesPanel.js +7 -12
- package/hooks/features/rowSelection/useGridRowSelection.js +11 -16
- package/hooks/features/rows/gridRowsSelector.js +11 -19
- package/hooks/features/rows/gridRowsUtils.js +7 -9
- package/hooks/features/rows/useGridParamsApi.js +1 -1
- package/hooks/features/rows/useGridRows.js +4 -13
- package/hooks/features/rows/useGridRowsMeta.js +7 -13
- package/hooks/features/scroll/useGridScroll.js +2 -3
- package/hooks/features/sorting/gridSortingSelector.js +4 -7
- package/hooks/features/sorting/useGridSorting.js +8 -14
- package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
- package/hooks/features/virtualization/useGridVirtualScroller.js +220 -71
- package/hooks/utils/useGridApiEventHandler.js +5 -10
- package/hooks/utils/useGridNativeEventListener.js +1 -2
- package/index.js +1 -1
- package/internals/index.d.ts +2 -0
- package/internals/index.js +1 -0
- package/internals/utils/useProps.js +1 -2
- package/joy/joySlots.js +7 -13
- package/models/api/gridRowsMetaApi.d.ts +1 -1
- package/models/api/index.d.ts +1 -1
- package/models/api/index.js +0 -1
- package/models/events/gridEventLookup.d.ts +7 -0
- package/models/gridExport.d.ts +6 -0
- package/models/gridStateCommunity.d.ts +1 -0
- package/models/props/DataGridProps.d.ts +23 -27
- package/modern/DataGrid/DataGrid.js +13 -17
- package/modern/DataGrid/useDataGridProps.js +3 -5
- package/modern/components/GridPagination.js +11 -2
- package/modern/components/cell/GridActionsCell.js +1 -1
- package/modern/components/cell/GridActionsCellItem.js +4 -0
- package/modern/components/cell/GridBooleanCell.js +3 -2
- package/modern/components/containers/GridRoot.js +3 -3
- package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
- package/modern/components/panel/filterPanel/GridFilterInputDate.js +1 -1
- package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
- package/modern/components/panel/filterPanel/GridFilterInputValue.js +1 -1
- package/modern/components/toolbar/GridToolbarDensitySelector.js +5 -5
- package/modern/hooks/features/clipboard/useGridClipboard.js +4 -2
- package/modern/hooks/features/columnResize/useGridColumnResize.js +1 -1
- package/modern/hooks/features/columns/gridColumnsUtils.js +0 -19
- package/modern/hooks/features/density/densitySelector.js +8 -2
- package/modern/hooks/features/density/useGridDensity.js +21 -29
- package/modern/hooks/features/editing/useGridCellEditing.js +1 -1
- package/modern/hooks/features/editing/useGridRowEditing.js +1 -1
- package/modern/hooks/features/export/serializers/csvSerializer.js +23 -12
- package/modern/hooks/features/export/useGridCsvExport.js +2 -1
- package/modern/hooks/features/filter/gridFilterUtils.js +1 -1
- package/modern/hooks/features/rowSelection/useGridRowSelection.js +3 -2
- package/modern/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
- package/modern/index.js +1 -1
- package/modern/internals/index.js +1 -0
- package/modern/models/api/index.js +0 -1
- package/modern/utils/createSelector.js +1 -1
- package/modern/utils/domUtils.js +1 -1
- package/modern/utils/keyboardUtils.js +1 -1
- package/node/DataGrid/DataGrid.js +13 -17
- package/node/DataGrid/useDataGridProps.js +3 -5
- package/node/components/GridPagination.js +9 -1
- package/node/components/cell/GridActionsCell.js +1 -1
- package/node/components/cell/GridActionsCellItem.js +4 -0
- package/node/components/cell/GridBooleanCell.js +3 -2
- package/node/components/containers/GridRoot.js +2 -2
- package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
- package/node/components/panel/filterPanel/GridFilterInputDate.js +1 -1
- package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
- package/node/components/panel/filterPanel/GridFilterInputValue.js +1 -1
- package/node/components/toolbar/GridToolbarDensitySelector.js +4 -4
- package/node/hooks/features/clipboard/useGridClipboard.js +4 -2
- package/node/hooks/features/columnResize/useGridColumnResize.js +1 -1
- package/node/hooks/features/columns/gridColumnsUtils.js +0 -20
- package/node/hooks/features/density/densitySelector.js +9 -3
- package/node/hooks/features/density/useGridDensity.js +22 -30
- package/node/hooks/features/editing/useGridCellEditing.js +1 -1
- package/node/hooks/features/editing/useGridRowEditing.js +1 -1
- package/node/hooks/features/export/serializers/csvSerializer.js +23 -12
- package/node/hooks/features/export/useGridCsvExport.js +2 -1
- package/node/hooks/features/filter/gridFilterUtils.js +1 -1
- package/node/hooks/features/rowSelection/useGridRowSelection.js +2 -1
- package/node/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
- package/node/index.js +1 -1
- package/node/internals/index.js +12 -0
- package/node/models/api/index.js +0 -11
- package/node/utils/createSelector.js +1 -1
- package/node/utils/domUtils.js +1 -1
- package/node/utils/keyboardUtils.js +1 -1
- package/package.json +4 -4
- package/utils/createSelector.js +9 -9
- package/utils/domUtils.js +4 -7
- package/utils/getGridLocalization.js +9 -12
- package/utils/keyboardUtils.js +1 -1
|
@@ -41,19 +41,15 @@ const createGroupLookup = columnGroupingModel => {
|
|
|
41
41
|
return _extends({}, groupLookup);
|
|
42
42
|
};
|
|
43
43
|
export const columnGroupsStateInitializer = (state, props, apiRef) => {
|
|
44
|
-
var _props$columnGrouping, _props$columnGrouping2, _apiRef$current$state;
|
|
45
44
|
if (!props.columnGroupingModel) {
|
|
46
45
|
return state;
|
|
47
46
|
}
|
|
48
47
|
const columnFields = gridColumnFieldsSelector(apiRef);
|
|
49
48
|
const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
|
|
50
|
-
const groupLookup = createGroupLookup(
|
|
51
|
-
const unwrappedGroupingModel = unwrapGroupingColumnModel(
|
|
52
|
-
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel,
|
|
53
|
-
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field =>
|
|
54
|
-
var _unwrappedGroupingMod, _unwrappedGroupingMod2;
|
|
55
|
-
return (_unwrappedGroupingMod = (_unwrappedGroupingMod2 = unwrappedGroupingModel[field]) == null ? void 0 : _unwrappedGroupingMod2.length) != null ? _unwrappedGroupingMod : 0;
|
|
56
|
-
}));
|
|
49
|
+
const groupLookup = createGroupLookup(props.columnGroupingModel ?? []);
|
|
50
|
+
const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
|
|
51
|
+
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, apiRef.current.state.pinnedColumns ?? {});
|
|
52
|
+
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
|
|
57
53
|
return _extends({}, state, {
|
|
58
54
|
columnGrouping: {
|
|
59
55
|
lookup: groupLookup,
|
|
@@ -73,9 +69,8 @@ export const useGridColumnGrouping = (apiRef, props) => {
|
|
|
73
69
|
* API METHODS
|
|
74
70
|
*/
|
|
75
71
|
const getColumnGroupPath = React.useCallback(field => {
|
|
76
|
-
var _unwrappedGroupingMod3;
|
|
77
72
|
const unwrappedGroupingModel = gridColumnGroupsUnwrappedModelSelector(apiRef);
|
|
78
|
-
return
|
|
73
|
+
return unwrappedGroupingModel[field] ?? [];
|
|
79
74
|
}, [apiRef]);
|
|
80
75
|
const getAllGroupDetails = React.useCallback(() => {
|
|
81
76
|
const columnGroupLookup = gridColumnGroupsLookupSelector(apiRef);
|
|
@@ -87,12 +82,10 @@ export const useGridColumnGrouping = (apiRef, props) => {
|
|
|
87
82
|
};
|
|
88
83
|
useGridApiMethod(apiRef, columnGroupingApi, 'public');
|
|
89
84
|
const handleColumnIndexChange = React.useCallback(() => {
|
|
90
|
-
|
|
91
|
-
const unwrappedGroupingModel = unwrapGroupingColumnModel((_props$columnGrouping3 = props.columnGroupingModel) != null ? _props$columnGrouping3 : []);
|
|
85
|
+
const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
|
|
92
86
|
apiRef.current.setState(state => {
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
const pinnedColumns = (_state$pinnedColumns = state.pinnedColumns) != null ? _state$pinnedColumns : {};
|
|
87
|
+
const orderedFields = state.columns?.orderedFields ?? [];
|
|
88
|
+
const pinnedColumns = state.pinnedColumns ?? {};
|
|
96
89
|
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(orderedFields, unwrappedGroupingModel, pinnedColumns);
|
|
97
90
|
return _extends({}, state, {
|
|
98
91
|
columnGrouping: _extends({}, state.columnGrouping, {
|
|
@@ -102,18 +95,14 @@ export const useGridColumnGrouping = (apiRef, props) => {
|
|
|
102
95
|
});
|
|
103
96
|
}, [apiRef, props.columnGroupingModel]);
|
|
104
97
|
const updateColumnGroupingState = React.useCallback(columnGroupingModel => {
|
|
105
|
-
var _apiRef$current$getPi, _apiRef$current$getPi2, _apiRef$current;
|
|
106
98
|
// @ts-expect-error Move this logic to `Pro` package
|
|
107
|
-
const pinnedColumns =
|
|
99
|
+
const pinnedColumns = apiRef.current.getPinnedColumns?.() ?? {};
|
|
108
100
|
const columnFields = gridColumnFieldsSelector(apiRef);
|
|
109
101
|
const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
|
|
110
|
-
const groupLookup = createGroupLookup(columnGroupingModel
|
|
111
|
-
const unwrappedGroupingModel = unwrapGroupingColumnModel(columnGroupingModel
|
|
102
|
+
const groupLookup = createGroupLookup(columnGroupingModel ?? []);
|
|
103
|
+
const unwrappedGroupingModel = unwrapGroupingColumnModel(columnGroupingModel ?? []);
|
|
112
104
|
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, pinnedColumns);
|
|
113
|
-
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field =>
|
|
114
|
-
var _unwrappedGroupingMod4, _unwrappedGroupingMod5;
|
|
115
|
-
return (_unwrappedGroupingMod4 = (_unwrappedGroupingMod5 = unwrappedGroupingModel[field]) == null ? void 0 : _unwrappedGroupingMod5.length) != null ? _unwrappedGroupingMod4 : 0;
|
|
116
|
-
}));
|
|
105
|
+
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
|
|
117
106
|
apiRef.current.setState(state => {
|
|
118
107
|
return _extends({}, state, {
|
|
119
108
|
columnGrouping: {
|
|
@@ -92,8 +92,8 @@ export const useGridColumnHeaders = props => {
|
|
|
92
92
|
};
|
|
93
93
|
};
|
|
94
94
|
const getFillers = (params, children, leftOverflow, borderTop = false) => {
|
|
95
|
-
const isPinnedRight =
|
|
96
|
-
const isNotPinned =
|
|
95
|
+
const isPinnedRight = params?.position === GridPinnedColumnPosition.RIGHT;
|
|
96
|
+
const isNotPinned = params?.position === undefined;
|
|
97
97
|
const hasScrollbarFiller = pinnedColumns.right.length > 0 && isPinnedRight || pinnedColumns.right.length === 0 && isNotPinned;
|
|
98
98
|
const leftOffsetWidth = offsetLeft - leftOverflow;
|
|
99
99
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
@@ -146,7 +146,7 @@ export const useGridColumnHeaders = props => {
|
|
|
146
146
|
const tabIndex = columnHeaderTabIndexState !== null && columnHeaderTabIndexState.field === colDef.field || isFirstColumn && !hasOtherElementInTabSequence ? 0 : -1;
|
|
147
147
|
const hasFocus = columnHeaderFocus !== null && columnHeaderFocus.field === colDef.field;
|
|
148
148
|
const open = columnMenuState.open && columnMenuState.field === colDef.field;
|
|
149
|
-
const pinnedPosition = params
|
|
149
|
+
const pinnedPosition = params?.position;
|
|
150
150
|
const style = getCellOffsetStyle({
|
|
151
151
|
pinnedPosition,
|
|
152
152
|
columnIndex,
|
|
@@ -201,7 +201,6 @@ export const useGridColumnHeaders = props => {
|
|
|
201
201
|
depth,
|
|
202
202
|
params
|
|
203
203
|
}) => {
|
|
204
|
-
var _apiRef$current$getCo, _apiRef$current$getCo2;
|
|
205
204
|
const columnsToRender = getColumnsToRender(params);
|
|
206
205
|
if (columnsToRender.renderedColumns.length === 0) {
|
|
207
206
|
return null;
|
|
@@ -213,13 +212,13 @@ export const useGridColumnHeaders = props => {
|
|
|
213
212
|
} = columnsToRender;
|
|
214
213
|
const rowStructure = columnGroupsHeaderStructure[depth];
|
|
215
214
|
const firstColumnFieldToRender = visibleColumns[firstColumnToRender].field;
|
|
216
|
-
const firstGroupToRender =
|
|
215
|
+
const firstGroupToRender = apiRef.current.getColumnGroupPath(firstColumnFieldToRender)[depth] ?? null;
|
|
217
216
|
const firstGroupIndex = rowStructure.findIndex(({
|
|
218
217
|
groupId,
|
|
219
218
|
columnFields
|
|
220
219
|
}) => groupId === firstGroupToRender && columnFields.includes(firstColumnFieldToRender));
|
|
221
220
|
const lastColumnFieldToRender = visibleColumns[lastColumnToRender - 1].field;
|
|
222
|
-
const lastGroupToRender =
|
|
221
|
+
const lastGroupToRender = apiRef.current.getColumnGroupPath(lastColumnFieldToRender)[depth] ?? null;
|
|
223
222
|
const lastGroupIndex = rowStructure.findIndex(({
|
|
224
223
|
groupId,
|
|
225
224
|
columnFields
|
|
@@ -232,9 +231,8 @@ export const useGridColumnHeaders = props => {
|
|
|
232
231
|
const firstVisibleColumnIndex = visibleColumnGroupHeader[0].columnFields.indexOf(firstColumnFieldToRender);
|
|
233
232
|
const hiddenGroupColumns = visibleColumnGroupHeader[0].columnFields.slice(0, firstVisibleColumnIndex);
|
|
234
233
|
const leftOverflow = hiddenGroupColumns.reduce((acc, field) => {
|
|
235
|
-
var _column$computedWidth;
|
|
236
234
|
const column = apiRef.current.getColumn(field);
|
|
237
|
-
return acc + (
|
|
235
|
+
return acc + (column.computedWidth ?? 0);
|
|
238
236
|
}, 0);
|
|
239
237
|
let columnIndex = firstColumnToRender;
|
|
240
238
|
const children = visibleColumnGroupHeader.map(({
|
|
@@ -37,8 +37,8 @@ const useGridColumnMenuSlots = props => {
|
|
|
37
37
|
const sorted = cleansedItems.sort((a, b) => {
|
|
38
38
|
const leftItemProps = processedSlotProps[a];
|
|
39
39
|
const rightItemProps = processedSlotProps[b];
|
|
40
|
-
const leftDisplayOrder = Number.isFinite(leftItemProps
|
|
41
|
-
const rightDisplayOrder = Number.isFinite(rightItemProps
|
|
40
|
+
const leftDisplayOrder = Number.isFinite(leftItemProps?.displayOrder) ? leftItemProps.displayOrder : 100;
|
|
41
|
+
const rightDisplayOrder = Number.isFinite(rightItemProps?.displayOrder) ? rightItemProps.displayOrder : 100;
|
|
42
42
|
return leftDisplayOrder - rightDisplayOrder;
|
|
43
43
|
});
|
|
44
44
|
return sorted.reduce((acc, key, index) => {
|
|
@@ -126,7 +126,7 @@ function excludeOutliers(inputValues, factor) {
|
|
|
126
126
|
const iqr = q3 - q1;
|
|
127
127
|
|
|
128
128
|
// We make a small adjustment if `iqr < 5` for the cases where the IQR is
|
|
129
|
-
// very small (
|
|
129
|
+
// very small (for example zero) due to very close by values in the input data.
|
|
130
130
|
// Otherwise, with an IQR of `0`, anything outside that would be considered
|
|
131
131
|
// an outlier, but it makes more sense visually to allow for this 5px variance
|
|
132
132
|
// rather than showing a cropped cell.
|
|
@@ -140,23 +140,21 @@ function extractColumnWidths(apiRef, options, columns) {
|
|
|
140
140
|
columns.forEach(column => {
|
|
141
141
|
const cells = findGridCells(apiRef.current, column.field);
|
|
142
142
|
const widths = cells.map(cell => {
|
|
143
|
-
|
|
144
|
-
return (_cell$getBoundingClie = cell.getBoundingClientRect().width) != null ? _cell$getBoundingClie : 0;
|
|
143
|
+
return cell.getBoundingClientRect().width ?? 0;
|
|
145
144
|
});
|
|
146
145
|
const filteredWidths = options.includeOutliers ? widths : excludeOutliers(widths, options.outliersFactor);
|
|
147
146
|
if (options.includeHeaders) {
|
|
148
147
|
const header = findGridHeader(apiRef.current, column.field);
|
|
149
148
|
if (header) {
|
|
150
|
-
var _iconContainer$client, _menuContainer$client;
|
|
151
149
|
const title = header.querySelector(`.${gridClasses.columnHeaderTitle}`);
|
|
152
150
|
const content = header.querySelector(`.${gridClasses.columnHeaderTitleContainerContent}`);
|
|
153
151
|
const iconContainer = header.querySelector(`.${gridClasses.iconButtonContainer}`);
|
|
154
152
|
const menuContainer = header.querySelector(`.${gridClasses.menuIcon}`);
|
|
155
|
-
const element = title
|
|
153
|
+
const element = title ?? content;
|
|
156
154
|
const style = window.getComputedStyle(header, null);
|
|
157
155
|
const paddingWidth = parseInt(style.paddingLeft, 10) + parseInt(style.paddingRight, 10);
|
|
158
156
|
const contentWidth = element.scrollWidth + 1;
|
|
159
|
-
const width = contentWidth + paddingWidth + (
|
|
157
|
+
const width = contentWidth + paddingWidth + (iconContainer?.clientWidth ?? 0) + (menuContainer?.clientWidth ?? 0);
|
|
160
158
|
filteredWidths.push(width);
|
|
161
159
|
}
|
|
162
160
|
}
|
|
@@ -290,7 +288,6 @@ export const useGridColumnResize = (apiRef, props) => {
|
|
|
290
288
|
});
|
|
291
289
|
};
|
|
292
290
|
const storeReferences = (colDef, separator, xStart) => {
|
|
293
|
-
var _apiRef$current$colum;
|
|
294
291
|
const root = apiRef.current.rootElementRef.current;
|
|
295
292
|
colDefRef.current = colDef;
|
|
296
293
|
columnHeaderElementRef.current = findHeaderElementFromField(apiRef.current.columnHeadersContainerRef.current, colDef.field);
|
|
@@ -298,7 +295,7 @@ export const useGridColumnResize = (apiRef, props) => {
|
|
|
298
295
|
if (headerFilterElement) {
|
|
299
296
|
headerFilterElementRef.current = headerFilterElement;
|
|
300
297
|
}
|
|
301
|
-
groupHeaderElementsRef.current = findGroupHeaderElementsFromField(
|
|
298
|
+
groupHeaderElementsRef.current = findGroupHeaderElementsFromField(apiRef.current.columnHeadersContainerRef?.current, colDef.field);
|
|
302
299
|
cellElementsRef.current = findGridCellElementsFromCol(columnHeaderElementRef.current, apiRef.current);
|
|
303
300
|
fillerLeftRef.current = findGridElement(apiRef.current, 'filler--pinnedLeft');
|
|
304
301
|
fillerRightRef.current = findGridElement(apiRef.current, 'filler--pinnedRight');
|
|
@@ -471,8 +468,7 @@ export const useGridColumnResize = (apiRef, props) => {
|
|
|
471
468
|
const columnVirtualizationDisabled = useColumnVirtualizationDisabled(apiRef);
|
|
472
469
|
const isAutosizingRef = React.useRef(false);
|
|
473
470
|
const autosizeColumns = React.useCallback(async userOptions => {
|
|
474
|
-
|
|
475
|
-
const root = (_apiRef$current$rootE = apiRef.current.rootElementRef) == null ? void 0 : _apiRef$current$rootE.current;
|
|
471
|
+
const root = apiRef.current.rootElementRef?.current;
|
|
476
472
|
if (!root) {
|
|
477
473
|
return;
|
|
478
474
|
}
|
|
@@ -482,7 +478,7 @@ export const useGridColumnResize = (apiRef, props) => {
|
|
|
482
478
|
isAutosizingRef.current = true;
|
|
483
479
|
const state = gridColumnsStateSelector(apiRef.current.state);
|
|
484
480
|
const options = _extends({}, DEFAULT_GRID_AUTOSIZE_OPTIONS, userOptions, {
|
|
485
|
-
columns:
|
|
481
|
+
columns: userOptions?.columns ?? state.orderedFields
|
|
486
482
|
});
|
|
487
483
|
options.columns = options.columns.filter(c => state.columnVisibilityModel[c] !== false);
|
|
488
484
|
const columns = options.columns.map(c => apiRef.current.state.columns.lookup[c]);
|
|
@@ -496,10 +492,7 @@ export const useGridColumnResize = (apiRef, props) => {
|
|
|
496
492
|
}));
|
|
497
493
|
if (options.expand) {
|
|
498
494
|
const visibleColumns = state.orderedFields.map(field => state.lookup[field]).filter(c => state.columnVisibilityModel[c.field] !== false);
|
|
499
|
-
const totalWidth = visibleColumns.reduce((total, column) =>
|
|
500
|
-
var _ref, _widthByField$column$;
|
|
501
|
-
return total + ((_ref = (_widthByField$column$ = widthByField[column.field]) != null ? _widthByField$column$ : column.computedWidth) != null ? _ref : column.width);
|
|
502
|
-
}, 0);
|
|
495
|
+
const totalWidth = visibleColumns.reduce((total, column) => total + (widthByField[column.field] ?? column.computedWidth ?? column.width), 0);
|
|
503
496
|
const availableWidth = apiRef.current.getRootDimensions().viewportInnerSize.width;
|
|
504
497
|
const remainingWidth = availableWidth - totalWidth;
|
|
505
498
|
if (remainingWidth > 0) {
|
|
@@ -539,10 +532,7 @@ export const useGridColumnResize = (apiRef, props) => {
|
|
|
539
532
|
});
|
|
540
533
|
}
|
|
541
534
|
});
|
|
542
|
-
useGridNativeEventListener(apiRef, () => {
|
|
543
|
-
var _apiRef$current$colum2;
|
|
544
|
-
return (_apiRef$current$colum2 = apiRef.current.columnHeadersContainerRef) == null ? void 0 : _apiRef$current$colum2.current;
|
|
545
|
-
}, 'touchstart', handleTouchStart, {
|
|
535
|
+
useGridNativeEventListener(apiRef, () => apiRef.current.columnHeadersContainerRef?.current, 'touchstart', handleTouchStart, {
|
|
546
536
|
passive: doesSupportTouchActionNone()
|
|
547
537
|
});
|
|
548
538
|
useGridApiMethod(apiRef, {
|
|
@@ -64,11 +64,10 @@ export const gridVisiblePinnedColumnDefinitionsSelector = createSelectorMemoized
|
|
|
64
64
|
return visiblePinnedColumns;
|
|
65
65
|
});
|
|
66
66
|
function filterVisibleColumns(pinnedColumns, columns, invert) {
|
|
67
|
-
var _pinnedColumns$left, _pinnedColumns$right;
|
|
68
67
|
if (!Array.isArray(pinnedColumns.left) && !Array.isArray(pinnedColumns.right)) {
|
|
69
68
|
return EMPTY_PINNED_COLUMN_FIELDS;
|
|
70
69
|
}
|
|
71
|
-
if (
|
|
70
|
+
if (pinnedColumns.left?.length === 0 && pinnedColumns.right?.length === 0) {
|
|
72
71
|
return EMPTY_PINNED_COLUMN_FIELDS;
|
|
73
72
|
}
|
|
74
73
|
const filter = (newPinnedColumns, remainingColumns) => {
|
|
@@ -51,13 +51,4 @@ export declare function getFirstNonSpannedColumnToRender({ firstColumnToRender,
|
|
|
51
51
|
lastRowToRender: number;
|
|
52
52
|
visibleRows: GridRowEntry[];
|
|
53
53
|
}): number;
|
|
54
|
-
export declare function getFirstColumnIndexToRender({ firstColumnIndex, minColumnIndex, columnBuffer, firstRowToRender, lastRowToRender, apiRef, visibleRows, }: {
|
|
55
|
-
firstColumnIndex: number;
|
|
56
|
-
minColumnIndex: number;
|
|
57
|
-
columnBuffer: number;
|
|
58
|
-
apiRef: React.MutableRefObject<GridApiCommon>;
|
|
59
|
-
firstRowToRender: number;
|
|
60
|
-
lastRowToRender: number;
|
|
61
|
-
visibleRows: GridRowEntry[];
|
|
62
|
-
}): number;
|
|
63
54
|
export declare function getTotalHeaderHeight(apiRef: React.MutableRefObject<GridApiCommunity>, headerHeight: number): number;
|
|
@@ -213,7 +213,6 @@ export const createColumnsState = ({
|
|
|
213
213
|
columnVisibilityModel = gridColumnVisibilityModelSelector(apiRef),
|
|
214
214
|
keepOnlyColumnsToUpsert = false
|
|
215
215
|
}) => {
|
|
216
|
-
var _apiRef$current$getRo, _apiRef$current$getRo2, _apiRef$current;
|
|
217
216
|
const isInsideStateInitializer = !apiRef.current.state.columns;
|
|
218
217
|
let columnsState;
|
|
219
218
|
if (isInsideStateInitializer) {
|
|
@@ -283,7 +282,7 @@ export const createColumnsState = ({
|
|
|
283
282
|
}
|
|
284
283
|
const columnsStateWithPreProcessing = apiRef.current.unstable_applyPipeProcessors('hydrateColumns', columnsState);
|
|
285
284
|
const columnsStateWithPortableColumns = applyInitialState(columnsStateWithPreProcessing, initialState);
|
|
286
|
-
return hydrateColumnsWidth(columnsStateWithPortableColumns,
|
|
285
|
+
return hydrateColumnsWidth(columnsStateWithPortableColumns, apiRef.current.getRootDimensions?.().viewportInnerSize.width ?? 0);
|
|
287
286
|
};
|
|
288
287
|
export function getFirstNonSpannedColumnToRender({
|
|
289
288
|
firstColumnToRender,
|
|
@@ -305,29 +304,10 @@ export function getFirstNonSpannedColumnToRender({
|
|
|
305
304
|
}
|
|
306
305
|
return firstNonSpannedColumnToRender;
|
|
307
306
|
}
|
|
308
|
-
export function getFirstColumnIndexToRender({
|
|
309
|
-
firstColumnIndex,
|
|
310
|
-
minColumnIndex,
|
|
311
|
-
columnBuffer,
|
|
312
|
-
firstRowToRender,
|
|
313
|
-
lastRowToRender,
|
|
314
|
-
apiRef,
|
|
315
|
-
visibleRows
|
|
316
|
-
}) {
|
|
317
|
-
const initialFirstColumnToRender = Math.max(firstColumnIndex - columnBuffer, minColumnIndex);
|
|
318
|
-
const firstColumnToRender = getFirstNonSpannedColumnToRender({
|
|
319
|
-
firstColumnToRender: initialFirstColumnToRender,
|
|
320
|
-
apiRef,
|
|
321
|
-
firstRowToRender,
|
|
322
|
-
lastRowToRender,
|
|
323
|
-
visibleRows
|
|
324
|
-
});
|
|
325
|
-
return firstColumnToRender;
|
|
326
|
-
}
|
|
327
307
|
export function getTotalHeaderHeight(apiRef, headerHeight) {
|
|
328
308
|
const densityFactor = gridDensityFactorSelector(apiRef);
|
|
329
309
|
const maxDepth = gridColumnGroupsHeaderMaxDepthSelector(apiRef);
|
|
330
310
|
const isHeaderFilteringEnabled = gridHeaderFilteringEnabledSelector(apiRef);
|
|
331
311
|
const multiplicationFactor = isHeaderFilteringEnabled ? 2 : 1;
|
|
332
|
-
return Math.floor(headerHeight * densityFactor) * ((maxDepth
|
|
312
|
+
return Math.floor(headerHeight * densityFactor) * ((maxDepth ?? 0) + multiplicationFactor);
|
|
333
313
|
}
|
|
@@ -8,8 +8,7 @@ import { useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
|
|
|
8
8
|
export const useGridColumnSpanning = apiRef => {
|
|
9
9
|
const lookup = React.useRef({});
|
|
10
10
|
const getCellColSpanInfo = (rowId, columnIndex) => {
|
|
11
|
-
|
|
12
|
-
return (_lookup$current$rowId = lookup.current[rowId]) == null ? void 0 : _lookup$current$rowId[columnIndex];
|
|
11
|
+
return lookup.current[rowId]?.[columnIndex];
|
|
13
12
|
};
|
|
14
13
|
|
|
15
14
|
// Calculate `colSpan` for each cell in the row
|
|
@@ -10,19 +10,18 @@ import { hydrateColumnsWidth, createColumnsState, COLUMNS_DIMENSION_PROPERTIES }
|
|
|
10
10
|
import { GridPreferencePanelsValue } from '../preferencesPanel';
|
|
11
11
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
12
|
export const columnsStateInitializer = (state, props, apiRef) => {
|
|
13
|
-
var _props$initialState, _ref, _props$columnVisibili, _props$initialState2, _state$pinnedColumns;
|
|
14
13
|
const columnsState = createColumnsState({
|
|
15
14
|
apiRef,
|
|
16
15
|
columnsToUpsert: props.columns,
|
|
17
|
-
initialState:
|
|
18
|
-
columnVisibilityModel:
|
|
16
|
+
initialState: props.initialState?.columns,
|
|
17
|
+
columnVisibilityModel: props.columnVisibilityModel ?? props.initialState?.columns?.columnVisibilityModel ?? {},
|
|
19
18
|
keepOnlyColumnsToUpsert: true
|
|
20
19
|
});
|
|
21
20
|
return _extends({}, state, {
|
|
22
21
|
columns: columnsState,
|
|
23
22
|
// In pro/premium, this part of the state is defined. We give it an empty but defined value
|
|
24
23
|
// for the community version.
|
|
25
|
-
pinnedColumns:
|
|
24
|
+
pinnedColumns: state.pinnedColumns ?? EMPTY_PINNED_COLUMN_FIELDS
|
|
26
25
|
});
|
|
27
26
|
};
|
|
28
27
|
|
|
@@ -32,7 +31,6 @@ export const columnsStateInitializer = (state, props, apiRef) => {
|
|
|
32
31
|
* TODO: Impossible priority - useGridParamsApi also needs to be after useGridColumns
|
|
33
32
|
*/
|
|
34
33
|
export function useGridColumns(apiRef, props) {
|
|
35
|
-
var _props$initialState4, _props$slotProps2;
|
|
36
34
|
const logger = useGridLogger(apiRef, 'useGridColumns');
|
|
37
35
|
const previousColumnsProp = React.useRef(props.columns);
|
|
38
36
|
apiRef.current.registerControlState({
|
|
@@ -43,11 +41,10 @@ export function useGridColumns(apiRef, props) {
|
|
|
43
41
|
changeEvent: 'columnVisibilityModelChange'
|
|
44
42
|
});
|
|
45
43
|
const setGridColumnsState = React.useCallback(columnsState => {
|
|
46
|
-
var _apiRef$current$updat, _apiRef$current;
|
|
47
44
|
logger.debug('Updating columns state.');
|
|
48
45
|
apiRef.current.setState(mergeColumnsState(columnsState));
|
|
49
46
|
apiRef.current.publishEvent('columnsChange', columnsState.orderedFields);
|
|
50
|
-
|
|
47
|
+
apiRef.current.updateRenderContext?.();
|
|
51
48
|
apiRef.current.forceUpdate();
|
|
52
49
|
}, [logger, apiRef]);
|
|
53
50
|
|
|
@@ -68,7 +65,6 @@ export function useGridColumns(apiRef, props) {
|
|
|
68
65
|
const setColumnVisibilityModel = React.useCallback(model => {
|
|
69
66
|
const currentModel = gridColumnVisibilityModelSelector(apiRef);
|
|
70
67
|
if (currentModel !== model) {
|
|
71
|
-
var _apiRef$current$updat2, _apiRef$current2;
|
|
72
68
|
apiRef.current.setState(state => _extends({}, state, {
|
|
73
69
|
columns: createColumnsState({
|
|
74
70
|
apiRef,
|
|
@@ -78,7 +74,7 @@ export function useGridColumns(apiRef, props) {
|
|
|
78
74
|
keepOnlyColumnsToUpsert: false
|
|
79
75
|
})
|
|
80
76
|
}));
|
|
81
|
-
|
|
77
|
+
apiRef.current.updateRenderContext?.();
|
|
82
78
|
apiRef.current.forceUpdate();
|
|
83
79
|
}
|
|
84
80
|
}, [apiRef]);
|
|
@@ -92,9 +88,8 @@ export function useGridColumns(apiRef, props) {
|
|
|
92
88
|
setGridColumnsState(columnsState);
|
|
93
89
|
}, [apiRef, setGridColumnsState]);
|
|
94
90
|
const setColumnVisibility = React.useCallback((field, isVisible) => {
|
|
95
|
-
var _columnVisibilityMode;
|
|
96
91
|
const columnVisibilityModel = gridColumnVisibilityModelSelector(apiRef);
|
|
97
|
-
const isCurrentlyVisible =
|
|
92
|
+
const isCurrentlyVisible = columnVisibilityModel[field] ?? true;
|
|
98
93
|
if (isVisible !== isCurrentlyVisible) {
|
|
99
94
|
const newModel = _extends({}, columnVisibilityModel, {
|
|
100
95
|
[field]: isVisible
|
|
@@ -167,7 +162,6 @@ export function useGridColumns(apiRef, props) {
|
|
|
167
162
|
* PRE-PROCESSING
|
|
168
163
|
*/
|
|
169
164
|
const stateExportPreProcessing = React.useCallback((prevState, context) => {
|
|
170
|
-
var _props$initialState$c, _props$initialState3;
|
|
171
165
|
const columnsStateToExport = {};
|
|
172
166
|
const columnVisibilityModelToExport = gridColumnVisibilityModelSelector(apiRef);
|
|
173
167
|
const shouldExportColumnVisibilityModel =
|
|
@@ -177,7 +171,7 @@ export function useGridColumns(apiRef, props) {
|
|
|
177
171
|
props.columnVisibilityModel != null ||
|
|
178
172
|
// Always export if the model has been initialized
|
|
179
173
|
// TODO v6 Do a nullish check instead to export even if the initial model equals "{}"
|
|
180
|
-
Object.keys(
|
|
174
|
+
Object.keys(props.initialState?.columns?.columnVisibilityModel ?? {}).length > 0 ||
|
|
181
175
|
// Always export if the model is not empty
|
|
182
176
|
Object.keys(columnVisibilityModelToExport).length > 0;
|
|
183
177
|
if (shouldExportColumnVisibilityModel) {
|
|
@@ -205,10 +199,9 @@ export function useGridColumns(apiRef, props) {
|
|
|
205
199
|
return _extends({}, prevState, {
|
|
206
200
|
columns: columnsStateToExport
|
|
207
201
|
});
|
|
208
|
-
}, [apiRef, props.columnVisibilityModel,
|
|
202
|
+
}, [apiRef, props.columnVisibilityModel, props.initialState?.columns]);
|
|
209
203
|
const stateRestorePreProcessing = React.useCallback((params, context) => {
|
|
210
|
-
|
|
211
|
-
const columnVisibilityModelToImport = (_context$stateToResto = context.stateToRestore.columns) == null ? void 0 : _context$stateToResto.columnVisibilityModel;
|
|
204
|
+
const columnVisibilityModelToImport = context.stateToRestore.columns?.columnVisibilityModel;
|
|
212
205
|
const initialState = context.stateToRestore.columns;
|
|
213
206
|
if (columnVisibilityModelToImport == null && initialState == null) {
|
|
214
207
|
return params;
|
|
@@ -228,12 +221,11 @@ export function useGridColumns(apiRef, props) {
|
|
|
228
221
|
}, [apiRef]);
|
|
229
222
|
const preferencePanelPreProcessing = React.useCallback((initialValue, value) => {
|
|
230
223
|
if (value === GridPreferencePanelsValue.columns) {
|
|
231
|
-
var _props$slotProps;
|
|
232
224
|
const ColumnsPanel = props.slots.columnsPanel;
|
|
233
|
-
return /*#__PURE__*/_jsx(ColumnsPanel, _extends({},
|
|
225
|
+
return /*#__PURE__*/_jsx(ColumnsPanel, _extends({}, props.slotProps?.columnsPanel));
|
|
234
226
|
}
|
|
235
227
|
return initialValue;
|
|
236
|
-
}, [props.slots.columnsPanel,
|
|
228
|
+
}, [props.slots.columnsPanel, props.slotProps?.columnsPanel]);
|
|
237
229
|
const addColumnMenuItems = React.useCallback(columnMenuItems => {
|
|
238
230
|
if (props.disableColumnSelector) {
|
|
239
231
|
return columnMenuItems;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { GridStateCommunity } from '../../../models/gridStateCommunity';
|
|
2
|
-
|
|
3
|
-
export declare const
|
|
2
|
+
import { GridDensity } from '../../../models/gridDensity';
|
|
3
|
+
export declare const COMPACT_DENSITY_FACTOR = 0.7;
|
|
4
|
+
export declare const COMFORTABLE_DENSITY_FACTOR = 1.3;
|
|
5
|
+
export declare const gridDensitySelector: (state: GridStateCommunity) => GridDensity;
|
|
4
6
|
export declare const gridDensityFactorSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { createSelector } from '../../../utils/createSelector';
|
|
2
|
+
export const COMPACT_DENSITY_FACTOR = 0.7;
|
|
3
|
+
export const COMFORTABLE_DENSITY_FACTOR = 1.3;
|
|
4
|
+
const DENSITY_FACTORS = {
|
|
5
|
+
compact: COMPACT_DENSITY_FACTOR,
|
|
6
|
+
comfortable: COMFORTABLE_DENSITY_FACTOR,
|
|
7
|
+
standard: 1
|
|
8
|
+
};
|
|
2
9
|
export const gridDensitySelector = state => state.density;
|
|
3
|
-
export const
|
|
4
|
-
export const gridDensityFactorSelector = createSelector(gridDensitySelector, density => density.factor);
|
|
10
|
+
export const gridDensityFactorSelector = createSelector(gridDensitySelector, density => DENSITY_FACTORS[density]);
|
|
@@ -2,7 +2,5 @@ import * as React from 'react';
|
|
|
2
2
|
import { GridPrivateApiCommunity } from '../../../models/api/gridApiCommunity';
|
|
3
3
|
import { DataGridProcessedProps } from '../../../models/props/DataGridProps';
|
|
4
4
|
import { GridStateInitializer } from '../../utils/useGridInitializeState';
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const
|
|
7
|
-
export declare const densityStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'density'>>;
|
|
8
|
-
export declare const useGridDensity: (apiRef: React.MutableRefObject<GridPrivateApiCommunity>, props: Pick<DataGridProcessedProps, 'density'>) => void;
|
|
5
|
+
export declare const densityStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'initialState' | 'density'>>;
|
|
6
|
+
export declare const useGridDensity: (apiRef: React.MutableRefObject<GridPrivateApiCommunity>, props: Pick<DataGridProcessedProps, 'density' | 'onDensityChange'>) => void;
|
|
@@ -1,43 +1,35 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
import useEventCallback from '@mui/utils/useEventCallback';
|
|
3
4
|
import { useGridLogger } from '../../utils/useGridLogger';
|
|
4
5
|
import { useGridApiMethod } from '../../utils/useGridApiMethod';
|
|
5
6
|
import { gridDensitySelector } from './densitySelector';
|
|
6
|
-
import { isDeepEqual } from '../../../utils/utils';
|
|
7
|
-
export const COMPACT_DENSITY_FACTOR = 0.7;
|
|
8
|
-
export const COMFORTABLE_DENSITY_FACTOR = 1.3;
|
|
9
|
-
const DENSITY_FACTORS = {
|
|
10
|
-
compact: COMPACT_DENSITY_FACTOR,
|
|
11
|
-
comfortable: COMFORTABLE_DENSITY_FACTOR,
|
|
12
|
-
standard: 1
|
|
13
|
-
};
|
|
14
7
|
export const densityStateInitializer = (state, props) => _extends({}, state, {
|
|
15
|
-
density:
|
|
16
|
-
value: props.density,
|
|
17
|
-
factor: DENSITY_FACTORS[props.density]
|
|
18
|
-
}
|
|
8
|
+
density: props.initialState?.density ?? props.density ?? 'standard'
|
|
19
9
|
});
|
|
20
10
|
export const useGridDensity = (apiRef, props) => {
|
|
21
11
|
const logger = useGridLogger(apiRef, 'useDensity');
|
|
22
|
-
|
|
12
|
+
apiRef.current.registerControlState({
|
|
13
|
+
stateId: 'density',
|
|
14
|
+
propModel: props.density,
|
|
15
|
+
propOnChange: props.onDensityChange,
|
|
16
|
+
stateSelector: gridDensitySelector,
|
|
17
|
+
changeEvent: 'densityChange'
|
|
18
|
+
});
|
|
19
|
+
const setDensity = useEventCallback(newDensity => {
|
|
20
|
+
const currentDensity = gridDensitySelector(apiRef.current.state);
|
|
21
|
+
if (currentDensity === newDensity) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
23
24
|
logger.debug(`Set grid density to ${newDensity}`);
|
|
24
|
-
apiRef.current.setState(state => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
factor: DENSITY_FACTORS[newDensity]
|
|
29
|
-
};
|
|
30
|
-
if (isDeepEqual(currentDensityState, newDensityState)) {
|
|
31
|
-
return state;
|
|
32
|
-
}
|
|
33
|
-
return _extends({}, state, {
|
|
34
|
-
density: newDensityState
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
apiRef.current.forceUpdate();
|
|
38
|
-
}, [logger, apiRef]);
|
|
25
|
+
apiRef.current.setState(state => _extends({}, state, {
|
|
26
|
+
density: newDensity
|
|
27
|
+
}));
|
|
28
|
+
});
|
|
39
29
|
React.useEffect(() => {
|
|
40
|
-
|
|
30
|
+
if (props.density) {
|
|
31
|
+
apiRef.current.setDensity(props.density);
|
|
32
|
+
}
|
|
41
33
|
}, [apiRef, props.density]);
|
|
42
34
|
const densityApi = {
|
|
43
35
|
setDensity
|
|
@@ -66,7 +66,6 @@ export function useGridDimensions(apiRef, props) {
|
|
|
66
66
|
}));
|
|
67
67
|
});
|
|
68
68
|
const resize = React.useCallback(() => {
|
|
69
|
-
var _previousSize$current, _previousSize$current2;
|
|
70
69
|
const element = apiRef.current.mainElementRef.current;
|
|
71
70
|
if (!element) {
|
|
72
71
|
return;
|
|
@@ -74,8 +73,8 @@ export function useGridDimensions(apiRef, props) {
|
|
|
74
73
|
const computedStyle = ownerWindow(element).getComputedStyle(element);
|
|
75
74
|
const height = parseFloat(computedStyle.height) || 0;
|
|
76
75
|
const width = parseFloat(computedStyle.width) || 0;
|
|
77
|
-
const hasHeightChanged = height !==
|
|
78
|
-
const hasWidthChanged = width !==
|
|
76
|
+
const hasHeightChanged = height !== previousSize.current?.height;
|
|
77
|
+
const hasWidthChanged = width !== previousSize.current?.width;
|
|
79
78
|
if (!previousSize.current || hasHeightChanged || hasWidthChanged) {
|
|
80
79
|
const size = {
|
|
81
80
|
width,
|
|
@@ -106,7 +105,6 @@ export function useGridDimensions(apiRef, props) {
|
|
|
106
105
|
return Math.min(maximumPageSizeWithoutScrollBar, currentPage.rows.length);
|
|
107
106
|
}, [apiRef, props.pagination, props.paginationMode, props.getRowHeight, rowHeight]);
|
|
108
107
|
const updateDimensions = React.useCallback(() => {
|
|
109
|
-
var _apiRef$current$updat, _apiRef$current;
|
|
110
108
|
const rootElement = apiRef.current.rootElementRef.current;
|
|
111
109
|
const pinnedRowsHeight = calculatePinnedRowsHeight(apiRef);
|
|
112
110
|
const scrollbarSize = measureScrollbarSize(rootElement, columnsTotalWidth, props.scrollbarSize);
|
|
@@ -191,7 +189,7 @@ export function useGridDimensions(apiRef, props) {
|
|
|
191
189
|
if (newDimensions.viewportInnerSize.width !== prevDimensions.viewportInnerSize.width || newDimensions.viewportInnerSize.height !== prevDimensions.viewportInnerSize.height) {
|
|
192
190
|
apiRef.current.publishEvent('viewportInnerSizeChange', newDimensions.viewportInnerSize);
|
|
193
191
|
}
|
|
194
|
-
|
|
192
|
+
apiRef.current.updateRenderContext?.();
|
|
195
193
|
}, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight, rowsMeta.currentPageTotalHeight, rowHeight, headerHeight, columnsTotalWidth, headersTotalHeight, leftPinnedWidth, rightPinnedWidth]);
|
|
196
194
|
const apiPublic = {
|
|
197
195
|
resize,
|
|
@@ -14,7 +14,7 @@ import { buildWarning } from '../../../utils/warning';
|
|
|
14
14
|
import { gridRowsDataRowIdToIdLookupSelector } from '../rows/gridRowsSelector';
|
|
15
15
|
import { deepClone } from '../../../utils/utils';
|
|
16
16
|
import { GridCellEditStartReasons, GridCellEditStopReasons } from '../../../models/params/gridEditCellParams';
|
|
17
|
-
const missingOnProcessRowUpdateErrorWarning = buildWarning(['MUI X: A call to `processRowUpdate` threw an error which was not handled because `onProcessRowUpdateError` is missing.', 'To handle the error pass a callback to the `onProcessRowUpdateError` prop,
|
|
17
|
+
const missingOnProcessRowUpdateErrorWarning = buildWarning(['MUI X: A call to `processRowUpdate` threw an error which was not handled because `onProcessRowUpdateError` is missing.', 'To handle the error pass a callback to the `onProcessRowUpdateError` prop, for example `<DataGrid onProcessRowUpdateError={(error) => ...} />`.', 'For more detail, see https://mui.com/x/react-data-grid/editing/#server-side-persistence.'], 'error');
|
|
18
18
|
export const useGridCellEditing = (apiRef, props) => {
|
|
19
19
|
const [cellModesModel, setCellModesModel] = React.useState({});
|
|
20
20
|
const cellModesModelRef = React.useRef(cellModesModel);
|
|
@@ -339,7 +339,6 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
339
339
|
}
|
|
340
340
|
});
|
|
341
341
|
const setCellEditingEditCellValue = React.useCallback(async params => {
|
|
342
|
-
var _editingState$id;
|
|
343
342
|
const {
|
|
344
343
|
id,
|
|
345
344
|
field,
|
|
@@ -389,7 +388,7 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
389
388
|
newProps.value = column.preProcessEditCellProps ? editingState[id][field].value : parsedValue;
|
|
390
389
|
updateOrDeleteFieldState(id, field, newProps);
|
|
391
390
|
editingState = gridEditRowsStateSelector(apiRef.current.state);
|
|
392
|
-
return !
|
|
391
|
+
return !editingState[id]?.[field]?.error;
|
|
393
392
|
}, [apiRef, throwIfNotEditable, throwIfNotInMode, updateOrDeleteFieldState]);
|
|
394
393
|
const getRowWithUpdatedValuesFromCellEditing = React.useCallback((id, field) => {
|
|
395
394
|
const column = apiRef.current.getColumn(field);
|
|
@@ -432,9 +431,8 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
432
431
|
|
|
433
432
|
Object.entries(cellModesModel).forEach(([id, fields]) => {
|
|
434
433
|
Object.entries(fields).forEach(([field, params]) => {
|
|
435
|
-
|
|
436
|
-
const
|
|
437
|
-
const originalId = (_idToIdLookup$id = idToIdLookup[id]) != null ? _idToIdLookup$id : id;
|
|
434
|
+
const prevMode = copyOfPrevCellModes[id]?.[field]?.mode || GridCellModes.View;
|
|
435
|
+
const originalId = idToIdLookup[id] ?? id;
|
|
438
436
|
if (params.mode === GridCellModes.Edit && prevMode === GridCellModes.View) {
|
|
439
437
|
updateStateToStartCellEditMode(_extends({
|
|
440
438
|
id: originalId,
|