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

Sign up to get free protection for your applications and to get access to all the features.
@@ -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":";;;;;;;AAcA;AACA,SAASA,yBAAyBA,CAAkBC,KAAwB;EACxE,IAAMC,SAAS,GAAGD,KAAK,CAACE,OAAO,CAACC,IAA6B;EAC7D,IAAIC,MAAM,GAAG,CAAC;EAEd,IAAIH,SAAS,CAACI,MAAM,CAACC,SAAS,EAAE;IAC5BF,MAAM,IAAI,CAAC;;EAGf,IAAIJ,KAAK,CAACO,eAAe,EAAE,CAACC,MAAM,GAAG,CAAC,EAAE;IACpCJ,MAAM,IAAIJ,KAAK,CAACO,eAAe,EAAE,CAACC,MAAM,GAAG,CAAC;;EAGhD,IAAIC,MAAM,GAAGC,oBAAoB,CAACC,MAAM,GAAGP,MAAM;EAEjD,IAAMQ,UAAU,GAAGZ,KAAK,CAACa,aAAa,EAAE;EAExC,IAAID,UAAU,CAACJ,MAAM,EAAE;;IAEnBC,MAAM,IAAIC,oBAAoB,CAACT,SAAS,CAACa,SAAS,CAACL,MAAM,CAAC,GAAG,GAAG,GAAGG,UAAU,CAACJ,MAAM;;EAGxF,OAAOC,MAAM;AACjB;AAEA;AACA,SAASM,mBAAmBA,CAAkBf,KAAwB,EAAEE,OAA+B;;EACnG,IAAMU,UAAU,IAAAI,oBAAA,GAAGhB,KAAK,CAACa,aAAa,EAAE,cAAAG,oBAAA,cAAAA,oBAAA,GAAI,EAAE;EAC9C,OAAON,oBAAoB,CAACC,MAAM,KAAAM,qBAAA,GAAIf,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEgB,2BAA2B,cAAAD,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC,GAAGL,UAAU,CAACJ,MAAM;AACxG;SAEgBW,gBAAgBA,CAC5BC,SAAmC,EACnCpB,KAAwB,EACxBqB,QAAmC,EACnCb,MAAc,EACdc,qBAA0C,EAC1CpB,OAA+B;;EAE/B,IAAMD,SAAS,GAAGD,KAAK,CAACE,OAAO,CAACC,IAA6B;EAC7D,IAAMoB,iBAAiB,GAAG,CAAC,GAAAC,qBAAA,GAACxB,KAAK,CAACyB,QAAQ,EAAE,CAACC,QAAQ,cAAAF,qBAAA,eAAzBA,qBAAA,CAA2BhB,MAAM;EAC7D,IAAMmB,IAAI,IAAAC,oBAAA,GAAG5B,KAAK,CAAC6B,aAAa,EAAE,cAAAD,oBAAA,cAAAA,oBAAA,GAAI,EAAE;;EAGxC,IAAAE,qBAAA,GAA4CC,0BAA0B,CAAQ/B,KAAK,CAAC;IAA5EgC,iBAAiB,GAAAF,qBAAA,CAAjBE,iBAAiB;IAAEC,YAAY,GAAAH,qBAAA,CAAZG,YAAY;;EAGvC,IAAMC,cAAc,GAAGC,yBAAyB,CAAQnC,KAAK,CAAC;;EAG9D,IAAMoC,kBAAkB,GAAG1B,oBAAoB,CAACC,MAAM;EAEtD,IAAM0B,KAAK,GAAGpC,SAAS,CAACqC,MAAM,CAAChC,SAAS,IAAIL,SAAS,CAACqC,MAAM,CAACC,wBAAwB,GAAG/B,MAAM,GAAGmB,IAAI,CAACnB,MAAM;EAE5G,IAAMgC,WAAW,GAAGC,cAAc,CAAC;IAC/BJ,KAAK,EAALA,KAAK;IACLJ,YAAY,EAAZA,YAAY;IACZS,gBAAgB,EAAE,SAAAA;MAAA,OAAMrB,QAAQ,CAACsB,OAAO;;IACxCC,QAAQ,EAAE3C,SAAS,CAAC4C,QAAQ,CAACC,UAAU,GAAGT,KAAK,GAAGU,SAAS;IAC3Db,cAAc,EAAdA,cAAc;;IAEdE,kBAAkB,EAAlBA,kBAAkB;IAClBY,gBAAgB,EAAEjD,yBAAyB,CAACC,KAAK,CAAC;IAClDiD,UAAU,EAAElC,mBAAmB,CAACf,KAAK,EAAEE,OAAO;GACjD,CAAC;EAEF,IAAMgD,SAAS,GAAGV,WAAW,CAACW,YAAY,EAAE;EAC5C,IAAMC,YAAY,GAAGZ,WAAW,CAACa,eAAe,EAAE;EAElD,IAAMC,aAAa,GAAGC,cAAK,CAACC,WAAW,CACnC,UAACC,KAAa,EAAEvD;QAAAA;MAAAA,UAAuC;QAAEwD,KAAK,EAAE,MAAM;QAAEC,QAAQ,EAAE;OAAU;;IACxF,IAAMC,SAAS,GAAAC,QAAA,KAAqC3D,OAAO;MAAEyD,QAAQ,EAAE;MAAQ;IAE/E,IAAItC,QAAQ,CAACsB,OAAO,EAAE;MAClB,IAAIc,KAAK,KAAK,CAAC,EAAE;QACbjB,WAAW,CAACsB,cAAc,CAAC,CAAC,EAAEF,SAAS,CAAC;OAC3C,MAAM,IAAIH,KAAK,KAAKpB,KAAK,GAAG,CAAC,EAAE;;QAE5BhB,QAAQ,CAACsB,OAAO,CAACoB,SAAS,GAAG1C,QAAQ,CAACsB,OAAO,CAACqB,YAAY;OAC7D,MAAM;QACHxB,WAAW,CAACc,aAAa,CAACG,KAAK,EAAEvD,OAAO,CAAC;;;GAGpD,EACD,CAACkD,YAAY,CAAC5C,MAAM,EAAEa,QAAQ,CAACsB,OAAO,EAAEO,SAAS,EAAEb,KAAK,CAAC,CAC5D;;EAGD,IAAM4B,iBAAiB,GAAG1C,iBAAiB,IAAIc,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;EAEhE,IAAM6B,UAAU,GAAG3C,iBAAiB,GAC9B,EAAA4C,qBAAA,GAAAf,YAAY,CAACa,iBAAiB,CAAC,cAAAE,qBAAA,uBAA/BA,qBAAA,CAAiCC,KAAK,MAAAC,sBAAA,GAAGjB,YAAY,CAACa,iBAAiB,CAAC,cAAAI,sBAAA,uBAA/BA,sBAAA,CAAiCC,IAAI,KAAAC,sBAAA,GAC9EnB,YAAY,CAACa,iBAAiB,CAAC,cAAAM,sBAAA,uBAA/BA,sBAAA,CAAiCH,KAAK;;EAG5C,IAAAI,IAAA,GACIpB,YAAY,CAAC5C,MAAM,GAAG,CAAC,GACjB,CAACiE,IAAI,CAACC,GAAG,CAAC,CAAC,EAAER,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAI,CAAC,CAAC,EAAEO,IAAI,CAACC,GAAG,CAAC,CAAC,EAAExB,SAAS,KAAAyB,iBAAA,IAAAC,aAAA,GAAIxB,YAAY,CAACA,YAAY,CAAC5C,MAAM,GAAG,CAAC,CAAC,cAAAoE,aAAA,uBAArCA,aAAA,CAAuCC,GAAG,cAAAF,iBAAA,cAAAA,iBAAA,GAAI,CAAC,CAAC,CAAC,CAAC,GAC1G,CAAC,CAAC,EAAE,CAAC,CAAC;IAHTG,UAAU,GAAAN,IAAA;IAAEO,aAAa,GAAAP,IAAA;;EAMhCjB,cAAK,CAACyB,SAAS,CAAC;IACZ,IAAI1D,qBAAqB,EAAE;MACvBgC,aAAa,CAAChC,qBAAqB,EAAE;QAAEoC,KAAK,EAAE,QAAQ;QAAEC,QAAQ,EAAE;OAAQ,CAAC;;GAElF,EAAE,EAAE,CAAC;;EAGN,IAAIsB,KAAK,GAAkB,EAAE;EAC7B,IAAIC,OAAO,GAAkC,IAAI;;EAGjD,IAAI7C,KAAK,IAAIrC,KAAK,CAACa,aAAa,EAAE,CAACL,MAAM,EAAE;IACvCyE,KAAK,GAAG;MACJxE,MAAM,EAAEyC,SAAS;MACjB6B,aAAa,EAAEI,KAAK,CAACJ,aAAa,CAAC,GAAG,CAAC,GAAGA,aAAa;MACvDD,UAAU,EAAEK,KAAK,CAACL,UAAU,CAAC,GAAG,CAAC,GAAGA;KACvC;;;EAIL,IAAIzC,KAAK,EAAE;IACP6C,OAAO,GAAG9B,YAAY,CAACgC,GAAG,CAAC,UAAAC,UAAU;;;MAEjC,IAAI,CAACA,UAAU,EAAE;QACb,OAAO,IAAI;;MAGf,IAAIC,GAAqC;MAEzC,IAAIrF,SAAS,CAACqC,MAAM,CAAChC,SAAS,IAAIL,SAAS,CAACqC,MAAM,CAACC,wBAAwB,EAAE;QAAA,IAAAgD,qBAAA,EAAAC,sBAAA;QACzE,IAAMC,gBAAgB,GACjBhB,IAAI,CAACiB,KAAK,CAACL,UAAU,CAAC5B,KAAK,GAAGxD,SAAS,CAACqC,MAAM,CAACqD,QAAQ,CAAC,GAAG1F,SAAS,CAACqC,MAAM,CAACqD,QAAQ,GACrF1F,SAAS,CAACqC,MAAM,CAACqD,QAAQ;QAC7B,IAAMC,YAAY,IAAAL,qBAAA,IAAAC,sBAAA,GAAGvF,SAAS,CAACqC,MAAM,CAACuD,KAAK,cAAAL,sBAAA,uBAAtBA,sBAAA,CAAwBM,OAAO,CAACL,gBAAgB,CAAC,cAAAF,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC;QAE5E,IAAIK,YAAY,GAAG,CAAC,CAAC,EAAE;;;;UAInB,IAAMG,SAAS,GAAGH,YAAY,GAAG3F,SAAS,CAACqC,MAAM,CAACqD,QAAQ,GAAIN,UAAU,CAAC5B,KAAK,GAAGxD,SAAS,CAACqC,MAAM,CAACqD,QAAS;UAC3GL,GAAG,GAAG3D,IAAI,CAACoE,SAAS,CAAC;;OAE5B,MAAM;QACHT,GAAG,GAAG3D,IAAI,CAAC0D,UAAU,CAAC5B,KAAK,CAAC;;MAGhC,IAAI,GAAAuC,IAAA,GAACV,GAAG,cAAAU,IAAA,eAAHA,IAAA,CAAKC,QAAQ,GAAE;QAAA,IAAAC,qBAAA;QAChB,oBACI3C,6BAAC4C,WAAW;UACRC,GAAG,EAAEf,UAAU,CAAC5B,KAAK;UACrBA,KAAK,EAAE4B,UAAU,CAAC5B,KAAK;UACvB4C,eAAe,GAAAH,qBAAA,GAAE1D,WAAW,CAAC6D,eAAe,cAAAH,qBAAA,cAAAA,qBAAA,GAAInD,SAAS;UACzD/C,KAAK,EAAEA;UACT;;MAIV,IAAMsG,UAAU,GAAGtE,iBAAiB,CAACQ,WAAW,CAAC+D,UAAU,EAAElB,UAAU,CAAC;MACxE,oBACI9B,6BAACiD,GAAG;QACAJ,GAAG,EAAEd,GAAG,CAACmB,EAAE;QACXnB,GAAG,EAAEA,GAAG;QACR7B,KAAK,EAAE4B,UAAU,CAAC5B,KAAK;QACvB4C,eAAe,GAAAK,sBAAA,GAAElE,WAAW,CAAC6D,eAAe,cAAAK,sBAAA,cAAAA,sBAAA,GAAI3D,SAAS;QACzD/C,KAAK,EAAEA,KAAK;QACZsG,UAAU,EAAEA,UAAU;QACtBK,QAAQ,EAAEvF,SAAS,CAACkE,GAAG;QACvBsB,YAAY,EAAExF,SAAS,CAACyF;QAC1B;KAET,CAAC;;EAGN,OAAO;IACHlF,IAAI,EAAEuD,OAAO;IACbD,KAAK,EAALA,KAAK;IACL3B,aAAa,EAAbA;GACH;AACL;AAEA;AACA,SAASvB,0BAA0BA,CAAkB/B,KAAwB;EACzE,IAAMC,SAAS,GAAGD,KAAK,CAACE,OAAO,CAACC,IAA6B;EAC7D,IAAMwB,IAAI,GAAG3B,KAAK,CAAC8G,WAAW,EAAE,CAACnF,IAAI;EACrC,IAAMoF,aAAa,GAAG/G,KAAK,CAACyB,QAAQ,EAAE,CAACuF,QAAQ;EAE/C,IAAAC,eAAA,GAA8D1D,cAAK,CAAC2D,QAAQ,CAAyB,EAAE,CAAC;IAAjGC,uBAAuB,GAAAF,eAAA;IAAEG,0BAA0B,GAAAH,eAAA;;;EAI1D,IAAMI,wBAAwB,GAAG9D,cAAK,CAAC+D,OAAO,CAAC;IAC3C,IAAMC,MAAM,GAAaC,MAAM,CAACD,MAAM,CAACJ,uBAAuB,CAAC;IAC/D,OAAOI,MAAM,CAAC/G,MAAM,GAAG+G,MAAM,CAACE,MAAM,CAAC,UAACC,CAAC,EAAEC,CAAC;MAAA,OAAKD,CAAC,GAAGC,CAAC;OAAE,CAAC,CAAC,GAAGJ,MAAM,CAAC/G,MAAM,GAAG,CAAC;GAC/E,EAAE,CAAC2G,uBAAuB,CAAC,CAAC;;EAG7B,IAAMlF,YAAY,GAAGsB,cAAK,CAACC,WAAW,CAClC,UAACC,KAAa;;IACV,IAAM3C,SAAS,GAAGb,SAAS,CAACa,SAAS,CAACL,MAAM,GACtCC,oBAAoB,CAACT,SAAS,CAACa,SAAS,CAACL,MAAM,CAAC,GAChDC,oBAAoB,CAACC,MAAM;IAEjC,IAAIoG,aAAa,KAAK,IAAI,KAAAa,WAAA,GAAIjG,IAAI,CAAC8B,KAAK,CAAC,cAAAmE,WAAA,gBAAAC,qBAAA,GAAXD,WAAA,CAAaE,aAAa,cAAAD,qBAAA,eAA1BA,qBAAA,CAAAE,IAAA,CAAAH,YAA8B,EAAE;MAC1D,OAAO9G,SAAS,GAAGuG,wBAAwB;;IAG/C,OAAOvG,SAAS;GACnB,EACD,CAACb,SAAS,CAACa,SAAS,CAACL,MAAM,EAAE4G,wBAAwB,EAAEN,aAAa,CAAC,CACxE;EAED,IAAM/E,iBAAiB,GAAGuB,cAAK,CAACC,WAAW,CACvC,UAAC+C,UAAqD,EAAElB,UAAuB;IAAA,OAC3E,UAACvE,SAAiB,EAAEkH,eAAwB;;MAExC,IAAIA,eAAe,EAAE;QACjBZ,0BAA0B,CAAC,UAAAa,KAAK;UAAA,IAAAC,SAAA;UAAA,OAAArE,QAAA,KAAUoE,KAAK,GAAAC,SAAA,OAAAA,SAAA,CAAG7C,UAAU,CAAC5B,KAAK,IAAGuE,eAAe,EAAAE,SAAA;SAAG,CAAC;;;MAI5F3B,UAAU,CAAClB,UAAU,EAAEvE,SAAS,IAAIkH,eAAe,aAAfA,eAAe,cAAfA,eAAe,GAAI,CAAC,CAAC,CAAC;KAC7D;KACL,EAAE,CACL;EAED,OAAO;IAAE/F,YAAY,EAAZA,YAAY;IAAED,iBAAiB,EAAjBA;GAAmB;AAC9C;AAEA;AACA,SAASG,yBAAyBA,CAAkBnC,KAAwB;EACxE,IAAM2B,IAAI,GAAG3B,KAAK,CAAC8G,WAAW,EAAE,CAACnF,IAAI;EACrC,IAAMwG,cAAc,GAAG,CAAC,CAACnI,KAAK,CAACyB,QAAQ,EAAE,CAACC,QAAQ,CAAClB,MAAM;EAEzD,IAAM4H,eAAe,GAAG7E,cAAK,CAAC+D,OAAO,CAAC;IAClC,IAAMe,OAAO,GAAa,EAAE;IAE5B,IAAIF,cAAc,EAAE;MAChBxG,IAAI,CAAC2G,OAAO,CAAC,UAAChD,GAAG,EAAE7B,KAAK;QACpB,IAAI6B,GAAG,CAACiD,YAAY,EAAE,EAAE;UACpBF,OAAO,CAACG,IAAI,CAAC/E,KAAK,CAAC;;OAE1B,CAAC;;IAGN,OAAO4E,OAAO;GACjB,EAAE,CAAC1G,IAAI,CAAC,CAAC;;EAGV,IAAMO,cAAc,GAAGqB,cAAK,CAACC,WAAW,CACpC,UAAAiF,KAAK;;IACD,IAAMC,mBAAmB,IAAAC,aAAA,GACrB,GAAAC,MAAA,CAAIR,eAAe,EAAES,OAAO,EAAE,CAACC,IAAI,CAAC,UAAArF,KAAK;MAAA,OAAIgF,KAAK,CAACM,UAAU,IAAItF,KAAK;MAAC,cAAAkF,aAAA,cAAAA,aAAA,GAAIP,eAAe,CAAC,CAAC,CAAC;IAEjG,IAAMY,IAAI,GAAG,IAAIC,GAAG,EAAEP,mBAAmB,EAAAE,MAAA,CAAKM,qBAAqB,CAACT,KAAK,CAAC,CAAC,CAAC;IAC5E,OAAO,GAAAG,MAAA,CAAII,IAAI,EAAEG,IAAI,CAAC,UAACzB,CAAC,EAAEC,CAAC;MAAA,OAAKD,CAAC,GAAGC,CAAC;MAAC;GACzC,EACD,CAACS,eAAe,CAAC,CACpB;EAED,OAAOD,cAAc,GAAGjG,cAAc,GAAGa,SAAS;AACtD;;;;"}
@@ -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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"}