@multiplatform.one/table 7.34.1 → 7.34.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/dist/cjs/components/ChildTable/index.native.js +1 -1
  2. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  3. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +1 -1
  4. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  5. package/dist/cjs/components/DataTable/CellContent.native.js.map +1 -1
  6. package/dist/cjs/components/DataTable/DataTableCardControls.native.js +1 -1
  7. package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableContext.native.js.map +1 -1
  9. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -1
  10. package/dist/cjs/components/DataTable/DataTableInfiniteTail.cjs +16 -0
  11. package/dist/cjs/components/DataTable/DataTableInfiniteTail.native.js +16 -0
  12. package/dist/cjs/components/DataTable/DataTableInfiniteTail.native.js.map +1 -1
  13. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  14. package/dist/cjs/components/DataTable/DataTableRoot.cjs +7 -6
  15. package/dist/cjs/components/DataTable/DataTableRoot.native.js +15 -14
  16. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  17. package/dist/cjs/components/DataTable/DataTableStateContext.native.js.map +1 -1
  18. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  19. package/dist/cjs/components/DataTable/NativeInfiniteSentinel.native.js.map +1 -1
  20. package/dist/cjs/components/DataTable/dataTableChrome.native.js.map +1 -1
  21. package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -1
  22. package/dist/cjs/components/DataTable/index.native.js +16 -14
  23. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  24. package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -1
  25. package/dist/cjs/components/DataTableBulkActions/index.native.js.map +1 -1
  26. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  27. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  28. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  29. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  30. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  31. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -1
  32. package/dist/cjs/components/DataTableFilterButton/index.native.js +1 -1
  33. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  34. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -1
  35. package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
  36. package/dist/cjs/components/DataTableFilters/index.native.js +2 -2
  37. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  38. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  39. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  40. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  41. package/dist/cjs/components/DataTableToolbar/index.native.js +2 -2
  42. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  43. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  44. package/dist/cjs/components/FilterManager.native.js.map +1 -1
  45. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  46. package/dist/cjs/components/KnobDialog.native.js.map +1 -1
  47. package/dist/cjs/components/SavedFilterDropdown.native.js.map +1 -1
  48. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  49. package/dist/cjs/components/TableInput/RowDetailEditor.native.js +1 -1
  50. package/dist/cjs/components/TableInput/index.native.js +1 -1
  51. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  52. package/dist/cjs/hooks/useDataTable.cjs +4 -0
  53. package/dist/cjs/hooks/useDataTable.native.js +4 -0
  54. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  55. package/dist/cjs/hooks/useDataTableKeyboard.native.js.map +1 -1
  56. package/dist/cjs/hooks/useDragScroll.native.js.map +1 -1
  57. package/dist/cjs/hooks/useInfiniteRows.cjs +35 -3
  58. package/dist/cjs/hooks/useInfiniteRows.native.js +46 -3
  59. package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
  60. package/dist/cjs/hooks/useSavedFilters.native.js.map +1 -1
  61. package/dist/cjs/hooks/useTableColumnPinning.native.js.map +1 -1
  62. package/dist/cjs/hooks/useTableFiltering.native.js.map +1 -1
  63. package/dist/cjs/hooks/useTableGrouping.native.js.map +1 -1
  64. package/dist/cjs/hooks/useTableKeyboard.native.js.map +1 -1
  65. package/dist/cjs/hooks/useTablePagination.native.js.map +1 -1
  66. package/dist/cjs/hooks/useTableSearch.native.js.map +1 -1
  67. package/dist/cjs/hooks/useTableSelection.native.js.map +1 -1
  68. package/dist/cjs/hooks/useTableSorting.native.js.map +1 -1
  69. package/dist/cjs/hooks/useTableUrlSync.native.js.map +1 -1
  70. package/dist/cjs/hooks/useTableViews.native.js.map +1 -1
  71. package/dist/cjs/index.native.js +20 -20
  72. package/dist/cjs/index.native.js.map +1 -1
  73. package/dist/cjs/shared/devWarn.native.js.map +1 -1
  74. package/dist/cjs/shared/t.native.js.map +1 -1
  75. package/dist/cjs/shims/primitives.native.js.map +1 -1
  76. package/dist/cjs/shims/tableCellContext.native.js.map +1 -1
  77. package/dist/cjs/types.native.js.map +1 -1
  78. package/dist/cjs/utils/chromeIcons.native.js.map +1 -1
  79. package/dist/cjs/utils/columnAlign.native.js.map +1 -1
  80. package/dist/cjs/utils/filterFields.native.js.map +1 -1
  81. package/dist/cjs/utils/filterUtils.native.js.map +1 -1
  82. package/dist/cjs/utils/money.native.js.map +1 -1
  83. package/dist/cjs/utils/paginationDefaults.native.js.map +1 -1
  84. package/dist/cjs/utils/rowAccumulator.native.js.map +1 -1
  85. package/dist/cjs/utils/rowPress.native.js.map +1 -1
  86. package/dist/cjs/utils/urlStateUtils.native.js.map +1 -1
  87. package/dist/cjs/utils/viewData.native.js.map +1 -1
  88. package/dist/cjs/utils/withInterp.native.js.map +1 -1
  89. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  90. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  91. package/dist/esm/components/DataTable/CellContent.native.js.map +1 -1
  92. package/dist/esm/components/DataTable/DataTableCardControls.native.js.map +1 -1
  93. package/dist/esm/components/DataTable/DataTableContext.native.js.map +1 -1
  94. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -1
  95. package/dist/esm/components/DataTable/DataTableInfiniteTail.mjs +17 -1
  96. package/dist/esm/components/DataTable/DataTableInfiniteTail.mjs.map +1 -1
  97. package/dist/esm/components/DataTable/DataTableInfiniteTail.native.js +17 -1
  98. package/dist/esm/components/DataTable/DataTableInfiniteTail.native.js.map +1 -1
  99. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  100. package/dist/esm/components/DataTable/DataTableRoot.mjs +7 -6
  101. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  102. package/dist/esm/components/DataTable/DataTableRoot.native.js +8 -7
  103. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  104. package/dist/esm/components/DataTable/DataTableStateContext.native.js.map +1 -1
  105. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  106. package/dist/esm/components/DataTable/NativeInfiniteSentinel.native.js.map +1 -1
  107. package/dist/esm/components/DataTable/dataTableChrome.native.js.map +1 -1
  108. package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -1
  109. package/dist/esm/components/DataTable/index.native.js +6 -4
  110. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  111. package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -1
  112. package/dist/esm/components/DataTableBulkActions/index.native.js.map +1 -1
  113. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  114. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  115. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  116. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  117. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  118. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -1
  119. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  120. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -1
  121. package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
  122. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  123. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  124. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  125. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  126. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  127. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  128. package/dist/esm/components/FilterManager.native.js.map +1 -1
  129. package/dist/esm/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  130. package/dist/esm/components/KnobDialog.native.js.map +1 -1
  131. package/dist/esm/components/SavedFilterDropdown.native.js.map +1 -1
  132. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  133. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  134. package/dist/esm/hooks/useDataTable.mjs +4 -0
  135. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  136. package/dist/esm/hooks/useDataTable.native.js +4 -0
  137. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  138. package/dist/esm/hooks/useDataTableKeyboard.native.js.map +1 -1
  139. package/dist/esm/hooks/useDragScroll.native.js.map +1 -1
  140. package/dist/esm/hooks/useInfiniteRows.mjs +35 -3
  141. package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
  142. package/dist/esm/hooks/useInfiniteRows.native.js +46 -3
  143. package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
  144. package/dist/esm/hooks/useSavedFilters.native.js.map +1 -1
  145. package/dist/esm/hooks/useTableColumnPinning.native.js.map +1 -1
  146. package/dist/esm/hooks/useTableFiltering.native.js.map +1 -1
  147. package/dist/esm/hooks/useTableGrouping.native.js.map +1 -1
  148. package/dist/esm/hooks/useTableKeyboard.native.js.map +1 -1
  149. package/dist/esm/hooks/useTablePagination.native.js.map +1 -1
  150. package/dist/esm/hooks/useTableSearch.native.js.map +1 -1
  151. package/dist/esm/hooks/useTableSelection.native.js.map +1 -1
  152. package/dist/esm/hooks/useTableSorting.native.js.map +1 -1
  153. package/dist/esm/hooks/useTableUrlSync.native.js.map +1 -1
  154. package/dist/esm/hooks/useTableViews.native.js.map +1 -1
  155. package/dist/esm/index.native.js.map +1 -1
  156. package/dist/esm/shared/devWarn.native.js.map +1 -1
  157. package/dist/esm/shared/t.native.js.map +1 -1
  158. package/dist/esm/shims/primitives.native.js.map +1 -1
  159. package/dist/esm/shims/tableCellContext.native.js.map +1 -1
  160. package/dist/esm/types.native.js.map +1 -1
  161. package/dist/esm/utils/chromeIcons.native.js.map +1 -1
  162. package/dist/esm/utils/columnAlign.native.js.map +1 -1
  163. package/dist/esm/utils/filterFields.native.js.map +1 -1
  164. package/dist/esm/utils/filterUtils.native.js.map +1 -1
  165. package/dist/esm/utils/money.native.js.map +1 -1
  166. package/dist/esm/utils/paginationDefaults.native.js.map +1 -1
  167. package/dist/esm/utils/rowAccumulator.native.js.map +1 -1
  168. package/dist/esm/utils/rowPress.native.js.map +1 -1
  169. package/dist/esm/utils/urlStateUtils.native.js.map +1 -1
  170. package/dist/esm/utils/viewData.native.js.map +1 -1
  171. package/dist/esm/utils/withInterp.native.js.map +1 -1
  172. package/dist/jsx/components/DataTable/DataTableInfiniteTail.mjs +17 -1
  173. package/dist/jsx/components/DataTable/DataTableInfiniteTail.mjs.map +1 -1
  174. package/dist/jsx/components/DataTable/DataTableInfiniteTail.native.js +16 -0
  175. package/dist/jsx/components/DataTable/DataTableInfiniteTail.native.js.map +1 -1
  176. package/dist/jsx/components/DataTable/DataTableRoot.mjs +7 -6
  177. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  178. package/dist/jsx/components/DataTable/DataTableRoot.native.js +8 -7
  179. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  180. package/dist/jsx/components/DataTable/index.native.js +6 -4
  181. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  182. package/dist/jsx/hooks/useDataTable.mjs +4 -0
  183. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  184. package/dist/jsx/hooks/useDataTable.native.js +4 -0
  185. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  186. package/dist/jsx/hooks/useInfiniteRows.mjs +35 -3
  187. package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
  188. package/dist/jsx/hooks/useInfiniteRows.native.js +46 -3
  189. package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
  190. package/package.json +15 -15
  191. package/src/components/DataTable/DataTableInfiniteTail.tsx +21 -3
  192. package/src/components/DataTable/DataTableRoot.tsx +7 -6
  193. package/src/components/DataTable/index.native.tsx +5 -4
  194. package/src/components/DataTable/infiniteMode.spec.tsx +91 -2
  195. package/src/hooks/useDataTable.ts +4 -0
  196. package/src/hooks/useInfiniteRows.spec.tsx +84 -0
  197. package/src/hooks/useInfiniteRows.ts +49 -3
  198. package/src/types.ts +9 -1
  199. package/types/components/DataTable/DataTableInfiniteTail.d.ts +3 -2
  200. package/types/components/DataTable/DataTableInfiniteTail.d.ts.map +1 -1
  201. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  202. package/types/components/DataTable/index.native.d.ts.map +1 -1
  203. package/types/hooks/useDataTable.d.ts.map +1 -1
  204. package/types/hooks/useInfiniteRows.d.ts +11 -0
  205. package/types/hooks/useInfiniteRows.d.ts.map +1 -1
  206. package/types/types.d.ts +9 -1
  207. package/types/types.d.ts.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/table",
