@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
@@ -1,4 +1,7 @@
1
1
  import { createSelector } from '../../../utils/createSelector';
2
2
  export const gridHeaderFilteringStateSelector = state => state.headerFiltering;
3
+ export const gridHeaderFilteringEnabledSelector = createSelector(gridHeaderFilteringStateSelector,
4
+ // No initialization in MIT, so we need to default to false to be used by `getTotalHeaderHeight`
5
+ headerFilteringState => headerFilteringState?.enabled ?? false);
3
6
  export const gridHeaderFilteringEditFieldSelector = createSelector(gridHeaderFilteringStateSelector, headerFilteringState => headerFilteringState.editing);
4
7
  export const gridHeaderFilteringMenuSelector = createSelector(gridHeaderFilteringStateSelector, headerFilteringState => headerFilteringState.menuOpen);
@@ -3,14 +3,18 @@ import * as React from 'react';
3
3
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
4
4
  import { useGridLogger } from '../../utils';
5
5
  import { gridColumnLookupSelector, gridColumnVisibilityModelSelector, gridColumnFieldsSelector } from '../columns/gridColumnsSelector';
6
- export const headerFilteringStateInitializer = state => _extends({}, state, {
6
+ export const headerFilteringStateInitializer = (state, props) => _extends({}, state, {
7
+ // @ts-expect-error Access `Pro` prop in MIT
7
8
  headerFiltering: {
9
+ enabled: props.headerFilters ?? false,
8
10
  editing: null,
9
11
  menuOpen: null
10
12
  }
11
13
  });
12
14
  export const useGridHeaderFiltering = (apiRef, props) => {
13
15
  const logger = useGridLogger(apiRef, 'useGridHeaderFiltering');
16
+ // @ts-expect-error Access `Pro` prop in MIT
17
+ const isHeaderFilteringEnabled = props.headerFilters ?? false;
14
18
  const setHeaderFilterState = React.useCallback(headerFilterState => {
15
19
  apiRef.current.setState(state => {
16
20
  // Safety check to avoid MIT users from using it
@@ -20,13 +24,14 @@ export const useGridHeaderFiltering = (apiRef, props) => {
20
24
  }
21
25
  return _extends({}, state, {
22
26
  headerFiltering: {
27
+ enabled: isHeaderFilteringEnabled ?? false,
23
28
  editing: headerFilterState.editing ?? null,
24
29
  menuOpen: headerFilterState.menuOpen ?? null
25
30
  }
26
31
  });
27
32
  });
28
33
  apiRef.current.forceUpdate();
29
- }, [apiRef, props.signature]);
34
+ }, [apiRef, props.signature, isHeaderFilteringEnabled]);
30
35
  const startHeaderFilterEditMode = React.useCallback(field => {
31
36
  logger.debug(`Starting edit mode on header filter for field: ${field}`);
32
37
  apiRef.current.setHeaderFilterState({
@@ -87,4 +92,18 @@ export const useGridHeaderFiltering = (apiRef, props) => {
87
92
  };
88
93
  useGridApiMethod(apiRef, headerFilterApi, 'public');
89
94
  useGridApiMethod(apiRef, headerFilterPrivateApi, 'private');
95
+
96
+ /*
97
+ * EFFECTS
98
+ */
99
+ const isFirstRender = React.useRef(true);
100
+ React.useEffect(() => {
101
+ if (isFirstRender.current) {
102
+ isFirstRender.current = false;
103
+ } else {
104
+ apiRef.current.setHeaderFilterState({
105
+ enabled: isHeaderFilteringEnabled
106
+ });
107
+ }
108
+ }, [apiRef, isHeaderFilteringEnabled]);
90
109
  };
@@ -2,6 +2,7 @@
2
2
  export * from './columnMenu';
3
3
  export * from './columns';
4
4
  export * from './columnGrouping';
5
+ export * from './columnResize';
5
6
  export * from './density';
6
7
  export * from './filter';
7
8
  export * from './focus';
@@ -1,5 +1,5 @@
1
1
  import { createSelector, createSelectorMemoized } from '../../../utils/createSelector';
2
- import { gridFilteredTopLevelRowCountSelector, gridExpandedSortedRowEntriesSelector, gridExpandedSortedRowIdsSelector, gridFilteredSortedTopLevelRowEntriesSelector } from '../filter/gridFilterSelector';
2
+ import { gridExpandedSortedRowEntriesSelector, gridExpandedSortedRowIdsSelector, gridFilteredSortedTopLevelRowEntriesSelector } from '../filter/gridFilterSelector';
3
3
  import { gridRowMaximumTreeDepthSelector, gridRowTreeSelector } from '../rows/gridRowsSelector';
4
4
  import { getPageCount } from './gridPaginationUtils';
5
5
 
@@ -15,6 +15,12 @@ export const gridPaginationSelector = state => state.pagination;
15
15
  */
16
16
  export const gridPaginationModelSelector = createSelector(gridPaginationSelector, pagination => pagination.paginationModel);
17
17
 
18
+ /**
19
+ * Get the row count
20
+ * @category Pagination
21
+ */
22
+ export const gridPaginationRowCountSelector = createSelector(gridPaginationSelector, pagination => pagination.rowCount);
23
+
18
24
  /**
19
25
  * Get the index of the page to render if the pagination is enabled
20
26
  * @category Pagination
@@ -31,7 +37,7 @@ export const gridPageSizeSelector = createSelector(gridPaginationModelSelector,
31
37
  * Get the amount of pages needed to display all the rows if the pagination is enabled
32
38
  * @category Pagination
33
39
  */
34
- export const gridPageCountSelector = createSelector(gridPaginationModelSelector, gridFilteredTopLevelRowCountSelector, (paginationModel, visibleTopLevelRowCount) => getPageCount(visibleTopLevelRowCount, paginationModel.pageSize));
40
+ export const gridPageCountSelector = createSelector(gridPageSizeSelector, gridPaginationRowCountSelector, (pageSize, rowCount) => getPageCount(rowCount, pageSize));
35
41
 
36
42
  /**
37
43
  * Get the index of the first and the last row to include in the current page if the pagination is enabled.
@@ -1,165 +1,24 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import * as React from 'react';
3
- import { gridFilteredTopLevelRowCountSelector } from '../filter';
4
- import { gridDensityFactorSelector } from '../density';
5
- import { useGridLogger, useGridSelector, useGridApiMethod, useGridApiEventHandler } from '../../utils';
6
- import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
7
- import { gridPaginationModelSelector } from './gridPaginationSelector';
8
- import { getPageCount, noRowCountInServerMode, defaultPageSize, throwIfPageSizeExceedsTheLimit, getDefaultGridPaginationModel, getValidPage } from './gridPaginationUtils';
2
+ import { throwIfPageSizeExceedsTheLimit, getDefaultGridPaginationModel } from './gridPaginationUtils';
3
+ import { useGridPaginationModel } from './useGridPaginationModel';
4
+ import { useGridRowCount } from './useGridRowCount';
9
5
  export const paginationStateInitializer = (state, props) => {
10
6
  const paginationModel = _extends({}, getDefaultGridPaginationModel(props.autoPageSize), props.paginationModel ?? props.initialState?.pagination?.paginationModel);
11
7
  throwIfPageSizeExceedsTheLimit(paginationModel.pageSize, props.signature);
8
+ const rowCount = props.rowCount ?? props.initialState?.pagination?.rowCount;
12
9
  return _extends({}, state, {
13
10
  pagination: {
14
- paginationModel
11
+ paginationModel,
12
+ rowCount
15
13
  }
16
14
  });
17
15
  };
18
- export const mergeStateWithPaginationModel = (rowCount, signature, paginationModelProp) => paginationState => {
19
- let paginationModel = paginationState.paginationModel;
20
- const pageSize = paginationModelProp?.pageSize ?? paginationModel.pageSize;
21
- const pageCount = getPageCount(rowCount, pageSize);
22
- if (paginationModelProp && (paginationModelProp?.page !== paginationModel.page || paginationModelProp?.pageSize !== paginationModel.pageSize)) {
23
- paginationModel = paginationModelProp;
24
- }
25
- const validPage = getValidPage(paginationModel.page, pageCount);
26
- if (validPage !== paginationModel.page) {
27
- paginationModel = _extends({}, paginationModel, {
28
- page: validPage
29
- });
30
- }
31
- throwIfPageSizeExceedsTheLimit(paginationModel.pageSize, signature);
32
- return {
33
- paginationModel
34
- };
35
- };
36
16
 
37
17
  /**
38
18
  * @requires useGridFilter (state)
39
19
  * @requires useGridDimensions (event) - can be after
40
20
  */
41
21
  export const useGridPagination = (apiRef, props) => {
42
- const logger = useGridLogger(apiRef, 'useGridPagination');
43
- const visibleTopLevelRowCount = useGridSelector(apiRef, gridFilteredTopLevelRowCountSelector);
44
- const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
45
- const rowHeight = Math.floor(props.rowHeight * densityFactor);
46
- apiRef.current.registerControlState({
47
- stateId: 'pagination',
48
- propModel: props.paginationModel,
49
- propOnChange: props.onPaginationModelChange,
50
- stateSelector: gridPaginationModelSelector,
51
- changeEvent: 'paginationModelChange'
52
- });
53
-
54
- /**
55
- * API METHODS
56
- */
57
- const setPage = React.useCallback(page => {
58
- const currentModel = gridPaginationModelSelector(apiRef);
59
- if (page === currentModel.page) {
60
- return;
61
- }
62
- logger.debug(`Setting page to ${page}`);
63
- apiRef.current.setPaginationModel({
64
- page,
65
- pageSize: currentModel.pageSize
66
- });
67
- }, [apiRef, logger]);
68
- const setPageSize = React.useCallback(pageSize => {
69
- const currentModel = gridPaginationModelSelector(apiRef);
70
- if (pageSize === currentModel.pageSize) {
71
- return;
72
- }
73
- logger.debug(`Setting page size to ${pageSize}`);
74
- apiRef.current.setPaginationModel({
75
- pageSize,
76
- page: currentModel.page
77
- });
78
- }, [apiRef, logger]);
79
- const setPaginationModel = React.useCallback(paginationModel => {
80
- const currentModel = gridPaginationModelSelector(apiRef);
81
- if (paginationModel === currentModel) {
82
- return;
83
- }
84
- logger.debug("Setting 'paginationModel' to", paginationModel);
85
- apiRef.current.updateControlState('pagination', mergeStateWithPaginationModel(props.rowCount ?? visibleTopLevelRowCount, props.signature, paginationModel), 'setPaginationModel');
86
- apiRef.current.forceUpdate();
87
- }, [apiRef, logger, props.rowCount, props.signature, visibleTopLevelRowCount]);
88
- const pageApi = {
89
- setPage,
90
- setPageSize,
91
- setPaginationModel
92
- };
93
- useGridApiMethod(apiRef, pageApi, 'public');
94
-
95
- /**
96
- * PRE-PROCESSING
97
- */
98
- const stateExportPreProcessing = React.useCallback((prevState, context) => {
99
- const paginationModel = gridPaginationModelSelector(apiRef);
100
- const shouldExportPaginationModel =
101
- // Always export if the `exportOnlyDirtyModels` property is not activated
102
- !context.exportOnlyDirtyModels ||
103
- // Always export if the `paginationModel` is controlled
104
- props.paginationModel != null ||
105
- // Always export if the `paginationModel` has been initialized
106
- props.initialState?.pagination?.paginationModel != null ||
107
- // Export if `page` or `pageSize` is not equal to the default value
108
- paginationModel.page !== 0 && paginationModel.pageSize !== defaultPageSize(props.autoPageSize);
109
- if (!shouldExportPaginationModel) {
110
- return prevState;
111
- }
112
- return _extends({}, prevState, {
113
- pagination: _extends({}, prevState.pagination, {
114
- paginationModel
115
- })
116
- });
117
- }, [apiRef, props.paginationModel, props.initialState?.pagination?.paginationModel, props.autoPageSize]);
118
- const stateRestorePreProcessing = React.useCallback((params, context) => {
119
- const paginationModel = context.stateToRestore.pagination?.paginationModel ? _extends({}, getDefaultGridPaginationModel(props.autoPageSize), context.stateToRestore.pagination?.paginationModel) : gridPaginationModelSelector(apiRef);
120
- apiRef.current.updateControlState('pagination', mergeStateWithPaginationModel(props.rowCount ?? visibleTopLevelRowCount, props.signature, paginationModel), 'stateRestorePreProcessing');
121
- return params;
122
- }, [apiRef, props.autoPageSize, props.rowCount, props.signature, visibleTopLevelRowCount]);
123
- useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
124
- useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
125
-
126
- /**
127
- * EVENTS
128
- */
129
- const handlePaginationModelChange = () => {
130
- const paginationModel = gridPaginationModelSelector(apiRef);
131
- if (apiRef.current.virtualScrollerRef?.current) {
132
- apiRef.current.scrollToIndexes({
133
- rowIndex: paginationModel.page * paginationModel.pageSize
134
- });
135
- }
136
- apiRef.current.forceUpdate();
137
- };
138
- const handleUpdateAutoPageSize = React.useCallback(() => {
139
- if (!props.autoPageSize) {
140
- return;
141
- }
142
- const dimensions = apiRef.current.getRootDimensions();
143
- const maximumPageSizeWithoutScrollBar = Math.floor(dimensions.viewportInnerSize.height / rowHeight);
144
- apiRef.current.setPageSize(maximumPageSizeWithoutScrollBar);
145
- }, [apiRef, props.autoPageSize, rowHeight]);
146
- useGridApiEventHandler(apiRef, 'viewportInnerSizeChange', handleUpdateAutoPageSize);
147
- useGridApiEventHandler(apiRef, 'paginationModelChange', handlePaginationModelChange);
148
-
149
- /**
150
- * EFFECTS
151
- */
152
- React.useEffect(() => {
153
- if (process.env.NODE_ENV !== 'production') {
154
- if (props.paginationMode === 'server' && props.rowCount == null) {
155
- noRowCountInServerMode();
156
- }
157
- }
158
- }, [props.rowCount, props.paginationMode]);
159
- React.useEffect(() => {
160
- apiRef.current.updateControlState('pagination', mergeStateWithPaginationModel(props.rowCount ?? visibleTopLevelRowCount, props.signature, props.paginationModel));
161
- }, [apiRef, props.paginationModel, props.rowCount, props.paginationMode, visibleTopLevelRowCount, props.signature]);
162
- React.useEffect(() => {
163
- handleUpdateAutoPageSize();
164
- }, [handleUpdateAutoPageSize]);
22
+ useGridPaginationModel(apiRef, props);
23
+ useGridRowCount(apiRef, props);
165
24
  };
@@ -0,0 +1,165 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { gridDensityFactorSelector } from '../density';
4
+ import { useGridLogger, useGridSelector, useGridApiMethod, useGridApiEventHandler } from '../../utils';
5
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
6
+ import { gridPageCountSelector, gridPaginationModelSelector } from './gridPaginationSelector';
7
+ import { getPageCount, defaultPageSize, throwIfPageSizeExceedsTheLimit, getDefaultGridPaginationModel, getValidPage } from './gridPaginationUtils';
8
+ export const getDerivedPaginationModel = (paginationState, signature, paginationModelProp) => {
9
+ let paginationModel = paginationState.paginationModel;
10
+ const rowCount = paginationState.rowCount;
11
+ const pageSize = paginationModelProp?.pageSize ?? paginationModel.pageSize;
12
+ const pageCount = getPageCount(rowCount, pageSize);
13
+ if (paginationModelProp && (paginationModelProp?.page !== paginationModel.page || paginationModelProp?.pageSize !== paginationModel.pageSize)) {
14
+ paginationModel = paginationModelProp;
15
+ }
16
+ const validPage = getValidPage(paginationModel.page, pageCount);
17
+ if (validPage !== paginationModel.page) {
18
+ paginationModel = _extends({}, paginationModel, {
19
+ page: validPage
20
+ });
21
+ }
22
+ throwIfPageSizeExceedsTheLimit(paginationModel.pageSize, signature);
23
+ return paginationModel;
24
+ };
25
+
26
+ /**
27
+ * @requires useGridFilter (state)
28
+ * @requires useGridDimensions (event) - can be after
29
+ */
30
+ export const useGridPaginationModel = (apiRef, props) => {
31
+ const logger = useGridLogger(apiRef, 'useGridPaginationModel');
32
+ const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
33
+ const rowHeight = Math.floor(props.rowHeight * densityFactor);
34
+ apiRef.current.registerControlState({
35
+ stateId: 'paginationModel',
36
+ propModel: props.paginationModel,
37
+ propOnChange: props.onPaginationModelChange,
38
+ stateSelector: gridPaginationModelSelector,
39
+ changeEvent: 'paginationModelChange'
40
+ });
41
+
42
+ /**
43
+ * API METHODS
44
+ */
45
+ const setPage = React.useCallback(page => {
46
+ const currentModel = gridPaginationModelSelector(apiRef);
47
+ if (page === currentModel.page) {
48
+ return;
49
+ }
50
+ logger.debug(`Setting page to ${page}`);
51
+ apiRef.current.setPaginationModel({
52
+ page,
53
+ pageSize: currentModel.pageSize
54
+ });
55
+ }, [apiRef, logger]);
56
+ const setPageSize = React.useCallback(pageSize => {
57
+ const currentModel = gridPaginationModelSelector(apiRef);
58
+ if (pageSize === currentModel.pageSize) {
59
+ return;
60
+ }
61
+ logger.debug(`Setting page size to ${pageSize}`);
62
+ apiRef.current.setPaginationModel({
63
+ pageSize,
64
+ page: currentModel.page
65
+ });
66
+ }, [apiRef, logger]);
67
+ const setPaginationModel = React.useCallback(paginationModel => {
68
+ const currentModel = gridPaginationModelSelector(apiRef);
69
+ if (paginationModel === currentModel) {
70
+ return;
71
+ }
72
+ logger.debug("Setting 'paginationModel' to", paginationModel);
73
+ apiRef.current.setState(state => _extends({}, state, {
74
+ pagination: _extends({}, state.pagination, {
75
+ paginationModel: getDerivedPaginationModel(state.pagination, props.signature, paginationModel)
76
+ })
77
+ }));
78
+ }, [apiRef, logger, props.signature]);
79
+ const paginationModelApi = {
80
+ setPage,
81
+ setPageSize,
82
+ setPaginationModel
83
+ };
84
+ useGridApiMethod(apiRef, paginationModelApi, 'public');
85
+
86
+ /**
87
+ * PRE-PROCESSING
88
+ */
89
+ const stateExportPreProcessing = React.useCallback((prevState, context) => {
90
+ const paginationModel = gridPaginationModelSelector(apiRef);
91
+ const shouldExportPaginationModel =
92
+ // Always export if the `exportOnlyDirtyModels` property is not activated
93
+ !context.exportOnlyDirtyModels ||
94
+ // Always export if the `paginationModel` is controlled
95
+ props.paginationModel != null ||
96
+ // Always export if the `paginationModel` has been initialized
97
+ props.initialState?.pagination?.paginationModel != null ||
98
+ // Export if `page` or `pageSize` is not equal to the default value
99
+ paginationModel.page !== 0 && paginationModel.pageSize !== defaultPageSize(props.autoPageSize);
100
+ if (!shouldExportPaginationModel) {
101
+ return prevState;
102
+ }
103
+ return _extends({}, prevState, {
104
+ pagination: _extends({}, prevState.pagination, {
105
+ paginationModel
106
+ })
107
+ });
108
+ }, [apiRef, props.paginationModel, props.initialState?.pagination?.paginationModel, props.autoPageSize]);
109
+ const stateRestorePreProcessing = React.useCallback((params, context) => {
110
+ const paginationModel = context.stateToRestore.pagination?.paginationModel ? _extends({}, getDefaultGridPaginationModel(props.autoPageSize), context.stateToRestore.pagination?.paginationModel) : gridPaginationModelSelector(apiRef);
111
+ apiRef.current.setState(state => _extends({}, state, {
112
+ pagination: _extends({}, state.pagination, {
113
+ paginationModel: getDerivedPaginationModel(state.pagination, props.signature, paginationModel)
114
+ })
115
+ }));
116
+ return params;
117
+ }, [apiRef, props.autoPageSize, props.signature]);
118
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
119
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
120
+
121
+ /**
122
+ * EVENTS
123
+ */
124
+ const handlePaginationModelChange = () => {
125
+ const paginationModel = gridPaginationModelSelector(apiRef);
126
+ if (apiRef.current.virtualScrollerRef?.current) {
127
+ apiRef.current.scrollToIndexes({
128
+ rowIndex: paginationModel.page * paginationModel.pageSize
129
+ });
130
+ }
131
+ };
132
+ const handleUpdateAutoPageSize = React.useCallback(() => {
133
+ if (!props.autoPageSize) {
134
+ return;
135
+ }
136
+ const dimensions = apiRef.current.getRootDimensions();
137
+ const maximumPageSizeWithoutScrollBar = Math.floor(dimensions.viewportInnerSize.height / rowHeight);
138
+ apiRef.current.setPageSize(maximumPageSizeWithoutScrollBar);
139
+ }, [apiRef, props.autoPageSize, rowHeight]);
140
+ const handleRowCountChange = React.useCallback(newRowCount => {
141
+ if (newRowCount == null) {
142
+ return;
143
+ }
144
+ const paginationModel = gridPaginationModelSelector(apiRef);
145
+ const pageCount = gridPageCountSelector(apiRef);
146
+ if (paginationModel.page > pageCount - 1) {
147
+ apiRef.current.setPage(Math.max(0, pageCount - 1));
148
+ }
149
+ }, [apiRef]);
150
+ useGridApiEventHandler(apiRef, 'viewportInnerSizeChange', handleUpdateAutoPageSize);
151
+ useGridApiEventHandler(apiRef, 'paginationModelChange', handlePaginationModelChange);
152
+ useGridApiEventHandler(apiRef, 'rowCountChange', handleRowCountChange);
153
+
154
+ /**
155
+ * EFFECTS
156
+ */
157
+ React.useEffect(() => {
158
+ apiRef.current.setState(state => _extends({}, state, {
159
+ pagination: _extends({}, state.pagination, {
160
+ paginationModel: getDerivedPaginationModel(state.pagination, props.signature, props.paginationModel)
161
+ })
162
+ }));
163
+ }, [apiRef, props.paginationModel, props.paginationMode, props.signature]);
164
+ React.useEffect(handleUpdateAutoPageSize, [handleUpdateAutoPageSize]);
165
+ };
@@ -0,0 +1,94 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { gridFilteredTopLevelRowCountSelector } from '../filter';
4
+ import { useGridLogger, useGridSelector, useGridApiMethod } from '../../utils';
5
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
6
+ import { gridPaginationRowCountSelector } from './gridPaginationSelector';
7
+ import { noRowCountInServerMode } from './gridPaginationUtils';
8
+
9
+ /**
10
+ * @requires useGridFilter (state)
11
+ * @requires useGridDimensions (event) - can be after
12
+ */
13
+ export const useGridRowCount = (apiRef, props) => {
14
+ const logger = useGridLogger(apiRef, 'useGridRowCount');
15
+ const visibleTopLevelRowCount = useGridSelector(apiRef, gridFilteredTopLevelRowCountSelector);
16
+ const rowCount = useGridSelector(apiRef, gridPaginationRowCountSelector);
17
+ apiRef.current.registerControlState({
18
+ stateId: 'paginationRowCount',
19
+ propModel: props.rowCount,
20
+ propOnChange: props.onRowCountChange,
21
+ stateSelector: gridPaginationRowCountSelector,
22
+ changeEvent: 'rowCountChange'
23
+ });
24
+
25
+ /**
26
+ * API METHODS
27
+ */
28
+ const setRowCount = React.useCallback(newRowCount => {
29
+ if (rowCount === newRowCount) {
30
+ return;
31
+ }
32
+ logger.debug("Setting 'rowCount' to", newRowCount);
33
+ apiRef.current.setState(state => _extends({}, state, {
34
+ pagination: _extends({}, state.pagination, {
35
+ rowCount: newRowCount
36
+ })
37
+ }));
38
+ }, [apiRef, logger, rowCount]);
39
+ const paginationRowCountApi = {
40
+ setRowCount
41
+ };
42
+ useGridApiMethod(apiRef, paginationRowCountApi, 'public');
43
+
44
+ /**
45
+ * PRE-PROCESSING
46
+ */
47
+ const stateExportPreProcessing = React.useCallback((prevState, context) => {
48
+ const exportedRowCount = gridPaginationRowCountSelector(apiRef);
49
+ const shouldExportRowCount =
50
+ // Always export if the `exportOnlyDirtyModels` property is not activated
51
+ !context.exportOnlyDirtyModels ||
52
+ // Always export if the `rowCount` is controlled
53
+ props.rowCount != null ||
54
+ // Always export if the `rowCount` has been initialized
55
+ props.initialState?.pagination?.rowCount != null;
56
+ if (!shouldExportRowCount) {
57
+ return prevState;
58
+ }
59
+ return _extends({}, prevState, {
60
+ pagination: _extends({}, prevState.pagination, {
61
+ rowCount: exportedRowCount
62
+ })
63
+ });
64
+ }, [apiRef, props.rowCount, props.initialState?.pagination?.rowCount]);
65
+ const stateRestorePreProcessing = React.useCallback((params, context) => {
66
+ const restoredRowCount = context.stateToRestore.pagination?.rowCount ? context.stateToRestore.pagination.rowCount : gridPaginationRowCountSelector(apiRef);
67
+ apiRef.current.setState(state => _extends({}, state, {
68
+ pagination: _extends({}, state.pagination, {
69
+ rowCount: restoredRowCount
70
+ })
71
+ }));
72
+ return params;
73
+ }, [apiRef]);
74
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
75
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
76
+
77
+ /**
78
+ * EFFECTS
79
+ */
80
+ React.useEffect(() => {
81
+ if (process.env.NODE_ENV !== 'production') {
82
+ if (props.paginationMode === 'server' && props.rowCount == null) {
83
+ noRowCountInServerMode();
84
+ }
85
+ }
86
+ }, [props.rowCount, props.paginationMode]);
87
+ React.useEffect(() => {
88
+ if (props.paginationMode === 'client') {
89
+ apiRef.current.setRowCount(visibleTopLevelRowCount);
90
+ } else if (props.rowCount != null) {
91
+ apiRef.current.setRowCount(props.rowCount);
92
+ }
93
+ }, [apiRef, visibleTopLevelRowCount, props.paginationMode, props.rowCount]);
94
+ };
@@ -31,12 +31,13 @@ export function useGridParamsApi(apiRef) {
31
31
  }, [apiRef]);
32
32
  const getCellParams = React.useCallback((id, field) => {
33
33
  const colDef = apiRef.current.getColumn(field);
34
- const value = apiRef.current.getCellValue(id, field);
35
34
  const row = apiRef.current.getRow(id);
36
35
  const rowNode = apiRef.current.getRowNode(id);
37
36
  if (!row || !rowNode) {
38
37
  throw new MissingRowIdError(`No row with id #${id} found`);
39
38
  }
39
+ const rawValue = row[field];
40
+ const value = colDef?.valueGetter ? colDef.valueGetter(rawValue, row, colDef, apiRef) : rawValue;
40
41
  const cellFocus = gridFocusCellSelector(apiRef);
41
42
  const cellTabIndex = gridTabIndexCellSelector(apiRef);
42
43
  const params = {
@@ -60,19 +61,14 @@ export function useGridParamsApi(apiRef) {
60
61
  }, [apiRef]);
61
62
  const getCellValue = React.useCallback((id, field) => {
62
63
  const colDef = apiRef.current.getColumn(field);
63
- if (!colDef || !colDef.valueGetter) {
64
- const rowModel = apiRef.current.getRow(id);
65
- if (!rowModel) {
66
- throw new MissingRowIdError(`No row with id #${id} found`);
67
- }
68
- return rowModel[field];
69
- }
70
64
  const row = apiRef.current.getRow(id);
71
65
  if (!row) {
72
66
  throw new MissingRowIdError(`No row with id #${id} found`);
73
67
  }
74
- const value = row[colDef.field];
75
- return colDef.valueGetter(value, row, colDef, apiRef);
68
+ if (!colDef || !colDef.valueGetter) {
69
+ return row[field];
70
+ }
71
+ return colDef.valueGetter(row[colDef.field], row, colDef, apiRef);
76
72
  }, [apiRef]);
77
73
  const getRowValue = React.useCallback((row, colDef) => {
78
74
  const field = colDef.field;
@@ -45,7 +45,7 @@ function scrollIntoView(dimensions) {
45
45
  export const useGridScroll = (apiRef, props) => {
46
46
  const theme = useTheme();
47
47
  const logger = useGridLogger(apiRef, 'useGridScroll');
48
- const colRef = apiRef.current.columnHeadersElementRef;
48
+ const colRef = apiRef.current.columnHeadersContainerRef;
49
49
  const virtualScrollerRef = apiRef.current.virtualScrollerRef;
50
50
  const visibleSortedRows = useGridSelector(apiRef, gridExpandedSortedRowEntriesSelector);
51
51
  const scrollToIndexes = React.useCallback(params => {
@@ -40,7 +40,7 @@ export const useGridSorting = (apiRef, props) => {
40
40
  const existingIdx = sortModel.findIndex(c => c.field === field);
41
41
  let newSortModel = [...sortModel];
42
42
  if (existingIdx > -1) {
43
- if (!sortItem) {
43
+ if (sortItem?.sort == null) {
44
44
  newSortModel.splice(existingIdx, 1);
45
45
  } else {
46
46
  newSortModel.splice(existingIdx, 1, sortItem);
@@ -116,7 +116,7 @@ export const useGridSorting = (apiRef, props) => {
116
116
  const sortItem = createSortItem(column, direction);
117
117
  let sortModel;
118
118
  if (!allowMultipleSorting || props.disableMultipleColumnsSorting) {
119
- sortModel = !sortItem ? [] : [sortItem];
119
+ sortModel = sortItem?.sort == null ? [] : [sortItem];
120
120
  } else {
121
121
  sortModel = upsertSortModel(column.field, sortItem);
122
122
  }
@@ -31,8 +31,6 @@ export const gridRenderContextSelector = createSelector(gridVirtualizationSelect
31
31
  * @ignore - do not document.
32
32
  */
33
33
  export const gridRenderContextColumnsSelector = createSelectorMemoized(state => state.virtualization.renderContext.firstColumnIndex, state => state.virtualization.renderContext.lastColumnIndex, (firstColumnIndex, lastColumnIndex) => ({
34
- firstRowIndex: -1,
35
- lastRowIndex: -1,
36
34
  firstColumnIndex,
37
35
  lastColumnIndex
38
36
  }));
@@ -272,6 +272,11 @@ export const useGridVirtualScroller = () => {
272
272
  if (panel) {
273
273
  rows.push(panel);
274
274
  }
275
+ if (isLastVisible) {
276
+ rows.push(apiRef.current.getInfiniteLoadingTriggerElement?.({
277
+ lastRowId: id
278
+ }));
279
+ }
275
280
  });
276
281
  return rows;
277
282
  };
@@ -1,11 +1 @@
1
- import * as React from 'react';
2
- const UNINITIALIZED = {};
3
-
4
- // See https://github.com/facebook/react/issues/14490 for when to use this.
5
- export function useLazyRef(init, initArg) {
6
- const ref = React.useRef(UNINITIALIZED);
7
- if (ref.current === UNINITIALIZED) {
8
- ref.current = init(initArg);
9
- }
10
- return ref;
11
- }
1
+ export { default as useLazyRef } from '@mui/utils/useLazyRef';
@@ -1,7 +1 @@
1
- import * as React from 'react';
2
- const EMPTY = [];
3
- export function useOnMount(fn) {
4
- /* eslint-disable react-hooks/exhaustive-deps */
5
- React.useEffect(fn, EMPTY);
6
- /* eslint-enable react-hooks/exhaustive-deps */
7
- }
1
+ export { default as useOnMount } from '@mui/utils/useOnMount';