@etsoo/react 1.7.94 → 1.7.96

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 (93) hide show
  1. package/README.md +2 -1
  2. package/__tests__/EventWatcher.tsx +21 -21
  3. package/__tests__/ReactUtils.ts +4 -4
  4. package/__tests__/tsconfig.json +17 -17
  5. package/babel.config.json +8 -8
  6. package/lib/app/CoreConstants.js +2 -2
  7. package/lib/app/EventWatcher.d.ts +1 -1
  8. package/lib/app/EventWatcher.js +3 -5
  9. package/lib/app/InputDialogProps.d.ts +2 -2
  10. package/lib/app/ReactUtils.d.ts +2 -2
  11. package/lib/app/ReactUtils.js +20 -19
  12. package/lib/components/DnDList.d.ts +3 -3
  13. package/lib/components/DnDList.js +4 -4
  14. package/lib/components/DynamicRouter.d.ts +2 -2
  15. package/lib/components/DynamicRouter.js +2 -2
  16. package/lib/components/GridColumn.d.ts +6 -6
  17. package/lib/components/GridColumn.js +7 -7
  18. package/lib/components/GridLoader.d.ts +4 -4
  19. package/lib/components/GridLoader.js +2 -2
  20. package/lib/components/GridMethodRef.d.ts +2 -2
  21. package/lib/components/ListItemReact.d.ts +2 -2
  22. package/lib/components/ScrollRestoration.js +3 -3
  23. package/lib/components/ScrollerGrid.d.ts +7 -12
  24. package/lib/components/ScrollerGrid.js +13 -17
  25. package/lib/components/ScrollerList.d.ts +6 -10
  26. package/lib/components/ScrollerList.js +15 -14
  27. package/lib/custom/CustomFieldReact.d.ts +1 -1
  28. package/lib/index.d.ts +32 -32
  29. package/lib/index.js +31 -31
  30. package/lib/notifier/Notifier.d.ts +5 -5
  31. package/lib/notifier/Notifier.js +7 -7
  32. package/lib/states/CultureState.d.ts +3 -3
  33. package/lib/states/CultureState.js +3 -3
  34. package/lib/states/IState.d.ts +2 -2
  35. package/lib/states/PageState.d.ts +2 -2
  36. package/lib/states/PageState.js +2 -3
  37. package/lib/states/State.d.ts +3 -3
  38. package/lib/states/State.js +2 -2
  39. package/lib/states/UserState.d.ts +2 -2
  40. package/lib/states/UserState.js +5 -5
  41. package/lib/uses/useAsyncState.d.ts +1 -1
  42. package/lib/uses/useAsyncState.js +1 -1
  43. package/lib/uses/useCombinedRefs.js +2 -2
  44. package/lib/uses/useDelayedExecutor.d.ts +1 -1
  45. package/lib/uses/useDelayedExecutor.js +2 -2
  46. package/lib/uses/useDimensions.d.ts +1 -1
  47. package/lib/uses/useDimensions.js +3 -3
  48. package/lib/uses/useParamsEx.d.ts +1 -1
  49. package/lib/uses/useParamsEx.js +2 -2
  50. package/lib/uses/useRefs.d.ts +2 -2
  51. package/lib/uses/useRefs.js +1 -1
  52. package/lib/uses/useSearchParamsEx.d.ts +1 -1
  53. package/lib/uses/useSearchParamsEx.js +3 -3
  54. package/lib/uses/useTimeout.js +2 -2
  55. package/lib/uses/useWindowScroll.js +3 -3
  56. package/lib/uses/useWindowSize.js +4 -5
  57. package/package.json +72 -74
  58. package/src/app/CoreConstants.ts +8 -8
  59. package/src/app/EventWatcher.ts +50 -52
  60. package/src/app/InputDialogProps.ts +16 -16
  61. package/src/app/ReactUtils.ts +206 -208
  62. package/src/components/DnDList.tsx +268 -283
  63. package/src/components/DynamicRouter.tsx +35 -35
  64. package/src/components/GridColumn.ts +201 -201
  65. package/src/components/GridLoader.ts +121 -121
  66. package/src/components/GridMethodRef.ts +26 -26
  67. package/src/components/ListItemReact.ts +2 -2
  68. package/src/components/ScrollRestoration.tsx +24 -24
  69. package/src/components/ScrollerGrid.tsx +428 -448
  70. package/src/components/ScrollerList.tsx +320 -332
  71. package/src/custom/CustomFieldReact.ts +12 -12
  72. package/src/index.ts +35 -35
  73. package/src/notifier/Notifier.ts +229 -240
  74. package/src/states/CultureState.ts +51 -52
  75. package/src/states/IState.ts +19 -19
  76. package/src/states/PageState.ts +63 -66
  77. package/src/states/State.tsx +47 -51
  78. package/src/states/UserState.ts +98 -98
  79. package/src/uses/useAsyncState.ts +37 -39
  80. package/src/uses/useCombinedRefs.ts +16 -16
  81. package/src/uses/useDelayedExecutor.ts +8 -8
  82. package/src/uses/useDimensions.ts +102 -103
  83. package/src/uses/useParamsEx.ts +6 -6
  84. package/src/uses/useRefs.ts +6 -6
  85. package/src/uses/useSearchParamsEx.ts +13 -13
  86. package/src/uses/useTimeout.ts +17 -17
  87. package/src/uses/useWindowScroll.ts +43 -43
  88. package/src/uses/useWindowSize.ts +46 -49
  89. package/tsconfig.json +17 -17
  90. package/.eslintignore +0 -3
  91. package/.eslintrc.json +0 -38
  92. package/.prettierignore +0 -5
  93. package/.prettierrc +0 -6
