@mui/x-data-grid 7.0.0-beta.5 → 7.0.0-beta.7

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.
Files changed (210) hide show
  1. package/CHANGELOG.md +252 -50
  2. package/DataGrid/DataGrid.js +44 -0
  3. package/DataGrid/useDataGridComponent.js +3 -0
  4. package/DataGrid/useDataGridProps.js +3 -2
  5. package/components/GridColumnHeaders.d.ts +1 -2
  6. package/components/GridColumnHeaders.js +6 -17
  7. package/components/GridHeaders.js +1 -4
  8. package/components/GridPagination.js +2 -7
  9. package/components/GridPinnedRows.d.ts +1 -2
  10. package/components/GridRow.d.ts +1 -1
  11. package/components/GridRow.js +9 -26
  12. package/components/GridScrollArea.d.ts +10 -0
  13. package/components/GridScrollArea.js +150 -0
  14. package/components/cell/GridCell.d.ts +7 -2
  15. package/components/cell/GridCell.js +14 -10
  16. package/components/columnHeaders/GridBaseColumnHeaders.js +1 -0
  17. package/components/columnHeaders/GridColumnGroupHeader.d.ts +5 -0
  18. package/components/columnHeaders/GridColumnGroupHeader.js +18 -8
  19. package/components/columnHeaders/GridColumnHeaderItem.d.ts +5 -0
  20. package/components/columnHeaders/GridColumnHeaderItem.js +21 -6
  21. package/components/columnHeaders/GridGenericColumnHeaderItem.d.ts +1 -0
  22. package/components/columnHeaders/GridGenericColumnHeaderItem.js +6 -5
  23. package/components/containers/GridRootStyles.js +12 -22
  24. package/components/virtualization/GridVirtualScrollbar.js +4 -0
  25. package/components/virtualization/GridVirtualScroller.js +11 -4
  26. package/components/virtualization/GridVirtualScrollerFiller.js +2 -1
  27. package/constants/gridClasses.d.ts +6 -32
  28. package/constants/gridClasses.js +1 -1
  29. package/hooks/core/pipeProcessing/gridPipeProcessingApi.d.ts +5 -1
  30. package/hooks/core/pipeProcessing/useGridPipeProcessing.js +22 -20
  31. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +23 -7
  32. package/hooks/features/columnHeaders/useGridColumnHeaders.js +186 -99
  33. package/hooks/features/columnResize/columnResizeSelector.d.ts +3 -0
  34. package/hooks/features/columnResize/columnResizeSelector.js +3 -0
  35. package/hooks/features/columnResize/columnResizeState.d.ts +3 -0
  36. package/hooks/features/columnResize/columnResizeState.js +1 -0
  37. package/hooks/features/columnResize/gridColumnResizeApi.d.ts +44 -0
  38. package/hooks/features/columnResize/gridColumnResizeApi.js +10 -0
  39. package/hooks/features/columnResize/index.d.ts +3 -0
  40. package/hooks/features/columnResize/index.js +3 -0
  41. package/hooks/features/columnResize/useGridColumnResize.d.ts +10 -0
  42. package/hooks/features/columnResize/useGridColumnResize.js +563 -0
  43. package/hooks/features/columns/gridColumnsUtils.js +4 -1
  44. package/hooks/features/dimensions/useGridDimensions.js +5 -5
  45. package/hooks/features/editing/useGridCellEditing.js +21 -2
  46. package/hooks/features/export/useGridPrintExport.js +8 -7
  47. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.d.ts +1 -0
  48. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +6 -0
  49. package/hooks/features/headerFiltering/useGridHeaderFiltering.js +30 -7
  50. package/hooks/features/index.d.ts +1 -0
  51. package/hooks/features/index.js +1 -0
  52. package/hooks/features/pagination/gridPaginationInterfaces.d.ts +19 -2
  53. package/hooks/features/pagination/gridPaginationSelector.d.ts +5 -0
  54. package/hooks/features/pagination/gridPaginationSelector.js +8 -2
  55. package/hooks/features/pagination/useGridPagination.d.ts +1 -6
  56. package/hooks/features/pagination/useGridPagination.js +9 -157
  57. package/hooks/features/pagination/useGridPaginationModel.d.ts +11 -0
  58. package/hooks/features/pagination/useGridPaginationModel.js +170 -0
  59. package/hooks/features/pagination/useGridRowCount.d.ts +8 -0
  60. package/hooks/features/pagination/useGridRowCount.js +97 -0
  61. package/hooks/features/rows/useGridParamsApi.js +6 -10
  62. package/hooks/features/scroll/useGridScroll.js +1 -1
  63. package/hooks/features/sorting/useGridSorting.js +2 -2
  64. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +4 -4
  65. package/hooks/features/virtualization/gridVirtualizationSelectors.js +0 -2
  66. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +2 -2
  67. package/hooks/features/virtualization/useGridVirtualScroller.js +6 -0
  68. package/hooks/utils/useLazyRef.d.ts +1 -2
  69. package/hooks/utils/useLazyRef.js +1 -11
  70. package/hooks/utils/useOnMount.d.ts +1 -2
  71. package/hooks/utils/useOnMount.js +1 -7
  72. package/hooks/utils/useTimeout.d.ts +1 -11
  73. package/hooks/utils/useTimeout.js +1 -36
  74. package/index.js +1 -1
  75. package/internals/index.d.ts +2 -2
  76. package/internals/index.js +2 -2
  77. package/internals/utils/getPinnedCellOffset.d.ts +3 -0
  78. package/internals/utils/getPinnedCellOffset.js +17 -0
  79. package/joy/joySlots.js +13 -52
  80. package/locales/jaJP.js +3 -4
  81. package/material/index.js +0 -2
  82. package/models/api/gridApiCommon.d.ts +2 -1
  83. package/models/api/gridCoreApi.d.ts +1 -5
  84. package/models/api/gridInfiniteLoaderApi.d.ts +6 -0
  85. package/models/api/gridInfiniteLoaderApi.js +1 -0
  86. package/models/events/gridEventLookup.d.ts +6 -0
  87. package/models/gridHeaderFilteringModel.d.ts +1 -0
  88. package/models/gridSlotsComponent.d.ts +0 -5
  89. package/models/gridStateCommunity.d.ts +2 -0
  90. package/models/params/gridScrollParams.d.ts +5 -3
  91. package/models/props/DataGridProps.d.ts +35 -1
  92. package/modern/DataGrid/DataGrid.js +44 -0
  93. package/modern/DataGrid/useDataGridComponent.js +3 -0
  94. package/modern/DataGrid/useDataGridProps.js +3 -2
  95. package/modern/components/GridColumnHeaders.js +6 -17
  96. package/modern/components/GridHeaders.js +1 -4
  97. package/modern/components/GridPagination.js +2 -4
  98. package/modern/components/GridRow.js +9 -26
  99. package/modern/components/GridScrollArea.js +150 -0
  100. package/modern/components/cell/GridCell.js +14 -10
  101. package/modern/components/columnHeaders/GridBaseColumnHeaders.js +1 -0
  102. package/modern/components/columnHeaders/GridColumnGroupHeader.js +18 -8
  103. package/modern/components/columnHeaders/GridColumnHeaderItem.js +21 -6
  104. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +6 -5
  105. package/modern/components/containers/GridRootStyles.js +12 -22
  106. package/modern/components/virtualization/GridVirtualScrollbar.js +4 -0
  107. package/modern/components/virtualization/GridVirtualScroller.js +11 -4
  108. package/modern/components/virtualization/GridVirtualScrollerFiller.js +2 -1
  109. package/modern/constants/gridClasses.js +1 -1
  110. package/modern/hooks/core/pipeProcessing/useGridPipeProcessing.js +22 -20
  111. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +184 -97
  112. package/modern/hooks/features/columnResize/columnResizeSelector.js +3 -0
  113. package/modern/hooks/features/columnResize/columnResizeState.js +1 -0
  114. package/modern/hooks/features/columnResize/gridColumnResizeApi.js +10 -0
  115. package/modern/hooks/features/columnResize/index.js +3 -0
  116. package/modern/hooks/features/columnResize/useGridColumnResize.js +553 -0
  117. package/modern/hooks/features/columns/gridColumnsUtils.js +4 -1
  118. package/modern/hooks/features/dimensions/useGridDimensions.js +5 -5
  119. package/modern/hooks/features/editing/useGridCellEditing.js +21 -2
  120. package/modern/hooks/features/export/useGridPrintExport.js +8 -7
  121. package/modern/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +3 -0
  122. package/modern/hooks/features/headerFiltering/useGridHeaderFiltering.js +21 -2
  123. package/modern/hooks/features/index.js +1 -0
  124. package/modern/hooks/features/pagination/gridPaginationSelector.js +8 -2
  125. package/modern/hooks/features/pagination/useGridPagination.js +8 -149
  126. package/modern/hooks/features/pagination/useGridPaginationModel.js +165 -0
  127. package/modern/hooks/features/pagination/useGridRowCount.js +94 -0
  128. package/modern/hooks/features/rows/useGridParamsApi.js +6 -10
  129. package/modern/hooks/features/scroll/useGridScroll.js +1 -1
  130. package/modern/hooks/features/sorting/useGridSorting.js +2 -2
  131. package/modern/hooks/features/virtualization/gridVirtualizationSelectors.js +0 -2
  132. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +5 -0
  133. package/modern/hooks/utils/useLazyRef.js +1 -11
  134. package/modern/hooks/utils/useOnMount.js +1 -7
  135. package/modern/hooks/utils/useTimeout.js +1 -36
  136. package/modern/index.js +1 -1
  137. package/modern/internals/index.js +2 -2
  138. package/modern/internals/utils/getPinnedCellOffset.js +17 -0
  139. package/modern/joy/joySlots.js +11 -50
  140. package/modern/locales/jaJP.js +3 -4
  141. package/modern/material/index.js +0 -2
  142. package/modern/models/api/gridInfiniteLoaderApi.js +1 -0
  143. package/modern/utils/cellBorderUtils.js +8 -0
  144. package/modern/utils/createSelector.js +12 -20
  145. package/modern/utils/domUtils.js +144 -0
  146. package/node/DataGrid/DataGrid.js +44 -0
  147. package/node/DataGrid/useDataGridComponent.js +3 -0
  148. package/node/DataGrid/useDataGridProps.js +3 -2
  149. package/node/components/GridColumnHeaders.js +6 -16
  150. package/node/components/GridHeaders.js +1 -4
  151. package/node/components/GridPagination.js +1 -3
  152. package/node/components/GridRow.js +8 -25
  153. package/node/components/GridScrollArea.js +158 -0
  154. package/node/components/cell/GridCell.js +15 -11
  155. package/node/components/columnHeaders/GridBaseColumnHeaders.js +1 -0
  156. package/node/components/columnHeaders/GridColumnGroupHeader.js +18 -8
  157. package/node/components/columnHeaders/GridColumnHeaderItem.js +21 -6
  158. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +6 -5
  159. package/node/components/containers/GridRootStyles.js +12 -22
  160. package/node/components/virtualization/GridVirtualScrollbar.js +4 -0
  161. package/node/components/virtualization/GridVirtualScroller.js +11 -4
  162. package/node/components/virtualization/GridVirtualScrollerFiller.js +2 -1
  163. package/node/constants/gridClasses.js +1 -1
  164. package/node/hooks/core/pipeProcessing/useGridPipeProcessing.js +22 -20
  165. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +190 -103
  166. package/node/hooks/features/columnResize/columnResizeSelector.js +10 -0
  167. package/node/hooks/features/columnResize/columnResizeState.js +5 -0
  168. package/node/hooks/features/columnResize/gridColumnResizeApi.js +16 -0
  169. package/node/hooks/features/columnResize/index.js +38 -0
  170. package/node/hooks/features/columnResize/useGridColumnResize.js +564 -0
  171. package/node/hooks/features/columns/gridColumnsUtils.js +4 -1
  172. package/node/hooks/features/dimensions/useGridDimensions.js +5 -5
  173. package/node/hooks/features/editing/useGridCellEditing.js +21 -2
  174. package/node/hooks/features/export/useGridPrintExport.js +8 -7
  175. package/node/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +4 -1
  176. package/node/hooks/features/headerFiltering/useGridHeaderFiltering.js +21 -2
  177. package/node/hooks/features/index.js +11 -0
  178. package/node/hooks/features/pagination/gridPaginationSelector.js +8 -2
  179. package/node/hooks/features/pagination/useGridPagination.js +9 -153
  180. package/node/hooks/features/pagination/useGridPaginationModel.js +176 -0
  181. package/node/hooks/features/pagination/useGridRowCount.js +103 -0
  182. package/node/hooks/features/rows/useGridParamsApi.js +6 -10
  183. package/node/hooks/features/scroll/useGridScroll.js +1 -1
  184. package/node/hooks/features/sorting/useGridSorting.js +2 -2
  185. package/node/hooks/features/virtualization/gridVirtualizationSelectors.js +0 -2
  186. package/node/hooks/features/virtualization/useGridVirtualScroller.js +5 -0
  187. package/node/hooks/utils/useLazyRef.js +7 -13
  188. package/node/hooks/utils/useOnMount.js +8 -10
  189. package/node/hooks/utils/useTimeout.js +7 -37
  190. package/node/index.js +1 -1
  191. package/node/internals/index.js +15 -15
  192. package/node/internals/utils/getPinnedCellOffset.js +24 -0
  193. package/node/joy/joySlots.js +11 -50
  194. package/node/locales/jaJP.js +3 -4
  195. package/node/material/index.js +0 -2
  196. package/node/models/api/gridInfiniteLoaderApi.js +5 -0
  197. package/node/utils/cellBorderUtils.js +16 -0
  198. package/node/utils/createSelector.js +14 -23
  199. package/node/utils/domUtils.js +155 -0
  200. package/package.json +2 -2
  201. package/utils/cellBorderUtils.d.ts +3 -0
  202. package/utils/cellBorderUtils.js +8 -0
  203. package/utils/createSelector.d.ts +0 -1
  204. package/utils/createSelector.js +12 -22
  205. package/utils/domUtils.d.ts +14 -1
  206. package/utils/domUtils.js +147 -0
  207. package/components/columnHeaders/GridColumnHeadersInner.d.ts +0 -8
  208. package/components/columnHeaders/GridColumnHeadersInner.js +0 -58
  209. package/modern/components/columnHeaders/GridColumnHeadersInner.js +0 -58
  210. package/node/components/columnHeaders/GridColumnHeadersInner.js +0 -67
