@1771technologies/lytenyte-pro 1.0.0-beta.33 → 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 -5
  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,7 +2,12 @@ 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 { equal, get, itemsWithIdToMap } from "@1771technologies/lytenyte-js-utils";
7
12
  import { computeFilteredRows } from "./filter/compute-filtered-rows.js";
8
13
  import { builtIns } from "./built-ins/built-ins.js";
@@ -10,688 +15,718 @@ import { createPivotColumns } from "./pivots/create-pivot-columns.js";
10
15
  import { createAggModel } from "./pivots/create-agg-model.js";
11
16
  import { makeClientTree } from "./tree/client-tree.js";
12
17
  export function makeClientDataSource(p) {
13
- const rdsStore = createStore();
14
- const data = atom(p.data);
15
- const topData = atom(p.topData ?? []);
16
- const bottomData = atom(p.bottomData ?? []);
17
- const dataToSrc$ = atom((g) => {
18
- return new Map(g(data).map((c, i) => [c, i]));
19
- });
20
- const cache = new Map();
21
- const centerNodes = atom((g) => {
22
- const nodes = [];
23
- const d = g(data);
24
- for (let i = 0; i < d.length; i++) {
25
- if (!cache.has(i)) {
26
- cache.set(i, {
27
- id: "",
28
- kind: "leaf",
29
- data: d[i],
30
- });
31
- }
32
- const node = cache.get(i);
33
- node.data = d[i];
34
- nodes.push(node);
35
- }
36
- return nodes;
37
- });
38
- const topNodes = atom((g) => {
39
- return g(topData).map((c, i) => ({ data: c, id: `top-${i}`, kind: "leaf" }));
40
- });
41
- const botNodes = atom((g) => {
42
- return g(bottomData).map((c, i) => ({ data: c, id: `bottom-${i}`, kind: "leaf" }));
43
- });
44
- const pinnedIdMap = atom((g) => {
45
- const combined = new Map([...g(topNodes), ...g(botNodes)].map((c) => [c.id, c]));
46
- return combined;
47
- });
48
- const models = atom({
49
- sort: [],
50
- filter: {},
51
- filterIn: {},
52
- quickSearch: null,
53
- agg: {},
54
- group: [],
55
- groupExpansions: {},
56
- columnPivotGroupExpansions: {},
57
- pivotMode: false,
58
- pivotModel: {
59
- columns: [],
60
- filters: {},
61
- filtersIn: {},
62
- rows: [],
63
- sorts: [],
64
- values: [],
65
- },
66
- });
67
- const sortModel = atom((g) => g(models).sort);
68
- const filterModel = atom((g) => g(models).filter);
69
- const filterInModel = atom((g) => g(models).filterIn);
70
- const rowGroupModel = atom((g) => g(models).group);
71
- const groupExpansions = atom((g) => g(models).groupExpansions);
72
- const aggModel = atom((g) => g(models).agg);
73
- const quickSearch = atom((g) => g(models).quickSearch);
74
- const columnPivotGroupExpansions = atom((g) => g(models).columnPivotGroupExpansions);
75
- const columnPivotMode = atom((g) => g(models).pivotMode);
76
- const columnPivotModel = atom((g) => g(models).pivotModel);
77
- const grid$ = atom(null);
78
- const snapshot = atom(0);
79
- const pivotTree = atom((g) => {
80
- g(snapshot);
81
- const grid = g(grid$);
82
- const model = g(columnPivotModel);
83
- const lookup = new Map(grid.state.columns.get().map((c) => [c.id, c]));
84
- const activeRows = model.rows.filter((c) => c.active ?? true);
85
- const rowGroups = activeRows.length
86
- ? activeRows.map((c) => {
87
- const column = lookup.get(c.field);
88
- return {
89
- fn: (r) => {
90
- const res = grid.api.columnField(column, r);
91
- return res == null ? null : `${res}`;
92
- },
93
- };
94
- })
95
- : [{ fn: () => null }];
96
- const filtered = computeFilteredRows(g(centerNodes), grid, model.filters, model.filtersIn, "", "case-sensitive", true);
97
- const aggModel = createAggModel(model, grid.state.columnPivotColumns.get(), grid.state.columnGroupJoinDelimiter.get());
98
- const rowAggModel = Object.entries(aggModel).map(([name, agg]) => {
99
- if (typeof agg.fn === "function") {
100
- const fn = agg.fn;
101
- return {
102
- name,
103
- fn: (rows) => fn(rows.map((c) => c.data), grid),
104
- };
105
- }
106
- const key = agg.fn;
107
- const fn = (data) => {
108
- const fieldData = data.map((r) => grid?.api.columnField(name, { kind: "leaf", data: r.data }));
109
- return builtIns[key](fieldData);
110
- };
111
- return { name, fn };
18
+ const rdsStore = createStore();
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],
112
35
  });
113
- return makeClientTree({
114
- rowData: filtered,
115
- rowAggModel: rowAggModel,
116
- rowBranchModel: rowGroups,
117
- rowIdGroup: p.rowIdBranch,
118
- rowIdLeaf: p.rowIdLeaf,
119
- });
120
- });
121
- const normalTree = atom((g) => {
122
- g(snapshot);
123
- const grid = g(grid$);
124
- const rows = g(centerNodes);
125
- const filtered = computeFilteredRows(rows, grid, g(filterModel), g(filterInModel), g(quickSearch), grid?.state.quickSearchSensitivity.get() ?? "case-sensitive", false);
126
- const rowGroups = g(rowGroupModel)
127
- .map((c) => {
128
- if (typeof c === "string")
129
- return (r) => grid.api.columnField(c, r);
130
- if (typeof c.field === "string" || typeof c.field === "number")
131
- return (r) => r.data[c.field];
132
- if (typeof c.field === "function")
133
- return (r) => c.field({ data: r.data, grid: grid });
134
- return (r) => get(r.data, c.field.path);
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
+ columnPivotGroupExpansions: {},
62
+ pivotMode: false,
63
+ pivotModel: {
64
+ columns: [],
65
+ filters: {},
66
+ filtersIn: {},
67
+ rows: [],
68
+ sorts: [],
69
+ values: [],
70
+ },
71
+ });
72
+ const sortModel = atom((g) => g(models).sort);
73
+ const filterModel = atom((g) => g(models).filter);
74
+ const filterInModel = atom((g) => g(models).filterIn);
75
+ const rowGroupModel = atom((g) => g(models).group);
76
+ const groupExpansions = atom((g) => g(models).groupExpansions);
77
+ const aggModel = atom((g) => g(models).agg);
78
+ const quickSearch = atom((g) => g(models).quickSearch);
79
+ const columnPivotGroupExpansions = atom((g) => g(models).columnPivotGroupExpansions);
80
+ const columnPivotMode = atom((g) => g(models).pivotMode);
81
+ const columnPivotModel = atom((g) => g(models).pivotModel);
82
+ const grid$ = atom(null);
83
+ const snapshot = atom(0);
84
+ const pivotTree = atom((g) => {
85
+ g(snapshot);
86
+ const grid = g(grid$);
87
+ const model = g(columnPivotModel);
88
+ const lookup = new Map(grid.state.columns.get().map((c) => [c.id, c]));
89
+ const activeRows = model.rows.filter((c) => c.active ?? true);
90
+ const rowGroups = activeRows.length
91
+ ? activeRows.map((c) => {
92
+ const column = lookup.get(c.field);
93
+ return {
94
+ fn: (r) => {
95
+ const res = grid.api.columnField(column, r);
96
+ return res == null ? null : `${res}`;
97
+ },
98
+ };
135
99
  })
136
- .map((c) => ({ fn: c }));
137
- const rowAggModel = Object.entries(g(aggModel)).map(([name, agg]) => {
138
- if (typeof agg.fn === "function") {
139
- const fn = agg.fn;
140
- return {
141
- name,
142
- fn: (rows) => fn(rows.map((c) => c.data), grid),
143
- };
144
- }
145
- const key = agg.fn;
146
- const fn = (data) => {
147
- const fieldData = data.map((r) => grid?.api.columnField(name, { kind: "leaf", data: r.data }));
148
- return builtIns[key](fieldData);
149
- };
150
- return { name, fn };
151
- });
152
- return makeClientTree({
153
- rowData: filtered,
154
- rowAggModel: grid ? rowAggModel : [],
155
- rowBranchModel: grid ? rowGroups : [],
156
- rowIdGroup: p.rowIdBranch,
157
- rowIdLeaf: p.rowIdLeaf,
158
- });
159
- });
160
- const sortComparator = atom((g) => {
161
- const model = g(columnPivotMode) ? g(columnPivotModel).sorts : g(sortModel);
162
- const grid = g(grid$);
163
- if (!model.length || !grid)
164
- return () => 0;
165
- const comparator = (l, r) => {
166
- let res = 0;
167
- for (const sortSpec of model) {
168
- const sort = sortSpec.sort;
169
- const columnId = sortSpec.columnId;
170
- const ld = l.kind === 2
171
- ? { kind: "branch", data: l.data, key: l.key }
172
- : { kind: "leaf", data: l.data.data };
173
- const rd = r.kind === 2
174
- ? { kind: "branch", data: r.data, key: r.key }
175
- : { kind: "leaf", data: r.data.data };
176
- if (sort.kind === "custom") {
177
- res = sort.comparator(ld, rd, sort.options ?? {});
178
- }
179
- else if (sort.kind === "number") {
180
- const left = grid.api.columnField(columnId, ld);
181
- const right = grid.api.columnField(columnId, rd);
182
- res = numberComparator(left, right, sort.options ?? {});
183
- }
184
- else if (sort.kind === "date") {
185
- const left = grid.api.columnField(columnId, ld);
186
- const right = grid.api.columnField(columnId, rd);
187
- res = dateComparator(left, right, sort.options ?? {});
188
- }
189
- else if (sort.kind === "string") {
190
- const left = grid.api.columnField(columnId, ld);
191
- const right = grid.api.columnField(columnId, rd);
192
- res = stringComparator(left, right, sort.options ?? {});
193
- }
194
- else {
195
- res = 0;
196
- }
197
- res = sortSpec.isDescending ? -res : res;
198
- if (res !== 0)
199
- break;
200
- }
201
- return res;
100
+ : [{ fn: () => null }];
101
+ const filtered = computeFilteredRows(
102
+ g(centerNodes),
103
+ grid,
104
+ model.filters,
105
+ model.filtersIn,
106
+ "",
107
+ "case-sensitive",
108
+ true,
109
+ );
110
+ const aggModel = createAggModel(
111
+ model,
112
+ grid.state.columnPivotColumns.get(),
113
+ grid.state.columnGroupJoinDelimiter.get(),
114
+ );
115
+ const rowAggModel = Object.entries(aggModel).map(([name, agg]) => {
116
+ if (typeof agg.fn === "function") {
117
+ const fn = agg.fn;
118
+ return {
119
+ name,
120
+ fn: (rows) =>
121
+ fn(
122
+ rows.map((c) => c.data),
123
+ grid,
124
+ ),
202
125
  };
203
- return comparator;
126
+ }
127
+ const key = agg.fn;
128
+ const fn = (data) => {
129
+ const fieldData = data.map((r) =>
130
+ grid?.api.columnField(name, { kind: "leaf", data: r.data }),
131
+ );
132
+ return builtIns[key](fieldData);
133
+ };
134
+ return { name, fn };
204
135
  });
205
- const idToNode = atom((g) => {
206
- const map = new Map();
207
- traverse(g(tree).root, (node) => {
208
- map.set(node.id, node);
209
- });
210
- return map;
136
+ return makeClientTree({
137
+ rowData: filtered,
138
+ rowAggModel: rowAggModel,
139
+ rowBranchModel: rowGroups,
140
+ rowIdGroup: p.rowIdBranch,
141
+ rowIdLeaf: p.rowIdLeaf,
211
142
  });
212
- const tree = atom((g) => (g(columnPivotMode) ? g(pivotTree) : g(normalTree)));
213
- const initialized = atom(false);
214
- const flatPivot = atom((g) => {
215
- if (!g(initialized))
216
- return { flat: [], idMap: new Map(), idToIndexMap: new Map() };
217
- const idMap = new Map();
218
- const idToIndexMap = new Map();
219
- const flattened = [];
220
- const comparator = g(sortComparator);
221
- const expansions = g(columnPivotGroupExpansions);
222
- const defaultExpansion = g(grid$)?.state.rowGroupDefaultExpansion.get() ?? false;
223
- let index = 0;
224
- traverse(g(tree).root, (node) => {
225
- if (node.kind === 1) {
226
- return;
227
- }
228
- else {
229
- flattened.push({
230
- kind: "branch",
231
- data: node.data,
232
- id: node.id,
233
- key: node.key,
234
- depth: node.depth,
235
- });
236
- }
237
- idMap.set(node.id, flattened.at(-1));
238
- idToIndexMap.set(node.id, index);
239
- index++;
240
- if (node.kind === 2) {
241
- const expanded = expansions[node.id] ??
242
- (typeof defaultExpansion === "number"
243
- ? node.depth <= defaultExpansion
244
- : defaultExpansion);
245
- return expanded;
246
- }
247
- }, comparator);
248
- return { flat: flattened, idMap, idToIndexMap };
143
+ });
144
+ const normalTree = atom((g) => {
145
+ g(snapshot);
146
+ const grid = g(grid$);
147
+ const rows = g(centerNodes);
148
+ const filtered = computeFilteredRows(
149
+ rows,
150
+ grid,
151
+ g(filterModel),
152
+ g(filterInModel),
153
+ g(quickSearch),
154
+ grid?.state.quickSearchSensitivity.get() ?? "case-sensitive",
155
+ false,
156
+ );
157
+ const rowGroups = g(rowGroupModel)
158
+ .map((c) => {
159
+ if (typeof c === "string") return (r) => grid.api.columnField(c, r);
160
+ if (typeof c.field === "string" || typeof c.field === "number")
161
+ return (r) => r.data[c.field];
162
+ if (typeof c.field === "function") return (r) => c.field({ data: r.data, grid: grid });
163
+ return (r) => get(r.data, c.field.path);
164
+ })
165
+ .map((c) => ({ fn: c }));
166
+ const rowAggModel = Object.entries(g(aggModel)).map(([name, agg]) => {
167
+ if (typeof agg.fn === "function") {
168
+ const fn = agg.fn;
169
+ return {
170
+ name,
171
+ fn: (rows) =>
172
+ fn(
173
+ rows.map((c) => c.data),
174
+ grid,
175
+ ),
176
+ };
177
+ }
178
+ const key = agg.fn;
179
+ const fn = (data) => {
180
+ const fieldData = data.map((r) =>
181
+ grid?.api.columnField(name, { kind: "leaf", data: r.data }),
182
+ );
183
+ return builtIns[key](fieldData);
184
+ };
185
+ return { name, fn };
249
186
  });
250
- const flatNormal = atom((g) => {
251
- if (!g(initialized))
252
- return { flat: [], idMap: new Map(), idToIndexMap: new Map() };
253
- const idMap = new Map();
254
- const idToIndexMap = new Map();
255
- const flattened = [];
256
- const comparator = g(sortComparator);
257
- const expansions = g(groupExpansions);
258
- const defaultExpansion = g(grid$)?.state.rowGroupDefaultExpansion.get() ?? false;
259
- let index = g(topNodes).length;
260
- traverse(g(tree).root, (node) => {
261
- if (node.kind === 1) {
262
- node.data.id = node.id;
263
- flattened.push(node.data);
264
- }
265
- else {
266
- flattened.push({
267
- kind: "branch",
268
- data: node.data,
269
- id: node.id,
270
- key: node.key,
271
- depth: node.depth,
272
- });
273
- }
274
- idMap.set(node.id, flattened.at(-1));
275
- idToIndexMap.set(node.id, index);
276
- index++;
277
- if (node.kind === 2) {
278
- const expanded = expansions[node.id] ??
279
- (typeof defaultExpansion === "number"
280
- ? node.depth <= defaultExpansion
281
- : defaultExpansion);
282
- return expanded;
283
- }
284
- }, comparator);
285
- return { flat: flattened, idMap, idToIndexMap };
187
+ return makeClientTree({
188
+ rowData: filtered,
189
+ rowAggModel: grid ? rowAggModel : [],
190
+ rowBranchModel: grid ? rowGroups : [],
191
+ rowIdGroup: p.rowIdBranch,
192
+ rowIdLeaf: p.rowIdLeaf,
286
193
  });
287
- const flat = atom((g) => (g(columnPivotMode) ? g(flatPivot) : g(flatNormal)));
288
- const flatLength = atom((g) => g(flat).flat.length);
289
- const cleanup = [];
290
- const init = (grid) => {
291
- while (cleanup.length)
292
- cleanup.pop()?.();
293
- rdsStore.set(grid$, grid);
294
- const store = grid.state.rowDataStore;
295
- // Monitor row count changes
194
+ });
195
+ const sortComparator = atom((g) => {
196
+ const model = g(columnPivotMode) ? g(columnPivotModel).sorts : g(sortModel);
197
+ const grid = g(grid$);
198
+ if (!model.length || !grid) return () => 0;
199
+ const comparator = (l, r) => {
200
+ let res = 0;
201
+ for (const sortSpec of model) {
202
+ const sort = sortSpec.sort;
203
+ const columnId = sortSpec.columnId;
204
+ const ld =
205
+ l.kind === 2
206
+ ? { kind: "branch", data: l.data, key: l.key }
207
+ : { kind: "leaf", data: l.data.data };
208
+ const rd =
209
+ r.kind === 2
210
+ ? { kind: "branch", data: r.data, key: r.key }
211
+ : { kind: "leaf", data: r.data.data };
212
+ if (sort.kind === "custom") {
213
+ res = sort.comparator(ld, rd, sort.options ?? {});
214
+ } else if (sort.kind === "number") {
215
+ const left = grid.api.columnField(columnId, ld);
216
+ const right = grid.api.columnField(columnId, rd);
217
+ res = numberComparator(left, right, sort.options ?? {});
218
+ } else if (sort.kind === "date") {
219
+ const left = grid.api.columnField(columnId, ld);
220
+ const right = grid.api.columnField(columnId, rd);
221
+ res = dateComparator(left, right, sort.options ?? {});
222
+ } else if (sort.kind === "string") {
223
+ const left = grid.api.columnField(columnId, ld);
224
+ const right = grid.api.columnField(columnId, rd);
225
+ res = stringComparator(left, right, sort.options ?? {});
226
+ } else {
227
+ res = 0;
228
+ }
229
+ res = sortSpec.isDescending ? -res : res;
230
+ if (res !== 0) break;
231
+ }
232
+ return res;
233
+ };
234
+ return comparator;
235
+ });
236
+ const idToNode = atom((g) => {
237
+ const map = new Map();
238
+ traverse(g(tree).root, (node) => {
239
+ map.set(node.id, node);
240
+ });
241
+ return map;
242
+ });
243
+ const tree = atom((g) => (g(columnPivotMode) ? g(pivotTree) : g(normalTree)));
244
+ const initialized = atom(false);
245
+ const flatPivot = atom((g) => {
246
+ if (!g(initialized)) return { flat: [], idMap: new Map(), idToIndexMap: new Map() };
247
+ const idMap = new Map();
248
+ const idToIndexMap = new Map();
249
+ const flattened = [];
250
+ const comparator = g(sortComparator);
251
+ const expansions = g(columnPivotGroupExpansions);
252
+ const defaultExpansion = g(grid$)?.state.rowGroupDefaultExpansion.get() ?? false;
253
+ let index = 0;
254
+ traverse(
255
+ g(tree).root,
256
+ (node) => {
257
+ if (node.kind === 1) {
258
+ return;
259
+ } else {
260
+ flattened.push({
261
+ kind: "branch",
262
+ data: node.data,
263
+ id: node.id,
264
+ key: node.key,
265
+ depth: node.depth,
266
+ });
267
+ }
268
+ idMap.set(node.id, flattened.at(-1));
269
+ idToIndexMap.set(node.id, index);
270
+ index++;
271
+ if (node.kind === 2) {
272
+ const expanded =
273
+ expansions[node.id] ??
274
+ (typeof defaultExpansion === "number"
275
+ ? node.depth <= defaultExpansion
276
+ : defaultExpansion);
277
+ return expanded;
278
+ }
279
+ },
280
+ comparator,
281
+ );
282
+ return { flat: flattened, idMap, idToIndexMap };
283
+ });
284
+ const flatNormal = atom((g) => {
285
+ if (!g(initialized)) return { flat: [], idMap: new Map(), idToIndexMap: new Map() };
286
+ const idMap = new Map();
287
+ const idToIndexMap = new Map();
288
+ const flattened = [];
289
+ const comparator = g(sortComparator);
290
+ const expansions = g(groupExpansions);
291
+ const defaultExpansion = g(grid$)?.state.rowGroupDefaultExpansion.get() ?? false;
292
+ let index = g(topNodes).length;
293
+ traverse(
294
+ g(tree).root,
295
+ (node) => {
296
+ if (node.kind === 1) {
297
+ node.data.id = node.id;
298
+ flattened.push(node.data);
299
+ } else {
300
+ flattened.push({
301
+ kind: "branch",
302
+ data: node.data,
303
+ id: node.id,
304
+ key: node.key,
305
+ depth: node.depth,
306
+ });
307
+ }
308
+ idMap.set(node.id, flattened.at(-1));
309
+ idToIndexMap.set(node.id, index);
310
+ index++;
311
+ if (node.kind === 2) {
312
+ const expanded =
313
+ expansions[node.id] ??
314
+ (typeof defaultExpansion === "number"
315
+ ? node.depth <= defaultExpansion
316
+ : defaultExpansion);
317
+ return expanded;
318
+ }
319
+ },
320
+ comparator,
321
+ );
322
+ return { flat: flattened, idMap, idToIndexMap };
323
+ });
324
+ const flat = atom((g) => (g(columnPivotMode) ? g(flatPivot) : g(flatNormal)));
325
+ const flatLength = atom((g) => g(flat).flat.length);
326
+ const cleanup = [];
327
+ const init = (grid) => {
328
+ while (cleanup.length) cleanup.pop()?.();
329
+ rdsStore.set(grid$, grid);
330
+ const store = grid.state.rowDataStore;
331
+ // Monitor row count changes
332
+ const centerCount = rdsStore.get(flatLength);
333
+ store.rowCenterCount.set(centerCount);
334
+ cleanup.push(
335
+ rdsStore.sub(flatLength, () => {
296
336
  const centerCount = rdsStore.get(flatLength);
297
337
  store.rowCenterCount.set(centerCount);
298
- cleanup.push(rdsStore.sub(flatLength, () => {
299
- const centerCount = rdsStore.get(flatLength);
300
- store.rowCenterCount.set(centerCount);
301
- grid.state.rowDataStore.rowClearCache();
302
- }));
338
+ grid.state.rowDataStore.rowClearCache();
339
+ }),
340
+ );
341
+ const top = rdsStore.get(topData).length;
342
+ store.rowTopCount.set(top);
343
+ cleanup.push(
344
+ rdsStore.sub(topData, () => {
303
345
  const top = rdsStore.get(topData).length;
304
346
  store.rowTopCount.set(top);
305
- cleanup.push(rdsStore.sub(topData, () => {
306
- const top = rdsStore.get(topData).length;
307
- store.rowTopCount.set(top);
308
- grid.state.rowDataStore.rowClearCache();
347
+ grid.state.rowDataStore.rowClearCache();
348
+ }),
349
+ );
350
+ const bottom = rdsStore.get(bottomData).length;
351
+ store.rowBottomCount.set(bottom);
352
+ cleanup.push(
353
+ rdsStore.sub(bottomData, () => {
354
+ const bot = rdsStore.get(bottomData).length;
355
+ store.rowBottomCount.set(bot);
356
+ grid.state.rowDataStore.rowClearCache();
357
+ }),
358
+ );
359
+ const sort = grid.state.sortModel.get();
360
+ const filter = grid.state.filterModel.get();
361
+ const filterIn = grid.state.filterInModel.get();
362
+ const group = grid.state.rowGroupModel.get();
363
+ const groupExpansions = grid.state.rowGroupExpansions.get();
364
+ const agg = grid.state.aggModel.get();
365
+ const quickSearch = grid.state.quickSearch.get();
366
+ const pivotMode = grid.state.columnPivotMode.get();
367
+ const pivotModel = grid.state.columnPivotModel.get();
368
+ const columnPivotGroupExpansions = grid.state.columnPivotRowGroupExpansions.get();
369
+ let prevPivotColumnModel = pivotModel.columns;
370
+ let prevPivotColumnValues = pivotModel.values;
371
+ const updatePivotColumns = (model, ignoreEqualCheck = false) => {
372
+ if (
373
+ !ignoreEqualCheck &&
374
+ rdsStore.get(initialized) &&
375
+ equal(prevPivotColumnModel, model.columns) &&
376
+ equal(prevPivotColumnValues, model.values)
377
+ )
378
+ return;
379
+ const lookup = itemsWithIdToMap(grid.state.columns.get());
380
+ const pivotColumns = createPivotColumns(model, lookup, grid, rdsStore.get(centerNodes));
381
+ grid.state.columnPivotColumns.set(pivotColumns);
382
+ prevPivotColumnModel = model.columns;
383
+ prevPivotColumnValues = model.values;
384
+ };
385
+ if (pivotMode) updatePivotColumns(pivotModel);
386
+ rdsStore.set(models, {
387
+ agg,
388
+ filter,
389
+ filterIn,
390
+ group,
391
+ quickSearch,
392
+ groupExpansions,
393
+ sort,
394
+ pivotMode,
395
+ pivotModel,
396
+ columnPivotGroupExpansions,
397
+ });
398
+ rdsStore.set(initialized, true);
399
+ rdsStore.sub(centerNodes, () => {
400
+ updatePivotColumns(grid.state.columnPivotModel.get(), true);
401
+ });
402
+ // Pivot model monitoring
403
+ cleanup.push(
404
+ grid.state.columnPivotMode.watch(() => {
405
+ const model = grid.state.columnPivotModel.get();
406
+ updatePivotColumns(model);
407
+ rdsStore.set(models, (prev) => ({ ...prev, pivotMode: grid.state.columnPivotMode.get() }));
408
+ grid.state.rowDataStore.rowClearCache();
409
+ }),
410
+ );
411
+ cleanup.push(
412
+ grid.state.columnPivotModel.watch(() => {
413
+ const model = grid.state.columnPivotModel.get();
414
+ updatePivotColumns(model);
415
+ rdsStore.set(models, (prev) => ({
416
+ ...prev,
417
+ pivotModel: model,
309
418
  }));
310
- const bottom = rdsStore.get(bottomData).length;
311
- store.rowBottomCount.set(bottom);
312
- cleanup.push(rdsStore.sub(bottomData, () => {
313
- const bot = rdsStore.get(bottomData).length;
314
- store.rowBottomCount.set(bot);
315
- grid.state.rowDataStore.rowClearCache();
419
+ grid.state.rowDataStore.rowClearCache();
420
+ }),
421
+ );
422
+ grid.state.columnPivotRowGroupExpansions.watch(() => {
423
+ rdsStore.set(models, (prev) => ({
424
+ ...prev,
425
+ columnPivotGroupExpansions: grid.state.columnPivotRowGroupExpansions.get(),
426
+ }));
427
+ grid.state.rowDataStore.rowClearCache();
428
+ });
429
+ // Sort model monitoring
430
+ cleanup.push(
431
+ grid.state.sortModel.watch(() => {
432
+ rdsStore.set(models, (prev) => ({ ...prev, sort: grid.state.sortModel.get() }));
433
+ grid.state.rowDataStore.rowClearCache();
434
+ }),
435
+ );
436
+ // Filter model monitoring
437
+ cleanup.push(
438
+ grid.state.filterModel.watch(() => {
439
+ rdsStore.set(models, (prev) => ({ ...prev, filter: grid.state.filterModel.get() }));
440
+ grid.state.rowDataStore.rowClearCache();
441
+ }),
442
+ );
443
+ cleanup.push(
444
+ grid.state.quickSearch.watch(() => {
445
+ rdsStore.set(models, (prev) => ({ ...prev, quickSearch: grid.state.quickSearch.get() }));
446
+ grid.state.rowDataStore.rowClearCache();
447
+ }),
448
+ );
449
+ cleanup.push(
450
+ grid.state.filterInModel.watch(() => {
451
+ rdsStore.set(models, (prev) => ({ ...prev, filterIn: grid.state.filterInModel.get() }));
452
+ grid.state.rowDataStore.rowClearCache();
453
+ }),
454
+ );
455
+ // Row group model monitoring
456
+ cleanup.push(
457
+ grid.state.rowGroupModel.watch(() => {
458
+ rdsStore.set(models, (prev) => ({ ...prev, group: grid.state.rowGroupModel.get() }));
459
+ grid.state.rowDataStore.rowClearCache();
460
+ }),
461
+ );
462
+ // Row group expansions monitoring
463
+ cleanup.push(
464
+ grid.state.rowGroupExpansions.watch(() => {
465
+ rdsStore.set(models, (prev) => ({
466
+ ...prev,
467
+ groupExpansions: grid.state.rowGroupExpansions.get(),
316
468
  }));
317
- const sort = grid.state.sortModel.get();
318
- const filter = grid.state.filterModel.get();
319
- const filterIn = grid.state.filterInModel.get();
320
- const group = grid.state.rowGroupModel.get();
321
- const groupExpansions = grid.state.rowGroupExpansions.get();
322
- const agg = grid.state.aggModel.get();
323
- const quickSearch = grid.state.quickSearch.get();
324
- const pivotMode = grid.state.columnPivotMode.get();
325
- const pivotModel = grid.state.columnPivotModel.get();
326
- const columnPivotGroupExpansions = grid.state.columnPivotRowGroupExpansions.get();
327
- let prevPivotColumnModel = pivotModel.columns;
328
- let prevPivotColumnValues = pivotModel.values;
329
- const updatePivotColumns = (model, ignoreEqualCheck = false) => {
330
- if (!ignoreEqualCheck &&
331
- rdsStore.get(initialized) &&
332
- equal(prevPivotColumnModel, model.columns) &&
333
- equal(prevPivotColumnValues, model.values))
334
- return;
335
- const lookup = itemsWithIdToMap(grid.state.columns.get());
336
- const pivotColumns = createPivotColumns(model, lookup, grid, rdsStore.get(centerNodes));
337
- grid.state.columnPivotColumns.set(pivotColumns);
338
- prevPivotColumnModel = model.columns;
339
- prevPivotColumnValues = model.values;
340
- };
341
- if (pivotMode)
342
- updatePivotColumns(pivotModel);
343
- rdsStore.set(models, {
344
- agg,
345
- filter,
346
- filterIn,
347
- group,
348
- quickSearch,
349
- groupExpansions,
350
- sort,
351
- pivotMode,
352
- pivotModel,
353
- columnPivotGroupExpansions,
354
- });
355
- rdsStore.set(initialized, true);
356
- rdsStore.sub(centerNodes, () => {
357
- updatePivotColumns(grid.state.columnPivotModel.get(), true);
469
+ grid.state.rowDataStore.rowClearCache();
470
+ }),
471
+ );
472
+ // Agg model monitoring
473
+ cleanup.push(
474
+ grid.state.aggModel.watch(() => {
475
+ rdsStore.set(models, (prev) => ({ ...prev, agg: grid.state.aggModel.get() }));
476
+ grid.state.rowDataStore.rowClearCache();
477
+ }),
478
+ );
479
+ };
480
+ const rowById = (id) => {
481
+ const pinned = rdsStore.get(pinnedIdMap);
482
+ if (pinned.has(id)) return pinned.get(id);
483
+ const t = rdsStore.get(flat);
484
+ return t.idMap.get(id) ?? null;
485
+ };
486
+ const rowByIndex = (index) => {
487
+ const top = rdsStore.get(topNodes);
488
+ const bot = rdsStore.get(botNodes);
489
+ const center = rdsStore.get(flat).flat;
490
+ const topOffset = top.length;
491
+ const centerOffset = topOffset + center.length;
492
+ const botOffset = centerOffset + bot.length;
493
+ if (index < topOffset) return top[index];
494
+ if (index < centerOffset) return center[index - topOffset];
495
+ if (index < botOffset) return bot[index - centerOffset];
496
+ return null;
497
+ };
498
+ const rowUpdate = (updates) => {
499
+ const grid = rdsStore.get(grid$);
500
+ const d = rdsStore.get(data);
501
+ const idMap = rdsStore.get(idToNode);
502
+ const dataToSrc = rdsStore.get(dataToSrc$);
503
+ for (const [key, next] of updates.entries()) {
504
+ const row = typeof key === "string" ? rowById(key) : rowByIndex(key);
505
+ const treeNode = typeof key === "string" ? idMap.get(key) : null;
506
+ if ((!row && !treeNode) || !grid) {
507
+ console.error(`Failed to find the row with identifier ${key} which is being updated.`);
508
+ continue;
509
+ }
510
+ if (row?.kind === "branch") {
511
+ row.data = next;
512
+ } else {
513
+ const data = row?.kind === "leaf" ? row.data : treeNode?.data.data;
514
+ const source = dataToSrc.get(data);
515
+ if (source == null) {
516
+ console.error(`Failed to find the row with identifier ${key} which is being updated.`);
517
+ continue;
518
+ }
519
+ d[source] = next;
520
+ }
521
+ }
522
+ rdsStore.set(data, [...d]);
523
+ rdsStore.set(snapshot, (prev) => prev + 1);
524
+ grid.state.rowDataStore.rowClearCache();
525
+ };
526
+ const rowToIndex = (rowId) => {
527
+ const f = rdsStore.get(flat);
528
+ const top = rdsStore.get(topNodes);
529
+ const bot = rdsStore.get(botNodes);
530
+ const topCount = top.length;
531
+ const center = f.flat.length;
532
+ const rowIndex = f.idToIndexMap.get(rowId);
533
+ if (rowIndex != null) return rowIndex;
534
+ if (rowIndex == null) {
535
+ const foundTop = top.findIndex((row) => row.id === rowId);
536
+ if (foundTop !== -1) return foundTop;
537
+ const foundBot = bot.findIndex((row) => row.id === rowId);
538
+ if (foundBot !== -1) return foundBot + topCount + center;
539
+ }
540
+ return null;
541
+ };
542
+ const rowAllChildIds = (rowId) => {
543
+ const t = rdsStore.get(tree);
544
+ const ids = [];
545
+ const node = t.idToNode.get(rowId);
546
+ if (node?.kind === 2) {
547
+ traverse(node, (n) => {
548
+ ids.push(n.id);
549
+ });
550
+ }
551
+ return ids;
552
+ };
553
+ return [
554
+ {
555
+ init,
556
+ rowById,
557
+ rowByIndex,
558
+ rowAllChildIds,
559
+ rowUpdate,
560
+ inFilterItems: (c) => {
561
+ const grid = rdsStore.get(grid$);
562
+ if (!grid) return [];
563
+ const data = rdsStore.get(centerNodes);
564
+ const values = new Set(
565
+ data.map((row) => {
566
+ const field = grid.api.columnField(c, row);
567
+ return field;
568
+ }),
569
+ );
570
+ if (p.transformInFilterItem) {
571
+ return p.transformInFilterItem({ column: c, values: [...values] });
572
+ }
573
+ return [...values].map((x) => ({ id: `${x}`, label: `${x}`, value: x }));
574
+ },
575
+ rowAdd: (newRows, place = "end") => {
576
+ rdsStore.set(data, (prev) => {
577
+ if (!newRows.length) return prev;
578
+ let next;
579
+ if (place === "beginning") next = [...newRows, ...prev];
580
+ else if (place === "end") next = [...prev, ...newRows];
581
+ else {
582
+ next = [...prev];
583
+ next.splice(place, 0, ...newRows);
584
+ }
585
+ return next;
358
586
  });
359
- // Pivot model monitoring
360
- cleanup.push(grid.state.columnPivotMode.watch(() => {
361
- const model = grid.state.columnPivotModel.get();
362
- updatePivotColumns(model);
363
- rdsStore.set(models, (prev) => ({ ...prev, pivotMode: grid.state.columnPivotMode.get() }));
364
- grid.state.rowDataStore.rowClearCache();
365
- }));
366
- cleanup.push(grid.state.columnPivotModel.watch(() => {
367
- const model = grid.state.columnPivotModel.get();
368
- updatePivotColumns(model);
369
- rdsStore.set(models, (prev) => ({
370
- ...prev,
371
- pivotModel: model,
372
- }));
373
- grid.state.rowDataStore.rowClearCache();
374
- }));
375
- grid.state.columnPivotRowGroupExpansions.watch(() => {
376
- rdsStore.set(models, (prev) => ({
377
- ...prev,
378
- columnPivotGroupExpansions: grid.state.columnPivotRowGroupExpansions.get(),
379
- }));
380
- grid.state.rowDataStore.rowClearCache();
587
+ const grid = rdsStore.get(grid$);
588
+ grid?.state.rowDataStore.rowClearCache();
589
+ },
590
+ rowDelete: (rows) => {
591
+ const rowData = new Set(
592
+ rows
593
+ .map((c) => {
594
+ if (typeof c === "number") return rowByIndex(c)?.data;
595
+ else return rowById(c)?.data;
596
+ })
597
+ .filter((c) => !!c),
598
+ );
599
+ rdsStore.set(data, (prev) => {
600
+ if (!rowData.size) return prev;
601
+ return prev.filter((d) => !rowData.has(d));
381
602
  });
382
- // Sort model monitoring
383
- cleanup.push(grid.state.sortModel.watch(() => {
384
- rdsStore.set(models, (prev) => ({ ...prev, sort: grid.state.sortModel.get() }));
385
- grid.state.rowDataStore.rowClearCache();
386
- }));
387
- // Filter model monitoring
388
- cleanup.push(grid.state.filterModel.watch(() => {
389
- rdsStore.set(models, (prev) => ({ ...prev, filter: grid.state.filterModel.get() }));
390
- grid.state.rowDataStore.rowClearCache();
391
- }));
392
- cleanup.push(grid.state.quickSearch.watch(() => {
393
- rdsStore.set(models, (prev) => ({ ...prev, quickSearch: grid.state.quickSearch.get() }));
394
- grid.state.rowDataStore.rowClearCache();
395
- }));
396
- cleanup.push(grid.state.filterInModel.watch(() => {
397
- rdsStore.set(models, (prev) => ({ ...prev, filterIn: grid.state.filterInModel.get() }));
398
- grid.state.rowDataStore.rowClearCache();
399
- }));
400
- // Row group model monitoring
401
- cleanup.push(grid.state.rowGroupModel.watch(() => {
402
- rdsStore.set(models, (prev) => ({ ...prev, group: grid.state.rowGroupModel.get() }));
403
- grid.state.rowDataStore.rowClearCache();
404
- }));
405
- // Row group expansions monitoring
406
- cleanup.push(grid.state.rowGroupExpansions.watch(() => {
407
- rdsStore.set(models, (prev) => ({
408
- ...prev,
409
- groupExpansions: grid.state.rowGroupExpansions.get(),
410
- }));
411
- grid.state.rowDataStore.rowClearCache();
412
- }));
413
- // Agg model monitoring
414
- cleanup.push(grid.state.aggModel.watch(() => {
415
- rdsStore.set(models, (prev) => ({ ...prev, agg: grid.state.aggModel.get() }));
416
- grid.state.rowDataStore.rowClearCache();
417
- }));
418
- };
419
- const rowById = (id) => {
420
- const pinned = rdsStore.get(pinnedIdMap);
421
- if (pinned.has(id))
422
- return pinned.get(id);
423
- const t = rdsStore.get(flat);
424
- return t.idMap.get(id) ?? null;
425
- };
426
- const rowByIndex = (index) => {
427
- const top = rdsStore.get(topNodes);
428
- const bot = rdsStore.get(botNodes);
429
- const center = rdsStore.get(flat).flat;
430
- const topOffset = top.length;
431
- const centerOffset = topOffset + center.length;
432
- const botOffset = centerOffset + bot.length;
433
- if (index < topOffset)
434
- return top[index];
435
- if (index < centerOffset)
436
- return center[index - topOffset];
437
- if (index < botOffset)
438
- return bot[index - centerOffset];
439
- return null;
440
- };
441
- const rowUpdate = (updates) => {
442
603
  const grid = rdsStore.get(grid$);
443
- const d = rdsStore.get(data);
444
- const idMap = rdsStore.get(idToNode);
445
- const dataToSrc = rdsStore.get(dataToSrc$);
446
- for (const [key, next] of updates.entries()) {
447
- const row = typeof key === "string" ? rowById(key) : rowByIndex(key);
448
- const treeNode = typeof key === "string" ? idMap.get(key) : null;
449
- if ((!row && !treeNode) || !grid) {
450
- console.error(`Failed to find the row with identifier ${key} which is being updated.`);
451
- continue;
452
- }
453
- if (row?.kind === "branch") {
454
- row.data = next;
455
- }
456
- else {
457
- const data = row?.kind === "leaf" ? row.data : treeNode?.data.data;
458
- const source = dataToSrc.get(data);
459
- if (source == null) {
460
- console.error(`Failed to find the row with identifier ${key} which is being updated.`);
461
- continue;
462
- }
463
- d[source] = next;
604
+ grid?.state.rowDataStore.rowClearCache();
605
+ },
606
+ rowSetBotData: (data) => {
607
+ rdsStore.set(bottomData, data);
608
+ const grid = rdsStore.get(grid$);
609
+ grid?.state.rowDataStore.rowClearCache();
610
+ },
611
+ rowSetCenterData: (d) => {
612
+ rdsStore.set(data, d);
613
+ const grid = rdsStore.get(grid$);
614
+ grid?.state.rowDataStore.rowClearCache();
615
+ },
616
+ rowSetTopData: (data) => {
617
+ rdsStore.set(topData, data);
618
+ const grid = rdsStore.get(grid$);
619
+ grid?.state.rowDataStore.rowClearCache();
620
+ },
621
+ rowData: (section) => {
622
+ const d = [];
623
+ if (section === "top" || section === "flat") {
624
+ d.push(...rdsStore.get(topData));
625
+ }
626
+ if (section === "center" || section === "flat") {
627
+ d.push(...rdsStore.get(data));
628
+ }
629
+ if (section === "bottom" || section === "flat") {
630
+ d.push(...rdsStore.get(bottomData));
631
+ }
632
+ return d;
633
+ },
634
+ rowExpand: (expansions) => {
635
+ const grid = rdsStore.get(grid$);
636
+ if (!grid) return;
637
+ const mode = grid.state.columnPivotMode.get();
638
+ if (mode)
639
+ grid.state.columnPivotRowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
640
+ else grid.state.rowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
641
+ },
642
+ rowToIndex,
643
+ rowSelect: (params) => {
644
+ const grid = rdsStore.get(grid$);
645
+ if (!grid) return;
646
+ if (params.mode === "none") return;
647
+ if (params.mode === "single") {
648
+ if (params.deselect) {
649
+ grid.state.rowSelectedIds.set(new Set());
650
+ } else {
651
+ grid.state.rowSelectedIds.set(new Set([params.startId]));
652
+ }
653
+ return;
654
+ }
655
+ const ids = new Set();
656
+ if (params.startId === params.endId) {
657
+ ids.add(params.startId);
658
+ if (params.selectChildren) {
659
+ rowAllChildIds(params.startId).forEach((c) => ids.add(c));
660
+ }
661
+ } else {
662
+ const first = rowToIndex(params.startId);
663
+ const last = rowToIndex(params.endId);
664
+ if (first == null || last == null) return;
665
+ const start = Math.min(first, last);
666
+ const end = Math.max(first, last);
667
+ for (let i = start; i <= end; i++) {
668
+ const row = rowByIndex(i);
669
+ if (!row) continue;
670
+ if (params.selectChildren) {
671
+ rowAllChildIds(row.id).forEach((c) => ids.add(c));
464
672
  }
673
+ if (row?.id) ids.add(row.id);
674
+ }
465
675
  }
466
- rdsStore.set(data, [...d]);
467
- rdsStore.set(snapshot, (prev) => prev + 1);
468
- grid.state.rowDataStore.rowClearCache();
469
- };
470
- const rowToIndex = (rowId) => {
471
- const f = rdsStore.get(flat);
472
- const top = rdsStore.get(topNodes);
473
- const bot = rdsStore.get(botNodes);
474
- const topCount = top.length;
475
- const center = f.flat.length;
476
- const rowIndex = f.idToIndexMap.get(rowId);
477
- if (rowIndex != null)
478
- return rowIndex;
479
- if (rowIndex == null) {
480
- const foundTop = top.findIndex((row) => row.id === rowId);
481
- if (foundTop !== -1)
482
- return foundTop;
483
- const foundBot = bot.findIndex((row) => row.id === rowId);
484
- if (foundBot !== -1)
485
- return foundBot + topCount + center;
676
+ if (params.deselect) {
677
+ const current = grid.state.rowSelectedIds.get();
678
+ const next = current.difference(ids);
679
+ grid.state.rowSelectedIds.set(next);
680
+ } else {
681
+ const current = grid.state.rowSelectedIds.get();
682
+ const next = current.union(ids);
683
+ grid.state.rowSelectedIds.set(next);
684
+ }
685
+ },
686
+ rowSelectAll: (params) => {
687
+ const grid = rdsStore.get(grid$);
688
+ if (!grid) return;
689
+ if (params.deselect) {
690
+ grid.state.rowSelectedIds.set(new Set());
691
+ return;
486
692
  }
487
- return null;
488
- };
489
- const rowAllChildIds = (rowId) => {
490
693
  const t = rdsStore.get(tree);
491
- const ids = [];
492
- const node = t.idToNode.get(rowId);
493
- if (node?.kind === 2) {
494
- traverse(node, (n) => {
495
- ids.push(n.id);
496
- });
694
+ grid.state.rowSelectedIds.set(new Set(t.idsAll));
695
+ },
696
+ rowAreAllSelected: (rowId) => {
697
+ const g = rdsStore.get(grid$);
698
+ if (!g) return false;
699
+ const selected = g.state.rowSelectedIds.get();
700
+ if (rowId) {
701
+ const row = rowById(rowId);
702
+ if (!row) return false;
703
+ const childIds = new Set(rowAllChildIds(rowId));
704
+ return childIds.isSubsetOf(selected);
497
705
  }
498
- return ids;
499
- };
500
- return [
501
- {
502
- init,
503
- rowById,
504
- rowByIndex,
505
- rowAllChildIds,
506
- rowUpdate,
507
- inFilterItems: (c) => {
508
- const grid = rdsStore.get(grid$);
509
- if (!grid)
510
- return [];
511
- const data = rdsStore.get(centerNodes);
512
- const values = new Set(data.map((row) => {
513
- const field = grid.api.columnField(c, row);
514
- return field;
515
- }));
516
- if (p.transformInFilterItem) {
517
- return p.transformInFilterItem({ column: c, values: [...values] });
518
- }
519
- return [...values].map((x) => ({ id: `${x}`, label: `${x}`, value: x }));
520
- },
521
- rowAdd: (newRows, place = "end") => {
522
- rdsStore.set(data, (prev) => {
523
- if (!newRows.length)
524
- return prev;
525
- let next;
526
- if (place === "beginning")
527
- next = [...newRows, ...prev];
528
- else if (place === "end")
529
- next = [...prev, ...newRows];
530
- else {
531
- next = [...prev];
532
- next.splice(place, 0, ...newRows);
533
- }
534
- return next;
535
- });
536
- const grid = rdsStore.get(grid$);
537
- grid?.state.rowDataStore.rowClearCache();
538
- },
539
- rowDelete: (rows) => {
540
- const rowData = new Set(rows
541
- .map((c) => {
542
- if (typeof c === "number")
543
- return rowByIndex(c)?.data;
544
- else
545
- return rowById(c)?.data;
546
- })
547
- .filter((c) => !!c));
548
- rdsStore.set(data, (prev) => {
549
- if (!rowData.size)
550
- return prev;
551
- return prev.filter((d) => !rowData.has(d));
552
- });
553
- const grid = rdsStore.get(grid$);
554
- grid?.state.rowDataStore.rowClearCache();
555
- },
556
- rowSetBotData: (data) => {
557
- rdsStore.set(bottomData, data);
558
- const grid = rdsStore.get(grid$);
559
- grid?.state.rowDataStore.rowClearCache();
560
- },
561
- rowSetCenterData: (d) => {
562
- rdsStore.set(data, d);
563
- const grid = rdsStore.get(grid$);
564
- grid?.state.rowDataStore.rowClearCache();
565
- },
566
- rowSetTopData: (data) => {
567
- rdsStore.set(topData, data);
568
- const grid = rdsStore.get(grid$);
569
- grid?.state.rowDataStore.rowClearCache();
570
- },
571
- rowData: (section) => {
572
- const d = [];
573
- if (section === "top" || section === "flat") {
574
- d.push(...rdsStore.get(topData));
575
- }
576
- if (section === "center" || section === "flat") {
577
- d.push(...rdsStore.get(data));
578
- }
579
- if (section === "bottom" || section === "flat") {
580
- d.push(...rdsStore.get(bottomData));
581
- }
582
- return d;
583
- },
584
- rowExpand: (expansions) => {
585
- const grid = rdsStore.get(grid$);
586
- if (!grid)
587
- return;
588
- const mode = grid.state.columnPivotMode.get();
589
- if (mode)
590
- grid.state.columnPivotRowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
591
- else
592
- grid.state.rowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
593
- },
594
- rowToIndex,
595
- rowSelect: (params) => {
596
- const grid = rdsStore.get(grid$);
597
- if (!grid)
598
- return;
599
- if (params.mode === "none")
600
- return;
601
- if (params.mode === "single") {
602
- if (params.deselect) {
603
- grid.state.rowSelectedIds.set(new Set());
604
- }
605
- else {
606
- grid.state.rowSelectedIds.set(new Set([params.startId]));
607
- }
608
- return;
609
- }
610
- const ids = new Set();
611
- if (params.startId === params.endId) {
612
- ids.add(params.startId);
613
- if (params.selectChildren) {
614
- rowAllChildIds(params.startId).forEach((c) => ids.add(c));
615
- }
616
- }
617
- else {
618
- const first = rowToIndex(params.startId);
619
- const last = rowToIndex(params.endId);
620
- if (first == null || last == null)
621
- return;
622
- const start = Math.min(first, last);
623
- const end = Math.max(first, last);
624
- for (let i = start; i <= end; i++) {
625
- const row = rowByIndex(i);
626
- if (!row)
627
- continue;
628
- if (params.selectChildren) {
629
- rowAllChildIds(row.id).forEach((c) => ids.add(c));
630
- }
631
- if (row?.id)
632
- ids.add(row.id);
633
- }
634
- }
635
- if (params.deselect) {
636
- const current = grid.state.rowSelectedIds.get();
637
- const next = current.difference(ids);
638
- grid.state.rowSelectedIds.set(next);
639
- }
640
- else {
641
- const current = grid.state.rowSelectedIds.get();
642
- const next = current.union(ids);
643
- grid.state.rowSelectedIds.set(next);
644
- }
645
- },
646
- rowSelectAll: (params) => {
647
- const grid = rdsStore.get(grid$);
648
- if (!grid)
649
- return;
650
- if (params.deselect) {
651
- grid.state.rowSelectedIds.set(new Set());
652
- return;
653
- }
654
- const t = rdsStore.get(tree);
655
- grid.state.rowSelectedIds.set(new Set(t.idsAll));
656
- },
657
- rowAreAllSelected: (rowId) => {
658
- const g = rdsStore.get(grid$);
659
- if (!g)
660
- return false;
661
- const selected = g.state.rowSelectedIds.get();
662
- if (rowId) {
663
- const row = rowById(rowId);
664
- if (!row)
665
- return false;
666
- const childIds = new Set(rowAllChildIds(rowId));
667
- return childIds.isSubsetOf(selected);
668
- }
669
- const f = rdsStore.get(tree);
670
- return f.idsAll.isSubsetOf(selected);
671
- },
672
- },
673
- {
674
- top: makeGridAtom(topData, rdsStore),
675
- center: makeGridAtom(data, rdsStore),
676
- bottom: makeGridAtom(bottomData, rdsStore),
677
- },
678
- ];
706
+ const f = rdsStore.get(tree);
707
+ return f.idsAll.isSubsetOf(selected);
708
+ },
709
+ },
710
+ {
711
+ top: makeGridAtom(topData, rdsStore),
712
+ center: makeGridAtom(data, rdsStore),
713
+ bottom: makeGridAtom(bottomData, rdsStore),
714
+ },
715
+ ];
679
716
  }
680
717
  export function useClientRowDataSource(p) {
681
- const ds = useRef(null);
682
- const dataAtomRef = useRef(null);
683
- if (!ds.current)
684
- [ds.current, dataAtomRef.current] = makeClientDataSource(p);
685
- const da = dataAtomRef.current;
686
- if (p.reflectData) {
687
- // Need to queue the microtask since it we cannot update state during render.
688
- if (p.data !== da.center.get())
689
- queueMicrotask(() => ds.current.rowSetCenterData(p.data));
690
- if (!equal(p.topData ?? [], da.top.get())) {
691
- queueMicrotask(() => ds.current.rowSetTopData(p.topData ?? []));
692
- }
693
- if (!equal(p.bottomData ?? [], da.bottom.get()))
694
- queueMicrotask(() => ds.current.rowSetBotData(p.bottomData ?? []));
718
+ const ds = useRef(null);
719
+ const dataAtomRef = useRef(null);
720
+ if (!ds.current) [ds.current, dataAtomRef.current] = makeClientDataSource(p);
721
+ const da = dataAtomRef.current;
722
+ if (p.reflectData) {
723
+ // Need to queue the microtask since it we cannot update state during render.
724
+ if (p.data !== da.center.get()) queueMicrotask(() => ds.current.rowSetCenterData(p.data));
725
+ if (!equal(p.topData ?? [], da.top.get())) {
726
+ queueMicrotask(() => ds.current.rowSetTopData(p.topData ?? []));
695
727
  }
696
- return ds.current;
728
+ if (!equal(p.bottomData ?? [], da.bottom.get()))
729
+ queueMicrotask(() => ds.current.rowSetBotData(p.bottomData ?? []));
730
+ }
731
+ return ds.current;
697
732
  }