@economic/taco 2.47.0-server.5 → 2.47.0-server.6
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/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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"}
|