@economic/taco 2.47.0-server.5 → 2.47.0-server.7

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.
@@ -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
- // if there's no direction, it means the scroll bar got dropped un unloaded pages,
42
- // in that case, load forward and backward pages to prevent skeletons
43
- if (scrollDirection === 'backward' || !scrollDirection) {
44
- const backIndex = pageIndex - 1;
45
- if (backIndex > -1) {
46
- pageIndexesToFetch.push(backIndex);
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 /*\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\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","pageCount","push","length","setTimeout","forEach","_tableMeta$server$loa","_tableMeta$server","loadPage","call","enableGlobalFilter","undefined","clearTimeout","pages","RowContext","Provider","value"],"mappings":"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"}
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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"}
@@ -30,7 +30,7 @@ function getPaddingEndOffset(table, options) {
30
30
  return ROW_HEIGHT_ESTIMATES.medium * ((_options$virtualiserP = options === null || options === void 0 ? void 0 : options.virtualiserPaddingEndOffset) !== null && _options$virtualiserP !== void 0 ? _options$virtualiserP : 1) * bottomRows.length;
31
31
  }
32
32
  function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIndex, options) {
33
- var _table$getState$group, _table$getCenterRows, _virtualItems$padding, _virtualItems$padding2, _virtualItems$padding3, _ref2, _virtualItems;
33
+ var _table$getState$group, _table$getCenterRows, _virtualItems$padding, _virtualItems$padding2, _virtualItems$padding3, _virtualItems$end, _virtualItems;
34
34
  var tableMeta = table.options.meta;
35
35
  var isTableRowGrouped = !!((_table$getState$group = table.getState().grouping) !== null && _table$getState$group !== void 0 && _table$getState$group.length);
36
36
  var rows = (_table$getCenterRows = table.getCenterRows()) !== null && _table$getCenterRows !== void 0 ? _table$getCenterRows : [];
@@ -83,7 +83,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
83
83
  var paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;
84
84
  var startValue = isTableRowGrouped ? ((_virtualItems$padding = virtualItems[paddingStartIndex]) === null || _virtualItems$padding === void 0 ? void 0 : _virtualItems$padding.start) - ((_virtualItems$padding2 = virtualItems[paddingStartIndex]) === null || _virtualItems$padding2 === void 0 ? void 0 : _virtualItems$padding2.size) : (_virtualItems$padding3 = virtualItems[paddingStartIndex]) === null || _virtualItems$padding3 === void 0 ? void 0 : _virtualItems$padding3.start;
85
85
  // styling for offsetting rows - this "is" the virtualisation
86
- var _ref = virtualItems.length > 0 ? [Math.max(0, startValue !== null && startValue !== void 0 ? startValue : 0), Math.max(0, (_ref2 = totalSize - ((_virtualItems = virtualItems[virtualItems.length - 1]) === null || _virtualItems === void 0 ? void 0 : _virtualItems.end)) !== null && _ref2 !== void 0 ? _ref2 : 0)] : [0, 0],
86
+ var _ref = virtualItems.length > 0 ? [Math.max(0, startValue !== null && startValue !== void 0 ? startValue : 0), Math.max(0, totalSize - ((_virtualItems$end = (_virtualItems = virtualItems[virtualItems.length - 1]) === null || _virtualItems === void 0 ? void 0 : _virtualItems.end) !== null && _virtualItems$end !== void 0 ? _virtualItems$end : 0))] : [0, 0],
87
87
  paddingTop = _ref[0],
88
88
  paddingBottom = _ref[1];
89
89
  // ensure default active rows are scrolled to
@@ -102,8 +102,8 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
102
102
  if (count || table.getBottomRows().length) {
103
103
  style = {
104
104
  height: totalSize,
105
- paddingBottom: paddingBottom,
106
- paddingTop: paddingTop
105
+ paddingBottom: isNaN(paddingBottom) ? 0 : paddingBottom,
106
+ paddingTop: isNaN(paddingTop) ? 0 : paddingTop
107
107
  };
108
108
  }
109
109
  // only render non sticky rows
@@ -1 +1 @@
1
- {"version":3,"file":"useTableRenderer.js","sources":["../../../../../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n VirtualItem,\n} from '@tanstack/react-virtual';\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers, useTableRenderOptions } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>, options?: useTableRenderOptions) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * (options?.virtualiserPaddingEndOffset ?? 1) * bottomRows.length;\n}\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined,\n options?: useTableRenderOptions\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // expanded rows\n const { createRowMeasurer, estimateSize } = useRowHeightVirtualisation<TType>(table);\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize,\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : undefined,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table, options),\n });\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? virtualItems[paddingStartIndex]?.start - virtualItems[paddingStartIndex]?.size\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - virtualItems[virtualItems.length - 1]?.end ?? 0)]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom,\n paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n return (\n <SkeletonRow\n key={virtualRow.index}\n index={virtualRow.index}\n scrollDirection={virtualiser.scrollDirection ?? undefined}\n table={table}\n />\n );\n }\n\n const measureRow = createRowMeasurer(virtualiser.resizeItem, virtualRow);\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n scrollDirection={virtualiser.scrollDirection ?? undefined}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support varying row heights - variable row heights, row expansion\nfunction useRowHeightVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const rows = table.getRowModel().rows;\n const expandedState = table.getState().expanded;\n\n const [expandedRowHeightsCache, setExpandedRowHeightsCache] = React.useState<Record<number, number>>({});\n\n // look at all registered expanded row heights and use them to form a more accurate average size\n // it might be worth considering if taking the max, or an upper bound, would be better\n const averageExpandedRowHeight = React.useMemo(() => {\n const values: number[] = Object.values(expandedRowHeightsCache);\n return values.length ? values.reduce((a, b) => a + b, 0) / values.length : 0;\n }, [expandedRowHeightsCache]);\n\n // row heights\n const estimateSize = React.useCallback(\n (index: number) => {\n const rowHeight = tableMeta.rowHeight.height\n ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height]\n : ROW_HEIGHT_ESTIMATES.medium;\n\n if (expandedState === true || rows[index]?.getIsExpanded?.()) {\n return rowHeight + averageExpandedRowHeight;\n }\n\n return rowHeight;\n },\n [tableMeta.rowHeight.height, averageExpandedRowHeight, expandedState]\n );\n\n const createRowMeasurer = React.useCallback(\n (resizeItem: (item: VirtualItem, size: number) => void, virtualRow: VirtualItem) =>\n (rowHeight: number, expansionHeight?: number) => {\n // register the expansion height so that it can be used to determine an average\n if (expansionHeight) {\n setExpandedRowHeightsCache(cache => ({ ...cache, [virtualRow.index]: expansionHeight }));\n }\n\n // update the whole row's size to include the expanded height\n resizeItem(virtualRow, rowHeight + (expansionHeight ?? 0));\n },\n []\n );\n\n return { estimateSize, createRowMeasurer };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n range => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n const next = new Set([activeRowGroupIndex, ...defaultRangeExtractor(range)]);\n return [...next].sort((a, b) => a - b);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["getScrollPaddingEndOffset","table","tableMeta","options","meta","offset","footer","isEnabled","getHeaderGroups","length","height","ROW_HEIGHT_ESTIMATES","medium","bottomRows","getBottomRows","rowHeight","getPaddingEndOffset","_table$getBottomRows","_options$virtualiserP","virtualiserPaddingEndOffset","useTableRenderer","renderers","tableRef","defaultRowActiveIndex","isTableRowGrouped","_table$getState$group","getState","grouping","rows","_table$getCenterRows","getCenterRows","_useRowHeightVirtuali","useRowHeightVirtualisation","createRowMeasurer","estimateSize","rangeExtractor","useRowGroupVirtualisation","scrollPaddingStart","count","server","_experimentalDataLoader2","virtualiser","useVirtualizer","getScrollElement","current","overscan","printing","isPrinting","undefined","scrollPaddingEnd","paddingEnd","totalSize","getTotalSize","virtualItems","getVirtualItems","scrollToIndex","React","useCallback","index","align","behavior","notSmooth","_extends","scrollToOffset","scrollTop","scrollHeight","paddingStartIndex","startValue","_virtualItems$padding","start","_virtualItems$padding2","size","_virtualItems$padding3","_ref","Math","max","_ref2","_virtualItems","end","paddingTop","paddingBottom","useEffect","style","content","map","virtualRow","row","_tableMeta$server$pag","_tableMeta$server$pag2","currentPageIndex","floor","pageSize","pagePosition","pages","indexOf","fakeIndex","_row","original","_virtualiser$scrollDi","SkeletonRow","key","scrollDirection","measureRow","resizeItem","Row","id","_virtualiser$scrollDi2","renderer","cellRenderer","cell","getRowModel","expandedState","expanded","_React$useState","useState","expandedRowHeightsCache","setExpandedRowHeightsCache","averageExpandedRowHeight","useMemo","values","Object","reduce","a","b","_rows$index","_rows$index$getIsExpa","getIsExpanded","call","expansionHeight","cache","_extends2","isTableGrouped","rowGroupIndexes","indexes","forEach","getIsGrouped","push","range","activeRowGroupIndex","_reverse$find","concat","reverse","find","startIndex","next","Set","defaultRangeExtractor","sort"],"mappings":"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"}
1
+ {"version":3,"file":"useTableRenderer.js","sources":["../../../../../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n VirtualItem,\n} from '@tanstack/react-virtual';\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers, useTableRenderOptions } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>, options?: useTableRenderOptions) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * (options?.virtualiserPaddingEndOffset ?? 1) * bottomRows.length;\n}\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined,\n options?: useTableRenderOptions\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // expanded rows\n const { createRowMeasurer, estimateSize } = useRowHeightVirtualisation<TType>(table);\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize,\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : undefined,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table, options),\n });\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? virtualItems[paddingStartIndex]?.start - virtualItems[paddingStartIndex]?.size\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n return (\n <SkeletonRow\n key={virtualRow.index}\n index={virtualRow.index}\n scrollDirection={virtualiser.scrollDirection ?? undefined}\n table={table}\n />\n );\n }\n\n const measureRow = createRowMeasurer(virtualiser.resizeItem, virtualRow);\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n scrollDirection={virtualiser.scrollDirection ?? undefined}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support varying row heights - variable row heights, row expansion\nfunction useRowHeightVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const rows = table.getRowModel().rows;\n const expandedState = table.getState().expanded;\n\n const [expandedRowHeightsCache, setExpandedRowHeightsCache] = React.useState<Record<number, number>>({});\n\n // look at all registered expanded row heights and use them to form a more accurate average size\n // it might be worth considering if taking the max, or an upper bound, would be better\n const averageExpandedRowHeight = React.useMemo(() => {\n const values: number[] = Object.values(expandedRowHeightsCache);\n return values.length ? values.reduce((a, b) => a + b, 0) / values.length : 0;\n }, [expandedRowHeightsCache]);\n\n // row heights\n const estimateSize = React.useCallback(\n (index: number) => {\n const rowHeight = tableMeta.rowHeight.height\n ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height]\n : ROW_HEIGHT_ESTIMATES.medium;\n\n if (expandedState === true || rows[index]?.getIsExpanded?.()) {\n return rowHeight + averageExpandedRowHeight;\n }\n\n return rowHeight;\n },\n [tableMeta.rowHeight.height, averageExpandedRowHeight, expandedState]\n );\n\n const createRowMeasurer = React.useCallback(\n (resizeItem: (item: VirtualItem, size: number) => void, virtualRow: VirtualItem) =>\n (rowHeight: number, expansionHeight?: number) => {\n // register the expansion height so that it can be used to determine an average\n if (expansionHeight) {\n setExpandedRowHeightsCache(cache => ({ ...cache, [virtualRow.index]: expansionHeight }));\n }\n\n // update the whole row's size to include the expanded height\n resizeItem(virtualRow, rowHeight + (expansionHeight ?? 0));\n },\n []\n );\n\n return { estimateSize, createRowMeasurer };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n range => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n const next = new Set([activeRowGroupIndex, ...defaultRangeExtractor(range)]);\n return [...next].sort((a, b) => a - b);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["getScrollPaddingEndOffset","table","tableMeta","options","meta","offset","footer","isEnabled","getHeaderGroups","length","height","ROW_HEIGHT_ESTIMATES","medium","bottomRows","getBottomRows","rowHeight","getPaddingEndOffset","_table$getBottomRows","_options$virtualiserP","virtualiserPaddingEndOffset","useTableRenderer","renderers","tableRef","defaultRowActiveIndex","isTableRowGrouped","_table$getState$group","getState","grouping","rows","_table$getCenterRows","getCenterRows","_useRowHeightVirtuali","useRowHeightVirtualisation","createRowMeasurer","estimateSize","rangeExtractor","useRowGroupVirtualisation","scrollPaddingStart","count","server","_experimentalDataLoader2","virtualiser","useVirtualizer","getScrollElement","current","overscan","printing","isPrinting","undefined","scrollPaddingEnd","paddingEnd","totalSize","getTotalSize","virtualItems","getVirtualItems","scrollToIndex","React","useCallback","index","align","behavior","notSmooth","_extends","scrollToOffset","scrollTop","scrollHeight","paddingStartIndex","startValue","_virtualItems$padding","start","_virtualItems$padding2","size","_virtualItems$padding3","_ref","Math","max","_virtualItems$end","_virtualItems","end","paddingTop","paddingBottom","useEffect","style","content","isNaN","map","virtualRow","row","_tableMeta$server$pag","_tableMeta$server$pag2","currentPageIndex","floor","pageSize","pagePosition","pages","indexOf","fakeIndex","_row","original","_virtualiser$scrollDi","SkeletonRow","key","scrollDirection","measureRow","resizeItem","Row","id","_virtualiser$scrollDi2","renderer","cellRenderer","cell","getRowModel","expandedState","expanded","_React$useState","useState","expandedRowHeightsCache","setExpandedRowHeightsCache","averageExpandedRowHeight","useMemo","values","Object","reduce","a","b","_rows$index","_rows$index$getIsExpa","getIsExpanded","call","expansionHeight","cache","_extends2","isTableGrouped","rowGroupIndexes","indexes","forEach","getIsGrouped","push","range","activeRowGroupIndex","_reverse$find","concat","reverse","find","startIndex","next","Set","defaultRangeExtractor","sort"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import React__default from 'react';
2
- import { _finallyRethrows, _catch } from '../../../../../node_modules/babel-plugin-transform-async-to-promises/helpers.mjs.js';
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.pages.includes(pageIndex) && !hasChangedData && !reset) {
23
- var position = data.pages.indexOf(pageIndex);
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 direction = getDirection2(pageIndex, _lastFetchedPage.current);
31
- var _temp2 = _finallyRethrows(function () {
32
- return _catch(function () {
33
- return Promise.resolve(fetchPage(pageIndex, pageSize, sorting, filters, search, hiddenColumns)).then(function (response) {
34
- length.current = response.length;
35
- // update state, here we do some "magic" to support "load in place"
36
- setData(function (currentData) {
37
- var nextPages = getPages(pageIndex, _lastFetchedPage.current, reset ? [] : currentData.pages, direction);
38
- var nextRows = currentData.rows;
39
- if (reset || !direction) {
40
- var index = nextPages.indexOf(pageIndex);
41
- var startIndex = (index > -1 ? index : 0) * pageSize;
42
- if (reset) {
43
- nextRows = [].concat(response.data);
44
- } else if (startIndex > 0 || pageIndex === 0) {
45
- nextRows = Array(startIndex).fill(undefined).concat(response.data);
46
- } else if (startIndex === 0) {
47
- nextRows = response.data.concat(currentData.rows.slice(pageSize));
48
- }
49
- } else if (direction === 'forward') {
50
- // if the new data will exceed the dataset size, then chop off the start or end
51
- // this keeps the stored dataset to our preferred size
52
- if (currentData.rows.length >= DATASET_SIZE) {
53
- nextRows = currentData.rows.slice(DEFAULT_PAGE_SIZE).concat(response.data);
54
- } else {
55
- nextRows = currentData.rows.concat(response.data);
56
- }
57
- } else if (direction === 'backward') {
58
- if (currentData.rows.length >= DATASET_SIZE) {
59
- nextRows = response.data.concat(currentData.rows.slice(0, -1 * pageSize));
60
- } else {
61
- nextRows = currentData.rows.concat(response.data);
62
- }
63
- }
64
- return {
65
- rows: nextRows,
66
- pages: nextPages
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
- }, function () {});
71
- }, function (_wasThrown2, _result2) {
72
- // reset pending requests
73
- delete _pendingPageRequests.current[pageIndex];
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
- pages: Array.from(Array(response.length / pageSize).keys())
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, _lastFetchedPage.current), _lastUsedSorting.current, _lastUsedFilters.current, _lastUsedSearch.current, _lastUsedHiddenColumns.current, true);
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, _lastFetchedPage.current), sorting, _lastUsedFilters.current, _lastUsedSearch.current, _lastUsedHiddenColumns.current, true);
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(getCurrentPage(data.pages, _lastFetchedPage.current), _lastUsedSorting.current, filters, _lastUsedSearch.current, hiddenColumns, true);
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(getCurrentPage(data.pages, _lastFetchedPage.current), _lastUsedSorting.current, _lastUsedFilters.current, search, hiddenColumns, true);
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, lastFetchedPage) {
196
+ function getCurrentPage(currentPages) {
194
197
  if (currentPages.length <= 2) {
195
- var _currentPages$;
196
- return (_currentPages$ = currentPages[0]) !== null && _currentPages$ !== void 0 ? _currentPages$ : 0;
198
+ return currentPages[0];
197
199
  }
198
- var middle = Math.floor(DATASET_SIZE_MULTIPLIER / 2);
199
- if (lastFetchedPage.index) {
200
- if (!lastFetchedPage.direction) {
201
- return lastFetchedPage.index;
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 getDirection2(pageIndex, lastUsedPage) {
208
- if (lastUsedPage.index === undefined) {
209
- return undefined;
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, lastUsedPage, currentPages, direction) {
223
- if (currentPages.length && (pageIndex === lastUsedPage.index || currentPages.includes(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
- if (pageIndex === 0) {
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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"}