@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.
- package/CHANGELOG.md +266 -12
- package/DataGrid/DataGrid.js +18 -17
- package/DataGrid/useDataGridProps.js +4 -5
- package/README.md +1 -1
- package/components/GridFooter.js +2 -3
- package/components/GridHeader.js +1 -2
- package/components/GridPagination.d.ts +6 -5
- package/components/GridPagination.js +12 -4
- package/components/GridRow.js +13 -17
- package/components/base/GridFooterPlaceholder.js +1 -2
- package/components/base/GridOverlays.js +3 -6
- package/components/cell/GridActionsCell.js +4 -6
- package/components/cell/GridActionsCellItem.d.ts +8 -25
- package/components/cell/GridActionsCellItem.js +8 -5
- package/components/cell/GridBooleanCell.d.ts +1 -0
- package/components/cell/GridBooleanCell.js +3 -2
- package/components/cell/GridCell.js +7 -8
- package/components/cell/GridEditBooleanCell.js +1 -2
- package/components/cell/GridEditDateCell.js +2 -3
- package/components/cell/GridEditInputCell.js +2 -2
- package/components/cell/GridEditSingleSelectCell.js +5 -8
- package/components/columnHeaders/ColumnHeaderMenuIcon.js +2 -3
- package/components/columnHeaders/GridColumnGroupHeader.js +4 -5
- package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +2 -3
- package/components/columnHeaders/GridColumnHeaderItem.js +8 -7
- package/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
- package/components/columnHeaders/GridColumnHeaderTitle.js +2 -3
- package/components/columnHeaders/GridGenericColumnHeaderItem.js +4 -2
- package/components/columnSelection/GridCellCheckboxRenderer.js +3 -5
- package/components/columnSelection/GridHeaderCheckbox.js +1 -2
- package/components/columnsManagement/GridColumnsManagement.js +17 -21
- package/components/containers/GridRoot.js +3 -3
- package/components/menu/GridMenu.js +4 -6
- package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
- package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +2 -3
- package/components/panel/GridColumnsPanel.js +1 -2
- package/components/panel/GridPanel.d.ts +1 -10
- package/components/panel/GridPanel.js +1 -2
- package/components/panel/GridPreferencesPanel.js +2 -3
- package/components/panel/filterPanel/GridFilterForm.js +24 -27
- package/components/panel/filterPanel/GridFilterInputBoolean.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputBoolean.js +6 -7
- package/components/panel/filterPanel/GridFilterInputDate.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputDate.js +3 -4
- package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +11 -15
- package/components/panel/filterPanel/GridFilterInputMultipleValue.js +10 -14
- package/components/panel/filterPanel/GridFilterInputSingleSelect.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputSingleSelect.js +10 -11
- package/components/panel/filterPanel/GridFilterInputValue.d.ts +1 -1
- package/components/panel/filterPanel/GridFilterInputValue.js +5 -7
- package/components/panel/filterPanel/GridFilterPanel.js +5 -9
- package/components/panel/filterPanel/filterPanelUtils.js +1 -1
- package/components/toolbar/GridToolbarColumnsButton.js +3 -5
- package/components/toolbar/GridToolbarDensitySelector.js +8 -10
- package/components/toolbar/GridToolbarExport.js +2 -2
- package/components/toolbar/GridToolbarExportContainer.js +3 -5
- package/components/toolbar/GridToolbarFilterButton.js +3 -5
- package/components/toolbar/GridToolbarQuickFilter.js +21 -7
- package/components/virtualization/GridVirtualScrollerContent.js +1 -2
- package/components/virtualization/GridVirtualScrollerRenderZone.js +1 -2
- package/hooks/core/strategyProcessing/useGridStrategyProcessing.js +1 -2
- package/hooks/core/useGridApiInitialization.js +4 -6
- package/hooks/features/clipboard/useGridClipboard.js +6 -5
- package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -16
- package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +4 -8
- package/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -23
- package/hooks/features/columnHeaders/useGridColumnHeaders.js +6 -8
- package/hooks/features/columnMenu/useGridColumnMenuSlots.js +2 -2
- package/hooks/features/columnResize/useGridColumnResize.js +9 -19
- package/hooks/features/columns/gridColumnsSelector.js +1 -2
- package/hooks/features/columns/gridColumnsUtils.d.ts +0 -9
- package/hooks/features/columns/gridColumnsUtils.js +2 -22
- package/hooks/features/columns/useGridColumnSpanning.js +1 -2
- package/hooks/features/columns/useGridColumns.js +11 -19
- package/hooks/features/density/densitySelector.d.ts +4 -2
- package/hooks/features/density/densitySelector.js +8 -2
- package/hooks/features/density/densityState.d.ts +1 -4
- package/hooks/features/density/useGridDensity.d.ts +2 -4
- package/hooks/features/density/useGridDensity.js +21 -29
- package/hooks/features/dimensions/useGridDimensions.d.ts +1 -1
- package/hooks/features/dimensions/useGridDimensions.js +6 -7
- package/hooks/features/editing/useGridCellEditing.js +4 -6
- package/hooks/features/editing/useGridEditing.js +1 -2
- package/hooks/features/editing/useGridRowEditing.js +17 -10
- package/hooks/features/export/serializers/csvSerializer.d.ts +2 -0
- package/hooks/features/export/serializers/csvSerializer.js +25 -16
- package/hooks/features/export/useGridCsvExport.js +9 -10
- package/hooks/features/export/useGridPrintExport.js +9 -15
- package/hooks/features/export/utils.js +2 -3
- package/hooks/features/filter/gridFilterSelector.js +15 -22
- package/hooks/features/filter/gridFilterUtils.js +10 -16
- package/hooks/features/filter/useGridFilter.js +9 -15
- package/hooks/features/focus/useGridFocus.js +5 -6
- package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +1 -4
- package/hooks/features/headerFiltering/useGridHeaderFiltering.js +12 -17
- package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +1 -2
- package/hooks/features/pagination/gridPaginationSelector.js +1 -2
- package/hooks/features/pagination/useGridPagination.js +2 -3
- package/hooks/features/pagination/useGridPaginationModel.js +6 -11
- package/hooks/features/pagination/useGridRowCount.js +3 -6
- package/hooks/features/preferencesPanel/useGridPreferencesPanel.js +7 -12
- package/hooks/features/rowSelection/useGridRowSelection.js +11 -16
- package/hooks/features/rows/gridRowsSelector.js +11 -19
- package/hooks/features/rows/gridRowsUtils.js +7 -9
- package/hooks/features/rows/useGridParamsApi.js +1 -1
- package/hooks/features/rows/useGridRows.js +4 -13
- package/hooks/features/rows/useGridRowsMeta.js +7 -13
- package/hooks/features/scroll/useGridScroll.js +2 -3
- package/hooks/features/sorting/gridSortingSelector.js +4 -7
- package/hooks/features/sorting/useGridSorting.js +8 -14
- package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
- package/hooks/features/virtualization/useGridVirtualScroller.js +220 -71
- package/hooks/utils/useGridApiEventHandler.js +5 -10
- package/hooks/utils/useGridNativeEventListener.js +1 -2
- package/index.js +1 -1
- package/internals/index.d.ts +2 -0
- package/internals/index.js +1 -0
- package/internals/utils/useProps.js +1 -2
- package/joy/joySlots.js +7 -13
- package/models/api/gridRowsMetaApi.d.ts +1 -1
- package/models/api/index.d.ts +1 -1
- package/models/api/index.js +0 -1
- package/models/events/gridEventLookup.d.ts +7 -0
- package/models/gridExport.d.ts +6 -0
- package/models/gridStateCommunity.d.ts +1 -0
- package/models/props/DataGridProps.d.ts +26 -25
- package/modern/DataGrid/DataGrid.js +18 -17
- package/modern/DataGrid/useDataGridProps.js +4 -5
- package/modern/components/GridPagination.js +11 -2
- package/modern/components/cell/GridActionsCell.js +1 -1
- package/modern/components/cell/GridActionsCellItem.js +4 -0
- package/modern/components/cell/GridBooleanCell.js +3 -2
- package/modern/components/columnHeaders/GridColumnHeaderItem.js +3 -1
- package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +3 -1
- package/modern/components/containers/GridRoot.js +3 -3
- package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
- package/modern/components/panel/filterPanel/GridFilterInputDate.js +1 -1
- package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
- package/modern/components/panel/filterPanel/GridFilterInputValue.js +1 -1
- package/modern/components/toolbar/GridToolbarDensitySelector.js +5 -5
- package/modern/components/toolbar/GridToolbarQuickFilter.js +17 -2
- package/modern/hooks/features/clipboard/useGridClipboard.js +4 -2
- package/modern/hooks/features/columnResize/useGridColumnResize.js +1 -1
- package/modern/hooks/features/columns/gridColumnsUtils.js +0 -19
- package/modern/hooks/features/density/densitySelector.js +8 -2
- package/modern/hooks/features/density/useGridDensity.js +21 -29
- package/modern/hooks/features/dimensions/useGridDimensions.js +3 -2
- package/modern/hooks/features/editing/useGridCellEditing.js +1 -1
- package/modern/hooks/features/editing/useGridRowEditing.js +14 -5
- package/modern/hooks/features/export/serializers/csvSerializer.js +23 -12
- package/modern/hooks/features/export/useGridCsvExport.js +2 -1
- package/modern/hooks/features/filter/gridFilterUtils.js +1 -1
- package/modern/hooks/features/rowSelection/useGridRowSelection.js +3 -2
- package/modern/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
- package/modern/index.js +1 -1
- package/modern/internals/index.js +1 -0
- package/modern/models/api/index.js +0 -1
- package/modern/utils/createSelector.js +1 -1
- package/modern/utils/domUtils.js +1 -1
- package/modern/utils/keyboardUtils.js +1 -1
- package/modern/utils/throttle.js +19 -0
- package/node/DataGrid/DataGrid.js +18 -17
- package/node/DataGrid/useDataGridProps.js +4 -5
- package/node/components/GridPagination.js +9 -1
- package/node/components/cell/GridActionsCell.js +1 -1
- package/node/components/cell/GridActionsCellItem.js +4 -0
- package/node/components/cell/GridBooleanCell.js +3 -2
- package/node/components/columnHeaders/GridColumnHeaderItem.js +3 -1
- package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +3 -1
- package/node/components/containers/GridRoot.js +2 -2
- package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
- package/node/components/panel/filterPanel/GridFilterInputDate.js +1 -1
- package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
- package/node/components/panel/filterPanel/GridFilterInputValue.js +1 -1
- package/node/components/toolbar/GridToolbarDensitySelector.js +4 -4
- package/node/components/toolbar/GridToolbarQuickFilter.js +17 -2
- package/node/hooks/features/clipboard/useGridClipboard.js +4 -2
- package/node/hooks/features/columnResize/useGridColumnResize.js +1 -1
- package/node/hooks/features/columns/gridColumnsUtils.js +0 -20
- package/node/hooks/features/density/densitySelector.js +9 -3
- package/node/hooks/features/density/useGridDensity.js +22 -30
- package/node/hooks/features/dimensions/useGridDimensions.js +2 -1
- package/node/hooks/features/editing/useGridCellEditing.js +1 -1
- package/node/hooks/features/editing/useGridRowEditing.js +14 -5
- package/node/hooks/features/export/serializers/csvSerializer.js +23 -12
- package/node/hooks/features/export/useGridCsvExport.js +2 -1
- package/node/hooks/features/filter/gridFilterUtils.js +1 -1
- package/node/hooks/features/rowSelection/useGridRowSelection.js +2 -1
- package/node/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
- package/node/index.js +1 -1
- package/node/internals/index.js +12 -0
- package/node/models/api/index.js +0 -11
- package/node/utils/createSelector.js +1 -1
- package/node/utils/domUtils.js +1 -1
- package/node/utils/keyboardUtils.js +1 -1
- package/node/utils/throttle.js +25 -0
- package/package.json +4 -4
- package/utils/createSelector.js +9 -9
- package/utils/domUtils.js +4 -7
- package/utils/getGridLocalization.js +9 -12
- package/utils/keyboardUtils.js +1 -1
- package/utils/throttle.d.ts +4 -0
- package/utils/throttle.js +19 -0
package/utils/createSelector.js
CHANGED
|
@@ -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`,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
87
|
-
const cacheFn = cacheArgs
|
|
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
|
-
|
|
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 (!
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
+
});
|
package/utils/keyboardUtils.js
CHANGED
|
@@ -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,
|
|
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,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
|
+
}
|