@1771technologies/lytenyte-pro 1.0.0-beta.34 → 1.0.0-beta.36

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 (386) hide show
  1. package/dist/+types.d.ts +4203 -4009
  2. package/dist/cell-selection/adjust-rect-for-row-and-cell-span.js +38 -38
  3. package/dist/cell-selection/are-rects-equal.js +6 -4
  4. package/dist/cell-selection/bound-selection-rect.js +14 -14
  5. package/dist/cell-selection/cell-selection-containers.js +108 -78
  6. package/dist/cell-selection/cell-selection-driver.js +250 -262
  7. package/dist/cell-selection/cell-style-row.d.ts +12 -6
  8. package/dist/cell-selection/cell-style-row.js +82 -79
  9. package/dist/cell-selection/deselect-rect-range.js +41 -40
  10. package/dist/cell-selection/expand-cell-selection-down.d.ts +5 -2
  11. package/dist/cell-selection/expand-cell-selection-down.js +29 -33
  12. package/dist/cell-selection/expand-cell-selection-end.d.ts +5 -2
  13. package/dist/cell-selection/expand-cell-selection-end.js +30 -34
  14. package/dist/cell-selection/expand-cell-selection-start.d.ts +5 -2
  15. package/dist/cell-selection/expand-cell-selection-start.js +29 -33
  16. package/dist/cell-selection/expand-cell-selection-up.d.ts +5 -2
  17. package/dist/cell-selection/expand-cell-selection-up.js +29 -33
  18. package/dist/cell-selection/full-width-start-end-index.js +3 -3
  19. package/dist/cell-selection/get-root-cell.d.ts +5 -1
  20. package/dist/cell-selection/get-root-cell.js +77 -79
  21. package/dist/cell-selection/is-bottom-rect.js +5 -5
  22. package/dist/cell-selection/is-center-col-rect.d.ts +5 -2
  23. package/dist/cell-selection/is-center-col-rect.js +5 -3
  24. package/dist/cell-selection/is-center-rect.js +3 -3
  25. package/dist/cell-selection/is-end-rect.d.ts +5 -2
  26. package/dist/cell-selection/is-end-rect.js +2 -2
  27. package/dist/cell-selection/is-overlapping-rect.js +6 -4
  28. package/dist/cell-selection/is-start-rect.d.ts +5 -2
  29. package/dist/cell-selection/is-start-rect.js +2 -2
  30. package/dist/cell-selection/is-top-rect.js +2 -2
  31. package/dist/cell-selection/is-within-selection-rect.js +1 -1
  32. package/dist/cell-selection/split-cell-selection-rect.d.ts +12 -6
  33. package/dist/cell-selection/split-cell-selection-rect.js +53 -47
  34. package/dist/cell-selection/update-additive-cell-selection.d.ts +5 -2
  35. package/dist/cell-selection/update-additive-cell-selection.js +16 -17
  36. package/dist/cell-selection/use-edge-scroll.d.ts +8 -6
  37. package/dist/cell-selection/use-edge-scroll.js +65 -63
  38. package/dist/cells/cell-default.d.ts +5 -1
  39. package/dist/cells/cell-default.js +5 -5
  40. package/dist/cells/cell-editor.d.ts +4 -2
  41. package/dist/cells/cell-editor.js +129 -92
  42. package/dist/cells/cell.d.ts +16 -3
  43. package/dist/cells/cell.js +56 -27
  44. package/dist/column-manager/branch-lookup-context.d.ts +3 -1
  45. package/dist/column-manager/branch.d.ts +17 -9
  46. package/dist/column-manager/branch.js +64 -46
  47. package/dist/column-manager/column-manager.d.ts +57 -8
  48. package/dist/column-manager/column-manager.js +8 -8
  49. package/dist/column-manager/context.d.ts +1 -1
  50. package/dist/column-manager/label.d.ts +10 -2
  51. package/dist/column-manager/label.js +11 -12
  52. package/dist/column-manager/leaf.d.ts +10 -2
  53. package/dist/column-manager/leaf.js +61 -49
  54. package/dist/column-manager/move-handle.d.ts +14 -6
  55. package/dist/column-manager/move-handle.js +52 -48
  56. package/dist/column-manager/panel.d.ts +10 -1
  57. package/dist/column-manager/root.d.ts +7 -3
  58. package/dist/column-manager/root.js +4 -1
  59. package/dist/column-manager/use-column-manager.d.ts +6 -3
  60. package/dist/column-manager/use-column-manager.js +14 -15
  61. package/dist/column-manager/use-columns-from-context.d.ts +3 -1
  62. package/dist/column-manager/use-columns-from-context.js +18 -18
  63. package/dist/column-manager/visibility-checkbox.d.ts +14 -6
  64. package/dist/column-manager/visibility-checkbox.js +36 -23
  65. package/dist/context.d.ts +4 -4
  66. package/dist/filter-tree/branch.d.ts +16 -8
  67. package/dist/filter-tree/branch.js +23 -13
  68. package/dist/filter-tree/context.d.ts +16 -16
  69. package/dist/filter-tree/filter-tree.d.ts +49 -8
  70. package/dist/filter-tree/filter-tree.js +8 -8
  71. package/dist/filter-tree/hooks/use-filter-tree.d.ts +35 -29
  72. package/dist/filter-tree/hooks/use-filter-tree.js +94 -92
  73. package/dist/filter-tree/hooks/use-tree-item.d.ts +4 -4
  74. package/dist/filter-tree/hooks/use-tree-item.js +99 -106
  75. package/dist/filter-tree/inclusion-checkbox.d.ts +14 -6
  76. package/dist/filter-tree/inclusion-checkbox.js +19 -9
  77. package/dist/filter-tree/label.d.ts +10 -2
  78. package/dist/filter-tree/label.js +11 -12
  79. package/dist/filter-tree/leaf.d.ts +10 -2
  80. package/dist/filter-tree/leaf.js +15 -5
  81. package/dist/filter-tree/root.d.ts +23 -7
  82. package/dist/filter-tree/root.js +51 -23
  83. package/dist/grid-box/+types.d.ts +11 -11
  84. package/dist/grid-box/context.d.ts +3 -3
  85. package/dist/grid-box/grid-box.d.ts +26 -6
  86. package/dist/grid-box/grid-box.js +6 -6
  87. package/dist/grid-box/item.d.ts +13 -5
  88. package/dist/grid-box/item.js +73 -56
  89. package/dist/grid-box/panel.d.ts +13 -1
  90. package/dist/grid-box/panel.js +9 -2
  91. package/dist/grid-box/root.d.ts +11 -5
  92. package/dist/grid-box/root.js +11 -2
  93. package/dist/grid-box/use-aggregation-box-items.d.ts +16 -13
  94. package/dist/grid-box/use-aggregation-box-items.js +56 -57
  95. package/dist/grid-box/use-column-box-items.d.ts +33 -23
  96. package/dist/grid-box/use-column-box-items.js +87 -75
  97. package/dist/grid-box/use-row-group-box-items.d.ts +17 -12
  98. package/dist/grid-box/use-row-group-box-items.js +120 -123
  99. package/dist/grid-provider/context.d.ts +4 -2
  100. package/dist/grid-provider/provider.d.ts +4 -2
  101. package/dist/grid-provider/use-grid.d.ts +1 -1
  102. package/dist/grid.d.ts +126 -14
  103. package/dist/grid.js +14 -14
  104. package/dist/header/header-cell.d.ts +13 -5
  105. package/dist/header/header-cell.js +41 -15
  106. package/dist/header/header-group-cell.d.ts +10 -2
  107. package/dist/header/header-group-cell.js +26 -8
  108. package/dist/header/header-row.d.ts +10 -2
  109. package/dist/header/header-row.js +2 -2
  110. package/dist/header/header.d.ts +10 -1
  111. package/dist/header/header.js +11 -2
  112. package/dist/header/resize-handler.d.ts +15 -6
  113. package/dist/header/resize-handler.js +131 -122
  114. package/dist/header/use-drag-move.d.ts +22 -11
  115. package/dist/header/use-drag-move.js +95 -94
  116. package/dist/header/use-header-cell-renderer.d.ts +9 -2
  117. package/dist/header/use-header-cell-renderer.js +25 -29
  118. package/dist/icons/index.d.ts +92 -1
  119. package/dist/icons/index.js +92 -1
  120. package/dist/index.d.ts +22 -5
  121. package/dist/index.js +22 -5
  122. package/dist/license.js +174 -174
  123. package/dist/listbox/context.d.ts +2 -2
  124. package/dist/listbox/item.d.ts +10 -1
  125. package/dist/listbox/item.js +23 -19
  126. package/dist/listbox/panel.d.ts +10 -1
  127. package/dist/listbox/panel.js +69 -43
  128. package/dist/listbox/root.d.ts +5 -3
  129. package/dist/listbox/root.js +7 -7
  130. package/dist/root/dialog-driver.js +22 -16
  131. package/dist/root/popover-driver.js +27 -16
  132. package/dist/root/root.d.ts +7 -3
  133. package/dist/root/root.js +111 -107
  134. package/dist/row-data-source-client/+types.d.ts +17 -17
  135. package/dist/row-data-source-client/built-ins/avg.js +3 -4
  136. package/dist/row-data-source-client/built-ins/built-ins.d.ts +16 -16
  137. package/dist/row-data-source-client/built-ins/built-ins.js +16 -16
  138. package/dist/row-data-source-client/built-ins/count.js +3 -5
  139. package/dist/row-data-source-client/built-ins/first.js +1 -1
  140. package/dist/row-data-source-client/built-ins/group.js +1 -1
  141. package/dist/row-data-source-client/built-ins/last.js +1 -1
  142. package/dist/row-data-source-client/built-ins/max.js +9 -13
  143. package/dist/row-data-source-client/built-ins/min.js +9 -13
  144. package/dist/row-data-source-client/built-ins/sum.js +8 -10
  145. package/dist/row-data-source-client/filter/+types.d.ts +35 -13
  146. package/dist/row-data-source-client/filter/compute-filtered-rows.d.ts +16 -2
  147. package/dist/row-data-source-client/filter/compute-filtered-rows.js +102 -102
  148. package/dist/row-data-source-client/pivots/create-agg-model.d.ts +8 -4
  149. package/dist/row-data-source-client/pivots/create-agg-model.js +8 -9
  150. package/dist/row-data-source-client/pivots/create-pivot-columns-from-paths.d.ts +6 -1
  151. package/dist/row-data-source-client/pivots/create-pivot-columns-from-paths.js +42 -46
  152. package/dist/row-data-source-client/pivots/create-pivot-columns.d.ts +6 -1
  153. package/dist/row-data-source-client/pivots/create-pivot-columns.js +16 -17
  154. package/dist/row-data-source-client/pivots/create-pivot-tree.d.ts +7 -1
  155. package/dist/row-data-source-client/pivots/create-pivot-tree.js +19 -19
  156. package/dist/row-data-source-client/tree/client-tree.d.ts +19 -13
  157. package/dist/row-data-source-client/tree/client-tree.js +64 -67
  158. package/dist/row-data-source-client/tree/evaluator-aggregation.d.ts +4 -1
  159. package/dist/row-data-source-client/tree/evaluator-aggregation.js +6 -6
  160. package/dist/row-data-source-client/tree/evaluator-group.d.ts +4 -1
  161. package/dist/row-data-source-client/tree/evaluator-group.js +6 -7
  162. package/dist/row-data-source-client/tree/traverse.d.ts +5 -1
  163. package/dist/row-data-source-client/tree/traverse.js +15 -18
  164. package/dist/row-data-source-client/use-client-data-source-paginated.d.ts +9 -5
  165. package/dist/row-data-source-client/use-client-data-source-paginated.js +566 -551
  166. package/dist/row-data-source-client/use-client-data-source.d.ts +9 -5
  167. package/dist/row-data-source-client/use-client-data-source.js +696 -661
  168. package/dist/row-data-source-client/use-client-tree-data-source.d.ts +9 -5
  169. package/dist/row-data-source-client/use-client-tree-data-source.js +523 -512
  170. package/dist/row-data-source-server/async-tree/+types.async-tree.d.ts +36 -33
  171. package/dist/row-data-source-server/async-tree/apply-delete-action-to-tree.d.ts +4 -1
  172. package/dist/row-data-source-server/async-tree/apply-delete-action-to-tree.js +18 -22
  173. package/dist/row-data-source-server/async-tree/apply-set-action-to-tree.d.ts +4 -1
  174. package/dist/row-data-source-server/async-tree/apply-set-action-to-tree.js +17 -25
  175. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-are-unique.js +18 -18
  176. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-are-valid.js +9 -10
  177. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-fit.d.ts +4 -1
  178. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-fit.js +13 -14
  179. package/dist/row-data-source-server/async-tree/check-set-action-item-kinds.js +9 -10
  180. package/dist/row-data-source-server/async-tree/get-parent-node-by-path.d.ts +4 -1
  181. package/dist/row-data-source-server/async-tree/get-parent-node-by-path.js +13 -13
  182. package/dist/row-data-source-server/async-tree/is-set-action-a-no-op-on-node.d.ts +4 -1
  183. package/dist/row-data-source-server/async-tree/is-set-action-a-no-op-on-node.js +1 -1
  184. package/dist/row-data-source-server/async-tree/make-async-tree.js +14 -14
  185. package/dist/row-data-source-server/async-tree/maybe-apply-parent-remove-self.d.ts +3 -1
  186. package/dist/row-data-source-server/async-tree/maybe-apply-parent-remove-self.js +6 -6
  187. package/dist/row-data-source-server/async-tree/maybe-apply-resize.d.ts +5 -1
  188. package/dist/row-data-source-server/async-tree/maybe-apply-resize.js +11 -14
  189. package/dist/row-data-source-server/async-tree/maybe-apply-set-action-items.d.ts +4 -1
  190. package/dist/row-data-source-server/async-tree/maybe-apply-set-action-items.js +42 -46
  191. package/dist/row-data-source-server/range-tree/range-tree.d.ts +28 -28
  192. package/dist/row-data-source-server/range-tree/range-tree.js +49 -48
  193. package/dist/row-data-source-server/use-server-data-source.d.ts +11 -2
  194. package/dist/row-data-source-server/use-server-data-source.js +688 -675
  195. package/dist/row-data-source-server/utils/get-node-depth.js +7 -7
  196. package/dist/row-data-source-server/utils/get-node-path.js +7 -7
  197. package/dist/row-data-source-server/utils/get-request-id.js +3 -4
  198. package/dist/rows/row/context.d.ts +2 -2
  199. package/dist/rows/row/row.d.ts +16 -3
  200. package/dist/rows/row/row.js +19 -4
  201. package/dist/rows/row/use-row-context-value.d.ts +5 -2
  202. package/dist/rows/row/use-row-context-value.js +23 -26
  203. package/dist/rows/row-detail-row.d.ts +4 -2
  204. package/dist/rows/row-detail-row.js +147 -124
  205. package/dist/rows/row-full-width.d.ts +12 -4
  206. package/dist/rows/row-full-width.js +35 -7
  207. package/dist/rows/rows-container.d.ts +10 -1
  208. package/dist/rows/rows-container.js +12 -3
  209. package/dist/rows/rows-sections.d.ts +30 -3
  210. package/dist/rows/rows-sections.js +42 -10
  211. package/dist/rows/scrollers/native-scroller.d.ts +3 -1
  212. package/dist/rows/scrollers/native-scroller.js +17 -13
  213. package/dist/sort-manager/+types.d.ts +14 -7
  214. package/dist/sort-manager/context.d.ts +4 -4
  215. package/dist/sort-manager/hooks/use-sort-manager.d.ts +9 -9
  216. package/dist/sort-manager/hooks/use-sort-manager.js +45 -49
  217. package/dist/sort-manager/hooks/use-sort-row-item.d.ts +57 -46
  218. package/dist/sort-manager/hooks/use-sort-row-item.js +126 -131
  219. package/dist/sort-manager/hooks/use-sortable-column-items.d.ts +6 -3
  220. package/dist/sort-manager/hooks/use-sortable-column-items.js +10 -10
  221. package/dist/sort-manager/root.d.ts +7 -1
  222. package/dist/sort-manager/root.js +10 -10
  223. package/dist/sort-manager/sort-add.d.ts +13 -5
  224. package/dist/sort-manager/sort-add.js +8 -8
  225. package/dist/sort-manager/sort-apply.d.ts +12 -4
  226. package/dist/sort-manager/sort-apply.js +16 -16
  227. package/dist/sort-manager/sort-cancel.d.ts +12 -4
  228. package/dist/sort-manager/sort-cancel.js +19 -19
  229. package/dist/sort-manager/sort-clear.d.ts +12 -4
  230. package/dist/sort-manager/sort-clear.js +15 -16
  231. package/dist/sort-manager/sort-column-select.d.ts +14 -6
  232. package/dist/sort-manager/sort-column-select.js +22 -14
  233. package/dist/sort-manager/sort-direction-select.d.ts +14 -6
  234. package/dist/sort-manager/sort-direction-select.js +27 -19
  235. package/dist/sort-manager/sort-manager.d.ts +93 -12
  236. package/dist/sort-manager/sort-manager.js +12 -12
  237. package/dist/sort-manager/sort-remove.d.ts +12 -4
  238. package/dist/sort-manager/sort-remove.js +8 -8
  239. package/dist/sort-manager/sort-row.d.ts +10 -2
  240. package/dist/sort-manager/sort-row.js +4 -1
  241. package/dist/sort-manager/sort-rows.d.ts +10 -1
  242. package/dist/sort-manager/sort-rows.js +1 -1
  243. package/dist/sort-manager/sort-value-select.d.ts +15 -7
  244. package/dist/sort-manager/sort-value-select.js +28 -19
  245. package/dist/sort-manager/utils/sort-item-to-sort-model.d.ts +4 -1
  246. package/dist/sort-manager/utils/sort-item-to-sort-model.js +46 -49
  247. package/dist/sort-manager/utils/sort-model-to-sort-items.d.ts +4 -1
  248. package/dist/sort-manager/utils/sort-model-to-sort-items.js +36 -44
  249. package/dist/state/+types.d.ts +43 -29
  250. package/dist/state/api/column-autosize.d.ts +4 -2
  251. package/dist/state/api/column-autosize.js +62 -63
  252. package/dist/state/api/column-by-id.js +4 -4
  253. package/dist/state/api/column-field.js +17 -20
  254. package/dist/state/api/column-from-index.js +4 -4
  255. package/dist/state/api/column-group-toggle.js +8 -8
  256. package/dist/state/api/column-index.js +5 -5
  257. package/dist/state/api/column-move.js +48 -46
  258. package/dist/state/api/column-resize.js +9 -7
  259. package/dist/state/api/column-update.d.ts +4 -2
  260. package/dist/state/api/column-update.js +23 -23
  261. package/dist/state/api/dialog-frame.d.ts +8 -4
  262. package/dist/state/api/dialog-frame.js +11 -12
  263. package/dist/state/api/edit-begin.d.ts +4 -2
  264. package/dist/state/api/edit-begin.js +71 -84
  265. package/dist/state/api/edit-end.d.ts +4 -2
  266. package/dist/state/api/edit-end.js +38 -41
  267. package/dist/state/api/edit-is-cell-active.d.ts +4 -2
  268. package/dist/state/api/edit-is-cell-active.js +17 -24
  269. package/dist/state/api/edit-update.d.ts +4 -2
  270. package/dist/state/api/edit-update.js +74 -85
  271. package/dist/state/api/event-listeners.d.ts +12 -3
  272. package/dist/state/api/event-listeners.js +16 -17
  273. package/dist/state/api/export-csv.js +33 -35
  274. package/dist/state/api/export-data-rect.js +21 -21
  275. package/dist/state/api/focus-cell.d.ts +4 -2
  276. package/dist/state/api/focus-cell.js +110 -109
  277. package/dist/state/api/popover-frame.d.ts +8 -4
  278. package/dist/state/api/popover-frame.js +11 -12
  279. package/dist/state/api/position-from-element.js +5 -6
  280. package/dist/state/api/row-by-id.js +3 -3
  281. package/dist/state/api/row-by-index.js +11 -6
  282. package/dist/state/api/row-detail-is-expanded.d.ts +3 -1
  283. package/dist/state/api/row-detail-is-expanded.js +4 -4
  284. package/dist/state/api/row-detail-rendered-height.d.ts +4 -2
  285. package/dist/state/api/row-detail-rendered-height.js +10 -12
  286. package/dist/state/api/row-detail-toggle.js +26 -30
  287. package/dist/state/api/row-group-apply-expansions.d.ts +3 -1
  288. package/dist/state/api/row-group-apply-expansions.js +15 -17
  289. package/dist/state/api/row-group-column-index.d.ts +3 -1
  290. package/dist/state/api/row-group-column-index.js +14 -12
  291. package/dist/state/api/row-group-is-expanded.d.ts +3 -1
  292. package/dist/state/api/row-group-is-expanded.js +11 -13
  293. package/dist/state/api/row-group-toggle.js +5 -5
  294. package/dist/state/api/row-handle-select.d.ts +4 -2
  295. package/dist/state/api/row-handle-select.js +36 -40
  296. package/dist/state/api/row-select-all.js +14 -15
  297. package/dist/state/api/row-select.d.ts +4 -2
  298. package/dist/state/api/row-select.js +30 -33
  299. package/dist/state/api/row-selected.js +10 -11
  300. package/dist/state/api/scroll-into-view.d.ts +4 -2
  301. package/dist/state/api/scroll-into-view.js +47 -47
  302. package/dist/state/api/sort-for-column.js +6 -7
  303. package/dist/state/api/use-row-drag.js +22 -24
  304. package/dist/state/helpers/cell-row-group.d.ts +5 -1
  305. package/dist/state/helpers/cell-row-group.js +18 -16
  306. package/dist/state/helpers/column-add-row-group.d.ts +18 -7
  307. package/dist/state/helpers/column-add-row-group.js +71 -66
  308. package/dist/state/helpers/column-layout.d.ts +7 -1
  309. package/dist/state/helpers/column-layout.js +60 -60
  310. package/dist/state/helpers/column-marker.d.ts +8 -4
  311. package/dist/state/helpers/column-marker.js +38 -34
  312. package/dist/state/helpers/column-view.d.ts +21 -15
  313. package/dist/state/helpers/column-view.js +56 -32
  314. package/dist/state/helpers/edit-on-change.d.ts +18 -10
  315. package/dist/state/helpers/edit-on-change.js +25 -25
  316. package/dist/state/helpers/empty-row-data-source.js +16 -16
  317. package/dist/state/helpers/get-data-rect.d.ts +20 -10
  318. package/dist/state/helpers/get-data-rect.js +67 -62
  319. package/dist/state/helpers/get-full-width-callback.d.ts +5 -1
  320. package/dist/state/helpers/get-full-width-callback.js +5 -6
  321. package/dist/state/helpers/get-span-callback.d.ts +6 -1
  322. package/dist/state/helpers/get-span-callback.js +15 -18
  323. package/dist/state/helpers/resolve-column.d.ts +6 -2
  324. package/dist/state/helpers/resolve-column.js +23 -23
  325. package/dist/state/helpers/row-layout/get-focus-criteria.d.ts +15 -12
  326. package/dist/state/helpers/row-layout/get-focus-criteria.js +57 -56
  327. package/dist/state/helpers/row-layout/row-layout.d.ts +15 -9
  328. package/dist/state/helpers/row-layout/row-layout.js +387 -401
  329. package/dist/state/use-lytenyte.js +567 -528
  330. package/dist/tree-view/branch/branch.d.ts +19 -11
  331. package/dist/tree-view/branch/branch.js +106 -54
  332. package/dist/tree-view/branch/use-branch-keys.d.ts +5 -1
  333. package/dist/tree-view/branch/use-branch-keys.js +71 -74
  334. package/dist/tree-view/context.d.ts +21 -17
  335. package/dist/tree-view/hooks/use-tree-view-paths.d.ts +7 -1
  336. package/dist/tree-view/hooks/use-tree-view-paths.js +5 -5
  337. package/dist/tree-view/index.d.ts +35 -7
  338. package/dist/tree-view/index.js +7 -7
  339. package/dist/tree-view/leaf.d.ts +10 -2
  340. package/dist/tree-view/leaf.js +30 -21
  341. package/dist/tree-view/navigation/get-all-ids.js +3 -3
  342. package/dist/tree-view/navigation/get-first-node.js +3 -3
  343. package/dist/tree-view/navigation/get-last-node.js +3 -3
  344. package/dist/tree-view/navigation/get-next-node.js +6 -8
  345. package/dist/tree-view/navigation/get-prev-node.js +6 -8
  346. package/dist/tree-view/panel/make-handle-navigation.js +23 -31
  347. package/dist/tree-view/panel/make-handle-selection.js +68 -77
  348. package/dist/tree-view/panel/make-handle-typeahead.js +34 -40
  349. package/dist/tree-view/panel/panel.d.ts +10 -1
  350. package/dist/tree-view/panel/panel.js +40 -20
  351. package/dist/tree-view/panel/use-tree-navigation.js +64 -52
  352. package/dist/tree-view/root.d.ts +20 -14
  353. package/dist/tree-view/root.js +53 -55
  354. package/dist/tree-view/utils/get-focusable-nodes.js +4 -2
  355. package/dist/tree-view/utils/get-focused-node.js +11 -11
  356. package/dist/tree-view/utils/get-ids-between-nodes.d.ts +5 -1
  357. package/dist/tree-view/utils/get-ids-between-nodes.js +10 -11
  358. package/dist/tree-view/utils/get-panel.js +5 -5
  359. package/dist/tree-view/utils/get-parent-node.js +6 -7
  360. package/dist/tree-view/utils/get-sibling-branches.js +8 -10
  361. package/dist/tree-view/utils/get-tree-node-id.js +1 -1
  362. package/dist/tree-view/utils/is-branch-node.js +1 -1
  363. package/dist/tree-view/utils/is-leaf-node.js +1 -1
  364. package/dist/tree-view/utils/is-tree-node-disabled.js +1 -1
  365. package/dist/tree-view/utils/select-node.d.ts +5 -1
  366. package/dist/tree-view/utils/select-node.js +8 -11
  367. package/dist/tree-view/utils/toggle-all-selections.js +4 -6
  368. package/dist/tree-view/utils/toggle-selection.js +15 -18
  369. package/dist/tree-view/virtualized/force-sync-scrolling.d.ts +3 -1
  370. package/dist/tree-view/virtualized/force-sync-scrolling.js +24 -18
  371. package/dist/tree-view/virtualized/get-virtual-tree-paths.d.ts +3 -1
  372. package/dist/tree-view/virtualized/get-virtual-tree-paths.js +11 -12
  373. package/dist/tree-view/virtualized/make-virtual-tree.d.ts +26 -21
  374. package/dist/tree-view/virtualized/make-virtual-tree.js +79 -85
  375. package/dist/tree-view/virtualized/use-flattened-tree.d.ts +17 -8
  376. package/dist/tree-view/virtualized/use-flattened-tree.js +30 -31
  377. package/dist/tree-view/virtualized/use-row-start-and-end.d.ts +6 -1
  378. package/dist/tree-view/virtualized/use-row-start-and-end.js +21 -23
  379. package/dist/tree-view/virtualized/use-virtualized-tree.d.ts +21 -15
  380. package/dist/tree-view/virtualized/use-virtualized-tree.js +103 -90
  381. package/dist/utils/cycle-sorts.js +12 -14
  382. package/dist/viewport/begin-editing.d.ts +6 -2
  383. package/dist/viewport/begin-editing.js +9 -13
  384. package/dist/viewport/viewport.d.ts +10 -1
  385. package/dist/viewport/viewport.js +93 -70
  386. package/package.json +7 -7