@@ -1,156 +1,145 @@
1
- import { DataTypes } from '@etsoo/shared';
2
- import React from 'react';
1
+ import { DataTypes } from "@etsoo/shared";
2
+ import React from "react";
3
3
  import {
4
- Align,
5
- GridChildComponentProps,
6
- GridOnItemsRenderedProps,
7
- VariableSizeGrid,
8
- VariableSizeGridProps
9
- } from 'react-window';
4
+ Align,
5
+ GridChildComponentProps,
6
+ GridOnItemsRenderedProps,
7
+ VariableSizeGrid,
8
+ VariableSizeGridProps
9
+ } from "react-window";
10
10
  import {
11
- GridLoadDataProps,
12
- GridLoader,
13
- GridLoaderPartialStates,
14
- GridLoaderStates
15
- } from './GridLoader';
16
- import { GridMethodRef } from './GridMethodRef';
11
+ GridLoadDataProps,
12
+ GridLoader,
13
+ GridLoaderPartialStates,
14
+ GridLoaderStates
15
+ } from "./GridLoader";
16
+ import { GridMethodRef } from "./GridMethodRef";
17
17
 
18
18
  export type ScrollerGridItemRendererProps<T> = Omit<
19
- GridChildComponentProps<T>,
20
- 'data'
19
+ GridChildComponentProps<T>,
20
+ "data"
21
21
  > & {
22
- /**
23
- * Selected items
24
- */
25
- selectedItems: T[];
26
-
27
- /**
28
- * Set items for rerenderer
29
- * @param callback Callback
30
- */
31
- setItems: (
32
- callback: (
33
- items: T[],
34
- ref: ScrollerGridForwardRef<T>
35
- ) => T[] | undefined | void
36
- ) => void;
37
-
38
- /**
39
- * Data
40
- */
41
- data?: T;
22
+ /**
23
+ * Selected items
24
+ */
25
+ selectedItems: T[];
26
+
27
+ /**
28
+ * Set items for rerenderer
29
+ * @param callback Callback
30
+ */
31
+ setItems: (
32
+ callback: (
33
+ items: T[],
34
+ ref: ScrollerGridForwardRef<T>
35
+ ) => T[] | undefined | void
36
+ ) => void;
37
+
38
+ /**
39
+ * Data
40
+ */
41
+ data?: T;
42
42
  };
43
43
 
44
44
  /**
45
45
  * Scroller vertical grid props
46
46
  */
47
47
  export interface ScrollerGridProps<T extends object>
