@mui/x-data-grid 7.16.0 → 7.18.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.
Files changed (243) hide show
  1. package/CHANGELOG.md +184 -4
  2. package/DataGrid/DataGrid.js +11 -1
  3. package/DataGrid/useDataGridComponent.js +3 -0
  4. package/DataGrid/useDataGridProps.js +2 -1
  5. package/colDef/gridStringOperators.js +49 -33
  6. package/components/GridRow.js +1 -0
  7. package/components/cell/GridCell.js +30 -5
  8. package/components/columnHeaders/GridColumnHeaderItem.d.ts +2 -0
  9. package/components/columnHeaders/GridColumnHeaderItem.js +9 -2
  10. package/components/columnHeaders/GridColumnHeaderTitle.js +3 -1
  11. package/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -2
  12. package/components/containers/GridRootStyles.js +3 -7
  13. package/components/panel/filterPanel/GridFilterForm.js +1 -1
  14. package/constants/gridClasses.d.ts +10 -0
  15. package/constants/gridClasses.js +1 -1
  16. package/constants/localeTextConstants.js +4 -0
  17. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +0 -1
  18. package/hooks/features/columnHeaders/useGridColumnHeaders.js +17 -12
  19. package/hooks/features/columnResize/useGridColumnResize.js +6 -6
  20. package/hooks/features/dimensions/gridDimensionsApi.d.ts +4 -0
  21. package/hooks/features/dimensions/useGridDimensions.d.ts +1 -1
  22. package/hooks/features/dimensions/useGridDimensions.js +4 -1
  23. package/hooks/features/editing/useGridCellEditing.js +3 -19
  24. package/hooks/features/editing/useGridRowEditing.js +7 -2
  25. package/hooks/features/editing/utils.d.ts +2 -0
  26. package/hooks/features/editing/utils.js +15 -0
  27. package/hooks/features/export/serializers/csvSerializer.js +1 -1
  28. package/hooks/features/export/useGridPrintExport.js +2 -1
  29. package/hooks/features/filter/gridFilterUtils.js +1 -1
  30. package/hooks/features/focus/useGridFocus.js +2 -1
  31. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +10 -46
  32. package/hooks/features/keyboardNavigation/utils.d.ts +17 -0
  33. package/hooks/features/keyboardNavigation/utils.js +58 -0
  34. package/hooks/features/rows/gridRowSpanningSelectors.d.ts +4 -0
  35. package/hooks/features/rows/gridRowSpanningSelectors.js +5 -0
  36. package/hooks/features/rows/gridRowSpanningUtils.d.ts +10 -0
  37. package/hooks/features/rows/gridRowSpanningUtils.js +42 -0
  38. package/hooks/features/rows/useGridRowSpanning.d.ts +27 -0
  39. package/hooks/features/rows/useGridRowSpanning.js +257 -0
  40. package/hooks/features/sorting/gridSortingUtils.js +1 -1
  41. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  42. package/hooks/features/virtualization/useGridVirtualScroller.js +17 -7
  43. package/hooks/utils/useGridApiEventHandler.js +0 -1
  44. package/hooks/utils/useGridSelector.js +1 -1
  45. package/index.js +1 -1
  46. package/internals/index.d.ts +1 -0
  47. package/internals/index.js +1 -0
  48. package/internals/utils/index.d.ts +0 -1
  49. package/internals/utils/index.js +1 -2
  50. package/internals/utils/propValidation.js +1 -1
  51. package/locales/arSD.js +4 -0
  52. package/locales/beBY.js +4 -0
  53. package/locales/bgBG.js +4 -0
  54. package/locales/csCZ.js +4 -0
  55. package/locales/daDK.js +4 -0
  56. package/locales/deDE.js +4 -0
  57. package/locales/elGR.js +4 -0
  58. package/locales/esES.js +4 -0
  59. package/locales/faIR.js +4 -0
  60. package/locales/fiFI.js +4 -0
  61. package/locales/frFR.js +4 -0
  62. package/locales/heIL.js +4 -0
  63. package/locales/hrHR.js +4 -0
  64. package/locales/huHU.js +11 -8
  65. package/locales/isIS.js +4 -0
  66. package/locales/itIT.js +4 -0
  67. package/locales/jaJP.js +4 -0
  68. package/locales/koKR.js +4 -0
  69. package/locales/nbNO.js +4 -0
  70. package/locales/nlNL.js +4 -0
  71. package/locales/nnNO.js +4 -0
  72. package/locales/plPL.js +4 -0
  73. package/locales/ptBR.js +4 -0
  74. package/locales/ptPT.js +4 -0
  75. package/locales/roRO.js +4 -0
  76. package/locales/ruRU.js +4 -0
  77. package/locales/skSK.js +4 -0
  78. package/locales/svSE.js +4 -0
  79. package/locales/trTR.js +4 -0
  80. package/locales/ukUA.js +4 -0
  81. package/locales/urPK.js +4 -0
  82. package/locales/viVN.js +4 -0
  83. package/locales/zhCN.js +4 -0
  84. package/locales/zhHK.js +4 -0
  85. package/locales/zhTW.js +4 -0
  86. package/models/api/gridLocaleTextApi.d.ts +4 -0
  87. package/models/colDef/gridColDef.d.ts +4 -0
  88. package/models/gridStateCommunity.d.ts +2 -0
  89. package/models/props/DataGridProps.d.ts +10 -0
  90. package/modern/DataGrid/DataGrid.js +11 -1
  91. package/modern/DataGrid/useDataGridComponent.js +3 -0
  92. package/modern/DataGrid/useDataGridProps.js +2 -1
  93. package/modern/colDef/gridStringOperators.js +49 -33
  94. package/modern/components/GridRow.js +1 -0
  95. package/modern/components/cell/GridCell.js +30 -5
  96. package/modern/components/columnHeaders/GridColumnHeaderItem.js +9 -2
  97. package/modern/components/columnHeaders/GridColumnHeaderTitle.js +3 -1
  98. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -2
  99. package/modern/components/containers/GridRootStyles.js +3 -7
  100. package/modern/components/panel/filterPanel/GridFilterForm.js +1 -1
  101. package/modern/constants/gridClasses.js +1 -1
  102. package/modern/constants/localeTextConstants.js +4 -0
  103. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +17 -12
  104. package/modern/hooks/features/columnResize/useGridColumnResize.js +6 -6
  105. package/modern/hooks/features/dimensions/useGridDimensions.js +4 -1
  106. package/modern/hooks/features/editing/useGridCellEditing.js +3 -19
  107. package/modern/hooks/features/editing/useGridRowEditing.js +7 -2
  108. package/modern/hooks/features/editing/utils.js +15 -0
  109. package/modern/hooks/features/export/serializers/csvSerializer.js +1 -1
  110. package/modern/hooks/features/export/useGridPrintExport.js +2 -1
  111. package/modern/hooks/features/filter/gridFilterUtils.js +1 -1
  112. package/modern/hooks/features/focus/useGridFocus.js +2 -1
  113. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +10 -46
  114. package/modern/hooks/features/keyboardNavigation/utils.js +58 -0
  115. package/modern/hooks/features/rows/gridRowSpanningSelectors.js +5 -0
  116. package/modern/hooks/features/rows/gridRowSpanningUtils.js +42 -0
  117. package/modern/hooks/features/rows/useGridRowSpanning.js +257 -0
  118. package/modern/hooks/features/sorting/gridSortingUtils.js +1 -1
  119. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +17 -7
  120. package/modern/hooks/utils/useGridApiEventHandler.js +0 -1
  121. package/modern/hooks/utils/useGridSelector.js +1 -1
  122. package/modern/index.js +1 -1
  123. package/modern/internals/index.js +1 -0
  124. package/modern/internals/utils/index.js +1 -2
  125. package/modern/internals/utils/propValidation.js +1 -1
  126. package/modern/locales/arSD.js +4 -0
  127. package/modern/locales/beBY.js +4 -0
  128. package/modern/locales/bgBG.js +4 -0
  129. package/modern/locales/csCZ.js +4 -0
  130. package/modern/locales/daDK.js +4 -0
  131. package/modern/locales/deDE.js +4 -0
  132. package/modern/locales/elGR.js +4 -0
  133. package/modern/locales/esES.js +4 -0
  134. package/modern/locales/faIR.js +4 -0
  135. package/modern/locales/fiFI.js +4 -0
  136. package/modern/locales/frFR.js +4 -0
  137. package/modern/locales/heIL.js +4 -0
  138. package/modern/locales/hrHR.js +4 -0
  139. package/modern/locales/huHU.js +11 -8
  140. package/modern/locales/isIS.js +4 -0
  141. package/modern/locales/itIT.js +4 -0
  142. package/modern/locales/jaJP.js +4 -0
  143. package/modern/locales/koKR.js +4 -0
  144. package/modern/locales/nbNO.js +4 -0
  145. package/modern/locales/nlNL.js +4 -0
  146. package/modern/locales/nnNO.js +4 -0
  147. package/modern/locales/plPL.js +4 -0
  148. package/modern/locales/ptBR.js +4 -0
  149. package/modern/locales/ptPT.js +4 -0
  150. package/modern/locales/roRO.js +4 -0
  151. package/modern/locales/ruRU.js +4 -0
  152. package/modern/locales/skSK.js +4 -0
  153. package/modern/locales/svSE.js +4 -0
  154. package/modern/locales/trTR.js +4 -0
  155. package/modern/locales/ukUA.js +4 -0
  156. package/modern/locales/urPK.js +4 -0
  157. package/modern/locales/viVN.js +4 -0
  158. package/modern/locales/zhCN.js +4 -0
  159. package/modern/locales/zhHK.js +4 -0
  160. package/modern/locales/zhTW.js +4 -0
  161. package/modern/utils/createSelector.js +1 -1
  162. package/modern/utils/domUtils.js +12 -12
  163. package/node/DataGrid/DataGrid.js +11 -1
  164. package/node/DataGrid/useDataGridComponent.js +3 -0
  165. package/node/DataGrid/useDataGridProps.js +2 -1
  166. package/node/colDef/gridStringOperators.js +49 -33
  167. package/node/components/GridRow.js +1 -0
  168. package/node/components/cell/GridCell.js +30 -5
  169. package/node/components/columnHeaders/GridColumnHeaderItem.js +9 -2
  170. package/node/components/columnHeaders/GridColumnHeaderTitle.js +3 -1
  171. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +1 -2
  172. package/node/components/containers/GridRootStyles.js +3 -7
  173. package/node/components/panel/filterPanel/GridFilterForm.js +1 -1
  174. package/node/constants/gridClasses.js +1 -1
  175. package/node/constants/localeTextConstants.js +4 -0
  176. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +17 -12
  177. package/node/hooks/features/columnResize/useGridColumnResize.js +6 -6
  178. package/node/hooks/features/dimensions/useGridDimensions.js +4 -1
  179. package/node/hooks/features/editing/useGridCellEditing.js +3 -19
  180. package/node/hooks/features/editing/useGridRowEditing.js +7 -2
  181. package/node/hooks/features/editing/utils.js +22 -0
  182. package/node/hooks/features/export/serializers/csvSerializer.js +1 -1
  183. package/node/hooks/features/export/useGridPrintExport.js +2 -1
  184. package/node/hooks/features/filter/gridFilterUtils.js +1 -1
  185. package/node/hooks/features/focus/useGridFocus.js +2 -1
  186. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +16 -53
  187. package/node/hooks/features/keyboardNavigation/utils.js +68 -0
  188. package/node/hooks/features/rows/gridRowSpanningSelectors.js +11 -0
  189. package/node/hooks/features/rows/gridRowSpanningUtils.js +52 -0
  190. package/node/hooks/features/rows/useGridRowSpanning.js +267 -0
  191. package/node/hooks/features/sorting/gridSortingUtils.js +1 -1
  192. package/node/hooks/features/virtualization/useGridVirtualScroller.js +17 -7
  193. package/node/hooks/utils/useGridApiEventHandler.js +0 -1
  194. package/node/hooks/utils/useGridSelector.js +1 -1
  195. package/node/index.js +1 -1
  196. package/node/internals/index.js +15 -0
  197. package/node/internals/utils/index.js +0 -11
  198. package/node/internals/utils/propValidation.js +1 -1
  199. package/node/locales/arSD.js +4 -0
  200. package/node/locales/beBY.js +4 -0
  201. package/node/locales/bgBG.js +4 -0
  202. package/node/locales/csCZ.js +4 -0
  203. package/node/locales/daDK.js +4 -0
  204. package/node/locales/deDE.js +4 -0
  205. package/node/locales/elGR.js +4 -0
  206. package/node/locales/esES.js +4 -0
  207. package/node/locales/faIR.js +4 -0
  208. package/node/locales/fiFI.js +4 -0
  209. package/node/locales/frFR.js +4 -0
  210. package/node/locales/heIL.js +4 -0
  211. package/node/locales/hrHR.js +4 -0
  212. package/node/locales/huHU.js +11 -8
  213. package/node/locales/isIS.js +4 -0
  214. package/node/locales/itIT.js +4 -0
  215. package/node/locales/jaJP.js +4 -0
  216. package/node/locales/koKR.js +4 -0
  217. package/node/locales/nbNO.js +4 -0
  218. package/node/locales/nlNL.js +4 -0
  219. package/node/locales/nnNO.js +4 -0
  220. package/node/locales/plPL.js +4 -0
  221. package/node/locales/ptBR.js +4 -0
  222. package/node/locales/ptPT.js +4 -0
  223. package/node/locales/roRO.js +4 -0
  224. package/node/locales/ruRU.js +4 -0
  225. package/node/locales/skSK.js +4 -0
  226. package/node/locales/svSE.js +4 -0
  227. package/node/locales/trTR.js +4 -0
  228. package/node/locales/ukUA.js +4 -0
  229. package/node/locales/urPK.js +4 -0
  230. package/node/locales/viVN.js +4 -0
  231. package/node/locales/zhCN.js +4 -0
  232. package/node/locales/zhHK.js +4 -0
  233. package/node/locales/zhTW.js +4 -0
  234. package/node/utils/createSelector.js +1 -1
  235. package/node/utils/domUtils.js +12 -12
  236. package/package.json +3 -3
  237. package/utils/createSelector.js +1 -1
  238. package/utils/domUtils.d.ts +4 -4
  239. package/utils/domUtils.js +12 -12
  240. package/internals/utils/warning.d.ts +0 -2
  241. package/internals/utils/warning.js +0 -21
  242. package/modern/internals/utils/warning.js +0 -21
  243. package/node/internals/utils/warning.js +0 -28
