@mui/x-data-grid 7.0.0-beta.7 → 7.1.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 (203) hide show
  1. package/CHANGELOG.md +266 -12
  2. package/DataGrid/DataGrid.js +18 -17
  3. package/DataGrid/useDataGridProps.js +4 -5
  4. package/README.md +1 -1
  5. package/components/GridFooter.js +2 -3
  6. package/components/GridHeader.js +1 -2
  7. package/components/GridPagination.d.ts +6 -5
  8. package/components/GridPagination.js +12 -4
  9. package/components/GridRow.js +13 -17
  10. package/components/base/GridFooterPlaceholder.js +1 -2
  11. package/components/base/GridOverlays.js +3 -6
  12. package/components/cell/GridActionsCell.js +4 -6
  13. package/components/cell/GridActionsCellItem.d.ts +8 -25
  14. package/components/cell/GridActionsCellItem.js +8 -5
  15. package/components/cell/GridBooleanCell.d.ts +1 -0
  16. package/components/cell/GridBooleanCell.js +3 -2
  17. package/components/cell/GridCell.js +7 -8
  18. package/components/cell/GridEditBooleanCell.js +1 -2
  19. package/components/cell/GridEditDateCell.js +2 -3
  20. package/components/cell/GridEditInputCell.js +2 -2
  21. package/components/cell/GridEditSingleSelectCell.js +5 -8
  22. package/components/columnHeaders/ColumnHeaderMenuIcon.js +2 -3
  23. package/components/columnHeaders/GridColumnGroupHeader.js +4 -5
  24. package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +2 -3
  25. package/components/columnHeaders/GridColumnHeaderItem.js +8 -7
  26. package/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
  27. package/components/columnHeaders/GridColumnHeaderTitle.js +2 -3
  28. package/components/columnHeaders/GridGenericColumnHeaderItem.js +4 -2
  29. package/components/columnSelection/GridCellCheckboxRenderer.js +3 -5
  30. package/components/columnSelection/GridHeaderCheckbox.js +1 -2
  31. package/components/columnsManagement/GridColumnsManagement.js +17 -21
  32. package/components/containers/GridRoot.js +3 -3
  33. package/components/menu/GridMenu.js +4 -6
  34. package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  35. package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +2 -3
  36. package/components/panel/GridColumnsPanel.js +1 -2
  37. package/components/panel/GridPanel.d.ts +1 -10
  38. package/components/panel/GridPanel.js +1 -2
  39. package/components/panel/GridPreferencesPanel.js +2 -3
  40. package/components/panel/filterPanel/GridFilterForm.js +24 -27
  41. package/components/panel/filterPanel/GridFilterInputBoolean.d.ts +1 -1
  42. package/components/panel/filterPanel/GridFilterInputBoolean.js +6 -7
  43. package/components/panel/filterPanel/GridFilterInputDate.d.ts +1 -1
  44. package/components/panel/filterPanel/GridFilterInputDate.js +3 -4
  45. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +11 -15
  46. package/components/panel/filterPanel/GridFilterInputMultipleValue.js +10 -14
  47. package/components/panel/filterPanel/GridFilterInputSingleSelect.d.ts +1 -1
  48. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +10 -11
  49. package/components/panel/filterPanel/GridFilterInputValue.d.ts +1 -1
  50. package/components/panel/filterPanel/GridFilterInputValue.js +5 -7
  51. package/components/panel/filterPanel/GridFilterPanel.js +5 -9
  52. package/components/panel/filterPanel/filterPanelUtils.js +1 -1
  53. package/components/toolbar/GridToolbarColumnsButton.js +3 -5
  54. package/components/toolbar/GridToolbarDensitySelector.js +8 -10
  55. package/components/toolbar/GridToolbarExport.js +2 -2
  56. package/components/toolbar/GridToolbarExportContainer.js +3 -5
  57. package/components/toolbar/GridToolbarFilterButton.js +3 -5
  58. package/components/toolbar/GridToolbarQuickFilter.js +21 -7
  59. package/components/virtualization/GridVirtualScrollerContent.js +1 -2
  60. package/components/virtualization/GridVirtualScrollerRenderZone.js +1 -2
  61. package/hooks/core/strategyProcessing/useGridStrategyProcessing.js +1 -2
  62. package/hooks/core/useGridApiInitialization.js +4 -6
  63. package/hooks/features/clipboard/useGridClipboard.js +6 -5
  64. package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -16
  65. package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +4 -8
  66. package/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -23
  67. package/hooks/features/columnHeaders/useGridColumnHeaders.js +6 -8
  68. package/hooks/features/columnMenu/useGridColumnMenuSlots.js +2 -2
  69. package/hooks/features/columnResize/useGridColumnResize.js +9 -19
  70. package/hooks/features/columns/gridColumnsSelector.js +1 -2
  71. package/hooks/features/columns/gridColumnsUtils.d.ts +0 -9
  72. package/hooks/features/columns/gridColumnsUtils.js +2 -22
  73. package/hooks/features/columns/useGridColumnSpanning.js +1 -2
  74. package/hooks/features/columns/useGridColumns.js +11 -19
  75. package/hooks/features/density/densitySelector.d.ts +4 -2
  76. package/hooks/features/density/densitySelector.js +8 -2
  77. package/hooks/features/density/densityState.d.ts +1 -4
  78. package/hooks/features/density/useGridDensity.d.ts +2 -4
  79. package/hooks/features/density/useGridDensity.js +21 -29
  80. package/hooks/features/dimensions/useGridDimensions.d.ts +1 -1
  81. package/hooks/features/dimensions/useGridDimensions.js +6 -7
  82. package/hooks/features/editing/useGridCellEditing.js +4 -6
  83. package/hooks/features/editing/useGridEditing.js +1 -2
  84. package/hooks/features/editing/useGridRowEditing.js +17 -10
  85. package/hooks/features/export/serializers/csvSerializer.d.ts +2 -0
  86. package/hooks/features/export/serializers/csvSerializer.js +25 -16
  87. package/hooks/features/export/useGridCsvExport.js +9 -10
  88. package/hooks/features/export/useGridPrintExport.js +9 -15
  89. package/hooks/features/export/utils.js +2 -3
  90. package/hooks/features/filter/gridFilterSelector.js +15 -22
  91. package/hooks/features/filter/gridFilterUtils.js +10 -16
  92. package/hooks/features/filter/useGridFilter.js +9 -15
  93. package/hooks/features/focus/useGridFocus.js +5 -6
  94. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +1 -4
  95. package/hooks/features/headerFiltering/useGridHeaderFiltering.js +12 -17
  96. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +1 -2
  97. package/hooks/features/pagination/gridPaginationSelector.js +1 -2
  98. package/hooks/features/pagination/useGridPagination.js +2 -3
  99. package/hooks/features/pagination/useGridPaginationModel.js +6 -11
  100. package/hooks/features/pagination/useGridRowCount.js +3 -6
  101. package/hooks/features/preferencesPanel/useGridPreferencesPanel.js +7 -12
  102. package/hooks/features/rowSelection/useGridRowSelection.js +11 -16
  103. package/hooks/features/rows/gridRowsSelector.js +11 -19
  104. package/hooks/features/rows/gridRowsUtils.js +7 -9
  105. package/hooks/features/rows/useGridParamsApi.js +1 -1
  106. package/hooks/features/rows/useGridRows.js +4 -13
  107. package/hooks/features/rows/useGridRowsMeta.js +7 -13
  108. package/hooks/features/scroll/useGridScroll.js +2 -3
  109. package/hooks/features/sorting/gridSortingSelector.js +4 -7
  110. package/hooks/features/sorting/useGridSorting.js +8 -14
  111. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  112. package/hooks/features/virtualization/useGridVirtualScroller.js +220 -71
  113. package/hooks/utils/useGridApiEventHandler.js +5 -10
  114. package/hooks/utils/useGridNativeEventListener.js +1 -2
  115. package/index.js +1 -1
  116. package/internals/index.d.ts +2 -0
  117. package/internals/index.js +1 -0
  118. package/internals/utils/useProps.js +1 -2
  119. package/joy/joySlots.js +7 -13
  120. package/models/api/gridRowsMetaApi.d.ts +1 -1
  121. package/models/api/index.d.ts +1 -1
  122. package/models/api/index.js +0 -1
  123. package/models/events/gridEventLookup.d.ts +7 -0
  124. package/models/gridExport.d.ts +6 -0
  125. package/models/gridStateCommunity.d.ts +1 -0
  126. package/models/props/DataGridProps.d.ts +26 -25
  127. package/modern/DataGrid/DataGrid.js +18 -17
  128. package/modern/DataGrid/useDataGridProps.js +4 -5
  129. package/modern/components/GridPagination.js +11 -2
  130. package/modern/components/cell/GridActionsCell.js +1 -1
  131. package/modern/components/cell/GridActionsCellItem.js +4 -0
  132. package/modern/components/cell/GridBooleanCell.js +3 -2
  133. package/modern/components/columnHeaders/GridColumnHeaderItem.js +3 -1
  134. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +3 -1
  135. package/modern/components/containers/GridRoot.js +3 -3
  136. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  137. package/modern/components/panel/filterPanel/GridFilterInputDate.js +1 -1
  138. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  139. package/modern/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  140. package/modern/components/toolbar/GridToolbarDensitySelector.js +5 -5
  141. package/modern/components/toolbar/GridToolbarQuickFilter.js +17 -2
  142. package/modern/hooks/features/clipboard/useGridClipboard.js +4 -2
  143. package/modern/hooks/features/columnResize/useGridColumnResize.js +1 -1
  144. package/modern/hooks/features/columns/gridColumnsUtils.js +0 -19
  145. package/modern/hooks/features/density/densitySelector.js +8 -2
  146. package/modern/hooks/features/density/useGridDensity.js +21 -29
  147. package/modern/hooks/features/dimensions/useGridDimensions.js +3 -2
  148. package/modern/hooks/features/editing/useGridCellEditing.js +1 -1
  149. package/modern/hooks/features/editing/useGridRowEditing.js +14 -5
  150. package/modern/hooks/features/export/serializers/csvSerializer.js +23 -12
  151. package/modern/hooks/features/export/useGridCsvExport.js +2 -1
  152. package/modern/hooks/features/filter/gridFilterUtils.js +1 -1
  153. package/modern/hooks/features/rowSelection/useGridRowSelection.js +3 -2
  154. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
  155. package/modern/index.js +1 -1
  156. package/modern/internals/index.js +1 -0
  157. package/modern/models/api/index.js +0 -1
  158. package/modern/utils/createSelector.js +1 -1
  159. package/modern/utils/domUtils.js +1 -1
  160. package/modern/utils/keyboardUtils.js +1 -1
  161. package/modern/utils/throttle.js +19 -0
  162. package/node/DataGrid/DataGrid.js +18 -17
  163. package/node/DataGrid/useDataGridProps.js +4 -5
  164. package/node/components/GridPagination.js +9 -1
  165. package/node/components/cell/GridActionsCell.js +1 -1
  166. package/node/components/cell/GridActionsCellItem.js +4 -0
  167. package/node/components/cell/GridBooleanCell.js +3 -2
  168. package/node/components/columnHeaders/GridColumnHeaderItem.js +3 -1
  169. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +3 -1
  170. package/node/components/containers/GridRoot.js +2 -2
  171. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  172. package/node/components/panel/filterPanel/GridFilterInputDate.js +1 -1
  173. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  174. package/node/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  175. package/node/components/toolbar/GridToolbarDensitySelector.js +4 -4
  176. package/node/components/toolbar/GridToolbarQuickFilter.js +17 -2
  177. package/node/hooks/features/clipboard/useGridClipboard.js +4 -2
  178. package/node/hooks/features/columnResize/useGridColumnResize.js +1 -1
  179. package/node/hooks/features/columns/gridColumnsUtils.js +0 -20
  180. package/node/hooks/features/density/densitySelector.js +9 -3
  181. package/node/hooks/features/density/useGridDensity.js +22 -30
  182. package/node/hooks/features/dimensions/useGridDimensions.js +2 -1
  183. package/node/hooks/features/editing/useGridCellEditing.js +1 -1
  184. package/node/hooks/features/editing/useGridRowEditing.js +14 -5
  185. package/node/hooks/features/export/serializers/csvSerializer.js +23 -12
  186. package/node/hooks/features/export/useGridCsvExport.js +2 -1
  187. package/node/hooks/features/filter/gridFilterUtils.js +1 -1
  188. package/node/hooks/features/rowSelection/useGridRowSelection.js +2 -1
  189. package/node/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
  190. package/node/index.js +1 -1
  191. package/node/internals/index.js +12 -0
  192. package/node/models/api/index.js +0 -11
  193. package/node/utils/createSelector.js +1 -1
  194. package/node/utils/domUtils.js +1 -1
  195. package/node/utils/keyboardUtils.js +1 -1
  196. package/node/utils/throttle.js +25 -0
  197. package/package.json +4 -4
  198. package/utils/createSelector.js +9 -9
  199. package/utils/domUtils.js +4 -7
  200. package/utils/getGridLocalization.js +9 -12
  201. package/utils/keyboardUtils.js +1 -1
  202. package/utils/throttle.d.ts +4 -0
  203. package/utils/throttle.js +19 -0