48
- extends GridLoader<T>,
49
- Omit<VariableSizeGridProps<T>, 'children' | 'rowCount' | 'rowHeight'> {
50
- /**
51
- * Default order by asc
52
- * @default true
53
- */
54
- defaultOrderByAsc?: boolean;
55
-
56
- /**
57
- * Footer renderer
58
- */
59
- footerRenderer?: (
60
- rows: T[],
61
- states: GridLoaderStates<T>
62
- ) => React.ReactNode;
63
-
64
- /**
65
- * Header renderer
66
- */
67
- headerRenderer?: (states: GridLoaderStates<T>) => React.ReactNode;
68
-
69
- /**
70
- * Id field
71
- */
72
- idField?: DataTypes.Keys<T>;
73
-
74
- /**
75
- * Item renderer
76
- */
77
- itemRenderer: (
78
- props: ScrollerGridItemRendererProps<T>
79
- ) => React.ReactElement;
80
-
81
- /**
82
- * Methods
83
- */
84
- mRef?: React.Ref<ScrollerGridForwardRef<T>>;
85
-
86
- /**
87
- * On items select change
88
- */
89
- onSelectChange?: (selectedItems: T[]) => void;
90
-
91
- /**
92
- * Returns the height of the specified row.
93
- */
94
- rowHeight?: ((index: number) => number) | number;
48
+ extends GridLoader<T>,
49
+ Omit<VariableSizeGridProps<T>, "children" | "rowCount" | "rowHeight"> {
50
+ /**
51
+ * Footer renderer
52
+ */
53
+ footerRenderer?: (rows: T[], states: GridLoaderStates<T>) => React.ReactNode;
54
+
55
+ /**
56
+ * Header renderer
57
+ */
58
+ headerRenderer?: (states: GridLoaderStates<T>) => React.ReactNode;
59
+
60
+ /**
61
+ * Id field
62
+ */
63
+ idField?: DataTypes.Keys<T>;
64
+
65
+ /**
66
+ * Item renderer
67
+ */
68
+ itemRenderer: (props: ScrollerGridItemRendererProps<T>) => React.ReactElement;
69
+
70
+ /**
71
+ * Methods
72
+ */
73
+ mRef?: React.Ref<ScrollerGridForwardRef<T>>;
74
+
75
+ /**
76
+ * On items select change
77
+ */
78
+ onSelectChange?: (selectedItems: T[]) => void;
79
+
80
+ /**
81
+ * Returns the height of the specified row.
82
+ */
83
+ rowHeight?: ((index: number) => number) | number;
95
84
  }
96
85
 
97
86
  /**
98
87
  * Scroller grid forward ref
99
88
  */
100
89
  export interface ScrollerGridForwardRef<T> extends GridMethodRef<T> {
101
- /**
102
- * Scroll to the specified offsets
103
- */
104
- scrollTo(params: { scrollLeft: number; scrollTop: number }): void;
105
-
106
- scrollToItem(params: {
107
- align?: Align | undefined;
108
- columnIndex?: number | undefined;
109
- rowIndex?: number | undefined;
110
- }): void;
111
-
112
- /**
113
- * Scroll to the specified item
114
- */
115
- scrollToItem(params: {
116
- align?: Align | undefined;
117
- columnIndex?: number | undefined;
118
- rowIndex?: number | undefined;
119
- }): void;
120
-
121
- /**
122
- * Select the item
123
- * @param rowIndex Row index
124
- */
125
- select(rowIndex: number): void;
126
-
127
- /**
128
- * Select or unselect all items
129
- * @param checked Checked
130
- */
131
- selectAll(checked: boolean): void;
132
-
133
- /**
134
- * Select item
135
- * @param item Item
136
- * @param checked Checked
137
- */
138
- selectItem(item: any, checked: boolean): void;
139
-
140
- /**
141
- *
142
- * @param index
143
- * @param shouldForceUpdate
144
- */
145
- resetAfterColumnIndex(index: number, shouldForceUpdate?: boolean): void;
146
-
147
- resetAfterIndices(params: {
148
- columnIndex: number;
149
- rowIndex: number;
150
- shouldForceUpdate?: boolean | undefined;
151
- }): void;
152
-
153
- resetAfterRowIndex(index: number, shouldForceUpdate?: boolean): void;
90
+ /**
91
+ * Scroll to the specified offsets
92
+ */
93
+ scrollTo(params: { scrollLeft: number; scrollTop: number }): void;
94
+
95
+ scrollToItem(params: {
96
+ align?: Align | undefined;
97
+ columnIndex?: number | undefined;
98
+ rowIndex?: number | undefined;
99
+ }): void;
100
+
101
+ /**
102
+ * Scroll to the specified item
103
+ */
104
+ scrollToItem(params: {
105
+ align?: Align | undefined;
106
+ columnIndex?: number | undefined;
107
+ rowIndex?: number | undefined;
108
+ }): void;
109
+
110
+ /**
111
+ * Select the item
112
+ * @param rowIndex Row index
113
+ */
114
+ select(rowIndex: number): void;
115
+
116
+ /**
117
+ * Select or unselect all items
118
+ * @param checked Checked
119
+ */
120
+ selectAll(checked: boolean): void;
121
+
122
+ /**
123
+ * Select item
124
+ * @param item Item
125
+ * @param checked Checked
126
+ */
127
+ selectItem(item: any, checked: boolean): void;
128
+
129
+ /**
130
+ *
131
+ * @param index
132
+ * @param shouldForceUpdate
133
+ */
134
+ resetAfterColumnIndex(index: number, shouldForceUpdate?: boolean): void;
135
+
136
+ resetAfterIndices(params: {
137
+ columnIndex: number;
138
+ rowIndex: number;
139
+ shouldForceUpdate?: boolean | undefined;
140
+ }): void;
141
+
142
+ resetAfterRowIndex(index: number, shouldForceUpdate?: boolean): void;
154
143
  }
155
144
 
156
145
  /**
@@ -159,327 +148,318 @@ export interface ScrollerGridForwardRef<T> extends GridMethodRef<T> {
159
148
  * @returns Component
160
149
  */
161
150
  export const ScrollerGrid = <T extends object>(props: ScrollerGridProps<T>) => {
162
- // Destruct
163
- const {
164
- autoLoad = true,
165
- defaultOrderBy,
166
- defaultOrderByAsc,
167
- footerRenderer,
168
- headerRenderer,
169
- itemRenderer,
170
- idField = 'id' as DataTypes.Keys<T>,
171
- loadBatchSize,
172
- loadData,
173
- mRef,
174
- onItemsRendered,
175
- onSelectChange,
176
- rowHeight = 53,
177
- threshold = 6,
178
- width,
179
- onInitLoad,
180
- onUpdateRows,
181
- ...rest
182
- } = props;
183
-
184
- // Rows
185
- const [rows, updateRows] = React.useState<T[]>([]);
186
- const setRows = (rows: T[], reset: boolean = false) => {
187
- refs.current.loadedItems = rows.length;
188
- updateRows(rows);
189
-
190
- if (!reset && onUpdateRows) onUpdateRows(rows, refs.current);
151
+ // Destruct
152
+ const {
153
+ autoLoad = true,
154
+ defaultOrderBy,
155
+ footerRenderer,
156
+ headerRenderer,
157
+ itemRenderer,
158
+ idField = "id" as DataTypes.Keys<T>,
159
+ loadBatchSize,
160
+ loadData,
161
+ mRef,
162
+ onItemsRendered,
163
+ onSelectChange,
164
+ rowHeight = 53,
165
+ threshold = 6,
166
+ width,
167
+ onInitLoad,
168
+ onUpdateRows,
169
+ ...rest
170
+ } = props;
171
+
172
+ // Rows
173
+ const [rows, updateRows] = React.useState<T[]>([]);
174
+ const setRows = (rows: T[], reset: boolean = false) => {
175
+ refs.current.loadedItems = rows.length;
176
+ updateRows(rows);
177
+
178
+ if (!reset && onUpdateRows) onUpdateRows(rows, refs.current);
179
+ };
180
+
181
+ // Refs
182
+ const refs = React.useRef<GridLoaderStates<T>>({
183
+ queryPaging: {
184
+ currentPage: 0,
185
+ orderBy: defaultOrderBy,
186
+ batchSize: 10
187
+ },
188
+ autoLoad,
189
+ hasNextPage: true,
190
+ isNextPageLoading: false,
191
+ loadedItems: 0,
192
+ selectedItems: [],
193
+ idCache: {}
194
+ });
195
+
196
+ const ref = React.useRef<VariableSizeGrid<T>>(null);
197
+
198
+ // Load data
199
+ const loadDataLocal = (pageAdd: number = 1) => {
200
+ // Prevent multiple loadings
201
+ if (!refs.current.hasNextPage || refs.current.isNextPageLoading) return;
202
+
203
+ // Update state
204
+ refs.current.isNextPageLoading = true;
205
+
206
+ // Parameters
207
+ const { queryPaging, data } = refs.current;
208
+
209
+ const loadProps: GridLoadDataProps = {
210
+ queryPaging,
211
+ data
191
212
  };
192
213
 
193
- // Refs
194
- const refs = React.useRef<GridLoaderStates<T>>({
195
- queryPaging: {
196
- currentPage: 0,
197
- orderBy: defaultOrderBy,
198
- orderByAsc: defaultOrderByAsc,
199
- batchSize: 10
200
- },
201
- autoLoad,
202
- hasNextPage: true,
203
- isNextPageLoading: false,
204
- loadedItems: 0,
205
- selectedItems: [],
206
- idCache: {}
207
- });
208
-
209
- const ref = React.useRef<VariableSizeGrid<T>>(null);
210
-
211
- // Load data
212
- const loadDataLocal = (pageAdd: number = 1) => {
213
- // Prevent multiple loadings
214
- if (!refs.current.hasNextPage || refs.current.isNextPageLoading) return;
215
-
216
- // Update state
217
- refs.current.isNextPageLoading = true;
218
-
219
- // Parameters
220
- const { queryPaging, data } = refs.current;
221
-
222
- const loadProps: GridLoadDataProps = {
223
- queryPaging,
224
- data
225
- };
226
-
227
- loadData(loadProps).then((result) => {
228
- if (result == null || refs.current.isMounted === false) {
229
- return;
230
- }
231
- refs.current.isMounted = true;
232
-
233
- const newItems = result.length;
234
- refs.current.lastLoadedItems = newItems;
235
- refs.current.isNextPageLoading = false;
236
- refs.current.hasNextPage =
237
- newItems >= refs.current.queryPaging.batchSize;
238
-
239
- if (pageAdd === 0) {
240
- // New items
241
- const newRows = refs.current.lastLoadedItems
242
- ? [...rows]
243
- .splice(
244
- rows.length - refs.current.lastLoadedItems,
245
- refs.current.lastLoadedItems
246
- )
247
- .concat(result)
248
- : result;
249
-
250
- refs.current.idCache = {};
251
- for (const row of newRows) {
252
- const id = row[idField] as any;
253
- refs.current.idCache[id] = null;
254
- }
255
-
256
- // Update rows
257
- setRows(newRows);
258
- } else {
259
- // Set current page
260
- refs.current.queryPaging.currentPage += pageAdd;
261
-
262
- // Update rows, avoid duplicate items
263
- const newRows = [...rows];
264
-
265
- for (const item of result) {
266
- const id = item[idField] as any;
267
- if (refs.current.idCache[id] === undefined) {
268
- newRows.push(item);
269
- }
270
- }
271
-
272
- setRows(newRows);
273
- }
274
- });
275
- };
276
-
277
- // Item renderer
278
- const itemRendererLocal = (
279
- itemProps: GridChildComponentProps<T>,
280
- state: GridLoaderStates<T>
281
- ) => {
282
- // Custom render
283
- const data =
284
- itemProps.rowIndex < rows.length
285
- ? rows[itemProps.rowIndex]
286
- : undefined;
287
- return itemRenderer({
288
- ...itemProps,
289
- data,
290
- selectedItems: state.selectedItems,
291
- setItems: (
292
- callback: (
293
- items: T[],
294
- ref: ScrollerGridForwardRef<T>
295
- ) => T[] | undefined | void
296
- ) => {
297
- const result = callback(rows, instance);
298
- if (result == null) return;
299
- setRows(result);
300
- }
301
- });
302
- };
214
+ loadData(loadProps).then((result) => {
215
+ if (result == null || refs.current.isMounted === false) {
216
+ return;
217
+ }
218
+ refs.current.isMounted = true;
219
+
220
+ const newItems = result.length;
221
+ refs.current.lastLoadedItems = newItems;
222
+ refs.current.isNextPageLoading = false;
223
+ refs.current.hasNextPage = newItems >= refs.current.queryPaging.batchSize;
224
+
225
+ if (pageAdd === 0) {
226
+ // New items
227
+ const newRows = refs.current.lastLoadedItems
228
+ ? [...rows]
229
+ .splice(
230
+ rows.length - refs.current.lastLoadedItems,
231
+ refs.current.lastLoadedItems
232
+ )
233
+ .concat(result)
234
+ : result;
235
+
236
+ refs.current.idCache = {};
237
+ for (const row of newRows) {
238
+ const id = row[idField] as any;
239
+ refs.current.idCache[id] = null;
240
+ }
303
241
 
304
- // Local items renderer callback
305
- const onItemsRenderedLocal = (props: GridOnItemsRenderedProps) => {
306
- // No items, means no necessary to load more data during reset
307
- const itemCount = rows.length;
308
- if (
309
- itemCount > 0 &&
310
- props.visibleRowStopIndex + threshold > itemCount
311
- ) {
312
- // Auto load next page
313
- loadDataLocal();
242
+ // Update rows
243
+ setRows(newRows);
244
+ } else {
245
+ // Set current page
246
+ if (refs.current.queryPaging.currentPage == null)
247
+ refs.current.queryPaging.currentPage = pageAdd;
248
+ else refs.current.queryPaging.currentPage += pageAdd;
249
+
250
+ // Update rows, avoid duplicate items
251
+ const newRows = [...rows];
252
+
253
+ for (const item of result) {
254
+ const id = item[idField] as any;
255
+ if (refs.current.idCache[id] === undefined) {
256
+ newRows.push(item);
257
+ }
314
258
  }
315
259
 
316
- // Custom
317
- if (onItemsRendered) onItemsRendered(props);
318
- };
260
+ setRows(newRows);
261
+ }
262
+ });
263
+ };
264
+
265
+ // Item renderer
266
+ const itemRendererLocal = (
267
+ itemProps: GridChildComponentProps<T>,
268
+ state: GridLoaderStates<T>
269
+ ) => {
270
+ // Custom render
271
+ const data =
272
+ itemProps.rowIndex < rows.length ? rows[itemProps.rowIndex] : undefined;
273
+ return itemRenderer({
274
+ ...itemProps,
275
+ data,
276
+ selectedItems: state.selectedItems,
277
+ setItems: (
278
+ callback: (
279
+ items: T[],
280
+ ref: ScrollerGridForwardRef<T>
281
+ ) => T[] | undefined | void
282
+ ) => {
283
+ const result = callback(rows, instance);
284
+ if (result == null) return;
285
+ setRows(result);
286
+ }
287
+ });
288
+ };
289
+
290
+ // Local items renderer callback
291
+ const onItemsRenderedLocal = (props: GridOnItemsRenderedProps) => {
292
+ // No items, means no necessary to load more data during reset
293
+ const itemCount = rows.length;
294
+ if (itemCount > 0 && props.visibleRowStopIndex + threshold > itemCount) {
295
+ // Auto load next page
296
+ loadDataLocal();
297
+ }
319
298
 
320
- // Reset the state and load again
321
- const reset = (add?: GridLoaderPartialStates<T>, items: T[] = []) => {
322
- const { queryPaging, ...rest } = add ?? {};
323
- const resetState: GridLoaderPartialStates<T> = {
324
- autoLoad: true,
325
- loadedItems: 0,
326
- hasNextPage: true,
327
- isNextPageLoading: false,
328
- lastLoadedItems: undefined,
329
- ...rest
330
- };
331
- Object.assign(refs.current, resetState);
332
- Object.assign(refs.current.queryPaging, {
333
- currentPage: 0,
334
- ...queryPaging
335
- });
336
-
337
- // Reset items
338
- if (refs.current.isMounted !== false) setRows(items, true);
299
+ // Custom
300
+ if (onItemsRendered) onItemsRendered(props);
301
+ };
302
+
303
+ // Reset the state and load again
304
+ const reset = (add?: GridLoaderPartialStates<T>, items: T[] = []) => {
305
+ const { queryPaging, ...rest } = add ?? {};
306
+ const resetState: GridLoaderPartialStates<T> = {
307
+ autoLoad: true,
308
+ loadedItems: 0,
309
+ hasNextPage: true,
310
+ isNextPageLoading: false,
311
+ lastLoadedItems: undefined,
312
+ ...rest
339
313
  };
314
+ Object.assign(refs.current, resetState);
315
+ Object.assign(refs.current.queryPaging, {
316
+ currentPage: 0,
317
+ ...queryPaging
318
+ });
340
319
 
341
- const instance: ScrollerGridForwardRef<T> = {
342
- delete(index) {
343
- const item = rows.at(index);
344
- if (item) {
345
- const newRows = [...rows];
346
- newRows.splice(index, 1);
347
- setRows(newRows);
348
- }
349
- return item;
350
- },
351
- insert(item, start) {
352
- const newRows = [...rows];
353
- newRows.splice(start, 0, item);
354
- setRows(newRows);
355
- },
356
- scrollTo(params: { scrollLeft: number; scrollTop: number }) {
357
- ref.current?.scrollTo(params);
358
- },
359
- scrollToItem(params: {
360
- align?: Align | undefined;
361
- columnIndex?: number | undefined;
362
- rowIndex?: number | undefined;
363
- }) {
364
- ref.current?.scrollToItem(params);
365
- },
366
- scrollToRef(scrollOffset: number): void {
367
- ref.current?.scrollTo({ scrollLeft: 0, scrollTop: scrollOffset });
368
- },
369
-
370
- scrollToItemRef(index: number, align?: Align): void {
371
- ref.current?.scrollToItem({ rowIndex: index, align });
372
- },
373
- select(rowIndex: number) {
374
- // Select only one item
375
- const selectedItems = refs.current.selectedItems;
376
- selectedItems[0] = rows[rowIndex];
377
-
378
- if (onSelectChange) onSelectChange(selectedItems);
379
- },
380
- selectAll(checked: boolean) {
381
- const selectedItems = refs.current.selectedItems;
382
-
383
- rows.forEach((row) => {
384
- const index = selectedItems.findIndex(
385
- (selectedItem) => selectedItem[idField] === row[idField]
386
- );
387
-
388
- if (checked) {
389
- if (index === -1) selectedItems.push(row);
390
- } else if (index !== -1) {
391
- selectedItems.splice(index, 1);
392
- }
393
- });
394
-
395
- if (onSelectChange) onSelectChange(selectedItems);
396
- },
397
- selectItem(item: T, checked: boolean) {
398
- const selectedItems = refs.current.selectedItems;
399
- const index = selectedItems.findIndex(
400
- (selectedItem) => selectedItem[idField] === item[idField]
401
- );
402
-
403
- if (checked) {
404
- if (index === -1) selectedItems.push(item);
405
- } else {
406
- if (index !== -1) selectedItems.splice(index, 1);
407
- }
408
-
409
- if (onSelectChange) onSelectChange(selectedItems);
410
- },
411
- reset,
412
- resetAfterColumnIndex(index: number, shouldForceUpdate?: boolean) {
413
- ref.current?.resetAfterColumnIndex(index, shouldForceUpdate);
414
- },
415
- resetAfterIndices(params: {
416
- columnIndex: number;
417
- rowIndex: number;
418
- shouldForceUpdate?: boolean | undefined;
419
- }) {
420
- ref.current?.resetAfterIndices(params);
421
- },
422
- resetAfterRowIndex(index: number, shouldForceUpdate?: boolean) {
423
- ref.current?.resetAfterRowIndex(index, shouldForceUpdate);
320
+ // Reset items
321
+ if (refs.current.isMounted !== false) setRows(items, true);
322
+ };
323
+
324
+ const instance: ScrollerGridForwardRef<T> = {
325
+ delete(index) {
326
+ const item = rows.at(index);
327
+ if (item) {
328
+ const newRows = [...rows];
329
+ newRows.splice(index, 1);
330
+ setRows(newRows);
331
+ }
332
+ return item;
333
+ },
334
+ insert(item, start) {
335
+ const newRows = [...rows];
336
+ newRows.splice(start, 0, item);
337
+ setRows(newRows);
338
+ },
339
+ scrollTo(params: { scrollLeft: number; scrollTop: number }) {
340
+ ref.current?.scrollTo(params);
341
+ },
342
+ scrollToItem(params: {
343
+ align?: Align | undefined;
344
+ columnIndex?: number | undefined;
345
+ rowIndex?: number | undefined;
346
+ }) {
347
+ ref.current?.scrollToItem(params);
348
+ },
349
+ scrollToRef(scrollOffset: number): void {
350
+ ref.current?.scrollTo({ scrollLeft: 0, scrollTop: scrollOffset });
351
+ },
352
+
353
+ scrollToItemRef(index: number, align?: Align): void {
354
+ ref.current?.scrollToItem({ rowIndex: index, align });
355
+ },
356
+ select(rowIndex: number) {
357
+ // Select only one item
358
+ const selectedItems = refs.current.selectedItems;
359
+ selectedItems[0] = rows[rowIndex];
360
+
361
+ if (onSelectChange) onSelectChange(selectedItems);
362
+ },
363
+ selectAll(checked: boolean) {
364
+ const selectedItems = refs.current.selectedItems;
365
+
366
+ rows.forEach((row) => {
367
+ const index = selectedItems.findIndex(
368
+ (selectedItem) => selectedItem[idField] === row[idField]
369
+ );
370
+
371
+ if (checked) {
372
+ if (index === -1) selectedItems.push(row);
373
+ } else if (index !== -1) {
374
+ selectedItems.splice(index, 1);
424
375
  }
425
- };
426
-
427
- React.useImperativeHandle(mRef, () => instance, [rows]);
428
-
429
- React.useEffect(() => {
430
- return () => {
431
- refs.current.isMounted = false;
432
- };
433
- }, []);
434
-
435
- // Force update to work with the new width and rowHeight
436
- React.useEffect(() => {
437
- ref.current?.resetAfterIndices({
438
- columnIndex: 0,
439
- rowIndex: 0,
440
- shouldForceUpdate: true
441
- });
442
- }, [width, rowHeight]);
443
-
444
- // Rows
445
- const rowLength = rows.length;
446
-
447
- // Row count
448
- const rowCount = refs.current.hasNextPage ? rowLength + 1 : rowLength;
449
-
450
- // Auto load data when current page is 0
451
- if (refs.current.queryPaging.currentPage === 0 && refs.current.autoLoad) {
452
- const initItems =
453
- onInitLoad == null ? undefined : onInitLoad(ref.current);
454
- if (initItems) reset(initItems[1], initItems[0]);
455
- else loadDataLocal();
376
+ });
377
+
378
+ if (onSelectChange) onSelectChange(selectedItems);
379
+ },
380
+ selectItem(item: T, checked: boolean) {
381
+ const selectedItems = refs.current.selectedItems;
382
+ const index = selectedItems.findIndex(
383
+ (selectedItem) => selectedItem[idField] === item[idField]
384
+ );
385
+
386
+ if (checked) {
387
+ if (index === -1) selectedItems.push(item);
388
+ } else {
389
+ if (index !== -1) selectedItems.splice(index, 1);
390
+ }
391
+
392
+ if (onSelectChange) onSelectChange(selectedItems);
393
+ },
394
+ reset,
395
+ resetAfterColumnIndex(index: number, shouldForceUpdate?: boolean) {
396
+ ref.current?.resetAfterColumnIndex(index, shouldForceUpdate);
397
+ },
398
+ resetAfterIndices(params: {
399
+ columnIndex: number;
400
+ rowIndex: number;
401
+ shouldForceUpdate?: boolean | undefined;
402
+ }) {
403
+ ref.current?.resetAfterIndices(params);
404
+ },
405
+ resetAfterRowIndex(index: number, shouldForceUpdate?: boolean) {
406
+ ref.current?.resetAfterRowIndex(index, shouldForceUpdate);
456
407
  }
408
+ };
409
+
410
+ React.useImperativeHandle(mRef, () => instance, [rows]);
457
411
 
458
- // Layout
459
- return (
460
- <React.Fragment>
461
- {headerRenderer && headerRenderer(refs.current)}
462
- <VariableSizeGrid<T>
463
- itemKey={({ columnIndex, rowIndex, data }) => {
464
- if (data == null) return [rowIndex, columnIndex].join(',');
465
- // ${data[idField]}-${rowIndex} always unique but no cache for the same item
466
- return [`${data[idField]}`, columnIndex].join(',');
467
- }}
468
- onItemsRendered={onItemsRenderedLocal}
469
- ref={ref}
470
- rowCount={rowCount}
471
- rowHeight={
472
- typeof rowHeight === 'function'
473
- ? rowHeight
474
- : () => rowHeight
475
- }
476
- style={{ overflowX: 'hidden' }}
477
- width={width}
478
- {...rest}
479
- >
480
- {(props) => itemRendererLocal(props, refs.current)}
481
- </VariableSizeGrid>
482
- {footerRenderer && footerRenderer(rows, refs.current)}
483
- </React.Fragment>
484
- );
412
+ React.useEffect(() => {
413
+ return () => {
414
+ refs.current.isMounted = false;
415
+ };
416
+ }, []);
417
+
418
+ // Force update to work with the new width and rowHeight
419
+ React.useEffect(() => {
420
+ ref.current?.resetAfterIndices({
421
+ columnIndex: 0,
422
+ rowIndex: 0,
423
+ shouldForceUpdate: true
424
+ });
425
+ }, [width, rowHeight]);
426
+
427
+ // Rows
428
+ const rowLength = rows.length;
429
+
430
+ // Row count
431
+ const rowCount = refs.current.hasNextPage ? rowLength + 1 : rowLength;
432
+
433
+ // Auto load data when current page is 0
434
+ if (refs.current.queryPaging.currentPage === 0 && refs.current.autoLoad) {
435
+ const initItems = onInitLoad == null ? undefined : onInitLoad(ref.current);
436
+ if (initItems) reset(initItems[1], initItems[0]);
437
+ else loadDataLocal();
438
+ }
439
+
440
+ // Layout
441
+ return (
442
+ <React.Fragment>
443
+ {headerRenderer && headerRenderer(refs.current)}
444
+ <VariableSizeGrid<T>
445
+ itemKey={({ columnIndex, rowIndex, data }) => {
446
+ if (data == null) return [rowIndex, columnIndex].join(",");
447
+ // ${data[idField]}-${rowIndex} always unique but no cache for the same item
448
+ return [`${data[idField]}`, columnIndex].join(",");
449
+ }}
450
+ onItemsRendered={onItemsRenderedLocal}
451
+ ref={ref}
452
+ rowCount={rowCount}
453
+ rowHeight={
454
+ typeof rowHeight === "function" ? rowHeight : () => rowHeight
455
+ }
456
+ style={{ overflowX: "hidden" }}
457
+ width={width}
458
+ {...rest}
459
+ >
460
+ {(props) => itemRendererLocal(props, refs.current)}
461
+ </VariableSizeGrid>
462
+ {footerRenderer && footerRenderer(rows, refs.current)}
463
+ </React.Fragment>
464
+ );
485
465
  };