@@ -0,0 +1,257 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import useLazyRef from '@mui/utils/useLazyRef';
4
+ import { gridVisibleColumnDefinitionsSelector } from "../columns/gridColumnsSelector.js";
5
+ import { useGridVisibleRows } from "../../utils/useGridVisibleRows.js";
6
+ import { gridRenderContextSelector } from "../virtualization/gridVirtualizationSelectors.js";
7
+ import { useGridSelector } from "../../utils/useGridSelector.js";
8
+ import { getUnprocessedRange, isRowRangeUpdated, isRowContextInitialized, getCellValue } from "./gridRowSpanningUtils.js";
9
+ const EMPTY_STATE = {
10
+ spannedCells: {},
11
+ hiddenCells: {},
12
+ hiddenCellOriginMap: {}
13
+ };
14
+ const EMPTY_RANGE = {
15
+ firstRowIndex: 0,
16
+ lastRowIndex: 0
17
+ };
18
+ const skippedFields = new Set(['__check__', '__reorder__', '__detail_panel_toggle__']);
19
+ /**
20
+ * Default number of rows to process during state initialization to avoid flickering.
21
+ * Number `20` is arbitrarily chosen to be large enough to cover most of the cases without
22
+ * compromising performance.
23
+ */
24
+ const DEFAULT_ROWS_TO_PROCESS = 20;
25
+ const computeRowSpanningState = (apiRef, colDefs, visibleRows, range, rangeToProcess, resetState, processedRange) => {
26
+ const spannedCells = resetState ? {} : _extends({}, apiRef.current.state.rowSpanning.spannedCells);
27
+ const hiddenCells = resetState ? {} : _extends({}, apiRef.current.state.rowSpanning.hiddenCells);
28
+ const hiddenCellOriginMap = resetState ? {} : _extends({}, apiRef.current.state.rowSpanning.hiddenCellOriginMap);
29
+ if (resetState) {
30
+ processedRange = EMPTY_RANGE;
31
+ }
32
+ colDefs.forEach(colDef => {
33
+ if (skippedFields.has(colDef.field)) {
34
+ return;
35
+ }
36
+ for (let index = rangeToProcess.firstRowIndex; index <= rangeToProcess.lastRowIndex; index += 1) {
37
+ const row = visibleRows[index];
38
+ if (hiddenCells[row.id]?.[colDef.field]) {
39
+ continue;
40
+ }
41
+ const cellValue = getCellValue(row.model, colDef, apiRef);
42
+ if (cellValue == null) {
43
+ continue;
44
+ }
45
+ let spannedRowId = row.id;
46
+ let spannedRowIndex = index;
47
+ let rowSpan = 0;
48
+
49
+ // For first index, also scan in the previous rows to handle the reset state case e.g by sorting
50
+ const backwardsHiddenCells = [];
51
+ if (index === rangeToProcess.firstRowIndex) {
52
+ let prevIndex = index - 1;
53
+ const prevRowEntry = visibleRows[prevIndex];
54
+ while (prevIndex >= range.firstRowIndex && getCellValue(prevRowEntry.model, colDef, apiRef) === cellValue) {
55
+ const currentRow = visibleRows[prevIndex + 1];
56
+ if (hiddenCells[currentRow.id]) {
57
+ hiddenCells[currentRow.id][colDef.field] = true;
58
+ } else {
59
+ hiddenCells[currentRow.id] = {
60
+ [colDef.field]: true
61
+ };
62
+ }
63
+ backwardsHiddenCells.push(index);
64
+ rowSpan += 1;
65
+ spannedRowId = prevRowEntry.id;
66
+ spannedRowIndex = prevIndex;
67
+ prevIndex -= 1;
68
+ }
69
+ }
70
+ backwardsHiddenCells.forEach(hiddenCellIndex => {
71
+ if (hiddenCellOriginMap[hiddenCellIndex]) {
72
+ hiddenCellOriginMap[hiddenCellIndex][colDef.field] = spannedRowIndex;
73
+ } else {
74
+ hiddenCellOriginMap[hiddenCellIndex] = {
75
+ [colDef.field]: spannedRowIndex
76
+ };
77
+ }
78
+ });
79
+
80
+ // Scan the next rows
81
+ let relativeIndex = index + 1;
82
+ while (relativeIndex <= range.lastRowIndex && visibleRows[relativeIndex] && getCellValue(visibleRows[relativeIndex].model, colDef, apiRef) === cellValue) {
83
+ const currentRow = visibleRows[relativeIndex];
84
+ if (hiddenCells[currentRow.id]) {
85
+ hiddenCells[currentRow.id][colDef.field] = true;
86
+ } else {
87
+ hiddenCells[currentRow.id] = {
88
+ [colDef.field]: true
89
+ };
90
+ }
91
+ if (hiddenCellOriginMap[relativeIndex]) {
92
+ hiddenCellOriginMap[relativeIndex][colDef.field] = spannedRowIndex;
93
+ } else {
94
+ hiddenCellOriginMap[relativeIndex] = {
95
+ [colDef.field]: spannedRowIndex
96
+ };
97
+ }
98
+ relativeIndex += 1;
99
+ rowSpan += 1;
100
+ }
101
+ if (rowSpan > 0) {
102
+ if (spannedCells[spannedRowId]) {
103
+ spannedCells[spannedRowId][colDef.field] = rowSpan + 1;
104
+ } else {
105
+ spannedCells[spannedRowId] = {
106
+ [colDef.field]: rowSpan + 1
107
+ };
108
+ }
109
+ }
110
+ }
111
+ processedRange = {
112
+ firstRowIndex: Math.min(processedRange.firstRowIndex, rangeToProcess.firstRowIndex),
113
+ lastRowIndex: Math.max(processedRange.lastRowIndex, rangeToProcess.lastRowIndex)
114
+ };
115
+ });
116
+ return {
117
+ spannedCells,
118
+ hiddenCells,
119
+ hiddenCellOriginMap,
120
+ processedRange
121
+ };
122
+ };
123
+
124
+ /**
125
+ * @requires columnsStateInitializer (method) - should be initialized before
126
+ * @requires rowsStateInitializer (method) - should be initialized before
127
+ * @requires filterStateInitializer (method) - should be initialized before
128
+ */
129
+ export const rowSpanningStateInitializer = (state, props, apiRef) => {
130
+ if (props.unstable_rowSpanning) {
131
+ const rowIds = state.rows.dataRowIds || [];
132
+ const orderedFields = state.columns.orderedFields || [];
133
+ const dataRowIdToModelLookup = state.rows.dataRowIdToModelLookup;
134
+ const columnsLookup = state.columns.lookup;
135
+ const isFilteringPending = Boolean(state.filter.filterModel.items.length) || Boolean(state.filter.filterModel.quickFilterValues?.length);
136
+ if (!rowIds.length || !orderedFields.length || !dataRowIdToModelLookup || !columnsLookup || isFilteringPending) {
137
+ return _extends({}, state, {
138
+ rowSpanning: EMPTY_STATE
139
+ });
140
+ }
141
+ const rangeToProcess = {
142
+ firstRowIndex: 0,
143
+ lastRowIndex: Math.min(DEFAULT_ROWS_TO_PROCESS - 1, Math.max(rowIds.length - 1, 0))
144
+ };
145
+ const rows = rowIds.map(id => ({
146
+ id,
147
+ model: dataRowIdToModelLookup[id]
148
+ }));
149
+ const colDefs = orderedFields.map(field => columnsLookup[field]);
150
+ const {
151
+ spannedCells,
152
+ hiddenCells,
153
+ hiddenCellOriginMap
154
+ } = computeRowSpanningState(apiRef, colDefs, rows, rangeToProcess, rangeToProcess, true, EMPTY_RANGE);
155
+ return _extends({}, state, {
156
+ rowSpanning: {
157
+ spannedCells,
158
+ hiddenCells,
159
+ hiddenCellOriginMap
160
+ }
161
+ });
162
+ }
163
+ return _extends({}, state, {
164
+ rowSpanning: EMPTY_STATE
165
+ });
166
+ };
167
+ export const useGridRowSpanning = (apiRef, props) => {
168
+ const {
169
+ range,
170
+ rows: visibleRows
171
+ } = useGridVisibleRows(apiRef, props);
172
+ const renderContext = useGridSelector(apiRef, gridRenderContextSelector);
173
+ const colDefs = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
174
+ const processedRange = useLazyRef(() => {
175
+ return Object.keys(apiRef.current.state.rowSpanning.spannedCells).length > 0 ? {
176
+ firstRowIndex: 0,
177
+ lastRowIndex: Math.min(DEFAULT_ROWS_TO_PROCESS - 1, Math.max(apiRef.current.state.rows.dataRowIds.length - 1, 0))
178
+ } : EMPTY_RANGE;
179
+ });
180
+ const lastRange = React.useRef(EMPTY_RANGE);
181
+ const updateRowSpanningState = React.useCallback(
182
+ // A reset needs to occur when:
183
+ // - The `unstable_rowSpanning` prop is updated (feature flag)
184
+ // - The filtering is applied
185
+ // - The sorting is applied
186
+ // - The `paginationModel` is updated
187
+ // - The rows are updated
188
+ (resetState = true) => {
189
+ if (!props.unstable_rowSpanning) {
190
+ if (apiRef.current.state.rowSpanning !== EMPTY_STATE) {
191
+ apiRef.current.setState(state => _extends({}, state, {
192
+ rowSpanning: EMPTY_STATE
193
+ }));
194
+ }
195
+ return;
196
+ }
197
+ if (range === null || !isRowContextInitialized(renderContext)) {
198
+ return;
199
+ }
200
+ if (resetState) {
201
+ processedRange.current = EMPTY_RANGE;
202
+ }
203
+ const rangeToProcess = getUnprocessedRange({
204
+ firstRowIndex: renderContext.firstRowIndex,
205
+ lastRowIndex: renderContext.lastRowIndex - 1
206
+ }, processedRange.current);
207
+ if (rangeToProcess === null) {
208
+ return;
209
+ }
210
+ const {
211
+ spannedCells,
212
+ hiddenCells,
213
+ hiddenCellOriginMap,
214
+ processedRange: newProcessedRange
215
+ } = computeRowSpanningState(apiRef, colDefs, visibleRows, range, rangeToProcess, resetState, processedRange.current);
216
+ processedRange.current = newProcessedRange;
217
+ const newSpannedCellsCount = Object.keys(spannedCells).length;
218
+ const newHiddenCellsCount = Object.keys(hiddenCells).length;
219
+ const currentSpannedCellsCount = Object.keys(apiRef.current.state.rowSpanning.spannedCells).length;
220
+ const currentHiddenCellsCount = Object.keys(apiRef.current.state.rowSpanning.hiddenCells).length;
221
+ const shouldUpdateState = resetState || newSpannedCellsCount !== currentSpannedCellsCount || newHiddenCellsCount !== currentHiddenCellsCount;
222
+ if (!shouldUpdateState) {
223
+ return;
224
+ }
225
+ apiRef.current.setState(state => {
226
+ return _extends({}, state, {
227
+ rowSpanning: {
228
+ spannedCells,
229
+ hiddenCells,
230
+ hiddenCellOriginMap
231
+ }
232
+ });
233
+ });
234
+ }, [apiRef, props.unstable_rowSpanning, range, renderContext, visibleRows, colDefs, processedRange]);
235
+ const prevRenderContext = React.useRef(renderContext);
236
+ const isFirstRender = React.useRef(true);
237
+ const shouldResetState = React.useRef(false);
238
+ React.useEffect(() => {
239
+ const firstRender = isFirstRender.current;
240
+ if (isFirstRender.current) {
241
+ isFirstRender.current = false;
242
+ }
243
+ if (range && lastRange.current && isRowRangeUpdated(range, lastRange.current)) {
244
+ lastRange.current = range;
245
+ shouldResetState.current = true;
246
+ }
247
+ if (!firstRender && prevRenderContext.current !== renderContext) {
248
+ if (isRowRangeUpdated(prevRenderContext.current, renderContext)) {
249
+ updateRowSpanningState(shouldResetState.current);
250
+ shouldResetState.current = false;
251
+ }
252
+ prevRenderContext.current = renderContext;
253
+ return;
254
+ }
255
+ updateRowSpanningState();
256
+ }, [updateRowSpanningState, renderContext, range, lastRange]);
257
+ };
@@ -1,5 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { warnOnce } from "../../../internals/utils/warning.js";
2
+ import { warnOnce } from '@mui/x-internals/warning';
3
3
  export const sanitizeSortModel = (model, disableMultipleColumnsSorting) => {
4
4
  if (disableMultipleColumnsSorting && model.length > 1) {
5
5
  if (process.env.NODE_ENV !== 'production') {
@@ -40,4 +40,4 @@ export declare const useGridVirtualScroller: () => {
40
40
  };
41
41
  };
42
42
  export declare function areRenderContextsEqual(context1: GridRenderContext, context2: GridRenderContext): boolean;
43
- export declare function computeOffsetLeft(columnPositions: number[], renderContext: GridColumnsRenderContext, isRtl: boolean, pinnedLeftLength: number): number;
43
+ export declare function computeOffsetLeft(columnPositions: number[], renderContext: GridColumnsRenderContext, pinnedLeftLength: number): number;
@@ -24,6 +24,7 @@ import { getFirstNonSpannedColumnToRender } from "../columns/gridColumnsUtils.js
24
24
  import { getMinimalContentHeight } from "../rows/gridRowsUtils.js";
25
25
  import { gridRenderContextSelector, gridVirtualizationRowEnabledSelector, gridVirtualizationColumnEnabledSelector } from "./gridVirtualizationSelectors.js";
26
26
  import { EMPTY_RENDER_CONTEXT } from "./useGridVirtualization.js";
27
+ import { gridRowSpanningHiddenCellsOriginMapSelector } from "../rows/gridRowSpanningSelectors.js";
27
28
  import { jsx as _jsx } from "react/jsx-runtime";
28
29
  const MINIMUM_COLUMN_WIDTH = 50;
29
30
  var ScrollDirection = /*#__PURE__*/function (ScrollDirection) {
@@ -325,7 +326,7 @@ export const useGridVirtualScroller = () => {
325
326
  if (!isPinnedSection && frozenContext.current && rowIndexInPage >= frozenContext.current.firstRowIndex && rowIndexInPage < frozenContext.current.lastRowIndex) {
326
327
  currentRenderContext = frozenContext.current;
327
328
  }
328
- const offsetLeft = computeOffsetLeft(columnPositions, currentRenderContext, isRtl, pinnedColumns.left.length);
329
+ const offsetLeft = computeOffsetLeft(columnPositions, currentRenderContext, pinnedColumns.left.length);
329
330
  const showBottomBorder = isLastVisibleInSection && params.position === 'top';
330
331
  rows.push(/*#__PURE__*/_jsx(rootProps.slots.row, _extends({
331
332
  row: model,
@@ -353,7 +354,7 @@ export const useGridVirtualScroller = () => {
353
354
  if (panel) {
354
355
  rows.push(panel);
355
356
  }
356
- if (isLastVisible) {
357
+ if (params.position === undefined && isLastVisibleInSection) {
357
358
  rows.push(apiRef.current.getInfiniteLoadingTriggerElement?.({
358
359
  lastRowId: id
359
360
  }));
@@ -447,6 +448,7 @@ function inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns) {
447
448
  const dimensions = gridDimensionsSelector(apiRef.current.state);
448
449
  const currentPage = getVisibleRows(apiRef, rootProps);
449
450
  const visibleColumns = gridVisibleColumnDefinitionsSelector(apiRef);
451
+ const hiddenCellsOriginMap = gridRowSpanningHiddenCellsOriginMapSelector(apiRef);
450
452
  const lastRowId = apiRef.current.state.rows.dataRowIds.at(-1);
451
453
  const lastColumn = visibleColumns.at(-1);
452
454
  return {
@@ -467,7 +469,8 @@ function inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns) {
467
469
  rows: currentPage.rows,
468
470
  range: currentPage.range,
469
471
  pinnedColumns: gridVisiblePinnedColumnDefinitionsSelector(apiRef),
470
- visibleColumns
472
+ visibleColumns,
473
+ hiddenCellsOriginMap
471
474
  };
472
475
  }
473
476
  function computeRenderContext(inputs, scrollPosition, scrollCache) {
@@ -485,10 +488,18 @@ function computeRenderContext(inputs, scrollPosition, scrollCache) {
485
488
  if (inputs.enabledForRows) {
486
489
  // Clamp the value because the search may return an index out of bounds.
487
490
  // In the last index, this is not needed because Array.slice doesn't include it.
488
- const firstRowIndex = Math.min(getNearestIndexToRender(inputs, top, {
491
+ let firstRowIndex = Math.min(getNearestIndexToRender(inputs, top, {
489
492
  atStart: true,
490
493
  lastPosition: inputs.rowsMeta.positions[inputs.rowsMeta.positions.length - 1] + inputs.lastRowHeight
491
494
  }), inputs.rowsMeta.positions.length - 1);
495
+
496
+ // If any of the cells in the `firstRowIndex` is hidden due to an extended row span,
497
+ // Make sure the row from where the rowSpan is originated is visible.
498
+ const rowSpanHiddenCellOrigin = inputs.hiddenCellsOriginMap[firstRowIndex];
499
+ if (rowSpanHiddenCellOrigin) {
500
+ const minSpannedRowIndex = Math.min(...Object.values(rowSpanHiddenCellOrigin));
501
+ firstRowIndex = Math.min(firstRowIndex, minSpannedRowIndex);
502
+ }
492
503
  const lastRowIndex = inputs.autoHeight ? firstRowIndex + inputs.rows.length : getNearestIndexToRender(inputs, top + inputs.viewportInnerHeight);
493
504
  renderContext.firstRowIndex = firstRowIndex;
494
505
  renderContext.lastRowIndex = lastRowIndex;
@@ -642,9 +653,8 @@ export function areRenderContextsEqual(context1, context2) {
642
653
  }
643
654
  return context1.firstRowIndex === context2.firstRowIndex && context1.lastRowIndex === context2.lastRowIndex && context1.firstColumnIndex === context2.firstColumnIndex && context1.lastColumnIndex === context2.lastColumnIndex;
644
655
  }
645
- export function computeOffsetLeft(columnPositions, renderContext, isRtl, pinnedLeftLength) {
646
- const factor = isRtl ? -1 : 1;
647
- const left = factor * (columnPositions[renderContext.firstColumnIndex] ?? 0) - (columnPositions[pinnedLeftLength] ?? 0);
656
+ export function computeOffsetLeft(columnPositions, renderContext, pinnedLeftLength) {
657
+ const left = (columnPositions[renderContext.firstColumnIndex] ?? 0) - (columnPositions[pinnedLeftLength] ?? 0);
648
658
  return Math.abs(left);
649
659
  }
650
660
  function directionForDelta(dx, dy) {
@@ -90,7 +90,6 @@ const optionsSubscriberOptions = {
90
90
  isFirst: true
91
91
  };
92
92
  export function useGridApiOptionHandler(apiRef, eventName, handler) {
93
- // Validate that only one per event name?
94
93
  useGridApiEventHandler(apiRef, eventName, handler, optionsSubscriberOptions);
95
94
  }
96
95
  export { GridSignature };
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { fastObjectShallowCompare } from '@mui/x-internals/fastObjectShallowCompare';
3
+ import { warnOnce } from '@mui/x-internals/warning';
3
4
  import { useLazyRef } from "./useLazyRef.js";
4
5
  import { useOnMount } from "./useOnMount.js";
5
- import { warnOnce } from "../../internals/utils/warning.js";
6
6
  function isOutputSelector(selector) {
7
7
  return selector.acceptsApiRef;
8
8
  }
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v7.16.0
2
+ * @mui/x-data-grid v7.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -41,6 +41,7 @@ export { useGridPreferencesPanel, preferencePanelStateInitializer, } from '../ho
41
41
  export { useGridEditing, editingStateInitializer } from '../hooks/features/editing/useGridEditing';
42
42
  export { gridEditRowsStateSelector } from '../hooks/features/editing/gridEditingSelectors';
43
43
  export { useGridRows, rowsStateInitializer } from '../hooks/features/rows/useGridRows';
44
+ export { useGridRowSpanning, rowSpanningStateInitializer, } from '../hooks/features/rows/useGridRowSpanning';
44
45
  export { useGridAriaAttributes } from '../hooks/utils/useGridAriaAttributes';
45
46
  export { useGridRowAriaAttributes } from '../hooks/features/rows/useGridRowAriaAttributes';
46
47
  export { useGridRowsPreProcessors } from '../hooks/features/rows/useGridRowsPreProcessors';
@@ -32,6 +32,7 @@ export { useGridPreferencesPanel, preferencePanelStateInitializer } from "../hoo
32
32
  export { useGridEditing, editingStateInitializer } from "../hooks/features/editing/useGridEditing.js";
33
33
  export { gridEditRowsStateSelector } from "../hooks/features/editing/gridEditingSelectors.js";
34
34
  export { useGridRows, rowsStateInitializer } from "../hooks/features/rows/useGridRows.js";
35
+ export { useGridRowSpanning, rowSpanningStateInitializer } from "../hooks/features/rows/useGridRowSpanning.js";
35
36
  export { useGridAriaAttributes } from "../hooks/utils/useGridAriaAttributes.js";
36
37
  export { useGridRowAriaAttributes } from "../hooks/features/rows/useGridRowAriaAttributes.js";
37
38
  export { useGridRowsPreProcessors } from "../hooks/features/rows/useGridRowsPreProcessors.js";
@@ -1,4 +1,3 @@
1
1
  export * from './computeSlots';
2
2
  export * from './useProps';
3
3
  export * from './propValidation';
4
- export * from './warning';
@@ -1,4 +1,3 @@
1
1
  export * from "./computeSlots.js";
2
2
  export * from "./useProps.js";
3
- export * from "./propValidation.js";
4
- export * from "./warning.js";
3
+ export * from "./propValidation.js";
@@ -1,4 +1,4 @@
1
- import { warnOnce } from "./warning.js";
1
+ import { warnOnce } from '@mui/x-internals/warning';
2
2
  import { isNumber } from "../../utils/utils.js";
3
3
  import { GridSignature } from "../../hooks/utils/useGridApiEventHandler.js";
4
4
  export const propValidatorsDataGrid = [props => props.autoPageSize && props.autoHeight && ['MUI X: `<DataGrid autoPageSize={true} autoHeight={true} />` are not valid props.', 'You cannot use both the `autoPageSize` and `autoHeight` props at the same time because `autoHeight` scales the height of the Data Grid according to the `pageSize`.', '', 'Please remove one of these two props.'].join('\n') || undefined, props => props.paginationMode === 'client' && props.paginationMeta != null && ['MUI X: Usage of the `paginationMeta` prop with client-side pagination (`paginationMode="client"`) has no effect.', '`paginationMeta` is only meant to be used with `paginationMode="server"`.'].join('\n') || undefined, props => props.signature === GridSignature.DataGrid && props.paginationMode === 'client' && isNumber(props.rowCount) && ['MUI X: Usage of the `rowCount` prop with client side pagination (`paginationMode="client"`) has no effect.', '`rowCount` is only meant to be used with `paginationMode="server"`.'].join('\n') || undefined, props => props.paginationMode === 'server' && props.rowCount == null && !props.unstable_dataSource && ["MUI X: The `rowCount` prop must be passed using `paginationMode='server'`", 'For more detail, see http://mui.com/components/data-grid/pagination/#index-based-pagination'].join('\n') || undefined];
package/locales/arSD.js CHANGED
@@ -48,7 +48,9 @@ const arSDGrid = {
48
48
  filterPanelInputPlaceholder: 'ترشِيح قيمة',
49
49
  // Filter operators text
50
50
  filterOperatorContains: 'يحتوي',
51
+ // filterOperatorDoesNotContain: 'does not contain',
51
52
  filterOperatorEquals: 'يساوي',
53
+ // filterOperatorDoesNotEqual: 'does not equal',
52
54
  filterOperatorStartsWith: 'يبدأ بـ',
53
55
  filterOperatorEndsWith: 'ينتهي بـ',
54
56
  filterOperatorIs: 'يكون',
@@ -68,7 +70,9 @@ const arSDGrid = {
68
70
  'filterOperator<=': '<=',
69
71
  // Header filter operators text
70
72
  headerFilterOperatorContains: 'يحتوي على',
73
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
71
74
  headerFilterOperatorEquals: 'يساوي',
75
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
72
76
  headerFilterOperatorStartsWith: 'يبدأ ب',
73
77
  headerFilterOperatorEndsWith: 'ينتهي ب',
74
78
  headerFilterOperatorIs: 'هو',
package/locales/beBY.js CHANGED
@@ -62,7 +62,9 @@ const beBYGrid = {
62
62
  filterPanelInputPlaceholder: 'Значэнне фільтра',
63
63
  // Filter operators text
64
64
  filterOperatorContains: 'змяшчае',
65
+ // filterOperatorDoesNotContain: 'does not contain',
65
66
  filterOperatorEquals: 'роўны',
67
+ // filterOperatorDoesNotEqual: 'does not equal',
66
68
  filterOperatorStartsWith: 'пачынаецца з',
67
69
  filterOperatorEndsWith: 'скончваецца на',
68
70
  filterOperatorIs: 'роўны',
@@ -83,7 +85,9 @@ const beBYGrid = {
83
85
 
84
86
  // Header filter operators text
85
87
  // headerFilterOperatorContains: 'Contains',
88
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
86
89
  // headerFilterOperatorEquals: 'Equals',
90
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
87
91
  // headerFilterOperatorStartsWith: 'Starts with',
88
92
  // headerFilterOperatorEndsWith: 'Ends with',
89
93
  // headerFilterOperatorIs: 'Is',
package/locales/bgBG.js CHANGED
@@ -48,7 +48,9 @@ const bgBGGrid = {
48
48
  filterPanelInputPlaceholder: 'Стойност на филтъра',
49
49
  // Filter operators text
50
50
  filterOperatorContains: 'съдържа',
51
+ // filterOperatorDoesNotContain: 'does not contain',
51
52
  filterOperatorEquals: 'равно',
53
+ // filterOperatorDoesNotEqual: 'does not equal',
52
54
  filterOperatorStartsWith: 'започва с',
53
55
  filterOperatorEndsWith: 'завършва с',
54
56
  filterOperatorIs: 'е',
@@ -68,7 +70,9 @@ const bgBGGrid = {
68
70
  'filterOperator<=': '<=',
69
71
  // Header filter operators text
70
72
  headerFilterOperatorContains: 'Съдържа',
73
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
71
74
  headerFilterOperatorEquals: 'Равнo',
75
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
72
76
  headerFilterOperatorStartsWith: 'Започва с',
73
77
  headerFilterOperatorEndsWith: 'Завършва с',
74
78
  headerFilterOperatorIs: 'Равно е на',
package/locales/csCZ.js CHANGED
@@ -55,7 +55,9 @@ const csCZGrid = {
55
55
  filterPanelInputPlaceholder: 'Hodnota filtru',
56
56
  // Filter operators text
57
57
  filterOperatorContains: 'obsahuje',
58
+ // filterOperatorDoesNotContain: 'does not contain',
58
59
  filterOperatorEquals: 'rovná se',
60
+ // filterOperatorDoesNotEqual: 'does not equal',
59
61
  filterOperatorStartsWith: 'začíná na',
60
62
  filterOperatorEndsWith: 'končí na',
61
63
  filterOperatorIs: 'je',
@@ -75,7 +77,9 @@ const csCZGrid = {
75
77
  'filterOperator<=': '<=',
76
78
  // Header filter operators text
77
79
  headerFilterOperatorContains: 'Obsahuje',
80
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
78
81
  headerFilterOperatorEquals: 'Rovná se',
82
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
79
83
  headerFilterOperatorStartsWith: 'Začíná na',
80
84
  headerFilterOperatorEndsWith: 'Končí na',
81
85
  headerFilterOperatorIs: 'Je',
package/locales/daDK.js CHANGED
@@ -48,7 +48,9 @@ const daDKGrid = {
48
48
  filterPanelInputPlaceholder: 'Filterværdi',
49
49
  // Filter operators text
50
50
  filterOperatorContains: 'indeholder',
51
+ // filterOperatorDoesNotContain: 'does not contain',
51
52
  filterOperatorEquals: 'lig med',
53
+ // filterOperatorDoesNotEqual: 'does not equal',
52
54
  filterOperatorStartsWith: 'begynder med',
53
55
  filterOperatorEndsWith: 'ender med',
54
56
  filterOperatorIs: 'er lig med',
@@ -68,7 +70,9 @@ const daDKGrid = {
68
70
  'filterOperator<=': '<=',
69
71
  // Header filter operators text
70
72
  headerFilterOperatorContains: 'Indeholder',
73
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
71
74
  headerFilterOperatorEquals: 'Lig med',
75
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
72
76
  headerFilterOperatorStartsWith: 'Begynder med',
73
77
  headerFilterOperatorEndsWith: 'Ender med',
74
78
  headerFilterOperatorIs: 'Er lig med',
package/locales/deDE.js CHANGED
@@ -47,7 +47,9 @@ const deDEGrid = {
47
47
  filterPanelInputPlaceholder: 'Wert filtern',
48
48
  // Filter operators text
49
49
  filterOperatorContains: 'enthält',
50
+ // filterOperatorDoesNotContain: 'does not contain',
50
51
  filterOperatorEquals: 'ist gleich',
52
+ // filterOperatorDoesNotEqual: 'does not equal',
51
53
  filterOperatorStartsWith: 'beginnt mit',
52
54
  filterOperatorEndsWith: 'endet mit',
53
55
  filterOperatorIs: 'ist',
@@ -67,7 +69,9 @@ const deDEGrid = {
67
69
  'filterOperator<=': '<=',
68
70
  // Header filter operators text
69
71
  headerFilterOperatorContains: 'Enthält',
72
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
70
73
  headerFilterOperatorEquals: 'Gleich',
74
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
71
75
  headerFilterOperatorStartsWith: 'Beginnt mit',
72
76
  headerFilterOperatorEndsWith: 'Endet mit',
73
77
  headerFilterOperatorIs: 'Ist',
package/locales/elGR.js CHANGED
@@ -48,7 +48,9 @@ const elGRGrid = {
48
48
  filterPanelInputPlaceholder: 'Τιμή φίλτρου',
49
49
  // Filter operators text
50
50
  filterOperatorContains: 'περιέχει',
51
+ // filterOperatorDoesNotContain: 'does not contain',
51
52
  filterOperatorEquals: 'ισούται',
53
+ // filterOperatorDoesNotEqual: 'does not equal',
52
54
  filterOperatorStartsWith: 'ξεκινάει με',
53
55
  filterOperatorEndsWith: 'τελειώνει με',
54
56
  filterOperatorIs: 'είναι',
@@ -68,7 +70,9 @@ const elGRGrid = {
68
70
  'filterOperator<=': '<=',
69
71
  // Header filter operators text
70
72
  headerFilterOperatorContains: 'Περιέχει',
73
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
71
74
  headerFilterOperatorEquals: 'Ισούται',
75
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
72
76
  headerFilterOperatorStartsWith: 'Ξεκινάει με',
73
77
  headerFilterOperatorEndsWith: 'Τελειώνει με',
74
78
  headerFilterOperatorIs: 'Είναι',
package/locales/esES.js CHANGED
@@ -47,7 +47,9 @@ const esESGrid = {
47
47
  filterPanelInputPlaceholder: 'Valor de filtro',
48
48
  // Filter operators text
49
49
  filterOperatorContains: 'contiene',
50
+ // filterOperatorDoesNotContain: 'does not contain',
50
51
  filterOperatorEquals: 'es igual',
52
+ // filterOperatorDoesNotEqual: 'does not equal',
51
53
  filterOperatorStartsWith: 'comienza con',
52
54
  filterOperatorEndsWith: 'termina con',
53
55
  filterOperatorIs: 'es',
@@ -67,7 +69,9 @@ const esESGrid = {
67
69
  'filterOperator<=': '<=',
68
70
  // Header filter operators text
69
71
  headerFilterOperatorContains: 'Contiene',
72
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
70
73
  headerFilterOperatorEquals: 'Es igual a',
74
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
71
75
  headerFilterOperatorStartsWith: 'Comienza con',
72
76
  headerFilterOperatorEndsWith: 'Termina con',
73
77
  headerFilterOperatorIs: 'Es',
package/locales/faIR.js CHANGED
@@ -47,7 +47,9 @@ const faIRGrid = {
47
47
  filterPanelInputPlaceholder: 'فیلتر مقدار',
48
48
  // Filter operators text
49
49
  filterOperatorContains: 'شامل',
50
+ // filterOperatorDoesNotContain: 'does not contain',
50
51
  filterOperatorEquals: 'مساوی',
52
+ // filterOperatorDoesNotEqual: 'does not equal',
51
53
  filterOperatorStartsWith: 'شروع با',
52
54
  filterOperatorEndsWith: 'پایان با',
53
55
  filterOperatorIs: 'هست',
@@ -67,7 +69,9 @@ const faIRGrid = {
67
69
  'filterOperator<=': '<=',
68
70
  // Header filter operators text
69
71
  headerFilterOperatorContains: 'شامل',
72
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
70
73
  headerFilterOperatorEquals: 'مساوی',
74
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
71
75
  headerFilterOperatorStartsWith: 'شروع با',
72
76
  headerFilterOperatorEndsWith: 'پایان با',
73
77
  headerFilterOperatorIs: 'هست',
package/locales/fiFI.js CHANGED
@@ -47,7 +47,9 @@ const fiFIGrid = {
47
47
  filterPanelInputPlaceholder: 'Suodattimen arvo',
48
48
  // Filter operators text
49
49
  filterOperatorContains: 'sisältää',
50
+ // filterOperatorDoesNotContain: 'does not contain',
50
51
  filterOperatorEquals: 'on yhtä suuri kuin',
52
+ // filterOperatorDoesNotEqual: 'does not equal',
51
53
  filterOperatorStartsWith: 'alkaa',
52
54
  filterOperatorEndsWith: 'päättyy',
53
55
  filterOperatorIs: 'on',
@@ -67,7 +69,9 @@ const fiFIGrid = {
67
69
  'filterOperator<=': '<=',
68
70
  // Header filter operators text
69
71
  headerFilterOperatorContains: 'Sisältää',
72
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
70
73
  headerFilterOperatorEquals: 'On yhtä suuri kuin',
74
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
71
75
  headerFilterOperatorStartsWith: 'Alkaa',
72
76
  headerFilterOperatorEndsWith: 'Päättyy',
73
77
  headerFilterOperatorIs: 'On',
package/locales/frFR.js CHANGED
@@ -47,7 +47,9 @@ const frFRGrid = {
47
47
  filterPanelInputPlaceholder: 'Filtrer la valeur',
48
48
  // Filter operators text
49
49
  filterOperatorContains: 'contient',
50
+ // filterOperatorDoesNotContain: 'does not contain',
50
51
  filterOperatorEquals: 'est égal à',
52
+ // filterOperatorDoesNotEqual: 'does not equal',
51
53
  filterOperatorStartsWith: 'commence par',
52
54
  filterOperatorEndsWith: 'se termine par',
53
55
  filterOperatorIs: 'est',
@@ -67,7 +69,9 @@ const frFRGrid = {
67
69
  'filterOperator<=': '<=',
68
70
  // Header filter operators text
69
71
  headerFilterOperatorContains: 'Contient',
72
+ // headerFilterOperatorDoesNotContain: 'Does not contain',
70
73
  headerFilterOperatorEquals: 'Est égal à',
74
+ // headerFilterOperatorDoesNotEqual: 'Does not equal',
71
75
  headerFilterOperatorStartsWith: 'Commence par',
72
76
  headerFilterOperatorEndsWith: 'Se termine par',
73
77
  headerFilterOperatorIs: 'Est',