3
- "version": "7.34.1",
3
+ "version": "7.34.2",
4
4
  "description": "Advanced table components with filtering, pagination, sorting, and URL state management",
5
5
  "keywords": [
6
6
  "cross-platform",
@@ -74,30 +74,30 @@
74
74
  "access": "public"
75
75
  },
76
76
  "dependencies": {
77
- "@multiplatform.one/components": "7.34.1",
78
- "@multiplatform.one/forms": "7.34.1",
79
- "@multiplatform.one/platform": "7.34.1",
80
- "@multiplatform.one/rich-text": "7.34.1",
81
- "@multiplatform.one/router": "7.34.1",
82
- "@multiplatform.one/table-primitives": "7.34.1",
83
- "@multiplatform.one/theme": "7.34.1",
77
+ "@multiplatform.one/components": "7.34.2",
78
+ "@multiplatform.one/forms": "7.34.2",
79
+ "@multiplatform.one/platform": "7.34.2",
80
+ "@multiplatform.one/rich-text": "7.34.2",
81
+ "@multiplatform.one/router": "7.34.2",
82
+ "@multiplatform.one/table-primitives": "7.34.2",
83
+ "@multiplatform.one/theme": "7.34.2",
84
84
  "@phosphor-icons/react": "^2.1.10",
85
85
  "@shopify/flash-list": "^2.3.1",
86
86
  "@tamagui/roving-focus": "2.7.6",
87
87
  "@tanstack/react-table": "^8.21.3",
88
- "@tanstack/react-virtual": "^3.13.24",
88
+ "@tanstack/react-virtual": "^3.14.20",
89
89
  "@tanstack/table-core": "^8.21.3",
90
90
  "tamagui": "2.7.6"
91
91
  },