@@ -2,579 +2,594 @@ import {} from "../+types.js";
2
2
  import { useRef } from "react";
3
3
  import { atom, createStore } from "@1771technologies/atom";
4
4
  import { traverse } from "./tree/traverse.js";
5
- import { dateComparator, makeGridAtom, numberComparator, stringComparator, } from "@1771technologies/lytenyte-shared";
5
+ import {
6
+ dateComparator,
7
+ makeGridAtom,
8
+ numberComparator,
9
+ stringComparator,
10
+ } from "@1771technologies/lytenyte-shared";
6
11
  import { clamp, equal, get } from "@1771technologies/lytenyte-js-utils";
7
12
  import { makeClientTree } from "./tree/client-tree.js";
8
13
  import { computeFilteredRows } from "./filter/compute-filtered-rows.js";
9
14
  import { builtIns } from "./built-ins/built-ins.js";
10
15
  export function makeClientDataSourcePaginated(p) {
11
- const rdsStore = createStore();
12
- const pageInternal = atom(0);
13
- const rowsPerPage = atom(p.rowsPerPage ?? 50);
14
- const pageCount = atom((g) => Math.max(Math.ceil(g(flatLength) / g(rowsPerPage)), 1));
15
- const page = atom((g) => clamp(0, g(pageInternal), g(pageCount) - 1), (g, s, n) => {
16
- const res = typeof n === "function" ? n(g(pageInternal)) : n;
17
- s(pageInternal, clamp(0, res, g(pageCount) - 1));
18
- });
19
- const data = atom(p.data);
20
- const topData = atom(p.topData ?? []);
21
- const bottomData = atom(p.bottomData ?? []);
22
- const dataToSrc$ = atom((g) => {
23
- return new Map(g(data).map((c, i) => [c, i]));
24
- });
25
- const cache = new Map();
26
- const centerNodes = atom((g) => {
27
- const nodes = [];
28
- const d = g(data);
29
- for (let i = 0; i < d.length; i++) {
30
- if (!cache.has(i)) {
31
- cache.set(i, {
32
- id: "",
33
- kind: "leaf",
34
- data: d[i],
35
- });
36
- }
37
- const node = cache.get(i);
38
- node.data = d[i];
39
- nodes.push(node);
40
- }
41
- return nodes;
42
- });
43
- const topNodes = atom((g) => {
44
- return g(topData).map((c, i) => ({ data: c, id: `top-${i}`, kind: "leaf" }));
45
- });
46
- const botNodes = atom((g) => {
47
- return g(bottomData).map((c, i) => ({ data: c, id: `bottom-${i}`, kind: "leaf" }));
48
- });
49
- const pinnedIdMap = atom((g) => {
50
- const combined = new Map([...g(topNodes), ...g(botNodes)].map((c) => [c.id, c]));
51
- return combined;
52
- });
53
- const models = atom({
54
- sort: [],
55
- filter: {},
56
- filterIn: {},
57
- quickSearch: null,
58
- agg: {},
59
- group: [],
60
- groupExpansions: {},
61
- });
62
- const sortModel = atom((g) => g(models).sort);
63
- const filterModel = atom((g) => g(models).filter);
64
- const filterInModel = atom((g) => g(models).filterIn);
65
- const rowGroupModel = atom((g) => g(models).group);
66
- const groupExpansions = atom((g) => g(models).groupExpansions);
67
- const aggModel = atom((g) => g(models).agg);
68
- const quickSearch = atom((g) => g(models).quickSearch);
69
- const grid$ = atom(null);
70
- const snapshot = atom(0);
71
- const tree = atom((g) => {
72
- g(snapshot);
73
- const grid = g(grid$);
74
- const rows = g(centerNodes);
75
- const filtered = computeFilteredRows(rows, grid, g(filterModel), g(filterInModel), g(quickSearch), grid?.state.quickSearchSensitivity.get() ?? "case-sensitive", false);
76
- const rowGroups = g(rowGroupModel)
77
- .map((c) => {
78
- if (typeof c === "string")
79
- return (r) => grid.api.columnField(c, { kind: "leaf", data: r.data });
80
- if (typeof c.field === "string" || typeof c.field === "number")
81
- return (r) => r.data[c.field];
82
- if (typeof c.field === "function")
83
- return (r) => c.field({ data: r.data, grid: grid });
84
- return (r) => get(r.data, c.field.path);
85
- })
86
- .map((c) => ({ fn: c }));
87
- const rowAggModel = Object.entries(g(aggModel)).map(([name, agg]) => {
88
- if (typeof agg.fn === "function") {
89
- const fn = agg.fn;
90
- return {
91
- name,
92
- fn: (rows) => fn(rows.map((c) => c.data), grid),
93
- };
94
- }
95
- const key = agg.fn;
96
- const fn = (data) => {
97
- const fieldData = data.map((r) => grid?.api.columnField(name, { kind: "leaf", data: r.data }));
98
- return builtIns[key](fieldData);
99
- };
100
- return { name, fn };
16
+ const rdsStore = createStore();
17
+ const pageInternal = atom(0);
18
+ const rowsPerPage = atom(p.rowsPerPage ?? 50);
19
+ const pageCount = atom((g) => Math.max(Math.ceil(g(flatLength) / g(rowsPerPage)), 1));
20
+ const page = atom(
21
+ (g) => clamp(0, g(pageInternal), g(pageCount) - 1),
22
+ (g, s, n) => {
23
+ const res = typeof n === "function" ? n(g(pageInternal)) : n;
24
+ s(pageInternal, clamp(0, res, g(pageCount) - 1));
25
+ },
26
+ );
27
+ const data = atom(p.data);
28
+ const topData = atom(p.topData ?? []);
29
+ const bottomData = atom(p.bottomData ?? []);
30
+ const dataToSrc$ = atom((g) => {
31
+ return new Map(g(data).map((c, i) => [c, i]));
32
+ });
33
+ const cache = new Map();
34
+ const centerNodes = atom((g) => {
35
+ const nodes = [];
36
+ const d = g(data);
37
+ for (let i = 0; i < d.length; i++) {
38
+ if (!cache.has(i)) {
39
+ cache.set(i, {
40
+ id: "",
41
+ kind: "leaf",
42
+ data: d[i],
101
43
  });
102
- return makeClientTree({
103
- rowData: filtered,
104
- rowAggModel: grid ? rowAggModel : [],
105
- rowBranchModel: grid ? rowGroups : [],
106
- rowIdGroup: p.rowIdBranch,
107
- rowIdLeaf: p.rowIdLeaf,
108
- });
109
- });
110
- const sortComparator = atom((g) => {
111
- const model = g(sortModel);
112
- const grid = g(grid$);
113
- if (!model.length || !grid)
114
- return () => 0;
115
- const comparator = (l, r) => {
116
- let res = 0;
117
- for (const sortSpec of model) {
118
- const sort = sortSpec.sort;
119
- const columnId = sortSpec.columnId;
120
- const ld = l.kind === 2
121
- ? { kind: "branch", data: l.data, key: l.key }
122
- : { kind: "leaf", data: l.data.data };
123
- const rd = r.kind === 2
124
- ? { kind: "branch", data: r.data, key: r.key }
125
- : { kind: "leaf", data: r.data.data };
126
- if (sort.kind === "custom") {
127
- res = sort.comparator(ld, rd, sort.options ?? {});
128
- }
129
- else if (sort.kind === "number") {
130
- const left = grid.api.columnField(columnId, ld);
131
- const right = grid.api.columnField(columnId, rd);
132
- res = numberComparator(left, right, sort.options ?? {});
133
- }
134
- else if (sort.kind === "date") {
135
- const left = grid.api.columnField(columnId, ld);
136
- const right = grid.api.columnField(columnId, rd);
137
- res = dateComparator(left, right, sort.options ?? {});
138
- }
139
- else if (sort.kind === "string") {
140
- const left = grid.api.columnField(columnId, ld);
141
- const right = grid.api.columnField(columnId, rd);
142
- res = stringComparator(left, right, sort.options ?? {});
143
- }
144
- else {
145
- res = 0;
146
- }
147
- res = sortSpec.isDescending ? -res : res;
148
- if (res !== 0)
149
- break;
150
- }
151
- return res;
44
+ }
45
+ const node = cache.get(i);
46
+ node.data = d[i];
47
+ nodes.push(node);
48
+ }
49
+ return nodes;
50
+ });
51
+ const topNodes = atom((g) => {
52
+ return g(topData).map((c, i) => ({ data: c, id: `top-${i}`, kind: "leaf" }));
53
+ });
54
+ const botNodes = atom((g) => {
55
+ return g(bottomData).map((c, i) => ({ data: c, id: `bottom-${i}`, kind: "leaf" }));
56
+ });
57
+ const pinnedIdMap = atom((g) => {
58
+ const combined = new Map([...g(topNodes), ...g(botNodes)].map((c) => [c.id, c]));
59
+ return combined;
60
+ });
61
+ const models = atom({
62
+ sort: [],
63
+ filter: {},
64
+ filterIn: {},
65
+ quickSearch: null,
66
+ agg: {},
67
+ group: [],
68
+ groupExpansions: {},
69
+ });
70
+ const sortModel = atom((g) => g(models).sort);
71
+ const filterModel = atom((g) => g(models).filter);
72
+ const filterInModel = atom((g) => g(models).filterIn);
73
+ const rowGroupModel = atom((g) => g(models).group);
74
+ const groupExpansions = atom((g) => g(models).groupExpansions);
75
+ const aggModel = atom((g) => g(models).agg);
76
+ const quickSearch = atom((g) => g(models).quickSearch);
77
+ const grid$ = atom(null);
78
+ const snapshot = atom(0);
79
+ const tree = atom((g) => {
80
+ g(snapshot);
81
+ const grid = g(grid$);
82
+ const rows = g(centerNodes);
83
+ const filtered = computeFilteredRows(
84
+ rows,
85
+ grid,
86
+ g(filterModel),
87
+ g(filterInModel),
88
+ g(quickSearch),
89
+ grid?.state.quickSearchSensitivity.get() ?? "case-sensitive",
90
+ false,
91
+ );
92
+ const rowGroups = g(rowGroupModel)
93
+ .map((c) => {
94
+ if (typeof c === "string")
95
+ return (r) => grid.api.columnField(c, { kind: "leaf", data: r.data });
96
+ if (typeof c.field === "string" || typeof c.field === "number")
97
+ return (r) => r.data[c.field];
98
+ if (typeof c.field === "function") return (r) => c.field({ data: r.data, grid: grid });
99
+ return (r) => get(r.data, c.field.path);
100
+ })
101
+ .map((c) => ({ fn: c }));
102
+ const rowAggModel = Object.entries(g(aggModel)).map(([name, agg]) => {
103
+ if (typeof agg.fn === "function") {
104
+ const fn = agg.fn;
105
+ return {
106
+ name,
107
+ fn: (rows) =>
108
+ fn(
109
+ rows.map((c) => c.data),
110
+ grid,
111
+ ),
152
112
  };
153
- return comparator;
113
+ }
114
+ const key = agg.fn;
115
+ const fn = (data) => {
116
+ const fieldData = data.map((r) =>
117
+ grid?.api.columnField(name, { kind: "leaf", data: r.data }),
118
+ );
119
+ return builtIns[key](fieldData);
120
+ };
121
+ return { name, fn };
154
122
  });
155
- const idToNode = atom((g) => {
156
- const map = new Map();
157
- traverse(g(tree).root, (node) => {
158
- map.set(node.id, node);
159
- });
160
- return map;
123
+ return makeClientTree({
124
+ rowData: filtered,
125
+ rowAggModel: grid ? rowAggModel : [],
126
+ rowBranchModel: grid ? rowGroups : [],
127
+ rowIdGroup: p.rowIdBranch,
128
+ rowIdLeaf: p.rowIdLeaf,
161
129
  });
162
- const initialized = atom(false);
163
- const flat = atom((g) => {
164
- if (!g(initialized))
165
- return { flat: [], idMap: new Map(), idToIndexMap: new Map() };
166
- const idMap = new Map();
167
- const idToIndexMap = new Map();
168
- const flattened = [];
169
- const comparator = g(sortComparator);
170
- const expansions = g(groupExpansions);
171
- const defaultExpansion = g(grid$)?.state.rowGroupDefaultExpansion.get() ?? false;
172
- let index = g(topNodes).length;
173
- traverse(g(tree).root, (node) => {
174
- if (node.kind === 1) {
175
- node.data.id = node.id;
176
- flattened.push(node.data);
177
- }
178
- else {
179
- flattened.push({
180
- kind: "branch",
181
- data: node.data,
182
- id: node.id,
183
- key: node.key,
184
- depth: node.depth,
185
- });
186
- }
187
- idMap.set(node.id, flattened.at(-1));
188
- idToIndexMap.set(node.id, index);
189
- index++;
190
- if (node.kind === 2) {
191
- const expanded = expansions[node.id] ??
192
- (typeof defaultExpansion === "number"
193
- ? node.depth <= defaultExpansion
194
- : defaultExpansion);
195
- return expanded;
196
- }
197
- }, comparator);
198
- return { flat: flattened, idMap, idToIndexMap };
130
+ });
131
+ const sortComparator = atom((g) => {
132
+ const model = g(sortModel);
133
+ const grid = g(grid$);
134
+ if (!model.length || !grid) return () => 0;
135
+ const comparator = (l, r) => {
136
+ let res = 0;
137
+ for (const sortSpec of model) {
138
+ const sort = sortSpec.sort;
139
+ const columnId = sortSpec.columnId;
140
+ const ld =
141
+ l.kind === 2
142
+ ? { kind: "branch", data: l.data, key: l.key }
143
+ : { kind: "leaf", data: l.data.data };
144
+ const rd =
145
+ r.kind === 2
146
+ ? { kind: "branch", data: r.data, key: r.key }
147
+ : { kind: "leaf", data: r.data.data };
148
+ if (sort.kind === "custom") {
149
+ res = sort.comparator(ld, rd, sort.options ?? {});
150
+ } else if (sort.kind === "number") {
151
+ const left = grid.api.columnField(columnId, ld);
152
+ const right = grid.api.columnField(columnId, rd);
153
+ res = numberComparator(left, right, sort.options ?? {});
154
+ } else if (sort.kind === "date") {
155
+ const left = grid.api.columnField(columnId, ld);
156
+ const right = grid.api.columnField(columnId, rd);
157
+ res = dateComparator(left, right, sort.options ?? {});
158
+ } else if (sort.kind === "string") {
159
+ const left = grid.api.columnField(columnId, ld);
160
+ const right = grid.api.columnField(columnId, rd);
161
+ res = stringComparator(left, right, sort.options ?? {});
162
+ } else {
163
+ res = 0;
164
+ }
165
+ res = sortSpec.isDescending ? -res : res;
166
+ if (res !== 0) break;
167
+ }
168
+ return res;
169
+ };
170
+ return comparator;
171
+ });
172
+ const idToNode = atom((g) => {
173
+ const map = new Map();
174
+ traverse(g(tree).root, (node) => {
175
+ map.set(node.id, node);
199
176
  });
200
- const flatLength = atom((g) => g(flat).flat.length);
201
- const cleanup = [];
202
- const init = (grid) => {
203
- while (cleanup.length)
204
- cleanup.pop()?.();
205
- rdsStore.set(grid$, grid);
206
- const store = grid.state.rowDataStore;
207
- // Monitor row count changes
208
- const rowCount = rdsStore.get(flatLength);
209
- const perPage = rdsStore.get(rowsPerPage);
210
- const currentPage = rdsStore.get(pageInternal);
177
+ return map;
178
+ });
179
+ const initialized = atom(false);
180
+ const flat = atom((g) => {
181
+ if (!g(initialized)) return { flat: [], idMap: new Map(), idToIndexMap: new Map() };
182
+ const idMap = new Map();
183
+ const idToIndexMap = new Map();
184
+ const flattened = [];
185
+ const comparator = g(sortComparator);
186
+ const expansions = g(groupExpansions);
187
+ const defaultExpansion = g(grid$)?.state.rowGroupDefaultExpansion.get() ?? false;
188
+ let index = g(topNodes).length;
189
+ traverse(
190
+ g(tree).root,
191
+ (node) => {
192
+ if (node.kind === 1) {
193
+ node.data.id = node.id;
194
+ flattened.push(node.data);
195
+ } else {
196
+ flattened.push({
197
+ kind: "branch",
198
+ data: node.data,
199
+ id: node.id,
200
+ key: node.key,
201
+ depth: node.depth,
202
+ });
203
+ }
204
+ idMap.set(node.id, flattened.at(-1));
205
+ idToIndexMap.set(node.id, index);
206
+ index++;
207
+ if (node.kind === 2) {
208
+ const expanded =
209
+ expansions[node.id] ??
210
+ (typeof defaultExpansion === "number"
211
+ ? node.depth <= defaultExpansion
212
+ : defaultExpansion);
213
+ return expanded;
214
+ }
215
+ },
216
+ comparator,
217
+ );
218
+ return { flat: flattened, idMap, idToIndexMap };
219
+ });
220
+ const flatLength = atom((g) => g(flat).flat.length);
221
+ const cleanup = [];
222
+ const init = (grid) => {
223
+ while (cleanup.length) cleanup.pop()?.();
224
+ rdsStore.set(grid$, grid);
225
+ const store = grid.state.rowDataStore;
226
+ // Monitor row count changes
227
+ const rowCount = rdsStore.get(flatLength);
228
+ const perPage = rdsStore.get(rowsPerPage);
229
+ const currentPage = rdsStore.get(pageInternal);
230
+ const center = clamp(0, rowCount - currentPage * perPage, perPage);
231
+ store.rowCenterCount.set(center);
232
+ const updateCounts = () => {
233
+ const rowCount = rdsStore.get(flatLength);
234
+ const perPage = rdsStore.get(rowsPerPage);
235
+ const currentPage = rdsStore.get(pageInternal);
236
+ const center = clamp(0, rowCount - currentPage * perPage, perPage);
237
+ // Move to the last page if we are past the boundary
238
+ if (center === 0 && currentPage !== 0) {
239
+ const currentPage = rdsStore.get(pageCount) - 1;
240
+ rdsStore.set(page, currentPage);
241
+ rdsStore.set(snapshot, (prev) => prev + 1);
211
242
  const center = clamp(0, rowCount - currentPage * perPage, perPage);
212
243
  store.rowCenterCount.set(center);
213
- const updateCounts = () => {
214
- const rowCount = rdsStore.get(flatLength);
215
- const perPage = rdsStore.get(rowsPerPage);
216
- const currentPage = rdsStore.get(pageInternal);
217
- const center = clamp(0, rowCount - currentPage * perPage, perPage);
218
- // Move to the last page if we are past the boundary
219
- if (center === 0 && currentPage !== 0) {
220
- const currentPage = rdsStore.get(pageCount) - 1;
221
- rdsStore.set(page, currentPage);
222
- rdsStore.set(snapshot, (prev) => prev + 1);
223
- const center = clamp(0, rowCount - currentPage * perPage, perPage);
224
- store.rowCenterCount.set(center);
225
- grid.state.rowDataStore.rowClearCache();
226
- return;
227
- }
228
- store.rowCenterCount.set(center);
229
- grid.state.rowDataStore.rowClearCache();
230
- };
231
- cleanup.push(rdsStore.sub(flatLength, updateCounts));
232
- cleanup.push(rdsStore.sub(page, updateCounts));
233
- cleanup.push(rdsStore.sub(rowsPerPage, updateCounts));
234
- cleanup.push(rdsStore.sub(pageInternal, () => {
235
- grid.state.rowDataStore.rowClearCache();
236
- }));
244
+ grid.state.rowDataStore.rowClearCache();
245
+ return;
246
+ }
247
+ store.rowCenterCount.set(center);
248
+ grid.state.rowDataStore.rowClearCache();
249
+ };
250
+ cleanup.push(rdsStore.sub(flatLength, updateCounts));
251
+ cleanup.push(rdsStore.sub(page, updateCounts));
252
+ cleanup.push(rdsStore.sub(rowsPerPage, updateCounts));
253
+ cleanup.push(
254
+ rdsStore.sub(pageInternal, () => {
255
+ grid.state.rowDataStore.rowClearCache();
256
+ }),
257
+ );
258
+ const top = rdsStore.get(topData).length;
259
+ store.rowTopCount.set(top);
260
+ cleanup.push(
261
+ rdsStore.sub(topData, () => {
262
+ grid.state.rowDataStore.rowClearCache();
237
263
  const top = rdsStore.get(topData).length;
238
264
  store.rowTopCount.set(top);
239
- cleanup.push(rdsStore.sub(topData, () => {
240
- grid.state.rowDataStore.rowClearCache();
241
- const top = rdsStore.get(topData).length;
242
- store.rowTopCount.set(top);
243
- }));
244
- const bottom = rdsStore.get(bottomData).length;
245
- store.rowBottomCount.set(bottom);
246
- cleanup.push(rdsStore.sub(bottomData, () => {
247
- grid.state.rowDataStore.rowClearCache();
248
- const bot = rdsStore.get(bottomData).length;
249
- store.rowBottomCount.set(bot);
250
- }));
251
- const sort = grid.state.sortModel.get();
252
- const filter = grid.state.filterModel.get();
253
- const filterIn = grid.state.filterInModel.get();
254
- const group = grid.state.rowGroupModel.get();
255
- const groupExpansions = grid.state.rowGroupExpansions.get();
256
- const agg = grid.state.aggModel.get();
257
- const quickSearch = grid.state.quickSearch.get();
258
- rdsStore.set(models, { agg, filter, filterIn, group, groupExpansions, sort, quickSearch });
259
- rdsStore.set(initialized, true);
260
- // Sort model monitoring
261
- cleanup.push(grid.state.sortModel.watch(() => {
262
- grid.state.rowDataStore.rowClearCache();
263
- rdsStore.set(models, (prev) => ({ ...prev, sort: grid.state.sortModel.get() }));
264
- }));
265
- // Filter model monitoring
266
- cleanup.push(grid.state.filterModel.watch(() => {
267
- rdsStore.set(models, (prev) => ({ ...prev, filter: grid.state.filterModel.get() }));
268
- grid.state.rowDataStore.rowClearCache();
269
- }));
270
- cleanup.push(grid.state.quickSearch.watch(() => {
271
- rdsStore.set(models, (prev) => ({ ...prev, quickSearch: grid.state.quickSearch.get() }));
272
- grid.state.rowDataStore.rowClearCache();
273
- }));
274
- cleanup.push(grid.state.filterInModel.watch(() => {
275
- grid.state.filterInModel.watch(() => {
276
- rdsStore.set(models, (prev) => ({ ...prev, filterIn: grid.state.filterInModel.get() }));
277
- grid.state.rowDataStore.rowClearCache();
278
- });
279
- }));
280
- // Row group model monitoring
281
- cleanup.push(grid.state.rowGroupModel.watch(() => {
282
- rdsStore.set(models, (prev) => ({ ...prev, group: grid.state.rowGroupModel.get() }));
283
- grid.state.rowDataStore.rowClearCache();
284
- }));
285
- // Row group expansions monitoring
286
- cleanup.push(grid.state.rowGroupExpansions.watch(() => {
287
- rdsStore.set(models, (prev) => ({
288
- ...prev,
289
- groupExpansions: grid.state.rowGroupExpansions.get(),
290
- }));
291
- grid.state.rowDataStore.rowClearCache();
292
- }));
293
- // Agg model monitoring
294
- cleanup.push(grid.state.aggModel.watch(() => {
295
- rdsStore.set(models, (prev) => ({ ...prev, agg: grid.state.aggModel.get() }));
296
- grid.state.rowDataStore.rowClearCache();
265
+ }),
266
+ );
267
+ const bottom = rdsStore.get(bottomData).length;
268
+ store.rowBottomCount.set(bottom);
269
+ cleanup.push(
270
+ rdsStore.sub(bottomData, () => {
271
+ grid.state.rowDataStore.rowClearCache();
272
+ const bot = rdsStore.get(bottomData).length;
273
+ store.rowBottomCount.set(bot);
274
+ }),
275
+ );
276
+ const sort = grid.state.sortModel.get();
277
+ const filter = grid.state.filterModel.get();
278
+ const filterIn = grid.state.filterInModel.get();
279
+ const group = grid.state.rowGroupModel.get();
280
+ const groupExpansions = grid.state.rowGroupExpansions.get();
281
+ const agg = grid.state.aggModel.get();
282
+ const quickSearch = grid.state.quickSearch.get();
283
+ rdsStore.set(models, { agg, filter, filterIn, group, groupExpansions, sort, quickSearch });
284
+ rdsStore.set(initialized, true);
285
+ // Sort model monitoring
286
+ cleanup.push(
287
+ grid.state.sortModel.watch(() => {
288
+ grid.state.rowDataStore.rowClearCache();
289
+ rdsStore.set(models, (prev) => ({ ...prev, sort: grid.state.sortModel.get() }));
290
+ }),
291
+ );
292
+ // Filter model monitoring
293
+ cleanup.push(
294
+ grid.state.filterModel.watch(() => {
295
+ rdsStore.set(models, (prev) => ({ ...prev, filter: grid.state.filterModel.get() }));
296
+ grid.state.rowDataStore.rowClearCache();
297
+ }),
298
+ );
299
+ cleanup.push(
300
+ grid.state.quickSearch.watch(() => {
301
+ rdsStore.set(models, (prev) => ({ ...prev, quickSearch: grid.state.quickSearch.get() }));
302
+ grid.state.rowDataStore.rowClearCache();
303
+ }),
304
+ );
305
+ cleanup.push(
306
+ grid.state.filterInModel.watch(() => {
307
+ grid.state.filterInModel.watch(() => {
308
+ rdsStore.set(models, (prev) => ({ ...prev, filterIn: grid.state.filterInModel.get() }));
309
+ grid.state.rowDataStore.rowClearCache();
310
+ });
311
+ }),
312
+ );
313
+ // Row group model monitoring
314
+ cleanup.push(
315
+ grid.state.rowGroupModel.watch(() => {
316
+ rdsStore.set(models, (prev) => ({ ...prev, group: grid.state.rowGroupModel.get() }));
317
+ grid.state.rowDataStore.rowClearCache();
318
+ }),
319
+ );
320
+ // Row group expansions monitoring
321
+ cleanup.push(
322
+ grid.state.rowGroupExpansions.watch(() => {
323
+ rdsStore.set(models, (prev) => ({
324
+ ...prev,
325
+ groupExpansions: grid.state.rowGroupExpansions.get(),
297
326
  }));
298
- };
299
- const rowById = (id) => {
300
- const pinned = rdsStore.get(pinnedIdMap);
301
- if (pinned.has(id))
302
- return pinned.get(id);
303
- const t = rdsStore.get(flat);
304
- return t.idMap.get(id) ?? null;
305
- };
306
- const rowByIndex = (index) => {
307
- const top = rdsStore.get(topNodes);
308
- const bot = rdsStore.get(botNodes);
309
- const center = rdsStore.get(flat).flat;
310
- const topOffset = top.length;
311
- const centerOffset = topOffset + center.length;
312
- const botOffset = centerOffset + bot.length;
313
- if (index < topOffset)
314
- return top[index];
315
- if (index < centerOffset) {
316
- const pageOffset = index + rdsStore.get(rowsPerPage) * rdsStore.get(pageInternal);
317
- return center[pageOffset - topOffset];
327
+ grid.state.rowDataStore.rowClearCache();
328
+ }),
329
+ );
330
+ // Agg model monitoring
331
+ cleanup.push(
332
+ grid.state.aggModel.watch(() => {
333
+ rdsStore.set(models, (prev) => ({ ...prev, agg: grid.state.aggModel.get() }));
334
+ grid.state.rowDataStore.rowClearCache();
335
+ }),
336
+ );
337
+ };
338
+ const rowById = (id) => {
339
+ const pinned = rdsStore.get(pinnedIdMap);
340
+ if (pinned.has(id)) return pinned.get(id);
341
+ const t = rdsStore.get(flat);
342
+ return t.idMap.get(id) ?? null;
343
+ };
344
+ const rowByIndex = (index) => {
345
+ const top = rdsStore.get(topNodes);
346
+ const bot = rdsStore.get(botNodes);
347
+ const center = rdsStore.get(flat).flat;
348
+ const topOffset = top.length;
349
+ const centerOffset = topOffset + center.length;
350
+ const botOffset = centerOffset + bot.length;
351
+ if (index < topOffset) return top[index];
352
+ if (index < centerOffset) {
353
+ const pageOffset = index + rdsStore.get(rowsPerPage) * rdsStore.get(pageInternal);
354
+ return center[pageOffset - topOffset];
355
+ }
356
+ if (index < botOffset) return bot[index - centerOffset];
357
+ return null;
358
+ };
359
+ const rowUpdate = (updates) => {
360
+ const grid = rdsStore.get(grid$);
361
+ const d = rdsStore.get(data);
362
+ const idMap = rdsStore.get(idToNode);
363
+ const dataToSrc = rdsStore.get(dataToSrc$);
364
+ for (const [key, next] of updates.entries()) {
365
+ const row = typeof key === "string" ? rowById(key) : rowByIndex(key);
366
+ const treeNode = typeof key === "string" ? idMap.get(key) : null;
367
+ if ((!row && !treeNode) || !grid) {
368
+ console.error(`Failed to find the row with identifier ${key} which is being updated.`);
369
+ continue;
370
+ }
371
+ if (row?.kind === "branch") {
372
+ row.data = next;
373
+ } else {
374
+ const data = row?.kind === "leaf" ? row.data : treeNode?.data.data;
375
+ const source = dataToSrc.get(data);
376
+ if (source == null) {
377
+ console.error(`Failed to find the row with identifier ${key} which is being updated.`);
378
+ continue;
318
379
  }
319
- if (index < botOffset)
320
- return bot[index - centerOffset];
321
- return null;
322
- };
323
- const rowUpdate = (updates) => {
380
+ d[source] = next;
381
+ }
382
+ }
383
+ rdsStore.set(data, [...d]);
384
+ rdsStore.set(snapshot, (prev) => prev + 1);
385
+ grid.state.rowDataStore.rowClearCache();
386
+ };
387
+ const rowToIndex = (rowId) => {
388
+ const f = rdsStore.get(flat);
389
+ const top = rdsStore.get(topNodes);
390
+ const bot = rdsStore.get(botNodes);
391
+ const topCount = top.length;
392
+ const center = f.flat.length;
393
+ const rowIndex = f.idToIndexMap.get(rowId);
394
+ if (rowIndex != null) return rowIndex;
395
+ if (rowIndex == null) {
396
+ const foundTop = top.findIndex((row) => row.id === rowId);
397
+ if (foundTop !== -1) return foundTop;
398
+ const foundBot = bot.findIndex((row) => row.id === rowId);
399
+ if (foundBot !== -1) return foundBot + topCount + center;
400
+ }
401
+ return null;
402
+ };
403
+ const rowAllChildIds = (rowId) => {
404
+ const t = rdsStore.get(tree);
405
+ const ids = [];
406
+ const node = t.idToNode.get(rowId);
407
+ if (node?.kind === 2) {
408
+ traverse(node, (n) => {
409
+ ids.push(n.id);
410
+ });
411
+ }
412
+ return ids;
413
+ };
414
+ return [
415
+ {
416
+ page: {
417
+ current: makeGridAtom(page, rdsStore),
418
+ pageCount: makeGridAtom(pageCount, rdsStore),
419
+ perPage: makeGridAtom(rowsPerPage, rdsStore),
420
+ },
421
+ init,
422
+ rowById,
423
+ rowByIndex,
424
+ rowAllChildIds,
425
+ rowUpdate,
426
+ inFilterItems: (c) => {
324
427
  const grid = rdsStore.get(grid$);
325
- const d = rdsStore.get(data);
326
- const idMap = rdsStore.get(idToNode);
327
- const dataToSrc = rdsStore.get(dataToSrc$);
328
- for (const [key, next] of updates.entries()) {
329
- const row = typeof key === "string" ? rowById(key) : rowByIndex(key);
330
- const treeNode = typeof key === "string" ? idMap.get(key) : null;
331
- if ((!row && !treeNode) || !grid) {
332
- console.error(`Failed to find the row with identifier ${key} which is being updated.`);
333
- continue;
334
- }
335
- if (row?.kind === "branch") {
336
- row.data = next;
337
- }
338
- else {
339
- const data = row?.kind === "leaf" ? row.data : treeNode?.data.data;
340
- const source = dataToSrc.get(data);
341
- if (source == null) {
342
- console.error(`Failed to find the row with identifier ${key} which is being updated.`);
343
- continue;
344
- }
345
- d[source] = next;
428
+ if (!grid) return [];
429
+ const data = rdsStore.get(centerNodes);
430
+ const values = new Set(
431
+ data.map((row) => {
432
+ const field = grid.api.columnField(c, row);
433
+ return field;
434
+ }),
435
+ );
436
+ if (p.transformInFilterItem) {
437
+ return p.transformInFilterItem({ column: c, values: [...values] });
438
+ }
439
+ return [...values].map((x) => ({ id: `${x}`, label: `${x}`, value: x }));
440
+ },
441
+ rowAreAllSelected: (rowId) => {
442
+ const g = rdsStore.get(grid$);
443
+ if (!g) return false;
444
+ const selected = g.state.rowSelectedIds.get();
445
+ if (rowId) {
446
+ const row = rowById(rowId);
447
+ if (!row) return false;
448
+ const childIds = new Set(rowAllChildIds(rowId));
449
+ return childIds.isSubsetOf(selected);
450
+ }
451
+ const f = rdsStore.get(tree);
452
+ return f.idsAll.isSubsetOf(selected);
453
+ },
454
+ rowAdd: (newRows, place = "end") => {
455
+ rdsStore.set(data, (prev) => {
456
+ if (!newRows.length) return prev;
457
+ let next;
458
+ if (place === "beginning") next = [...newRows, ...prev];
459
+ else if (place === "end") next = [...prev, ...newRows];
460
+ else {
461
+ next = [...prev];
462
+ next.splice(place, 0, ...newRows);
463
+ }
464
+ return next;
465
+ });
466
+ const grid = rdsStore.get(grid$);
467
+ grid?.state.rowDataStore.rowClearCache();
468
+ },
469
+ rowDelete: (rows) => {
470
+ const rowData = new Set(
471
+ rows
472
+ .map((c) => {
473
+ if (typeof c === "number") return rowByIndex(c)?.data;
474
+ else return rowById(c)?.data;
475
+ })
476
+ .filter((c) => !!c),
477
+ );
478
+ rdsStore.set(data, (prev) => {
479
+ if (!rowData.size) return prev;
480
+ return prev.filter((d) => !rowData.has(d));
481
+ });
482
+ const grid = rdsStore.get(grid$);
483
+ grid?.state.rowDataStore.rowClearCache();
484
+ },
485
+ rowSetBotData: (data) => {
486
+ rdsStore.set(bottomData, data);
487
+ const grid = rdsStore.get(grid$);
488
+ grid?.state.rowDataStore.rowClearCache();
489
+ },
490
+ rowSetCenterData: (d) => {
491
+ rdsStore.set(data, d);
492
+ const grid = rdsStore.get(grid$);
493
+ grid?.state.rowDataStore.rowClearCache();
494
+ },
495
+ rowSetTopData: (data) => {
496
+ rdsStore.set(topData, data);
497
+ const grid = rdsStore.get(grid$);
498
+ grid?.state.rowDataStore.rowClearCache();
499
+ },
500
+ rowData: (section) => {
501
+ const d = [];
502
+ if (section === "top" || section === "flat") {
503
+ d.push(...rdsStore.get(topData));
504
+ }
505
+ if (section === "center" || section === "flat") {
506
+ d.push(...rdsStore.get(data));
507
+ }
508
+ if (section === "bottom" || section === "flat") {
509
+ d.push(...rdsStore.get(bottomData));
510
+ }
511
+ return d;
512
+ },
513
+ rowExpand: (expansions) => {
514
+ const grid = rdsStore.get(grid$);
515
+ if (!grid) return;
516
+ grid.state.rowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
517
+ },
518
+ rowToIndex,
519
+ rowSelect: (params) => {
520
+ const grid = rdsStore.get(grid$);
521
+ if (!grid) return;
522
+ if (params.mode === "none") return;
523
+ if (params.mode === "single") {
524
+ if (params.deselect) {
525
+ grid.state.rowSelectedIds.set(new Set());
526
+ } else {
527
+ grid.state.rowSelectedIds.set(new Set([params.startId]));
528
+ }
529
+ return;
530
+ }
531
+ const ids = new Set();
532
+ if (params.startId === params.endId) {
533
+ ids.add(params.startId);
534
+ if (params.selectChildren) {
535
+ rowAllChildIds(params.startId).forEach((c) => ids.add(c));
536
+ }
537
+ } else {
538
+ const first = rowToIndex(params.startId);
539
+ const last = rowToIndex(params.endId);
540
+ if (first == null || last == null) return;
541
+ const start = Math.min(first, last);
542
+ const end = Math.max(first, last);
543
+ for (let i = start; i <= end; i++) {
544
+ const row = rowByIndex(i);
545
+ if (!row) continue;
546
+ if (params.selectChildren) {
547
+ rowAllChildIds(row.id).forEach((c) => ids.add(c));
346
548
  }
549
+ if (row?.id) ids.add(row.id);
550
+ }
347
551
  }
348
- rdsStore.set(data, [...d]);
349
- rdsStore.set(snapshot, (prev) => prev + 1);
350
- grid.state.rowDataStore.rowClearCache();
351
- };
352
- const rowToIndex = (rowId) => {
353
- const f = rdsStore.get(flat);
354
- const top = rdsStore.get(topNodes);
355
- const bot = rdsStore.get(botNodes);
356
- const topCount = top.length;
357
- const center = f.flat.length;
358
- const rowIndex = f.idToIndexMap.get(rowId);
359
- if (rowIndex != null)
360
- return rowIndex;
361
- if (rowIndex == null) {
362
- const foundTop = top.findIndex((row) => row.id === rowId);
363
- if (foundTop !== -1)
364
- return foundTop;
365
- const foundBot = bot.findIndex((row) => row.id === rowId);
366
- if (foundBot !== -1)
367
- return foundBot + topCount + center;
552
+ if (params.deselect) {
553
+ const current = grid.state.rowSelectedIds.get();
554
+ const next = current.difference(ids);
555
+ grid.state.rowSelectedIds.set(next);
556
+ } else {
557
+ const current = grid.state.rowSelectedIds.get();
558
+ const next = current.union(ids);
559
+ grid.state.rowSelectedIds.set(next);
368
560
  }
369
- return null;
370
- };
371
- const rowAllChildIds = (rowId) => {
372
- const t = rdsStore.get(tree);
373
- const ids = [];
374
- const node = t.idToNode.get(rowId);
375
- if (node?.kind === 2) {
376
- traverse(node, (n) => {
377
- ids.push(n.id);
378
- });
561
+ },
562
+ rowSelectAll: (params) => {
563
+ const grid = rdsStore.get(grid$);
564
+ if (!grid) return;
565
+ if (params.deselect) {
566
+ grid.state.rowSelectedIds.set(new Set());
567
+ return;
379
568
  }
380
- return ids;
381
- };
382
- return [
383
- {
384
- page: {
385
- current: makeGridAtom(page, rdsStore),
386
- pageCount: makeGridAtom(pageCount, rdsStore),
387
- perPage: makeGridAtom(rowsPerPage, rdsStore),
388
- },
389
- init,
390
- rowById,
391
- rowByIndex,
392
- rowAllChildIds,
393
- rowUpdate,
394
- inFilterItems: (c) => {
395
- const grid = rdsStore.get(grid$);
396
- if (!grid)
397
- return [];
398
- const data = rdsStore.get(centerNodes);
399
- const values = new Set(data.map((row) => {
400
- const field = grid.api.columnField(c, row);
401
- return field;
402
- }));
403
- if (p.transformInFilterItem) {
404
- return p.transformInFilterItem({ column: c, values: [...values] });
405
- }
406
- return [...values].map((x) => ({ id: `${x}`, label: `${x}`, value: x }));
407
- },
408
- rowAreAllSelected: (rowId) => {
409
- const g = rdsStore.get(grid$);
410
- if (!g)
411
- return false;
412
- const selected = g.state.rowSelectedIds.get();
413
- if (rowId) {
414
- const row = rowById(rowId);
415
- if (!row)
416
- return false;
417
- const childIds = new Set(rowAllChildIds(rowId));
418
- return childIds.isSubsetOf(selected);
419
- }
420
- const f = rdsStore.get(tree);
421
- return f.idsAll.isSubsetOf(selected);
422
- },
423
- rowAdd: (newRows, place = "end") => {
424
- rdsStore.set(data, (prev) => {
425
- if (!newRows.length)
426
- return prev;
427
- let next;
428
- if (place === "beginning")
429
- next = [...newRows, ...prev];
430
- else if (place === "end")
431
- next = [...prev, ...newRows];
432
- else {
433
- next = [...prev];
434
- next.splice(place, 0, ...newRows);
435
- }
436
- return next;
437
- });
438
- const grid = rdsStore.get(grid$);
439
- grid?.state.rowDataStore.rowClearCache();
440
- },
441
- rowDelete: (rows) => {
442
- const rowData = new Set(rows
443
- .map((c) => {
444
- if (typeof c === "number")
445
- return rowByIndex(c)?.data;
446
- else
447
- return rowById(c)?.data;
448
- })
449
- .filter((c) => !!c));
450
- rdsStore.set(data, (prev) => {
451
- if (!rowData.size)
452
- return prev;
453
- return prev.filter((d) => !rowData.has(d));
454
- });
455
- const grid = rdsStore.get(grid$);
456
- grid?.state.rowDataStore.rowClearCache();
457
- },
458
- rowSetBotData: (data) => {
459
- rdsStore.set(bottomData, data);
460
- const grid = rdsStore.get(grid$);
461
- grid?.state.rowDataStore.rowClearCache();
462
- },
463
- rowSetCenterData: (d) => {
464
- rdsStore.set(data, d);
465
- const grid = rdsStore.get(grid$);
466
- grid?.state.rowDataStore.rowClearCache();
467
- },
468
- rowSetTopData: (data) => {
469
- rdsStore.set(topData, data);
470
- const grid = rdsStore.get(grid$);
471
- grid?.state.rowDataStore.rowClearCache();
472
- },
473
- rowData: (section) => {
474
- const d = [];
475
- if (section === "top" || section === "flat") {
476
- d.push(...rdsStore.get(topData));
477
- }
478
- if (section === "center" || section === "flat") {
479
- d.push(...rdsStore.get(data));
480
- }
481
- if (section === "bottom" || section === "flat") {
482
- d.push(...rdsStore.get(bottomData));
483
- }
484
- return d;
485
- },
486
- rowExpand: (expansions) => {
487
- const grid = rdsStore.get(grid$);
488
- if (!grid)
489
- return;
490
- grid.state.rowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
491
- },
492
- rowToIndex,
493
- rowSelect: (params) => {
494
- const grid = rdsStore.get(grid$);
495
- if (!grid)
496
- return;
497
- if (params.mode === "none")
498
- return;
499
- if (params.mode === "single") {
500
- if (params.deselect) {
501
- grid.state.rowSelectedIds.set(new Set());
502
- }
503
- else {
504
- grid.state.rowSelectedIds.set(new Set([params.startId]));
505
- }
506
- return;
507
- }
508
- const ids = new Set();
509
- if (params.startId === params.endId) {
510
- ids.add(params.startId);
511
- if (params.selectChildren) {
512
- rowAllChildIds(params.startId).forEach((c) => ids.add(c));
513
- }
514
- }
515
- else {
516
- const first = rowToIndex(params.startId);
517
- const last = rowToIndex(params.endId);
518
- if (first == null || last == null)
519
- return;
520
- const start = Math.min(first, last);
521
- const end = Math.max(first, last);
522
- for (let i = start; i <= end; i++) {
523
- const row = rowByIndex(i);
524
- if (!row)
525
- continue;
526
- if (params.selectChildren) {
527
- rowAllChildIds(row.id).forEach((c) => ids.add(c));
528
- }
529
- if (row?.id)
530
- ids.add(row.id);
531
- }
532
- }
533
- if (params.deselect) {
534
- const current = grid.state.rowSelectedIds.get();
535
- const next = current.difference(ids);
536
- grid.state.rowSelectedIds.set(next);
537
- }
538
- else {
539
- const current = grid.state.rowSelectedIds.get();
540
- const next = current.union(ids);
541
- grid.state.rowSelectedIds.set(next);
542
- }
543
- },
544
- rowSelectAll: (params) => {
545
- const grid = rdsStore.get(grid$);
546
- if (!grid)
547
- return;
548
- if (params.deselect) {
549
- grid.state.rowSelectedIds.set(new Set());
550
- return;
551
- }
552
- const t = rdsStore.get(tree);
553
- grid.state.rowSelectedIds.set(new Set(t.idsAll));
554
- },
555
- },
556
- {
557
- top: makeGridAtom(topData, rdsStore),
558
- center: makeGridAtom(data, rdsStore),
559
- bottom: makeGridAtom(bottomData, rdsStore),
560
- },
561
- ];
569
+ const t = rdsStore.get(tree);
570
+ grid.state.rowSelectedIds.set(new Set(t.idsAll));
571
+ },
572
+ },
573
+ {
574
+ top: makeGridAtom(topData, rdsStore),
575
+ center: makeGridAtom(data, rdsStore),
576
+ bottom: makeGridAtom(bottomData, rdsStore),
577
+ },
578
+ ];
562
579
  }
563
580
  export function useClientRowDataSourcePaginated(p) {
564
- const ds = useRef(null);
565
- const dataAtomRef = useRef(null);
566
- if (!ds.current)
567
- [ds.current, dataAtomRef.current] = makeClientDataSourcePaginated(p);
568
- const da = dataAtomRef.current;
569
- if (p.reflectData) {
570
- // Need to queue the microtask since it we cannot update state during render.
571
- if (p.data !== da.center.get())
572
- queueMicrotask(() => ds.current.rowSetCenterData(p.data));
573
- if (!equal(p.topData ?? [], da.top.get())) {
574
- queueMicrotask(() => ds.current.rowSetTopData(p.topData ?? []));
575
- }
576
- if (!equal(p.bottomData ?? [], da.bottom.get()))
577
- queueMicrotask(() => ds.current.rowSetBotData(p.bottomData ?? []));
581
+ const ds = useRef(null);
582
+ const dataAtomRef = useRef(null);
583
+ if (!ds.current) [ds.current, dataAtomRef.current] = makeClientDataSourcePaginated(p);
584
+ const da = dataAtomRef.current;
585
+ if (p.reflectData) {
586
+ // Need to queue the microtask since it we cannot update state during render.
587
+ if (p.data !== da.center.get()) queueMicrotask(() => ds.current.rowSetCenterData(p.data));
588
+ if (!equal(p.topData ?? [], da.top.get())) {
589
+ queueMicrotask(() => ds.current.rowSetTopData(p.topData ?? []));
578
590
  }
579
- return ds.current;
591
+ if (!equal(p.bottomData ?? [], da.bottom.get()))
592
+ queueMicrotask(() => ds.current.rowSetBotData(p.bottomData ?? []));
593
+ }
594
+ return ds.current;
580
595
  }