@@ -8,17 +8,20 @@ import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
8
8
  import { useGridSelector } from '../../hooks/utils/useGridSelector';
9
9
  import { GridGenericColumnHeaderItem } from './GridGenericColumnHeaderItem';
10
10
  import { isEventTargetInPortal } from '../../utils/domUtils';
11
+ import { shouldCellShowLeftBorder, shouldCellShowRightBorder } from '../../utils/cellBorderUtils';
11
12
  import { jsx as _jsx } from "react/jsx-runtime";
12
13
  const useUtilityClasses = ownerState => {
13
14
  const {
14
15
  classes,
15
16
  headerAlign,
16
17
  isDragging,
17
- showColumnBorder,
18
- groupId
18
+ showLeftBorder,
19
+ showRightBorder,
20
+ groupId,
21
+ pinnedPosition
19
22
  } = ownerState;
20
23
  const slots = {
21
- root: ['columnHeader', headerAlign === 'left' && 'columnHeader--alignLeft', headerAlign === 'center' && 'columnHeader--alignCenter', headerAlign === 'right' && 'columnHeader--alignRight', isDragging && 'columnHeader--moving', showColumnBorder && 'columnHeader--showColumnBorder', showColumnBorder && 'columnHeader--withRightBorder', 'withBorderColor', groupId === null ? 'columnHeader--emptyGroup' : 'columnHeader--filledGroup'],
24
+ root: ['columnHeader', headerAlign === 'left' && 'columnHeader--alignLeft', headerAlign === 'center' && 'columnHeader--alignCenter', headerAlign === 'right' && 'columnHeader--alignRight', isDragging && 'columnHeader--moving', showRightBorder && 'columnHeader--withRightBorder', showLeftBorder && 'columnHeader--withLeftBorder', 'withBorderColor', groupId === null ? 'columnHeader--emptyGroup' : 'columnHeader--filledGroup', pinnedPosition === 'left' && 'columnHeader--pinnedLeft', pinnedPosition === 'right' && 'columnHeader--pinnedRight'],
22
25
  draggableContainer: ['columnHeaderDraggableContainer'],
23
26
  titleContainer: ['columnHeaderTitleContainer', 'withBorderColor'],
24
27
  titleContainerContent: ['columnHeaderTitleContainerContent']
@@ -36,7 +39,11 @@ function GridColumnGroupHeader(props) {
36
39
  colIndex,
37
40
  hasFocus,
38
41
  tabIndex,
39
- isLastColumn
42
+ isLastColumn,
43
+ pinnedPosition,
44
+ style,
45
+ indexInSection,
46
+ sectionLength
40
47
  } = props;
41
48
  const rootProps = useGridRootProps();
42
49
  const headerCellRef = React.useRef(null);
@@ -63,10 +70,12 @@ function GridColumnGroupHeader(props) {
63
70
  if (groupId && render) {
64
71
  headerComponent = render(renderParams);
65
72
  }
66
- const showColumnBorder = rootProps.showColumnVerticalBorder;
73
+ const showLeftBorder = shouldCellShowLeftBorder(pinnedPosition, indexInSection);
74
+ const showRightBorder = shouldCellShowRightBorder(pinnedPosition, indexInSection, sectionLength, rootProps.showCellVerticalBorder);
67
75
  const ownerState = _extends({}, props, {
68
76
  classes: rootProps.classes,
69
- showColumnBorder,
77
+ showLeftBorder,
78
+ showRightBorder,
70
79
  headerAlign,
71
80
  depth,
72
81
  isDragging: false
@@ -117,12 +126,13 @@ function GridColumnGroupHeader(props) {
117
126
  width: width,
118
127
  columnMenuIconButton: null,
119
128
  columnTitleIconButtons: null,
120
- resizable: false,
129
+ resizable: true,
121
130
  label: label,
122
131
  "aria-colspan": fields.length
123
132
  // The fields are wrapped between |-...-| to avoid confusion between fields "id" and "id2" when using selector data-fields~=
124
133
  ,
125
- "data-fields": `|-${fields.join('-|-')}-|`
134
+ "data-fields": `|-${fields.join('-|-')}-|`,
135
+ style: style
126
136
  }, mouseEventsHandlers));
127
137
  }
128
138
  export { GridColumnGroupHeader };
@@ -11,6 +11,7 @@ import { getDataGridUtilityClass } from '../../constants/gridClasses';
11
11
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
12
12
  import { GridGenericColumnHeaderItem } from './GridGenericColumnHeaderItem';
13
13
  import { isEventTargetInPortal } from '../../utils/domUtils';
14
+ import { shouldCellShowLeftBorder, shouldCellShowRightBorder } from '../../utils/cellBorderUtils';
14
15
  import { jsx as _jsx } from "react/jsx-runtime";
15
16
  import { jsxs as _jsxs } from "react/jsx-runtime";
16
17
  const useUtilityClasses = ownerState => {
@@ -20,14 +21,16 @@ const useUtilityClasses = ownerState => {
20
21
  isDragging,
21
22
  sortDirection,
22
23
  showRightBorder,
23
- filterItemsCounter
24
+ showLeftBorder,
25
+ filterItemsCounter,
26
+ pinnedPosition
24
27
  } = ownerState;
25
28
  const isColumnSorted = sortDirection != null;
26
29
  const isColumnFiltered = filterItemsCounter != null && filterItemsCounter > 0;
27
30
  // todo refactor to a prop on col isNumeric or ?? ie: coltype===price wont work
28
31
  const isColumnNumeric = colDef.type === 'number';
29
32
  const slots = {
30
- root: ['columnHeader', colDef.headerAlign === 'left' && 'columnHeader--alignLeft', colDef.headerAlign === 'center' && 'columnHeader--alignCenter', colDef.headerAlign === 'right' && 'columnHeader--alignRight', colDef.sortable && 'columnHeader--sortable', isDragging && 'columnHeader--moving', isColumnSorted && 'columnHeader--sorted', isColumnFiltered && 'columnHeader--filtered', isColumnNumeric && 'columnHeader--numeric', 'withBorderColor', showRightBorder && 'columnHeader--withRightBorder'],
33
+ root: ['columnHeader', colDef.headerAlign === 'left' && 'columnHeader--alignLeft', colDef.headerAlign === 'center' && 'columnHeader--alignCenter', colDef.headerAlign === 'right' && 'columnHeader--alignRight', colDef.sortable && 'columnHeader--sortable', isDragging && 'columnHeader--moving', isColumnSorted && 'columnHeader--sorted', isColumnFiltered && 'columnHeader--filtered', isColumnNumeric && 'columnHeader--numeric', 'withBorderColor', showRightBorder && 'columnHeader--withRightBorder', showLeftBorder && 'columnHeader--withLeftBorder', pinnedPosition === 'left' && 'columnHeader--pinnedLeft', pinnedPosition === 'right' && 'columnHeader--pinnedRight'],
31
34
  draggableContainer: ['columnHeaderDraggableContainer'],
32
35
  titleContainer: ['columnHeaderTitleContainer'],
33
36
  titleContainerContent: ['columnHeaderTitleContainerContent']
@@ -47,7 +50,11 @@ function GridColumnHeaderItem(props) {
47
50
  hasFocus,
48
51
  tabIndex,
49
52
  disableReorder,
50
- separatorSide
53
+ separatorSide,
54
+ style,
55
+ pinnedPosition,
56
+ indexInSection,
57
+ sectionLength
51
58
  } = props;
52
59
  const apiRef = useGridPrivateApiContext();
53
60
  const rootProps = useGridRootProps();
@@ -61,9 +68,12 @@ function GridColumnHeaderItem(props) {
61
68
  if (colDef.renderHeader) {
62
69
  headerComponent = colDef.renderHeader(apiRef.current.getColumnHeaderParams(colDef.field));
63
70
  }
71
+ const showLeftBorder = shouldCellShowLeftBorder(pinnedPosition, indexInSection);
72
+ const showRightBorder = shouldCellShowRightBorder(pinnedPosition, indexInSection, sectionLength, rootProps.showCellVerticalBorder);
64
73
  const ownerState = _extends({}, props, {
65
74
  classes: rootProps.classes,
66
- showRightBorder: rootProps.showColumnVerticalBorder
75
+ showRightBorder,
76
+ showLeftBorder
67
77
  });
68
78
  const classes = useUtilityClasses(ownerState);
69
79
  const publish = React.useCallback(eventName => event => {
@@ -143,7 +153,7 @@ function GridColumnHeaderItem(props) {
143
153
  const focusableElement = headerCellRef.current.querySelector('[tabindex="0"]');
144
154
  const elementToFocus = focusableElement || headerCellRef.current;
145
155
  elementToFocus?.focus();
146
- apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
156
+ apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
147
157
  }
148
158
  }, [apiRef, hasFocus]);
149
159
  const headerClassName = typeof colDef.headerClassName === 'function' ? colDef.headerClassName({
@@ -175,7 +185,8 @@ function GridColumnHeaderItem(props) {
175
185
  "data-field": colDef.field,
176
186
  columnMenu: columnMenu,
177
187
  draggableContainerProps: draggableEventHandlers,
178
- columnHeaderSeparatorProps: columnHeaderSeparatorProps
188
+ columnHeaderSeparatorProps: columnHeaderSeparatorProps,
189
+ style: style
179
190
  }, mouseEventsHandlers));
180
191
  }
181
192
  process.env.NODE_ENV !== "production" ? GridColumnHeaderItem.propTypes = {
@@ -190,11 +201,15 @@ process.env.NODE_ENV !== "production" ? GridColumnHeaderItem.propTypes = {
190
201
  filterItemsCounter: PropTypes.number,
191
202
  hasFocus: PropTypes.bool,
192
203
  headerHeight: PropTypes.number.isRequired,
204
+ indexInSection: PropTypes.number.isRequired,
193
205
  isDragging: PropTypes.bool.isRequired,
194
206
  isResizing: PropTypes.bool.isRequired,
207
+ pinnedPosition: PropTypes.oneOf(['left', 'right']),
208
+ sectionLength: PropTypes.number.isRequired,
195
209
  separatorSide: PropTypes.oneOf(['left', 'right']),
196
210
  sortDirection: PropTypes.oneOf(['asc', 'desc']),
197
211
  sortIndex: PropTypes.number,
212
+ style: PropTypes.object,
198
213
  tabIndex: PropTypes.oneOf([-1, 0]).isRequired
199
214
  } : void 0;
200
215
  const Memoized = fastMemo(GridColumnHeaderItem);
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["classes", "columnMenuOpen", "colIndex", "height", "isResizing", "sortDirection", "hasFocus", "tabIndex", "separatorSide", "isDraggable", "headerComponent", "description", "elementId", "width", "columnMenuIconButton", "columnMenu", "columnTitleIconButtons", "headerClassName", "label", "resizable", "draggableContainerProps", "columnHeaderSeparatorProps"];
3
+ const _excluded = ["classes", "columnMenuOpen", "colIndex", "height", "isResizing", "sortDirection", "hasFocus", "tabIndex", "separatorSide", "isDraggable", "headerComponent", "description", "elementId", "width", "columnMenuIconButton", "columnMenu", "columnTitleIconButtons", "headerClassName", "label", "resizable", "draggableContainerProps", "columnHeaderSeparatorProps", "style"];
4
4
  import * as React from 'react';
5
5
  import clsx from 'clsx';
6
6
  import { unstable_useForkRef as useForkRef } from '@mui/utils';
@@ -32,7 +32,8 @@ const GridGenericColumnHeaderItem = /*#__PURE__*/React.forwardRef(function GridG
32
32
  label,
33
33
  resizable,
34
34
  draggableContainerProps,
35
- columnHeaderSeparatorProps
35
+ columnHeaderSeparatorProps,
36
+ style
36
37
  } = props,
37
38
  other = _objectWithoutPropertiesLoose(props, _excluded);
38
39
  const apiRef = useGridPrivateApiContext();
@@ -55,18 +56,18 @@ const GridGenericColumnHeaderItem = /*#__PURE__*/React.forwardRef(function GridG
55
56
  const focusableElement = headerCellRef.current.querySelector('[tabindex="0"]');
56
57
  const elementToFocus = focusableElement || headerCellRef.current;
57
58
  elementToFocus?.focus();
58
- apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
59
+ apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
59
60
  }
60
61
  }, [apiRef, hasFocus]);
61
62
  return /*#__PURE__*/_jsxs("div", _extends({
62
63
  ref: handleRef,
63
64
  className: clsx(classes.root, headerClassName),
64
- style: {
65
+ style: _extends({}, style, {
65
66
  height,
66
67
  width,
67
68
  minWidth: width,
68
69
  maxWidth: width
69
- },
70
+ }),
70
71
  role: "columnheader",
71
72
  tabIndex: tabIndex,
72
73
  "aria-colindex": colIndex + 1,
@@ -307,14 +307,6 @@ export const GridRootStyles = styled('div', {
307
307
  borderBottomStyle: 'solid',
308
308
  boxSizing: 'border-box'
309
309
  },
310
- [`& .${c['columnHeader--filledGroup']}.${c['columnHeader--showColumnBorder']} .${c.columnHeaderTitleContainer}`]: {
311
- borderBottom: `none`
312
- },
313
- [`& .${c['columnHeader--filledGroup']}.${c['columnHeader--showColumnBorder']}`]: {
314
- borderBottomWidth: '1px',
315
- borderBottomStyle: 'solid',
316
- boxSizing: 'border-box'
317
- },
318
310
  [`& .${c.sortIcon}, & .${c.filterIcon}`]: {
319
311
  fontSize: 'inherit'
320
312
  },
@@ -338,6 +330,12 @@ export const GridRootStyles = styled('div', {
338
330
  [`& .${c['columnHeader--moving']}`]: {
339
331
  backgroundColor: (t.vars || t).palette.action.hover
340
332
  },
333
+ [`& .${c['columnHeader--pinnedLeft']}, & .${c['columnHeader--pinnedRight']}`]: {
334
+ position: 'sticky',
335
+ zIndex: 4,
336
+ // Should be above the column separator
337
+ background: 'var(--DataGrid-pinnedBackground)'
338
+ },
341
339
  [`& .${c.columnSeparator}`]: {
342
340
  visibility: 'hidden',
343
341
  position: 'absolute',
@@ -428,9 +426,6 @@ export const GridRootStyles = styled('div', {
428
426
  [`& .${c['container--top']}, & .${c['container--bottom']}`]: {
429
427
  '[role=row]': {
430
428
  background: 'var(--DataGrid-containerBackground)'
431
- },
432
- [`.${c.pinnedColumnHeaders} [role=row]`]: {
433
- background: 'var(--DataGrid-pinnedBackground)'
434
429
  }
435
430
  },
436
431
  /* Cell styles */
@@ -441,8 +436,6 @@ export const GridRootStyles = styled('div', {
441
436
  lineHeight: 'calc(var(--height) - 1px)',
442
437
  // -1px for the border
443
438
 
444
- '--width': '0px',
445
- '--height': '0px',
446
439
  boxSizing: 'border-box',
447
440
  borderTop: `1px solid var(--rowBorderColor)`,
448
441
  overflow: 'hidden',
@@ -522,20 +515,16 @@ export const GridRootStyles = styled('div', {
522
515
  [`.${c.withBorderColor}`]: {
523
516
  borderColor
524
517
  },
525
- [`& .${c['cell--withLeftBorder']}`]: {
518
+ [`& .${c['cell--withLeftBorder']}, & .${c['columnHeader--withLeftBorder']}`]: {
526
519
  borderLeftColor: 'var(--DataGrid-rowBorderColor)',
527
520
  borderLeftWidth: '1px',
528
521
  borderLeftStyle: 'solid'
529
522
  },
530
- [`& .${c['cell--withRightBorder']}`]: {
523
+ [`& .${c['cell--withRightBorder']}, & .${c['columnHeader--withRightBorder']}`]: {
531
524
  borderRightColor: 'var(--DataGrid-rowBorderColor)',
532
525
  borderRightWidth: '1px',
533
526
  borderRightStyle: 'solid'
534
527
  },
535
- [`& .${c['columnHeader--withRightBorder']}`]: {
536
- borderRightWidth: '1px',
537
- borderRightStyle: 'solid'
538
- },
539
528
  [`& .${c['cell--flex']}`]: {
540
529
  display: 'flex',
541
530
  alignItems: 'center',
@@ -636,12 +625,13 @@ export const GridRootStyles = styled('div', {
636
625
  borderTop: '1px solid var(--DataGrid-rowBorderColor)'
637
626
  },
638
627
  [`&.${c['scrollbarFiller--pinnedRight']}`]: {
639
- backgroundColor: 'var(--DataGrid-pinnedBackground)'
640
- },
641
- [`&.${c['scrollbarFiller--pinnedRight']}:not(.${c['scrollbarFiller--header']})`]: {
628
+ backgroundColor: 'var(--DataGrid-pinnedBackground)',
642
629
  position: 'sticky',
643
630
  right: 0
644
631
  }
632
+ },
633
+ [`& .${c.filler}`]: {
634
+ flex: 1
645
635
  }
646
636
  });
647
637
  return gridStyle;
@@ -35,6 +35,8 @@ const ScrollbarVertical = styled(Scrollbar)({
35
35
  height: 'calc(var(--DataGrid-hasScrollY) * (100% - var(--DataGrid-topContainerHeight) - var(--DataGrid-bottomContainerHeight) - var(--DataGrid-hasScrollX) * var(--DataGrid-scrollbarSize)))',
36
36
  overflowY: 'auto',
37
37
  overflowX: 'hidden',
38
+ // Disable focus-visible style, it's a scrollbar.
39
+ outline: 0,
38
40
  '& > div': {
39
41
  width: 'var(--size)'
40
42
  },
@@ -46,6 +48,8 @@ const ScrollbarHorizontal = styled(Scrollbar)({
46
48
  height: 'var(--size)',
47
49
  overflowY: 'hidden',
48
50
  overflowX: 'auto',
51
+ // Disable focus-visible style, it's a scrollbar.
52
+ outline: 0,
49
53
  '& > div': {
50
54
  height: 'var(--size)'
51
55
  },
@@ -2,6 +2,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { styled } from '@mui/system';
4
4
  import { unstable_composeClasses as composeClasses } from '@mui/utils';
5
+ import { GridScrollArea } from '../GridScrollArea';
5
6
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
6
7
  import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
7
8
  import { useGridSelector } from '../../hooks/utils/useGridSelector';
@@ -59,12 +60,18 @@ function GridVirtualScroller(props) {
59
60
  getContentProps,
60
61
  getRenderZoneProps,
61
62
  getScrollbarVerticalProps,
62
- getScrollbarHorizontalProps
63
+ getScrollbarHorizontalProps,
64
+ getRows
63
65
  } = virtualScroller;
66
+ const rows = getRows();
64
67
  return /*#__PURE__*/_jsxs(Container, _extends({
65
68
  className: classes.root
66
69
  }, getContainerProps(), {
67
- children: [/*#__PURE__*/_jsxs(Scroller, _extends({
70
+ children: [/*#__PURE__*/_jsx(GridScrollArea, {
71
+ scrollDirection: "left"
72
+ }), /*#__PURE__*/_jsx(GridScrollArea, {
73
+ scrollDirection: "right"
74
+ }), /*#__PURE__*/_jsxs(Scroller, _extends({
68
75
  className: classes.scroller
69
76
  }, getScrollerProps(), {
70
77
  ownerState: rootProps,
@@ -75,11 +82,11 @@ function GridVirtualScroller(props) {
75
82
  })]
76
83
  }), /*#__PURE__*/_jsx(GridOverlays, {}), /*#__PURE__*/_jsx(Content, _extends({}, getContentProps(), {
77
84
  children: /*#__PURE__*/_jsxs(RenderZone, _extends({}, getRenderZoneProps(), {
78
- children: [virtualScroller.getRows(), /*#__PURE__*/_jsx(rootProps.slots.detailPanels, {
85
+ children: [rows, /*#__PURE__*/_jsx(rootProps.slots.detailPanels, {
79
86
  virtualScroller: virtualScroller
80
87
  })]
81
88
  }))
82
- })), /*#__PURE__*/_jsx(SpaceFiller, {}), /*#__PURE__*/_jsx(BottomContainer, {
89
+ })), rows.length > 0 && /*#__PURE__*/_jsx(SpaceFiller, {}), /*#__PURE__*/_jsx(BottomContainer, {
83
90
  children: /*#__PURE__*/_jsx(rootProps.slots.pinnedRows, {
84
91
  position: "bottom",
85
92
  virtualScroller: virtualScroller
@@ -38,6 +38,7 @@ function GridVirtualScrollerFiller() {
38
38
  viewportOuterSize,
39
39
  minimumSize,
40
40
  hasScrollX,
41
+ hasScrollY,
41
42
  scrollbarSize,
42
43
  leftPinnedWidth,
43
44
  rightPinnedWidth
@@ -62,7 +63,7 @@ function GridVirtualScrollerFiller() {
62
63
  }), /*#__PURE__*/_jsx(Main, {}), rightPinnedWidth > 0 && /*#__PURE__*/_jsx(PinnedRight, {
63
64
  className: gridClasses['filler--pinnedRight'],
64
65
  style: {
65
- width: rightPinnedWidth
66
+ width: rightPinnedWidth + (hasScrollY ? scrollbarSize : 0)
66
67
  }
67
68
  })]
68
69
  });
@@ -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--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnGroupHeader', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeader--showColumnBorder', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', '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--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', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', '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--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader', '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--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']);
@@ -32,7 +32,7 @@ import { useGridApiMethod } from '../../utils/useGridApiMethod';
32
32
  * * `apiRef.current.requestPipeProcessorsApplication` is called for the given group.
33
33
  */
34
34
  export const useGridPipeProcessing = apiRef => {
35
- const processorsCache = React.useRef({});
35
+ const cache = React.useRef({});
36
36
  const isRunning = React.useRef(false);
37
37
  const runAppliers = React.useCallback(groupCache => {
38
38
  if (isRunning.current || !groupCache) {
@@ -45,52 +45,54 @@ export const useGridPipeProcessing = apiRef => {
45
45
  isRunning.current = false;
46
46
  }, []);
47
47
  const registerPipeProcessor = React.useCallback((group, id, processor) => {
48
- if (!processorsCache.current[group]) {
49
- processorsCache.current[group] = {
48
+ if (!cache.current[group]) {
49
+ cache.current[group] = {
50
50
  processors: new Map(),
51
+ processorsAsArray: [],
51
52
  appliers: {}
52
53
  };
53
54
  }
54
- const groupCache = processorsCache.current[group];
55
+ const groupCache = cache.current[group];
55
56
  const oldProcessor = groupCache.processors.get(id);
56
57
  if (oldProcessor !== processor) {
57
58
  groupCache.processors.set(id, processor);
59
+ groupCache.processorsAsArray = Array.from(cache.current[group].processors.values());
58
60
  runAppliers(groupCache);
59
61
  }
60
62
  return () => {
61
- processorsCache.current[group].processors.set(id, null);
63
+ cache.current[group].processors.delete(id);
64
+ cache.current[group].processorsAsArray = Array.from(cache.current[group].processors.values());
62
65
  };
63
66
  }, [runAppliers]);
64
67
  const registerPipeApplier = React.useCallback((group, id, applier) => {
65
- if (!processorsCache.current[group]) {
66
- processorsCache.current[group] = {
68
+ if (!cache.current[group]) {
69
+ cache.current[group] = {
67
70
  processors: new Map(),
71
+ processorsAsArray: [],
68
72
  appliers: {}
69
73
  };
70
74
  }
71
- processorsCache.current[group].appliers[id] = applier;
75
+ cache.current[group].appliers[id] = applier;
72
76
  return () => {
73
- const _appliers = processorsCache.current[group].appliers,
77
+ const _appliers = cache.current[group].appliers,
74
78
  otherAppliers = _objectWithoutPropertiesLoose(_appliers, [id].map(_toPropertyKey));
75
- processorsCache.current[group].appliers = otherAppliers;
79
+ cache.current[group].appliers = otherAppliers;
76
80
  };
77
81
  }, []);
78
82
  const requestPipeProcessorsApplication = React.useCallback(group => {
79
- const groupCache = processorsCache.current[group];
80
- runAppliers(groupCache);
83
+ runAppliers(cache.current[group]);
81
84
  }, [runAppliers]);
82
85
  const applyPipeProcessors = React.useCallback((...args) => {
83
86
  const [group, value, context] = args;
84
- if (!processorsCache.current[group]) {
87
+ if (!cache.current[group]) {
85
88
  return value;
86
89
  }
87
- const preProcessors = Array.from(processorsCache.current[group].processors.values());
88
- return preProcessors.reduce((acc, preProcessor) => {
89
- if (!preProcessor) {
90
- return acc;
91
- }
92
- return preProcessor(acc, context);
93
- }, value);
90
+ const processors = cache.current[group].processorsAsArray;
91
+ let result = value;
92
+ for (let i = 0; i < processors.length; i += 1) {
93
+ result = processors[i](result, context);
94
+ }
95
+ return result;
94
96
  }, []);
95
97
  const preProcessingPrivateApi = {
96
98
  registerPipeProcessor,