92
92
  "devDependencies": {
93
- "@multiplatform.one/config": "7.34.1",
94
- "@multiplatform.one/router": "7.34.1",
95
- "@multiplatform.one/storybook": "7.34.1",
96
- "@multiplatform.one/test-utils": "7.34.1",
93
+ "@multiplatform.one/config": "7.34.2",
94
+ "@multiplatform.one/router": "7.34.2",
95
+ "@multiplatform.one/storybook": "7.34.2",
96
+ "@multiplatform.one/test-utils": "7.34.2",
97
97
  "@tamagui/build": "2.7.6",
98
- "@testing-library/react": "^16.3.2",
98
+ "@testing-library/react": "^16.3.3",
99
99
  "@types/react-dom": "^19.2.3",
100
- "@vitejs/plugin-react": "^6.0.1",
100
+ "@vitejs/plugin-react": "^6.1.2",
101
101
  "@vitest/coverage-v8": "^4.1.5",
102
102
  "i18next": "^25.10.10",
103
103
  "react": "19.2.5",
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Infinite mode tail, shared by the web and native roots: the load-more
3
3
  * trigger each platform supplies, an append skeleton bounded by the actual
4
- * load (no infinite spinner), and an honest, announced end-of-data state
5
- * (DG-ST-01/04).
4
+ * load (no infinite spinner), an honest, announced end-of-data state
5
+ * (DG-ST-01/04), and a failed append as a retryable error that keeps the
6
+ * loaded rows above it (LC-84).
6
7
  */
7
8
 
8
- import { Skeleton } from "@multiplatform.one/components";
9
+ import { AsyncBoundary, Skeleton } from "@multiplatform.one/components";
9
10
  import type { ReactNode } from "react";
10
11
  import { useTranslation } from "react-i18next";
11
12
  import { Text, View } from "tamagui";
@@ -35,6 +36,23 @@ export function DataTableInfiniteTail({
35
36
  sentinel,
36
37
  }: DataTableInfiniteTailProps) {
37
38
  const { t } = useTranslation();
39
+ if (infinite.appendError) {
40
+ return (
41
+ <View
42
+ flexDirection="column"
43
+ width="100%"
44
+ paddingVertical="$2"
45
+ {...({ "data-testid": "infinite-append-error" } as any)}
46
+ >
47
+ <AsyncBoundary
48
+ error={infinite.appendError}
49
+ onRetry={infinite.retryAppend}
50
+ errorTitle={t("Couldn't load more rows")}
51
+ compact
52
+ />
53
+ </View>
54
+ );
55
+ }
38
56
  return (
39
57
  <View flexDirection="column" width="100%">
40
58
  {sentinel}
@@ -418,7 +418,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
418
418
  // while the sentinel stays on screen.
419
419
  const sentinelRef = useRef<HTMLElement | null>(null);
420
420
  React.useEffect(() => {
421
- if (!infinite || isVirtualized || infinite.exhausted) return;
421
+ if (!infinite || isVirtualized || infinite.exhausted || infinite.appendError) return;
422
422
  if (!isWeb || typeof IntersectionObserver === "undefined") return;
423
423
  const node = sentinelRef.current;
424
424
  if (!node) return;
@@ -432,7 +432,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
432
432
  );
433
433
  observer.observe(node);
434
434
  return () => observer.disconnect();
435
- }, [!!infinite, infinite?.exhausted, isVirtualized, tableRows.length]);
435
+ }, [!!infinite, infinite?.exhausted, !!infinite?.appendError, isVirtualized, tableRows.length]);
436
436
 
437
437
  const isFlexLayout = columnLayout !== "auto";
438
438
  const displayMode = isFlexLayout ? ("flex" as const) : ("table" as const);
@@ -1262,11 +1262,12 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
1262
1262
  // skeleton only when there are no rows to hold (first load).
1263
1263
  const resolvedAriaLabel = ariaLabel || t("Data table");
1264
1264
  const isRefetching = queryInFlight;
