@1771technologies/lytenyte-pro 1.0.0-beta.12 → 1.0.0-beta.14

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