@economic/taco 2.47.0-server.5 → 2.47.0-server.6
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/Row.js +8 -10
- package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/Row.js.map +1 -1
- package/dist/esm/packages/taco/src/primitives/Table/useTableDataLoader2.js +89 -100
- package/dist/esm/packages/taco/src/primitives/Table/useTableDataLoader2.js.map +1 -1
- package/dist/taco.cjs.development.js +94 -109
- package/dist/taco.cjs.development.js.map +1 -1
- package/dist/taco.cjs.production.min.js +1 -1
- package/dist/taco.cjs.production.min.js.map +1 -1
- package/package.json +1 -1
@@ -37,16 +37,14 @@ function Row(props) {
|
|
37
37
|
var search = props.table.getState().globalFilter;
|
38
38
|
var hiddenColumns = getHiddenColumns(props.table.getState().columnVisibility);
|
39
39
|
var pageIndexesToFetch = [];
|
40
|
-
|
41
|
-
//
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
}
|
49
|
-
*/
|
40
|
+
// if there's no direction, it means the scroll bar got dropped un unloaded pages,
|
41
|
+
// in that case, load forward and backward pages to prevent skeletons
|
42
|
+
if (scrollDirection === 'backward' || !scrollDirection) {
|
43
|
+
var backIndex = pageIndex - 1;
|
44
|
+
if (backIndex > -1) {
|
45
|
+
pageIndexesToFetch.push(backIndex);
|
46
|
+
}
|
47
|
+
}
|
50
48
|
// always load the next page
|
51
49
|
if ((scrollDirection === 'forward' || !scrollDirection) && pageIndex + 2 < tableMeta.server.pageCount) {
|
52
50
|
pageIndexesToFetch.push(pageIndex + 1);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Row.js","sources":["../../../../../../../../../../src/primitives/Table/Core/components/Row/Row.tsx"],"sourcesContent":["import React from 'react';\nimport { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport { RowContext } from './RowContext';\nimport { TableRowRenderer, TableRowRendererProps } from '../../types';\nimport { getHiddenColumns } from '../../../useTableManager/util/columns';\n\nconst DELAY_BEFORE_LOAD_MS = 250;\n\nexport type RowProps<TType = unknown> = React.HTMLAttributes<HTMLTableRowElement> &\n TableRowRendererProps<TType> & {\n renderer: TableRowRenderer<TType>;\n scrollDirection?: 'forward' | 'backward';\n skipPageLoading?: boolean;\n };\n\n/* anonymous functions will break the memoisation on each render, wrap handlers in callbacks */\nexport function Row<TType = unknown>(props: RowProps<TType>) {\n const {\n renderer: RowRenderer,\n cellRenderer: CellRenderer,\n hideInternalColumns = false,\n hideRowActions = false,\n scrollDirection,\n skipPageLoading = false,\n ...displayRowProps\n } = props;\n\n const tableMeta = props.table.options.meta as ReactTableMeta<TType>;\n const isHovered = tableMeta.rowActive.rowHoverIndex === props.index;\n // context - it must be here for cells to read it, since they render alongside the row inside DisplayRow\n const contextValue = React.useMemo(\n () => ({ isHovered, rowIndex: props.index, hideInternalColumns, hideRowActions }),\n [isHovered, props.index, hideInternalColumns, hideRowActions]\n );\n\n React.useEffect(() => {\n let timeout;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 && !skipPageLoading) {\n const pageIndex =\n (Math.floor(props.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) / tableMeta.server.pageSize;\n\n const sorting = props.table.getState().sorting;\n const filters = props.table.getState().columnFilters;\n const search = props.table.getState().globalFilter;\n const hiddenColumns = getHiddenColumns(props.table.getState().columnVisibility);\n\n const pageIndexesToFetch: number[] = [];\n\n
|
1
|
+
{"version":3,"file":"Row.js","sources":["../../../../../../../../../../src/primitives/Table/Core/components/Row/Row.tsx"],"sourcesContent":["import React from 'react';\nimport { TableMeta as ReactTableMeta } from '@tanstack/react-table';\nimport { RowContext } from './RowContext';\nimport { TableRowRenderer, TableRowRendererProps } from '../../types';\nimport { getHiddenColumns } from '../../../useTableManager/util/columns';\n\nconst DELAY_BEFORE_LOAD_MS = 250;\n\nexport type RowProps<TType = unknown> = React.HTMLAttributes<HTMLTableRowElement> &\n TableRowRendererProps<TType> & {\n renderer: TableRowRenderer<TType>;\n scrollDirection?: 'forward' | 'backward';\n skipPageLoading?: boolean;\n };\n\n/* anonymous functions will break the memoisation on each render, wrap handlers in callbacks */\nexport function Row<TType = unknown>(props: RowProps<TType>) {\n const {\n renderer: RowRenderer,\n cellRenderer: CellRenderer,\n hideInternalColumns = false,\n hideRowActions = false,\n scrollDirection,\n skipPageLoading = false,\n ...displayRowProps\n } = props;\n\n const tableMeta = props.table.options.meta as ReactTableMeta<TType>;\n const isHovered = tableMeta.rowActive.rowHoverIndex === props.index;\n // context - it must be here for cells to read it, since they render alongside the row inside DisplayRow\n const contextValue = React.useMemo(\n () => ({ isHovered, rowIndex: props.index, hideInternalColumns, hideRowActions }),\n [isHovered, props.index, hideInternalColumns, hideRowActions]\n );\n\n React.useEffect(() => {\n let timeout;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 && !skipPageLoading) {\n const pageIndex =\n (Math.floor(props.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) / tableMeta.server.pageSize;\n\n const sorting = props.table.getState().sorting;\n const filters = props.table.getState().columnFilters;\n const search = props.table.getState().globalFilter;\n const hiddenColumns = getHiddenColumns(props.table.getState().columnVisibility);\n\n const pageIndexesToFetch: number[] = [];\n\n // if there's no direction, it means the scroll bar got dropped un unloaded pages,\n // in that case, load forward and backward pages to prevent skeletons\n if (scrollDirection === 'backward' || !scrollDirection) {\n const backIndex = pageIndex - 1;\n\n if (backIndex > -1) {\n pageIndexesToFetch.push(backIndex);\n }\n }\n\n // always load the next page\n if ((scrollDirection === 'forward' || !scrollDirection) && pageIndex + 2 < tableMeta.server.pageCount) {\n pageIndexesToFetch.push(pageIndex + 1);\n }\n\n if (pageIndexesToFetch.length) {\n // the virtualiser fetches a page ahead, so this won't get called in most cases\n // but it provides a fallback for some edge cases\n timeout = setTimeout(() => {\n pageIndexesToFetch.forEach(index => {\n // this can be called by every row within the current page, but loadPage returns early if a pending request exists\n tableMeta.server.loadPage?.(\n index,\n sorting,\n filters,\n tableMeta.search.enableGlobalFilter ? search : undefined,\n hiddenColumns\n );\n });\n }, DELAY_BEFORE_LOAD_MS);\n }\n }\n\n return () => {\n clearTimeout(timeout);\n };\n }, [tableMeta.server.pages]);\n\n return (\n <RowContext.Provider value={contextValue}>\n <RowRenderer<TType> {...displayRowProps} cellRenderer={CellRenderer} />\n </RowContext.Provider>\n );\n}\n"],"names":["DELAY_BEFORE_LOAD_MS","Row","props","RowRenderer","renderer","CellRenderer","cellRenderer","_props$hideInternalCo","hideInternalColumns","_props$hideRowActions","hideRowActions","scrollDirection","_props$skipPageLoadin","skipPageLoading","displayRowProps","_objectWithoutPropertiesLoose","_excluded","tableMeta","table","options","meta","isHovered","rowActive","rowHoverIndex","index","contextValue","React","useMemo","rowIndex","useEffect","timeout","server","isEnabled","_experimentalDataLoader2","pageIndex","Math","floor","pageSize","sorting","getState","filters","columnFilters","search","globalFilter","hiddenColumns","getHiddenColumns","columnVisibility","pageIndexesToFetch","backIndex","push","pageCount","length","setTimeout","forEach","_tableMeta$server$loa","_tableMeta$server","loadPage","call","enableGlobalFilter","undefined","clearTimeout","pages","RowContext","Provider","value"],"mappings":"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"}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import React__default from 'react';
|
2
|
-
import {
|
2
|
+
import { extends as _extends } from '../../../../../_virtual/_rollupPluginBabelHelpers.js';
|
3
|
+
import { v4 } from 'uuid';
|
4
|
+
import { _catch, _finallyRethrows } from '../../../../../node_modules/babel-plugin-transform-async-to-promises/helpers.mjs.js';
|
3
5
|
import { DEFAULT_PAGE_SIZE } from './useTableDataLoader.js';
|
4
6
|
|
5
7
|
var DATASET_SIZE_MULTIPLIER = 15;
|
@@ -9,76 +11,68 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
9
11
|
reset = false;
|
10
12
|
}
|
11
13
|
try {
|
14
|
+
// if a request is already pending for this page (and it's not a reset), skip it
|
12
15
|
if (_pendingPageRequests.current[pageIndex] && !reset) {
|
13
16
|
return Promise.resolve();
|
14
17
|
}
|
15
18
|
var hasChangedData = JSON.stringify(sorting) !== JSON.stringify(_lastUsedSorting.current) || JSON.stringify(filters) !== JSON.stringify(_lastUsedFilters.current) || search !== _lastUsedSearch.current;
|
16
|
-
// set values so we can track if they changed between loads
|
17
|
-
_lastUsedSorting.current = sorting;
|
18
|
-
_lastUsedFilters.current = filters;
|
19
|
-
_lastUsedSearch.current = search;
|
20
|
-
_lastUsedHiddenColumns.current = hiddenColumns;
|
21
19
|
// if the page is already loaded and has actual rows, abort
|
22
|
-
if (data.
|
23
|
-
|
24
|
-
if (data.rows[position * pageSize] !== undefined) {
|
25
|
-
return Promise.resolve();
|
26
|
-
}
|
20
|
+
if (data.cache[pageIndex] && data.cache[pageIndex][0] && !hasChangedData && !reset) {
|
21
|
+
return Promise.resolve();
|
27
22
|
}
|
23
|
+
// create an id to track the update
|
24
|
+
var requestId = v4();
|
28
25
|
// set the page as loading, so that subsequent requests don't retrigger it
|
29
26
|
_pendingPageRequests.current[pageIndex] = true;
|
30
|
-
var
|
31
|
-
|
32
|
-
return
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
27
|
+
var _temp2 = _catch(function () {
|
28
|
+
_lastRequestId.current = requestId;
|
29
|
+
return Promise.resolve(fetchPage(pageIndex, pageSize, sorting, filters, search, hiddenColumns)).then(function (response) {
|
30
|
+
length.current = response.length;
|
31
|
+
// update state, here we do some "magic" to support "load in place"
|
32
|
+
setData(function (currentData) {
|
33
|
+
// if this request wasn't the last one, just return the current state to prevent weird updates
|
34
|
+
if (_lastRequestId.current !== requestId) {
|
35
|
+
return currentData;
|
36
|
+
}
|
37
|
+
var direction = getDirection(pageIndex, currentData.pages);
|
38
|
+
var nextPages = getPages(pageIndex, currentData.lastFetchedPage, reset ? [] : currentData.pages, direction);
|
39
|
+
// set values so we can track if they changed between loads
|
40
|
+
_lastUsedSorting.current = sorting;
|
41
|
+
_lastUsedFilters.current = filters;
|
42
|
+
_lastUsedSearch.current = search;
|
43
|
+
_lastUsedHiddenColumns.current = hiddenColumns;
|
44
|
+
// cache data as an object to prevent any duplicates for pages
|
45
|
+
var nextCache;
|
46
|
+
if (reset || hasChangedData || !direction) {
|
47
|
+
nextCache = nextPages.reduce(function (acc, p) {
|
48
|
+
var _extends2;
|
49
|
+
return _extends({}, acc, (_extends2 = {}, _extends2[p] = Array(pageSize).fill(undefined), _extends2));
|
50
|
+
}, {});
|
51
|
+
} else {
|
52
|
+
nextCache = _extends({}, currentData.cache);
|
53
|
+
}
|
54
|
+
nextCache[pageIndex] = response.data;
|
55
|
+
// cleanup "unloaded" pages
|
56
|
+
if (direction === 'forward' && currentData.rows.length >= DATASET_SIZE) {
|
57
|
+
delete nextCache[currentData.pages[0]];
|
58
|
+
} else if (direction === 'backward' && currentData.rows.length >= DATASET_SIZE) {
|
59
|
+
delete nextCache[currentData.pages[currentData.pages.length - 1]];
|
60
|
+
}
|
61
|
+
// remap rows from the cached data - do it here and not in render to save some performance
|
62
|
+
var rows = Object.values(nextCache).reduce(function (acc, p) {
|
63
|
+
return acc.concat(p);
|
64
|
+
}, []);
|
65
|
+
return {
|
66
|
+
cache: nextCache,
|
67
|
+
pages: nextPages,
|
68
|
+
rows: rows,
|
69
|
+
lastFetchedPage: pageIndex
|
70
|
+
};
|
69
71
|
});
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
// update the last loaded page
|
75
|
-
_lastFetchedPage.current = {
|
76
|
-
index: pageIndex,
|
77
|
-
direction: direction
|
78
|
-
};
|
79
|
-
if (_wasThrown2) throw _result2;
|
80
|
-
return _result2;
|
81
|
-
});
|
72
|
+
// reset pending requests
|
73
|
+
delete _pendingPageRequests.current[pageIndex];
|
74
|
+
});
|
75
|
+
}, function () {});
|
82
76
|
return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {}) : void 0);
|
83
77
|
} catch (e) {
|
84
78
|
return Promise.reject(e);
|
@@ -97,20 +91,21 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
97
91
|
// data will be filled after the first request
|
98
92
|
var _React$useState = React__default.useState({
|
99
93
|
rows: [],
|
100
|
-
pages: []
|
94
|
+
pages: [],
|
95
|
+
cache: {},
|
96
|
+
lastFetchedPage: undefined
|
101
97
|
}),
|
102
98
|
data = _React$useState[0],
|
103
99
|
setData = _React$useState[1];
|
104
100
|
// track which pages have been loaded to dedupe requests
|
105
101
|
var _pendingPageRequests = React__default.useRef({});
|
102
|
+
// it's possible to spam updates, e.g. sort, so we don't set state if the last request wasn't the current oen
|
103
|
+
var _lastRequestId = React__default.useRef();
|
104
|
+
// store last used properties
|
106
105
|
var _lastUsedSorting = React__default.useRef([]);
|
107
106
|
var _lastUsedFilters = React__default.useRef([]);
|
108
107
|
var _lastUsedSearch = React__default.useRef();
|
109
108
|
var _lastUsedHiddenColumns = React__default.useRef([]);
|
110
|
-
var _lastFetchedPage = React__default.useRef({
|
111
|
-
index: undefined,
|
112
|
-
direction: undefined
|
113
|
-
});
|
114
109
|
var loadAll = function loadAll(sorting, filters, search, hiddenColumns) {
|
115
110
|
try {
|
116
111
|
// set values so we can track if they changed between loads
|
@@ -122,9 +117,18 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
122
117
|
return _catch(function () {
|
123
118
|
return Promise.resolve(fetchAll(sorting, filters, search, hiddenColumns)).then(function (response) {
|
124
119
|
length.current = response.length;
|
120
|
+
var pages = [];
|
121
|
+
var cache = {};
|
122
|
+
Array.from(Array(response.length / pageSize).keys()).forEach(function (index) {
|
123
|
+
pages.push(index);
|
124
|
+
var startIndex = index * pageSize;
|
125
|
+
cache[index] = response.data.slice(startIndex, startIndex + pageSize);
|
126
|
+
});
|
125
127
|
setData({
|
128
|
+
cache: cache,
|
129
|
+
pages: pages,
|
126
130
|
rows: response.data,
|
127
|
-
|
131
|
+
lastFetchedPage: undefined
|
128
132
|
});
|
129
133
|
});
|
130
134
|
}, function () {});
|
@@ -141,11 +145,10 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
141
145
|
};
|
142
146
|
var invalidate = function invalidate() {
|
143
147
|
try {
|
144
|
-
console.log('invalidate');
|
145
148
|
// reset stuff
|
146
149
|
_pendingPageRequests.current = {};
|
147
150
|
// load the current page again
|
148
|
-
return loadPage(getCurrentPage(data.pages
|
151
|
+
return loadPage(getCurrentPage(data.pages), _lastUsedSorting.current, _lastUsedFilters.current, _lastUsedSearch.current, _lastUsedHiddenColumns.current, true);
|
149
152
|
} catch (e) {
|
150
153
|
return Promise.reject(e);
|
151
154
|
}
|
@@ -154,7 +157,7 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
154
157
|
try {
|
155
158
|
// reset before loading the current page
|
156
159
|
_pendingPageRequests.current = {};
|
157
|
-
return loadPage(getCurrentPage(data.pages
|
160
|
+
return loadPage(getCurrentPage(data.pages), sorting, _lastUsedFilters.current, _lastUsedSearch.current, _lastUsedHiddenColumns.current, true);
|
158
161
|
} catch (e) {
|
159
162
|
return Promise.reject(e);
|
160
163
|
}
|
@@ -163,7 +166,7 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
163
166
|
try {
|
164
167
|
// reset before loading the current page
|
165
168
|
_pendingPageRequests.current = {};
|
166
|
-
return loadPage(
|
169
|
+
return loadPage(0, _lastUsedSorting.current, filters, _lastUsedSearch.current, hiddenColumns, true);
|
167
170
|
} catch (e) {
|
168
171
|
return Promise.reject(e);
|
169
172
|
}
|
@@ -172,7 +175,7 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
172
175
|
try {
|
173
176
|
// reset before loading the current page
|
174
177
|
_pendingPageRequests.current = {};
|
175
|
-
return loadPage(
|
178
|
+
return loadPage(0, _lastUsedSorting.current, _lastUsedFilters.current, search, hiddenColumns, true);
|
176
179
|
} catch (e) {
|
177
180
|
return Promise.reject(e);
|
178
181
|
}
|
@@ -190,37 +193,27 @@ function useTableDataLoader2(fetchPage, fetchAll, options) {
|
|
190
193
|
_experimentalDataLoader2: true
|
191
194
|
}, invalidate];
|
192
195
|
}
|
193
|
-
function getCurrentPage(currentPages
|
196
|
+
function getCurrentPage(currentPages) {
|
194
197
|
if (currentPages.length <= 2) {
|
195
|
-
|
196
|
-
return (_currentPages$ = currentPages[0]) !== null && _currentPages$ !== void 0 ? _currentPages$ : 0;
|
198
|
+
return currentPages[0];
|
197
199
|
}
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
}
|
203
|
-
return lastFetchedPage.direction === 'forward' ? lastFetchedPage.index + middle : lastFetchedPage.index - middle;
|
204
|
-
}
|
205
|
-
return 0;
|
200
|
+
// for even page lengths we can't know which is the current visible page - it could even be both
|
201
|
+
// so we load one of them and rely on the "load next/previous page" functionality in row
|
202
|
+
var middle = Math.floor(currentPages.length / 2);
|
203
|
+
return currentPages[middle];
|
206
204
|
}
|
207
|
-
function
|
208
|
-
if (
|
209
|
-
|
210
|
-
}
|
211
|
-
if (pageIndex > lastUsedPage.index) {
|
212
|
-
if (lastUsedPage.index + 1 === pageIndex || lastUsedPage.index + DATASET_SIZE_MULTIPLIER === pageIndex) {
|
205
|
+
function getDirection(pageIndex, currentPages) {
|
206
|
+
if (currentPages.length) {
|
207
|
+
if (pageIndex === currentPages[currentPages.length - 1] + 1) {
|
213
208
|
return 'forward';
|
214
|
-
}
|
215
|
-
} else if (pageIndex < lastUsedPage.index) {
|
216
|
-
if (lastUsedPage.index - 1 === pageIndex || lastUsedPage.index - DATASET_SIZE_MULTIPLIER === pageIndex) {
|
209
|
+
} else if (pageIndex === currentPages[0] - 1 || currentPages.length === 2 && currentPages[0] !== 0 && pageIndex === currentPages[0]) {
|
217
210
|
return 'backward';
|
218
211
|
}
|
219
212
|
}
|
220
213
|
return undefined;
|
221
214
|
}
|
222
|
-
function getPages(pageIndex,
|
223
|
-
if (currentPages.length && (pageIndex ===
|
215
|
+
function getPages(pageIndex, lastUsedPageIndex, currentPages, direction) {
|
216
|
+
if (currentPages.length && (pageIndex === lastUsedPageIndex || currentPages.includes(pageIndex))) {
|
224
217
|
return currentPages;
|
225
218
|
}
|
226
219
|
if (direction === 'forward') {
|
@@ -231,11 +224,7 @@ function getPages(pageIndex, lastUsedPage, currentPages, direction) {
|
|
231
224
|
var _nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(0, -1) : currentPages;
|
232
225
|
return [pageIndex].concat(_nextPages);
|
233
226
|
}
|
234
|
-
|
235
|
-
return [0];
|
236
|
-
}
|
237
|
-
// don't go forward, the current page will trigger load of the next page
|
238
|
-
return [pageIndex - 1, pageIndex];
|
227
|
+
return [pageIndex];
|
239
228
|
}
|
240
229
|
|
241
230
|
export { useTableDataLoader2 };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useTableDataLoader2.js","sources":["../../../../../../../src/primitives/Table/useTableDataLoader2.ts"],"sourcesContent":["import React from 'react';\nimport {\n TableColumnFilter,\n TableColumnSort,\n TableFilterHandler,\n TableServerLoadPageHandler,\n TableServerLoadAllHandler,\n TableSortHandler,\n TableSearchHandler,\n} from './types';\nimport { DEFAULT_PAGE_SIZE, useTableDataLoaderOptions } from './useTableDataLoader';\n\nconst DATASET_SIZE_MULTIPLIER = 15;\n\nexport type useTableDataPageFetcher2<TType = unknown> = (\n pageIndex: number,\n pageSize: number,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[]\n) => Promise<{ data: TType[]; length: number }>;\n\nexport type useTableDataAllFetcher2<TType = unknown> = (\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[]\n) => Promise<{ data: TType[]; length: number }>;\n\nexport type useTableDataLoaderValues2<TType = unknown> = {\n data: TType[];\n length: number | undefined;\n loadAll: TableServerLoadAllHandler;\n loadPage: TableServerLoadPageHandler;\n onChangeFilter: TableFilterHandler;\n onChangeSearch: TableSearchHandler;\n onChangeSort: TableSortHandler;\n pageSize: number;\n pages: number[];\n _experimentalDataLoader2: boolean;\n};\n\ntype Data<TType = unknown> = {\n rows: TType[];\n pages: number[];\n};\ntype Direction = 'forward' | 'backward' | undefined;\ntype LastFetchedPage = {\n index: number | undefined;\n direction: Direction;\n};\n\nexport function useTableDataLoader2<TType = unknown>(\n fetchPage: useTableDataPageFetcher2<TType>,\n fetchAll: useTableDataAllFetcher2<TType>,\n options: useTableDataLoaderOptions = { pageSize: DEFAULT_PAGE_SIZE }\n): [useTableDataLoaderValues2<TType>, () => void] {\n const { pageSize } = options;\n const DATASET_SIZE = DATASET_SIZE_MULTIPLIER * pageSize;\n\n // track the data length, we don't know it until the first request\n const length = React.useRef<number>(0);\n // data will be filled after the first request\n const [data, setData] = React.useState<Data<TType>>({ rows: [], pages: [] });\n // track which pages have been loaded to dedupe requests\n const _pendingPageRequests = React.useRef({});\n const _lastUsedSorting = React.useRef<TableColumnSort[]>([]);\n const _lastUsedFilters = React.useRef<TableColumnFilter[]>([]);\n const _lastUsedSearch = React.useRef<string | undefined>();\n const _lastUsedHiddenColumns = React.useRef<string[]>([]);\n const _lastFetchedPage = React.useRef<LastFetchedPage>({\n index: undefined,\n direction: undefined,\n });\n\n async function loadPage(\n pageIndex: number,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[],\n reset = false\n ) {\n if (_pendingPageRequests.current[pageIndex] && !reset) {\n return;\n }\n\n const hasChangedData =\n JSON.stringify(sorting) !== JSON.stringify(_lastUsedSorting.current) ||\n JSON.stringify(filters) !== JSON.stringify(_lastUsedFilters.current) ||\n search !== _lastUsedSearch.current;\n\n // set values so we can track if they changed between loads\n _lastUsedSorting.current = sorting;\n _lastUsedFilters.current = filters;\n _lastUsedSearch.current = search;\n _lastUsedHiddenColumns.current = hiddenColumns;\n\n // if the page is already loaded and has actual rows, abort\n if (data.pages.includes(pageIndex) && !hasChangedData && !reset) {\n const position = data.pages.indexOf(pageIndex);\n\n if (data.rows[position * pageSize] !== undefined) {\n return;\n }\n }\n\n // set the page as loading, so that subsequent requests don't retrigger it\n _pendingPageRequests.current[pageIndex] = true;\n\n const direction = getDirection2(pageIndex, _lastFetchedPage.current);\n\n try {\n const response = await fetchPage(pageIndex, pageSize, sorting, filters, search, hiddenColumns);\n length.current = response.length;\n\n // update state, here we do some \"magic\" to support \"load in place\"\n setData(currentData => {\n const nextPages = getPages(pageIndex, _lastFetchedPage.current, reset ? [] : currentData.pages, direction);\n let nextRows = currentData.rows;\n\n if (reset || !direction) {\n const index = nextPages.indexOf(pageIndex);\n const startIndex = (index > -1 ? index : 0) * pageSize;\n\n if (reset) {\n nextRows = ([] as TType[]).concat(response.data);\n } else if (startIndex > 0 || pageIndex === 0) {\n nextRows = Array(startIndex).fill(undefined).concat(response.data);\n } else if (startIndex === 0) {\n nextRows = response.data.concat(currentData.rows.slice(pageSize));\n }\n } else if (direction === 'forward') {\n // if the new data will exceed the dataset size, then chop off the start or end\n // this keeps the stored dataset to our preferred size\n if (currentData.rows.length >= DATASET_SIZE) {\n nextRows = currentData.rows.slice(DEFAULT_PAGE_SIZE).concat(response.data);\n } else {\n nextRows = currentData.rows.concat(response.data);\n }\n } else if (direction === 'backward') {\n if (currentData.rows.length >= DATASET_SIZE) {\n nextRows = response.data.concat(currentData.rows.slice(0, -1 * pageSize));\n } else {\n nextRows = currentData.rows.concat(response.data);\n }\n }\n\n return {\n rows: nextRows,\n pages: nextPages,\n };\n });\n } catch {\n //\n } finally {\n // reset pending requests\n delete _pendingPageRequests.current[pageIndex];\n // update the last loaded page\n _lastFetchedPage.current = {\n index: pageIndex,\n direction,\n };\n }\n }\n\n const loadAll = async (\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[]\n ) => {\n // set values so we can track if they changed between loads\n _lastUsedSorting.current = sorting;\n _lastUsedFilters.current = filters;\n _lastUsedSearch.current = search;\n _lastUsedHiddenColumns.current = hiddenColumns;\n\n try {\n const response = await fetchAll(sorting, filters, search, hiddenColumns);\n length.current = response.length;\n\n setData({\n rows: response.data,\n pages: Array.from(Array(response.length / pageSize).keys()),\n });\n } catch {\n //\n } finally {\n // reset pending requests\n _pendingPageRequests.current = {};\n }\n };\n\n const invalidate = async () => {\n console.log('invalidate');\n // reset stuff\n _pendingPageRequests.current = {};\n\n // load the current page again\n return loadPage(\n getCurrentPage(data.pages, _lastFetchedPage.current),\n _lastUsedSorting.current,\n _lastUsedFilters.current,\n _lastUsedSearch.current,\n _lastUsedHiddenColumns.current,\n true\n );\n };\n\n const handleSort = async (sorting: TableColumnSort[]) => {\n // reset before loading the current page\n _pendingPageRequests.current = {};\n\n return loadPage(\n getCurrentPage(data.pages, _lastFetchedPage.current),\n sorting,\n _lastUsedFilters.current,\n _lastUsedSearch.current,\n _lastUsedHiddenColumns.current,\n true\n );\n };\n const handleFilter = async (filters: TableColumnFilter[], hiddenColumns: string[]) => {\n // reset before loading the current page\n _pendingPageRequests.current = {};\n\n return loadPage(\n getCurrentPage(data.pages, _lastFetchedPage.current),\n _lastUsedSorting.current,\n filters,\n _lastUsedSearch.current,\n hiddenColumns,\n true\n );\n };\n const handleSearch = async (search: string | undefined, hiddenColumns: string[]) => {\n // reset before loading the current page\n _pendingPageRequests.current = {};\n\n return loadPage(\n getCurrentPage(data.pages, _lastFetchedPage.current),\n _lastUsedSorting.current,\n _lastUsedFilters.current,\n search,\n hiddenColumns,\n true\n );\n };\n\n return [\n {\n data: data.rows,\n pages: data.pages,\n length: length.current,\n loadAll,\n loadPage,\n onChangeFilter: handleFilter,\n onChangeSearch: handleSearch,\n onChangeSort: handleSort,\n pageSize,\n _experimentalDataLoader2: true,\n },\n invalidate,\n ];\n}\n\nfunction getCurrentPage(currentPages: number[], lastFetchedPage: LastFetchedPage): number {\n if (currentPages.length <= 2) {\n return currentPages[0] ?? 0;\n }\n\n const middle = Math.floor(DATASET_SIZE_MULTIPLIER / 2);\n\n if (lastFetchedPage.index) {\n if (!lastFetchedPage.direction) {\n return lastFetchedPage.index;\n }\n\n return lastFetchedPage.direction === 'forward' ? lastFetchedPage.index + middle : lastFetchedPage.index - middle;\n }\n\n return 0;\n}\n\nfunction getDirection2(pageIndex: number, lastUsedPage: LastFetchedPage): Direction {\n if (lastUsedPage.index === undefined) {\n return undefined;\n }\n\n if (pageIndex > lastUsedPage.index) {\n if (lastUsedPage.index + 1 === pageIndex || lastUsedPage.index + DATASET_SIZE_MULTIPLIER === pageIndex) {\n return 'forward';\n }\n } else if (pageIndex < lastUsedPage.index) {\n if (lastUsedPage.index - 1 === pageIndex || lastUsedPage.index - DATASET_SIZE_MULTIPLIER === pageIndex) {\n return 'backward';\n }\n }\n\n return undefined;\n}\n\nfunction getPages(pageIndex: number, lastUsedPage: LastFetchedPage, currentPages: number[], direction: Direction) {\n if (currentPages.length && (pageIndex === lastUsedPage.index || currentPages.includes(pageIndex))) {\n return currentPages;\n }\n\n if (direction === 'forward') {\n const nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(1) : currentPages;\n return nextPages.concat(pageIndex);\n }\n\n if (direction === 'backward') {\n const nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(0, -1) : currentPages;\n return [pageIndex].concat(nextPages);\n }\n\n if (pageIndex === 0) {\n return [0];\n }\n\n // don't go forward, the current page will trigger load of the next page\n return [pageIndex - 1, pageIndex];\n}\n"],"names":["DATASET_SIZE_MULTIPLIER","useTableDataLoader2","fetchPage","fetchAll","options","loadPage","pageIndex","sorting","filters","search","hiddenColumns","reset","_pendingPageRequests","current","Promise","resolve","hasChangedData","JSON","stringify","_lastUsedSorting","_lastUsedFilters","_lastUsedSearch","_lastUsedHiddenColumns","data","pages","includes","position","indexOf","rows","pageSize","undefined","direction","getDirection2","_lastFetchedPage","_temp2","_finallyRethrows","_catch","then","response","length","setData","currentData","nextPages","getPages","nextRows","index","startIndex","concat","Array","fill","slice","DATASET_SIZE","DEFAULT_PAGE_SIZE","_wasThrown2","_result2","e","reject","_options","React","useRef","_React$useState","useState","loadAll","_temp","from","keys","_wasThrown","_result","invalidate","console","log","getCurrentPage","handleSort","handleFilter","handleSearch","onChangeFilter","onChangeSearch","onChangeSort","_experimentalDataLoader2","currentPages","lastFetchedPage","_currentPages$","middle","Math","floor","lastUsedPage"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"useTableDataLoader2.js","sources":["../../../../../../../src/primitives/Table/useTableDataLoader2.ts"],"sourcesContent":["import React from 'react';\nimport { v4 as uuid } from 'uuid';\nimport {\n TableColumnFilter,\n TableColumnSort,\n TableFilterHandler,\n TableServerLoadPageHandler,\n TableServerLoadAllHandler,\n TableSortHandler,\n TableSearchHandler,\n} from './types';\nimport { DEFAULT_PAGE_SIZE, useTableDataLoaderOptions } from './useTableDataLoader';\n\nconst DATASET_SIZE_MULTIPLIER = 15;\n\nexport type useTableDataPageFetcher2<TType = unknown> = (\n pageIndex: number,\n pageSize: number,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[]\n) => Promise<{ data: TType[]; length: number }>;\n\nexport type useTableDataAllFetcher2<TType = unknown> = (\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[]\n) => Promise<{ data: TType[]; length: number }>;\n\nexport type useTableDataLoaderValues2<TType = unknown> = {\n data: TType[];\n length: number | undefined;\n loadAll: TableServerLoadAllHandler;\n loadPage: TableServerLoadPageHandler;\n onChangeFilter: TableFilterHandler;\n onChangeSearch: TableSearchHandler;\n onChangeSort: TableSortHandler;\n pageSize: number;\n pages: number[];\n _experimentalDataLoader2: boolean;\n};\n\ntype Data<TType = unknown> = {\n rows: TType[];\n pages: number[];\n cache: Record<number, TType[]>;\n lastFetchedPage: number | undefined;\n};\ntype Direction = 'forward' | 'backward' | undefined;\n\nexport function useTableDataLoader2<TType = unknown>(\n fetchPage: useTableDataPageFetcher2<TType>,\n fetchAll: useTableDataAllFetcher2<TType>,\n options: useTableDataLoaderOptions = { pageSize: DEFAULT_PAGE_SIZE }\n): [useTableDataLoaderValues2<TType>, () => void] {\n const { pageSize } = options;\n const DATASET_SIZE = DATASET_SIZE_MULTIPLIER * pageSize;\n\n // track the data length, we don't know it until the first request\n const length = React.useRef<number>(0);\n // data will be filled after the first request\n const [data, setData] = React.useState<Data<TType>>({ rows: [], pages: [], cache: {}, lastFetchedPage: undefined });\n // track which pages have been loaded to dedupe requests\n const _pendingPageRequests = React.useRef({});\n // it's possible to spam updates, e.g. sort, so we don't set state if the last request wasn't the current oen\n const _lastRequestId = React.useRef<string | undefined>();\n // store last used properties\n const _lastUsedSorting = React.useRef<TableColumnSort[]>([]);\n const _lastUsedFilters = React.useRef<TableColumnFilter[]>([]);\n const _lastUsedSearch = React.useRef<string | undefined>();\n const _lastUsedHiddenColumns = React.useRef<string[]>([]);\n\n async function loadPage(\n pageIndex: number,\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[],\n reset = false\n ) {\n // if a request is already pending for this page (and it's not a reset), skip it\n if (_pendingPageRequests.current[pageIndex] && !reset) {\n return;\n }\n\n const hasChangedData =\n JSON.stringify(sorting) !== JSON.stringify(_lastUsedSorting.current) ||\n JSON.stringify(filters) !== JSON.stringify(_lastUsedFilters.current) ||\n search !== _lastUsedSearch.current;\n\n // if the page is already loaded and has actual rows, abort\n if (data.cache[pageIndex] && data.cache[pageIndex][0] && !hasChangedData && !reset) {\n return;\n }\n\n // create an id to track the update\n const requestId = uuid();\n\n // set the page as loading, so that subsequent requests don't retrigger it\n _pendingPageRequests.current[pageIndex] = true;\n\n try {\n _lastRequestId.current = requestId;\n const response = await fetchPage(pageIndex, pageSize, sorting, filters, search, hiddenColumns);\n length.current = response.length;\n\n // update state, here we do some \"magic\" to support \"load in place\"\n setData(currentData => {\n // if this request wasn't the last one, just return the current state to prevent weird updates\n if (_lastRequestId.current !== requestId) {\n return currentData;\n }\n\n const direction = getDirection(pageIndex, currentData.pages);\n const nextPages = getPages(pageIndex, currentData.lastFetchedPage, reset ? [] : currentData.pages, direction);\n\n // set values so we can track if they changed between loads\n _lastUsedSorting.current = sorting;\n _lastUsedFilters.current = filters;\n _lastUsedSearch.current = search;\n _lastUsedHiddenColumns.current = hiddenColumns;\n\n // cache data as an object to prevent any duplicates for pages\n let nextCache: Record<number, TType[]>;\n\n if (reset || hasChangedData || !direction) {\n nextCache = nextPages.reduce((acc, p) => ({ ...acc, [p]: Array(pageSize).fill(undefined) }), {});\n } else {\n nextCache = { ...currentData.cache };\n }\n\n nextCache[pageIndex] = response.data;\n\n // cleanup \"unloaded\" pages\n if (direction === 'forward' && currentData.rows.length >= DATASET_SIZE) {\n delete nextCache[currentData.pages[0]];\n } else if (direction === 'backward' && currentData.rows.length >= DATASET_SIZE) {\n delete nextCache[currentData.pages[currentData.pages.length - 1]];\n }\n\n // remap rows from the cached data - do it here and not in render to save some performance\n const rows = Object.values(nextCache).reduce((acc, p) => acc.concat(p), []);\n\n return {\n cache: nextCache,\n pages: nextPages,\n rows: rows,\n lastFetchedPage: pageIndex,\n };\n });\n\n // reset pending requests\n delete _pendingPageRequests.current[pageIndex];\n } catch {\n //\n }\n }\n\n const loadAll = async (\n sorting: TableColumnSort[],\n filters: TableColumnFilter[],\n search: string | undefined,\n hiddenColumns: string[]\n ) => {\n // set values so we can track if they changed between loads\n _lastUsedSorting.current = sorting;\n _lastUsedFilters.current = filters;\n _lastUsedSearch.current = search;\n _lastUsedHiddenColumns.current = hiddenColumns;\n\n try {\n const response = await fetchAll(sorting, filters, search, hiddenColumns);\n length.current = response.length;\n\n const pages: number[] = [];\n const cache = {};\n\n Array.from(Array(response.length / pageSize).keys()).forEach(index => {\n pages.push(index);\n const startIndex = index * pageSize;\n cache[index] = response.data.slice(startIndex, startIndex + pageSize);\n });\n\n setData({\n cache,\n pages,\n rows: response.data,\n lastFetchedPage: undefined,\n });\n } catch {\n //\n } finally {\n // reset pending requests\n _pendingPageRequests.current = {};\n }\n };\n\n const invalidate = async () => {\n // reset stuff\n _pendingPageRequests.current = {};\n\n // load the current page again\n return loadPage(\n getCurrentPage(data.pages),\n _lastUsedSorting.current,\n _lastUsedFilters.current,\n _lastUsedSearch.current,\n _lastUsedHiddenColumns.current,\n true\n );\n };\n\n const handleSort = async (sorting: TableColumnSort[]) => {\n // reset before loading the current page\n _pendingPageRequests.current = {};\n\n return loadPage(\n getCurrentPage(data.pages),\n sorting,\n _lastUsedFilters.current,\n _lastUsedSearch.current,\n _lastUsedHiddenColumns.current,\n true\n );\n };\n const handleFilter = async (filters: TableColumnFilter[], hiddenColumns: string[]) => {\n // reset before loading the current page\n _pendingPageRequests.current = {};\n return loadPage(0, _lastUsedSorting.current, filters, _lastUsedSearch.current, hiddenColumns, true);\n };\n const handleSearch = async (search: string | undefined, hiddenColumns: string[]) => {\n // reset before loading the current page\n _pendingPageRequests.current = {};\n return loadPage(0, _lastUsedSorting.current, _lastUsedFilters.current, search, hiddenColumns, true);\n };\n\n return [\n {\n data: data.rows,\n pages: data.pages,\n length: length.current,\n loadAll,\n loadPage,\n onChangeFilter: handleFilter,\n onChangeSearch: handleSearch,\n onChangeSort: handleSort,\n pageSize,\n _experimentalDataLoader2: true,\n },\n invalidate,\n ];\n}\n\nfunction getCurrentPage(currentPages: number[]): number {\n if (currentPages.length <= 2) {\n return currentPages[0];\n }\n\n // for even page lengths we can't know which is the current visible page - it could even be both\n // so we load one of them and rely on the \"load next/previous page\" functionality in row\n const middle = Math.floor(currentPages.length / 2);\n return currentPages[middle];\n}\n\nfunction getDirection(pageIndex: number, currentPages: number[]): Direction {\n if (currentPages.length) {\n if (pageIndex === currentPages[currentPages.length - 1] + 1) {\n return 'forward';\n } else if (\n pageIndex === currentPages[0] - 1 ||\n (currentPages.length === 2 && currentPages[0] !== 0 && pageIndex === currentPages[0])\n ) {\n return 'backward';\n }\n }\n\n return undefined;\n}\n\nfunction getPages(pageIndex: number, lastUsedPageIndex: number | undefined, currentPages: number[], direction: Direction) {\n if (currentPages.length && (pageIndex === lastUsedPageIndex || currentPages.includes(pageIndex))) {\n return currentPages;\n }\n\n if (direction === 'forward') {\n const nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(1) : currentPages;\n return nextPages.concat(pageIndex);\n }\n\n if (direction === 'backward') {\n const nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(0, -1) : currentPages;\n return [pageIndex].concat(nextPages);\n }\n\n return [pageIndex];\n}\n"],"names":["DATASET_SIZE_MULTIPLIER","useTableDataLoader2","fetchPage","fetchAll","options","loadPage","pageIndex","sorting","filters","search","hiddenColumns","reset","_pendingPageRequests","current","Promise","resolve","hasChangedData","JSON","stringify","_lastUsedSorting","_lastUsedFilters","_lastUsedSearch","data","cache","requestId","uuid","_temp2","_catch","_lastRequestId","pageSize","then","response","length","setData","currentData","direction","getDirection","pages","nextPages","getPages","lastFetchedPage","_lastUsedHiddenColumns","nextCache","reduce","acc","p","_extends2","_extends","Array","fill","undefined","rows","DATASET_SIZE","Object","values","concat","e","reject","DEFAULT_PAGE_SIZE","_options","React","useRef","_React$useState","useState","loadAll","_temp","_finallyRethrows","from","keys","forEach","index","push","startIndex","slice","_wasThrown","_result","invalidate","getCurrentPage","handleSort","handleFilter","handleSearch","onChangeFilter","onChangeSearch","onChangeSort","_experimentalDataLoader2","currentPages","middle","Math","floor","lastUsedPageIndex","includes"],"mappings":"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"}
|