1265
- if (state.error) {
1265
+ const loadError = state.error ?? infinite?.error;
1266
+ if (loadError) {
1266
1267
  return (
1267
1268
  <AsyncBoundary
1268
- error={state.error}
1269
- onRetry={onRetry}
1269
+ error={loadError}
1270
+ onRetry={state.error ? onRetry : infinite?.retry}
1270
1271
  layout="table"
1271
1272
  errorTitle={t("Couldn't load table")}
1272
1273
  compact
@@ -2241,7 +2242,7 @@ export function DataTableRoot<TData extends Record<string, any> = Record<string,
2241
2242
  fontSize={knobProps.sizeToken}
2242
2243
  gapProps={knobProps.gap}
2243
2244
  sentinel={
2244
- !isVirtualized && !infinite.exhausted && isWeb ? (
2245
+ !isVirtualized && !infinite.exhausted && !infinite.appendError && isWeb ? (
2245
2246
  <View
2246
2247
  // @ts-ignore web ref for IntersectionObserver
2247
2248
  ref={sentinelRef as any}
@@ -695,11 +695,12 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
695
695
  };
696
696
 
697
697
  // W9 / DG-ST-01,02,04 — error wins over empty; initial load uses table skeleton.
698
- if (state.error) {
698
+ const loadError = state.error ?? infinite?.error;
699
+ if (loadError) {
699
700
  return (
700
701
  <AsyncBoundary
701
- error={state.error}
702
- onRetry={onRetry}
702
+ error={loadError}
703
+ onRetry={state.error ? onRetry : infinite?.retry}
703
704
  layout="table"
704
705
  errorTitle={t("Couldn't load table")}
705
706
  compact
@@ -1056,7 +1057,7 @@ function DataTableRoot<TData extends Record<string, any> = Record<string, any>>(
1056
1057
  fontSize={knobProps.sizeToken}
1057
1058
  gapProps={knobProps.gap}
1058
1059
  sentinel={
1059
- !isVirtualGrid && !infinite.exhausted ? (
1060
+ !isVirtualGrid && !infinite.exhausted && !infinite.appendError ? (
1060
1061
  <NativeInfiniteSentinel
1061
1062
  onVisible={infinite.loadMore}
1062
1063
  leadPx={INFINITE_TRIGGER_ROWS * rowHeightPx}
@@ -5,8 +5,9 @@
5
5
  */
6
6
 
7
7
  import { renderWithProviders } from "@multiplatform.one/test-utils";
8
- import { waitFor } from "@testing-library/react";
9
- import { describe, expect, it, vi } from "vitest";
8
+ import { screen, waitFor } from "@testing-library/react";
9
+ import userEvent from "@testing-library/user-event";
10
+ import { afterEach, describe, expect, it, vi } from "vitest";
10
11
  import type { DataTableColumn, PageLoadQuery, PageLoadResult } from "../../types";
11
12
  import { DataTable } from "./index";
12
13
 
@@ -115,4 +116,92 @@ describe("DataTable paginationMode", () => {
115
116
  // Exactly one page-0 probe; nothing else to prefetch.
116
117
  expect(loader.mock.calls.map(([q]) => q.pageIndex)).toEqual([0]);
117
118
  });
119
+
120
+ // MPO-485 / LC-84 DG-ST-01: empty is not error is not loading.
121
+ describe("loader failures", () => {
122
+ afterEach(() => {
123
+ vi.unstubAllGlobals();
124
+ });
125
+
126
+ it("a rejected page 0 renders error chrome with Retry, never the empty state", async () => {
127
+ let fail = true;
128
+ const loader = vi.fn(async (q: PageLoadQuery): Promise<PageLoadResult<Row>> => {
129
+ if (fail) throw new Error("Pokemon is being migrated");
130
+ const start = q.pageIndex * q.pageSize;
131
+ return { rows: rows.slice(start, start + q.pageSize), totalCount: rows.length };
132
+ });
133
+ const user = userEvent.setup();
134
+ const { container } = renderWithProviders(
135
+ <DataTable
136
+ data={[]}
137
+ columns={columns}
138
+ readOnly
139
+ paginationMode="infinite"
140
+ loadPage={loader}
141
+ initialState={{ pagination: { pageIndex: 0, pageSize: 10 } }}
142
+ />,
143
+ );
144
+
145
+ await waitFor(() =>
146
+ expect(container.querySelector('[data-async-state="error"]')).not.toBeNull(),
147
+ );
148
+ expect(screen.getByText("Pokemon is being migrated")).toBeDefined();
149
+ expect(screen.queryByText("No data available")).toBeNull();
150
+
151
+ fail = false;
152
+ await user.click(screen.getByText("Retry"));
153
+ await waitFor(() => expect(screen.getByText("Row 1")).toBeDefined());
154
+ expect(container.querySelector('[data-async-state="error"]')).toBeNull();
155
+ });
156
+
157
+ it("a rejected append keeps the loaded rows and shows a retryable tail error", async () => {
158
+ // jsdom has no layout: the sentinel reports in view on observe, like a
159
+ // short page whose tail is on screen.
160
+ vi.stubGlobal(
161
+ "IntersectionObserver",
162
+ class {
163
+ private cb: IntersectionObserverCallback;
164
+ constructor(cb: IntersectionObserverCallback) {
165
+ this.cb = cb;
166
+ }
167
+ observe() {
168
+ this.cb([{ isIntersecting: true } as IntersectionObserverEntry], this as any);
169
+ }
170
+ disconnect() {}
171
+ unobserve() {}
172
+ takeRecords() {
173
+ return [];
174
+ }
175
+ },
176
+ );
177
+ let failAppend = true;
178
+ const loader = vi.fn(async (q: PageLoadQuery): Promise<PageLoadResult<Row>> => {
179
+ if (q.pageIndex > 0 && failAppend) throw new Error("Row read refused");
180
+ const start = q.pageIndex * q.pageSize;
181
+ return { rows: rows.slice(start, start + q.pageSize), totalCount: rows.length };
182
+ });
183
+ const user = userEvent.setup();
184
+ const { container } = renderWithProviders(
185
+ <DataTable
186
+ data={[]}
187
+ columns={columns}
188
+ readOnly
189
+ paginationMode="infinite"
190
+ loadPage={loader}
191
+ initialState={{ pagination: { pageIndex: 0, pageSize: 10 } }}
192
+ />,
193
+ );
194
+
195
+ await waitFor(() => expect(screen.getByText("Row read refused")).toBeDefined());
196
+ expect(screen.getByText("Row 1")).toBeDefined();
197
+ expect(screen.getByText("Row 10")).toBeDefined();
198
+ expect(screen.queryByText("End of results")).toBeNull();
199
+ expect(container.querySelector('[data-testid="infinite-append-error"]')).not.toBeNull();
200
+
201
+ failAppend = false;
202
+ await user.click(screen.getByText("Retry"));
203
+ await waitFor(() => expect(screen.getByText("Row 11")).toBeDefined());
204
+ expect(screen.queryByText("Row read refused")).toBeNull();
205
+ });
206
+ });
118
207
  });
@@ -709,6 +709,10 @@ export function useDataTable<TData extends DataTableData = DataTableData>({
709
709
  : infiniteRows.loadedPages * pagination.pageSize >= rowModelCount,
710
710
  isInitialLoading: infiniteRows.isInitialLoading,
711
711
  isAppending: infiniteRows.isAppending,
712
+ error: infiniteRows.error,
713
+ retry: infiniteRows.retry,
714
+ appendError: infiniteRows.appendError,
715
+ retryAppend: infiniteRows.retryAppend,
712
716
  loadMore: loadMoreInfinite,
713
717
  }
714
718
  : undefined;
@@ -216,6 +216,90 @@ describe("useInfiniteRows", () => {
216
216
  });
217
217
  });
218
218
 
219
+ // MPO-485 / LC-84 DG-ST-01: a failed load is an error, never an empty list.
220
+ describe("loader mode failures", () => {
221
+ it("keeps a failed page 0 as an error instead of settling empty", async () => {
222
+ const loader = vi.fn(async (_q: PageLoadQuery): Promise<PageLoadResult<Row>> => {
223
+ throw new Error("Pokemon is being migrated");
224
+ });
225
+ const { result } = renderHook(() => useInfiniteRows<Row>({ ...baseQuery, loadPage: loader }));
226
+
227
+ await waitFor(() => expect(result.current.error).toBeInstanceOf(Error));
228
+ expect(result.current.error?.message).toBe("Pokemon is being migrated");
229
+ expect(result.current.isInitialLoading).toBe(false);
230
+ expect(result.current.rows).toEqual([]);
231
+ expect(result.current.exhausted).toBe(false);
232
+ });
233
+
234
+ it("retry re-runs page 0 and the rows land when it succeeds", async () => {
235
+ let fail = true;
236
+ const ok = makeInstantLoader();
237
+ const loader = vi.fn(async (q: PageLoadQuery): Promise<PageLoadResult<Row>> => {
238
+ if (fail) throw new Error("timed out");
239
+ return ok(q);
240
+ });
241
+ const { result } = renderHook(() => useInfiniteRows<Row>({ ...baseQuery, loadPage: loader }));
242
+ await waitFor(() => expect(result.current.error).toBeDefined());
243
+
244
+ fail = false;
245
+ act(() => result.current.retry());
246
+ expect(result.current.isInitialLoading).toBe(true);
247
+ await waitFor(() => expect(result.current.rows).toHaveLength(20));
248
+ expect(result.current.error).toBeUndefined();
249
+ expect(loader.mock.calls.filter(([q]) => q.pageIndex === 0)).toHaveLength(2);
250
+ });
251
+
252
+ it("a failed append keeps the loaded rows and a retryable tail error", async () => {
253
+ let failAppend = true;
254
+ const ok = makeInstantLoader();
255
+ const loader = vi.fn(async (q: PageLoadQuery): Promise<PageLoadResult<Row>> => {
256
+ if (q.pageIndex > 0 && failAppend) throw new Error("Row read refused");
257
+ return ok(q);
258
+ });
259
+ const { result } = renderHook(() => useInfiniteRows<Row>({ ...baseQuery, loadPage: loader }));
260
+ await waitFor(() => expect(result.current.rows).toHaveLength(20));
261
+ await act(async () => {});
262
+
263
+ await act(async () => {
264
+ result.current.loadMore();
265
+ });
266
+ await waitFor(() => expect(result.current.appendError).toBeInstanceOf(Error));
267
+ expect(result.current.appendError?.message).toBe("Row read refused");
268
+ expect(result.current.rows).toHaveLength(20);
269
+ expect(result.current.error).toBeUndefined();
270
+ expect(result.current.exhausted).toBe(false);
271
+ expect(result.current.isAppending).toBe(false);
272
+
273
+ // The sentinel stays in view after a failure; loadMore must not spin.
274
+ const callsAfterFailure = loader.mock.calls.length;
275
+ act(() => result.current.loadMore());
276
+ expect(loader.mock.calls.length).toBe(callsAfterFailure);
277
+
278
+ failAppend = false;
279
+ await act(async () => {
280
+ result.current.retryAppend();
281
+ });
282
+ await waitFor(() => expect(result.current.rows).toHaveLength(40));
283
+ expect(result.current.appendError).toBeUndefined();
284
+ });
285
+
286
+ it("a query change clears a page 0 error", async () => {
287
+ const loader = vi.fn(async (q: PageLoadQuery): Promise<PageLoadResult<Row>> => {
288
+ if (q.globalFilter === "") throw new Error("bad");
289
+ return { rows: ROWS.slice(0, 5), totalCount: 5 };
290
+ });
291
+ const { result, rerender } = renderHook(
292
+ ({ globalFilter }: { globalFilter: string }) =>
293
+ useInfiniteRows<Row>({ ...baseQuery, globalFilter, loadPage: loader }),
294
+ { initialProps: { globalFilter: "" } },
295
+ );
296
+ await waitFor(() => expect(result.current.error).toBeDefined());
297
+ rerender({ globalFilter: "x" });
298
+ await waitFor(() => expect(result.current.rows).toHaveLength(5));
299
+ expect(result.current.error).toBeUndefined();
300
+ });
301
+ });
302
+
219
303
  describe("client mode", () => {
220
304
  it("reveals chunks and clamps at the row-model count", () => {
221
305
  const { result } = renderHook(() => useInfiniteRows<Row>({ ...baseQuery }));
@@ -59,12 +59,27 @@ export interface UseInfiniteRowsReturn<TData = any> {
59
59
  isPlaceholderData: boolean;
60
60
  /** Loader mode: a page append is awaiting the loader (cache miss) */
61
61
  isAppending: boolean;
62
+ /** Loader mode: page 0 for the current query failed (LC-84: an error, never empty) */
63
+ error?: Error;
64
+ /** Re-run page 0 for the current query after a failure */
65
+ retry: () => void;
66
+ /**
67
+ * Loader mode: the last append failed. Loaded rows stay; loadMore is a no-op
68
+ * until retryAppend, so an in-view sentinel cannot spin on a failing page.
69
+ */
70
+ appendError?: Error;
71
+ /** Clear the append error and load the next page again */
72
+ retryAppend: () => void;
62
73
  /** Append the next page (loader mode) */
63
74
  loadMore: () => void;
64
75
  /** Reveal the next chunk (client mode); maxRowCount clamps exhaustion */
65
76
  loadMoreClient: (maxRowCount: number) => void;
66
77
  }
67
78
 
79
+ function toError(reason: unknown): Error {
80
+ return reason instanceof Error ? reason : new Error(String(reason ?? ""));
81
+ }
82
+
68
83
  function isLastPage(result: PageLoadResult, pagesLoaded: number, pageSize: number): boolean {
69
84
  if (result.rows.length < pageSize) return true;
70
85
  if (result.totalCount != null && pagesLoaded * pageSize >= result.totalCount) return true;
@@ -113,6 +128,11 @@ export function useInfiniteRows<TData = any>({
113
128
  const [isFetching, setIsFetching] = useState(false);
114
129
  const [isPlaceholderData, setIsPlaceholderData] = useState(false);
115
130
  const [isAppending, setIsAppending] = useState(false);
131
+ const [error, setError] = useState<Error | undefined>(undefined);
132
+ const [appendError, setAppendError] = useState<Error | undefined>(undefined);
133
+ const appendErrorRef = useRef<Error | undefined>(undefined);
134
+ appendErrorRef.current = appendError;
135
+ const [retryToken, setRetryToken] = useState(0);
116
136
  /** True after the first successful page-0 settle — later query-key
117
137
  * changes keep the previous rows (or an empty body) mounted. */
118
138
  const hasLoadedRef = useRef(false);
@@ -169,6 +189,9 @@ export function useInfiniteRows<TData = any>({
169
189
  appendPendingRef.current = false;
170
190
  setExhausted(false);
171
191
  setIsAppending(false);
192
+ setError(undefined);
193
+ setAppendError(undefined);
194
+ appendErrorRef.current = undefined;
172
195
  const keepPlaceholder = hasLoadedRef.current;
173
196
  if (keepPlaceholder) {
174
197
  setIsFetching(true);
@@ -194,12 +217,21 @@ export function useInfiniteRows<TData = any>({
194
217
  // Prefetch-ahead: page 1 starts loading while the user views page 0.
195
218
  if (!done) void ensurePage(1);
196
219
  })
197
- .catch(() => {
220
+ .catch((reason: unknown) => {
198
221
  if (generation !== generationRef.current) return;
222
+ setPages([]);
223
+ setTotalCount(undefined);
224
+ setError(toError(reason));
199
225
  setIsInitialLoading(false);
200
226
  setIsFetching(false);
227
+ setIsPlaceholderData(false);
201
228
  });
202
- }, [enabled, isLoaderMode, queryKey, ensurePage]);
229
+ }, [enabled, isLoaderMode, queryKey, retryToken, ensurePage]);
230
+
231
+ const retry = useCallback(() => {
232
+ if (!enabled || !loadPageRef.current) return;
233
+ setRetryToken((n) => n + 1);
234
+ }, [enabled]);
203
235
 
204
236
  const rows = useMemo(() => pages.flat(), [pages]);
205
237
  const rowsLoadedRef = useRef(0);
@@ -214,6 +246,7 @@ export function useInfiniteRows<TData = any>({
214
246
  const loadMore = useCallback(() => {
215
247
  if (!enabled || !loadPageRef.current) return;
216
248
  if (exhaustedRef.current || initialLoadingRef.current || appendPendingRef.current) return;
249
+ if (appendErrorRef.current) return;
217
250
  const generation = generationRef.current;
218
251
  const nextPage = pagesLoadedRef.current;
219
252
  appendPendingRef.current = true;
@@ -249,13 +282,22 @@ export function useInfiniteRows<TData = any>({
249
282
  if (generation !== generationRef.current) return;
250
283
  appendResult(result);
251
284
  })
252
- .catch(() => {
285
+ .catch((reason: unknown) => {
253
286
  if (generation !== generationRef.current) return;
254
287
  appendPendingRef.current = false;
255
288
  setIsAppending(false);
289
+ const failure = toError(reason);
290
+ appendErrorRef.current = failure;
291
+ setAppendError(failure);
256
292
  });
257
293
  }, [enabled, ensurePage]);
258
294
 
295
+ const retryAppend = useCallback(() => {
296
+ appendErrorRef.current = undefined;
297
+ setAppendError(undefined);
298
+ loadMore();
299
+ }, [loadMore]);
300
+
259
301
  return {
260
302
  isLoaderMode,
261
303
  rows,
@@ -266,6 +308,10 @@ export function useInfiniteRows<TData = any>({
266
308
  isFetching,
267
309
  isPlaceholderData,
268
310
  isAppending,
311
+ error: isLoaderMode ? error : undefined,
312
+ retry,
313
+ appendError: isLoaderMode ? appendError : undefined,
314
+ retryAppend,
269
315
  loadMore,
270
316
  loadMoreClient,
271
317
  };
package/src/types.ts CHANGED
@@ -367,7 +367,15 @@ export interface DataTableInfiniteState {
367
367
  isInitialLoading: boolean;
368
368
  /** A page append is awaiting the loader (cache miss / in-flight prefetch) */
369
369
  isAppending: boolean;
370
- /** Append the next page (no-op while pending or exhausted) */
370
+ /** Page 0 for the current query failed (loader mode); the root renders error chrome */
371
+ error?: Error;
372
+ /** Re-run the failed page 0 */
373
+ retry: () => void;
374
+ /** The last append failed (loader mode); loaded rows stay and the tail offers Retry */
375
+ appendError?: Error;
376
+ /** Retry the failed append */
377
+ retryAppend: () => void;
378
+ /** Append the next page (no-op while pending, exhausted or after a failed append) */
371
379
  loadMore: () => void;
372
380
  }
373
381
 
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Infinite mode tail, shared by the web and native roots: the load-more
3
3
  * trigger each platform supplies, an append skeleton bounded by the actual
4
- * load (no infinite spinner), and an honest, announced end-of-data state
5
- * (DG-ST-01/04).
4
+ * load (no infinite spinner), an honest, announced end-of-data state
5
+ * (DG-ST-01/04), and a failed append as a retryable error that keeps the
6
+ * loaded rows above it (LC-84).
6
7
  */
7
8
  import type { ReactNode } from "react";
8
9
  import type { DataTableInfiniteState } from "../../types";
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableInfiniteTail.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableInfiniteTail.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,EAAE,0BAA0B,2CA0D5B"}
1
+ {"version":3,"file":"DataTableInfiniteTail.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableInfiniteTail.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,GACT,EAAE,0BAA0B,2CA2E5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableRoot.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAQjF,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,aAAa,CAAC;AAkDrB,MAAM,WAAW,kBAAkB,CACjC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACvD,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACrF,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,EAC1B,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAuB,EACvB,eAAe,EACf,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAA4B,EAC5B,oBAA4B,EAC5B,kBAAyB,EACzB,WAAmB,EACnB,YAAsB,EACtB,MAAe,EACf,oBAA4B,EAC5B,oBAAoB,EACpB,sBAA0B,EAC1B,kBAA0B,EAC1B,kBAAkB,EAClB,UAAU,EACV,mBAA2B,EAC3B,gBAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,UAAU,EACV,QAAQ,EACR,kBAA0B,EAC1B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EACX,QAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,OAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EAAE,cAAc,EAC7B,SAAS,EACT,IAAI,EACJ,OAAe,EACf,QAAgB,EAChB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,eAAe,EACnC,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,2CA0oE3B"}
1
+ {"version":3,"file":"DataTableRoot.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAQjF,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,aAAa,CAAC;AAkDrB,MAAM,WAAW,kBAAkB,CACjC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACvD,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACrF,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,EAC1B,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAuB,EACvB,eAAe,EACf,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAA4B,EAC5B,oBAA4B,EAC5B,kBAAyB,EACzB,WAAmB,EACnB,YAAsB,EACtB,MAAe,EACf,oBAA4B,EAC5B,oBAAoB,EACpB,sBAA0B,EAC1B,kBAA0B,EAC1B,kBAAkB,EAClB,UAAU,EACV,mBAA2B,EAC3B,gBAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,UAAU,EACV,QAAQ,EACR,kBAA0B,EAC1B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EACX,QAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,OAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EAAE,cAAc,EAC7B,SAAS,EACT,IAAI,EACJ,OAAe,EACf,QAAgB,EAChB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,eAAe,EACnC,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,2CA2oE3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/index.native.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAYzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnF,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA0D1D,iBAAS,aAAa,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC9E,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,EAC1B,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAuB,EACvB,eAAe,EACf,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAA4B,EAC5B,oBAA4B,EAC5B,kBAAyB,EACzB,WAAmB,EACnB,YAAsB,EACtB,MAAe,EACf,oBAA4B,EAC5B,oBAAoB,EACpB,sBAA0B,EAC1B,kBAA0B,EAC1B,kBAAkB,EAClB,UAAU,EACV,kBAA0B,EAC1B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EACX,mBAA2B,EAC3B,gBAAoB,EACpB,cAAsB,EACtB,wBAAwB,EAAE,yBAAiC,EAC3D,UAAU,EACV,QAAQ,EACR,QAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,OAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,SAAS,EAAE,UAAU,EACrB,IAAI,EACJ,OAAe,EACf,QAAgB,EAChB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,eAAe,EACnC,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,2CAu+B3B;AAED,eAAO,MAAM,SAAS;;;;;;;;;;CAUpB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,OAAO,SAAS,CAAC"}
1
+ {"version":3,"file":"index.native.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/index.native.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAYzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnF,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA0D1D,iBAAS,aAAa,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAC9E,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,EAC1B,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAuB,EACvB,eAAe,EACf,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAA4B,EAC5B,oBAA4B,EAC5B,kBAAyB,EACzB,WAAmB,EACnB,YAAsB,EACtB,MAAe,EACf,oBAA4B,EAC5B,oBAAoB,EACpB,sBAA0B,EAC1B,kBAA0B,EAC1B,kBAAkB,EAClB,UAAU,EACV,kBAA0B,EAC1B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EACX,mBAA2B,EAC3B,gBAAoB,EACpB,cAAsB,EACtB,wBAAwB,EAAE,yBAAiC,EAC3D,UAAU,EACV,QAAQ,EACR,QAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,OAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,SAAS,EAAE,UAAU,EACrB,IAAI,EACJ,OAAe,EACf,QAAgB,EAChB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,eAAe,EACnC,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,2CAw+B3B;AAED,eAAO,MAAM,SAAS;;;;;;;;;;CAUpB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,OAAO,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDataTable.d.ts","sourceRoot":"","sources":["../../src/hooks/useDataTable.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtC,YAAY,EAAE,CAAC,KACZ,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiID,eAAO,MAAM,iBAAiB;4BA9HkB,MAAM,KAAG,gBAAgB;mCAgIxC,GAAG,eAAe,MAAM;8BAE7B,GAAG,aAAa,GAAG,eAAe,MAAM;6BAzCnB,MAAM,KAAG,gBAAgB;uBA4CrD,gBAAgB;CACpC,CAAC;AAGF,OAAO,KAAK,EAEV,aAAa,EAIb,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AA0DlB,wBAAgB,YAAY,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,EAAE,EACxE,IAAS,EACT,OAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAgB,EAAE,iBAAwB,EAC1C,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAAoB,EAAE,qBAA6B,EACnD,oBAA4B,EAC5B,kBAAyB,EACzB,WAAW,EAAE,YAAoB,EACjC,kBAA0B,EAC1B,UAAU,EACV,mBAA2B,EAC3B,cAAsB,EACtB,kBAA0B,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,GAC3B,GAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAyiBjC"}
1
+ {"version":3,"file":"useDataTable.d.ts","sourceRoot":"","sources":["../../src/hooks/useDataTable.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtC,YAAY,EAAE,CAAC,KACZ,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiID,eAAO,MAAM,iBAAiB;4BA9HkB,MAAM,KAAG,gBAAgB;mCAgIxC,GAAG,eAAe,MAAM;8BAE7B,GAAG,aAAa,GAAG,eAAe,MAAM;6BAzCnB,MAAM,KAAG,gBAAgB;uBA4CrD,gBAAgB;CACpC,CAAC;AAGF,OAAO,KAAK,EAEV,aAAa,EAIb,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AA0DlB,wBAAgB,YAAY,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,EAAE,EACxE,IAAS,EACT,OAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAgB,EAAE,iBAAwB,EAC1C,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAAoB,EAAE,qBAA6B,EACnD,oBAA4B,EAC5B,kBAAyB,EACzB,WAAW,EAAE,YAAoB,EACjC,kBAA0B,EAC1B,UAAU,EACV,mBAA2B,EAC3B,cAAsB,EACtB,kBAA0B,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,GAC3B,GAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,kBAAkB,CAAC,KAAK,CAAC,CA6iBjC"}
@@ -55,6 +55,17 @@ export interface UseInfiniteRowsReturn<TData = any> {
55
55
  isPlaceholderData: boolean;
56
56
  /** Loader mode: a page append is awaiting the loader (cache miss) */
57
57
  isAppending: boolean;
58
+ /** Loader mode: page 0 for the current query failed (LC-84: an error, never empty) */
59
+ error?: Error;
60
+ /** Re-run page 0 for the current query after a failure */
61
+ retry: () => void;
62
+ /**
63
+ * Loader mode: the last append failed. Loaded rows stay; loadMore is a no-op
64
+ * until retryAppend, so an in-view sentinel cannot spin on a failing page.
65
+ */
66
+ appendError?: Error;
67
+ /** Clear the append error and load the next page again */
68
+ retryAppend: () => void;
58
69
  /** Append the next page (loader mode) */
59
70
  loadMore: () => void;
60
71
  /** Reveal the next chunk (client mode); maxRowCount clamps exhaustion */
@@ -1 +1 @@
1
- {"version":3,"file":"useInfiniteRows.d.ts","sourceRoot":"","sources":["../../src/hooks/useInfiniteRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE/F,MAAM,WAAW,sBAAsB,CAAC,KAAK,GAAG,GAAG;IACjD,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,kBAAkB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK,GAAG,GAAG;IAChD,yEAAyE;IACzE,YAAY,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,qFAAqF;IACrF,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,0DAA0D;IAC1D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;IACrB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,yEAAyE;IACzE,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAQD,wBAAgB,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,EAC3C,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,aAAa,EACb,YAAY,GACb,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CA8L9D"}
1
+ {"version":3,"file":"useInfiniteRows.d.ts","sourceRoot":"","sources":["../../src/hooks/useInfiniteRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE/F,MAAM,WAAW,sBAAsB,CAAC,KAAK,GAAG,GAAG;IACjD,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,kBAAkB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB,CAAC,KAAK,GAAG,GAAG;IAChD,yEAAyE;IACzE,YAAY,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,qFAAqF;IACrF,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,0DAA0D;IAC1D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;IACrB,sFAAsF;IACtF,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,0DAA0D;IAC1D,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,yEAAyE;IACzE,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAYD,wBAAgB,eAAe,CAAC,KAAK,GAAG,GAAG,EAAE,EAC3C,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,aAAa,EACb,YAAY,GACb,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CA6N9D"}
package/types/types.d.ts CHANGED
@@ -267,7 +267,15 @@ export interface DataTableInfiniteState {
267
267
  isInitialLoading: boolean;
268
268
  /** A page append is awaiting the loader (cache miss / in-flight prefetch) */
269
269
  isAppending: boolean;
270
- /** Append the next page (no-op while pending or exhausted) */
270
+ /** Page 0 for the current query failed (loader mode); the root renders error chrome */
271
+ error?: Error;
272
+ /** Re-run the failed page 0 */
273
+ retry: () => void;
274
+ /** The last append failed (loader mode); loaded rows stay and the tail offers Retry */
275
+ appendError?: Error;
276
+ /** Retry the failed append */
277
+ retryAppend: () => void;
278
+ /** Append the next page (no-op while pending, exhausted or after a failed append) */
271
279
  loadMore: () => void;
272
280
  }
273
281
  export interface TableSorting {