@@ -1,7 +1,7 @@
1
1
  import { createSelector as reselectCreateSelector } from 'reselect';
2
2
  import { buildWarning } from './warning';
3
3
  const cache = new WeakMap();
4
- const missingInstanceIdWarning = buildWarning(['MUI X: A selector was called without passing the instance ID, which may impact the performance of the grid.', 'To fix, call it with `apiRef`, e.g. `mySelector(apiRef)`, or pass the instance ID explicitly, e.g. `mySelector(state, apiRef.current.instanceId)`.']);
4
+ const missingInstanceIdWarning = buildWarning(['MUI X: A selector was called without passing the instance ID, which may impact the performance of the grid.', 'To fix, call it with `apiRef`, for example `mySelector(apiRef)`, or pass the instance ID explicitly, for example `mySelector(state, apiRef.current.instanceId)`.']);
5
5
  function checkIsAPIRef(value) {
6
6
  return 'current' in value && 'instanceId' in value.current;
7
7
  }
@@ -16,7 +16,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
16
16
  if (a && b && c && d && e && f) {
17
17
  selector = (stateOrApiRef, instanceIdParam) => {
18
18
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
19
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
19
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
20
20
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
21
21
  const va = a(state, instanceId);
22
22
  const vb = b(state, instanceId);
@@ -28,7 +28,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
28
28
  } else if (a && b && c && d && e) {
29
29
  selector = (stateOrApiRef, instanceIdParam) => {
30
30
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
31
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
31
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
32
32
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
33
33
  const va = a(state, instanceId);
34
34
  const vb = b(state, instanceId);
@@ -39,7 +39,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
39
39
  } else if (a && b && c && d) {
40
40
  selector = (stateOrApiRef, instanceIdParam) => {
41
41
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
42
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
42
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
43
43
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
44
44
  const va = a(state, instanceId);
45
45
  const vb = b(state, instanceId);
@@ -49,7 +49,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
49
49
  } else if (a && b && c) {
50
50
  selector = (stateOrApiRef, instanceIdParam) => {
51
51
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
52
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
52
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
53
53
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
54
54
  const va = a(state, instanceId);
55
55
  const vb = b(state, instanceId);
@@ -58,7 +58,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
58
58
  } else if (a && b) {
59
59
  selector = (stateOrApiRef, instanceIdParam) => {
60
60
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
61
- const instanceId = instanceIdParam != null ? instanceIdParam : isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID;
61
+ const instanceId = instanceIdParam ?? (isAPIRef ? stateOrApiRef.current.instanceId : DEFAULT_INSTANCE_ID);
62
62
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
63
63
  const va = a(state, instanceId);
64
64
  return b(va);
@@ -75,7 +75,7 @@ export const createSelector = (a, b, c, d, e, f, ...rest) => {
75
75
  export const createSelectorMemoized = (...args) => {
76
76
  const selector = (stateOrApiRef, instanceId) => {
77
77
  const isAPIRef = checkIsAPIRef(stateOrApiRef);
78
- const cacheKey = isAPIRef ? stateOrApiRef.current.instanceId : instanceId != null ? instanceId : DEFAULT_INSTANCE_ID;
78
+ const cacheKey = isAPIRef ? stateOrApiRef.current.instanceId : instanceId ?? DEFAULT_INSTANCE_ID;
79
79
  const state = isAPIRef ? stateOrApiRef.current.state : stateOrApiRef;
80
80
  if (process.env.NODE_ENV !== 'production') {
81
81
  if (cacheKey.id === 'default') {
@@ -83,8 +83,8 @@ export const createSelectorMemoized = (...args) => {
83
83
  }
84
84
  }
85
85
  const cacheArgsInit = cache.get(cacheKey);
86
- const cacheArgs = cacheArgsInit != null ? cacheArgsInit : new Map();
87
- const cacheFn = cacheArgs == null ? void 0 : cacheArgs.get(args);
86
+ const cacheArgs = cacheArgsInit ?? new Map();
87
+ const cacheFn = cacheArgs?.get(args);
88
88
  if (cacheArgs && cacheFn) {
89
89
  // We pass the cache key because the called selector might have as
90
90
  // dependency another selector created with this `createSelector`.
package/utils/domUtils.js CHANGED
@@ -54,11 +54,9 @@ export function findHeaderElementFromField(elem, field) {
54
54
  return elem.querySelector(`[data-field="${field}"]`);
55
55
  }
56
56
  export function findGroupHeaderElementsFromField(elem, field) {
57
- var _elem$querySelectorAl;
58
- return Array.from((_elem$querySelectorAl = elem.querySelectorAll(`[data-fields*="|-${field}-|"]`)) != null ? _elem$querySelectorAl : []);
57
+ return Array.from(elem.querySelectorAll(`[data-fields*="|-${field}-|"]`) ?? []);
59
58
  }
60
59
  export function findGridCellElementsFromCol(col, api) {
61
- var _api$virtualScrollerR;
62
60
  const root = findParentElementFromClassName(col, gridClasses.root);
63
61
  if (!root) {
64
62
  throw new Error('MUI X: The root element is not found.');
@@ -69,7 +67,7 @@ export function findGridCellElementsFromCol(col, api) {
69
67
  }
70
68
  const colIndex = Number(ariaColIndex) - 1;
71
69
  const cells = [];
72
- if (!((_api$virtualScrollerR = api.virtualScrollerRef) != null && _api$virtualScrollerR.current)) {
70
+ if (!api.virtualScrollerRef?.current) {
73
71
  return [];
74
72
  }
75
73
  queryRows(api).forEach(rowElement => {
@@ -140,8 +138,7 @@ const findPinnedHeaders = ({
140
138
  position,
141
139
  filterFn
142
140
  }) => {
143
- var _api$columnHeadersCon;
144
- if (!((_api$columnHeadersCon = api.columnHeadersContainerRef) != null && _api$columnHeadersCon.current)) {
141
+ if (!api.columnHeadersContainerRef?.current) {
145
142
  return [];
146
143
  }
147
144
  if (colIndex === null) {
@@ -184,7 +181,7 @@ export function findGridCells(api, field) {
184
181
  }
185
182
  function queryRows(api) {
186
183
  return api.virtualScrollerRef.current.querySelectorAll(
187
- // Use > to ignore rows from nested data grids (e.g. in detail panel)
184
+ // Use > to ignore rows from nested data grids (for example in detail panel)
188
185
  `:scope > div > div > .${gridClasses.row}`);
189
186
  }
190
187
  function parseCellColIndex(col) {
@@ -1,15 +1,12 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- export const getGridLocalization = (gridTranslations, coreTranslations) => {
3
- var _coreTranslations$com;
4
- return {
5
- components: {
6
- MuiDataGrid: {
7
- defaultProps: {
8
- localeText: _extends({}, gridTranslations, {
9
- MuiTablePagination: (coreTranslations == null || (_coreTranslations$com = coreTranslations.components) == null || (_coreTranslations$com = _coreTranslations$com.MuiTablePagination) == null ? void 0 : _coreTranslations$com.defaultProps) || {}
10
- })
11
- }
2
+ export const getGridLocalization = (gridTranslations, coreTranslations) => ({
3
+ components: {
4
+ MuiDataGrid: {
5
+ defaultProps: {
6
+ localeText: _extends({}, gridTranslations, {
7
+ MuiTablePagination: coreTranslations?.components?.MuiTablePagination?.defaultProps || {}
8
+ })
12
9
  }
13
10
  }
14
- };
15
- };
11
+ }
12
+ });
@@ -8,7 +8,7 @@ export const isEscapeKey = key => key === 'Escape';
8
8
  */
9
9
  export const isTabKey = key => key === 'Tab';
10
10
 
11
- // Non printable keys have a name, e.g. "ArrowRight", see the whole list:
11
+ // Non printable keys have a name, for example "ArrowRight", see the whole list:
12
12
  // https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values
13
13
  // So event.key.length === 1 is often enough.
14
14
  //
@@ -0,0 +1,4 @@
1
+ export interface Cancelable {
2
+ clear(): void;
3
+ }
4
+ export declare function throttle<T extends (...args: any[]) => any>(func: T, wait?: number): T & Cancelable;
@@ -0,0 +1,19 @@
1
+ export function throttle(func, wait = 166) {
2
+ let timeout;
3
+ let lastArgs;
4
+ const later = () => {
5
+ timeout = undefined;
6
+ func(...lastArgs);
7
+ };
8
+ function throttled(...args) {
9
+ lastArgs = args;
10
+ if (timeout === undefined) {
11
+ timeout = setTimeout(later, wait);
12
+ }
13
+ }
14
+ throttled.clear = () => {
15
+ clearTimeout(timeout);
16
+ timeout = undefined;
17
+ };
18
+ return throttled;
19
+ }