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

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 (381) 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 +29 -39
  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 +12 -11
  52. package/dist/column-manager/leaf.d.ts +2 -10
  53. package/dist/column-manager/leaf.js +32 -42
  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 +12 -12
  59. package/dist/column-manager/use-column-manager.js +20 -20
  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 +12 -11
  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 +9 -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 +3 -11
  86. package/dist/grid-box/item.js +26 -29
  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 +55 -54
  93. package/dist/grid-box/use-column-box-items.d.ts +21 -31
  94. package/dist/grid-box/use-column-box-items.js +78 -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 +124 -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 +118 -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 +8 -8
  221. package/dist/sort-manager/sort-apply.d.ts +4 -12
  222. package/dist/sort-manager/sort-apply.js +16 -16
  223. package/dist/sort-manager/sort-cancel.d.ts +4 -12
  224. package/dist/sort-manager/sort-cancel.js +19 -19
  225. package/dist/sort-manager/sort-clear.d.ts +4 -12
  226. package/dist/sort-manager/sort-clear.js +16 -15
  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 +8 -8
  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 +19 -28
  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 +28 -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.js +11 -11
  256. package/dist/state/api/dialog-frame.d.ts +4 -8
  257. package/dist/state/api/dialog-frame.js +12 -11
  258. package/dist/state/api/edit-begin.d.ts +2 -4
  259. package/dist/state/api/edit-begin.js +84 -71
  260. package/dist/state/api/edit-end.d.ts +2 -4
  261. package/dist/state/api/edit-end.js +41 -38
  262. package/dist/state/api/edit-is-cell-active.d.ts +2 -4
  263. package/dist/state/api/edit-is-cell-active.js +24 -17
  264. package/dist/state/api/edit-update.d.ts +2 -4
  265. package/dist/state/api/edit-update.js +85 -74
  266. package/dist/state/api/event-listeners.d.ts +3 -12
  267. package/dist/state/api/event-listeners.js +17 -16
  268. package/dist/state/api/export-csv.js +35 -33
  269. package/dist/state/api/export-data-rect.js +21 -21
  270. package/dist/state/api/focus-cell.d.ts +2 -4
  271. package/dist/state/api/focus-cell.js +109 -110
  272. package/dist/state/api/popover-frame.d.ts +4 -8
  273. package/dist/state/api/popover-frame.js +12 -11
  274. package/dist/state/api/position-from-element.js +6 -5
  275. package/dist/state/api/row-by-id.js +3 -3
  276. package/dist/state/api/row-by-index.js +6 -11
  277. package/dist/state/api/row-detail-is-expanded.d.ts +1 -3
  278. package/dist/state/api/row-detail-is-expanded.js +4 -4
  279. package/dist/state/api/row-detail-rendered-height.d.ts +2 -4
  280. package/dist/state/api/row-detail-rendered-height.js +12 -10
  281. package/dist/state/api/row-detail-toggle.js +30 -26
  282. package/dist/state/api/row-group-apply-expansions.d.ts +1 -3
  283. package/dist/state/api/row-group-apply-expansions.js +17 -15
  284. package/dist/state/api/row-group-column-index.d.ts +1 -3
  285. package/dist/state/api/row-group-column-index.js +12 -14
  286. package/dist/state/api/row-group-is-expanded.d.ts +1 -3
  287. package/dist/state/api/row-group-is-expanded.js +13 -11
  288. package/dist/state/api/row-group-toggle.js +5 -5
  289. package/dist/state/api/row-handle-select.d.ts +2 -4
  290. package/dist/state/api/row-handle-select.js +40 -36
  291. package/dist/state/api/row-select-all.js +15 -14
  292. package/dist/state/api/row-select.d.ts +2 -4
  293. package/dist/state/api/row-select.js +33 -30
  294. package/dist/state/api/row-selected.js +11 -10
  295. package/dist/state/api/scroll-into-view.d.ts +2 -4
  296. package/dist/state/api/scroll-into-view.js +47 -47
  297. package/dist/state/api/sort-for-column.js +7 -6
  298. package/dist/state/api/use-row-drag.js +24 -22
  299. package/dist/state/helpers/cell-row-group.d.ts +1 -5
  300. package/dist/state/helpers/cell-row-group.js +16 -18
  301. package/dist/state/helpers/column-add-row-group.d.ts +6 -16
  302. package/dist/state/helpers/column-add-row-group.js +58 -63
  303. package/dist/state/helpers/column-layout.d.ts +1 -7
  304. package/dist/state/helpers/column-layout.js +60 -60
  305. package/dist/state/helpers/column-marker.d.ts +4 -8
  306. package/dist/state/helpers/column-marker.js +34 -38
  307. package/dist/state/helpers/column-view.d.ts +15 -21
  308. package/dist/state/helpers/column-view.js +32 -56
  309. package/dist/state/helpers/edit-on-change.d.ts +10 -18
  310. package/dist/state/helpers/edit-on-change.js +24 -24
  311. package/dist/state/helpers/empty-row-data-source.js +16 -16
  312. package/dist/state/helpers/get-data-rect.d.ts +10 -20
  313. package/dist/state/helpers/get-data-rect.js +62 -67
  314. package/dist/state/helpers/get-full-width-callback.d.ts +1 -5
  315. package/dist/state/helpers/get-full-width-callback.js +6 -5
  316. package/dist/state/helpers/get-span-callback.d.ts +1 -6
  317. package/dist/state/helpers/get-span-callback.js +18 -15
  318. package/dist/state/helpers/resolve-column.d.ts +2 -6
  319. package/dist/state/helpers/resolve-column.js +18 -18
  320. package/dist/state/helpers/row-layout/get-focus-criteria.d.ts +12 -15
  321. package/dist/state/helpers/row-layout/get-focus-criteria.js +56 -57
  322. package/dist/state/helpers/row-layout/row-layout.d.ts +9 -15
  323. package/dist/state/helpers/row-layout/row-layout.js +401 -387
  324. package/dist/state/use-lytenyte.js +516 -556
  325. package/dist/tree-view/branch/branch.d.ts +8 -16
  326. package/dist/tree-view/branch/branch.js +52 -104
  327. package/dist/tree-view/branch/use-branch-keys.d.ts +1 -5
  328. package/dist/tree-view/branch/use-branch-keys.js +74 -71
  329. package/dist/tree-view/context.d.ts +17 -21
  330. package/dist/tree-view/hooks/use-tree-view-paths.d.ts +1 -6
  331. package/dist/tree-view/hooks/use-tree-view-paths.js +5 -5
  332. package/dist/tree-view/index.d.ts +7 -35
  333. package/dist/tree-view/index.js +7 -7
  334. package/dist/tree-view/leaf.d.ts +2 -10
  335. package/dist/tree-view/leaf.js +20 -29
  336. package/dist/tree-view/navigation/get-all-ids.js +3 -3
  337. package/dist/tree-view/navigation/get-first-node.js +3 -3
  338. package/dist/tree-view/navigation/get-last-node.js +3 -3
  339. package/dist/tree-view/navigation/get-next-node.js +8 -6
  340. package/dist/tree-view/navigation/get-prev-node.js +8 -6
  341. package/dist/tree-view/panel/make-handle-navigation.js +31 -23
  342. package/dist/tree-view/panel/make-handle-selection.js +77 -68
  343. package/dist/tree-view/panel/make-handle-typeahead.js +40 -34
  344. package/dist/tree-view/panel/panel.d.ts +1 -10
  345. package/dist/tree-view/panel/panel.js +20 -40
  346. package/dist/tree-view/panel/use-tree-navigation.js +52 -64
  347. package/dist/tree-view/root.d.ts +14 -20
  348. package/dist/tree-view/root.js +55 -53
  349. package/dist/tree-view/utils/get-focusable-nodes.js +2 -4
  350. package/dist/tree-view/utils/get-focused-node.js +11 -11
  351. package/dist/tree-view/utils/get-ids-between-nodes.d.ts +1 -5
  352. package/dist/tree-view/utils/get-ids-between-nodes.js +11 -10
  353. package/dist/tree-view/utils/get-panel.js +5 -5
  354. package/dist/tree-view/utils/get-parent-node.js +7 -6
  355. package/dist/tree-view/utils/get-sibling-branches.js +10 -8
  356. package/dist/tree-view/utils/get-tree-node-id.js +1 -1
  357. package/dist/tree-view/utils/is-branch-node.js +1 -1
  358. package/dist/tree-view/utils/is-leaf-node.js +1 -1
  359. package/dist/tree-view/utils/is-tree-node-disabled.js +1 -1
  360. package/dist/tree-view/utils/select-node.d.ts +1 -5
  361. package/dist/tree-view/utils/select-node.js +11 -8
  362. package/dist/tree-view/utils/toggle-all-selections.js +6 -4
  363. package/dist/tree-view/utils/toggle-selection.js +18 -15
  364. package/dist/tree-view/virtualized/force-sync-scrolling.d.ts +1 -3
  365. package/dist/tree-view/virtualized/force-sync-scrolling.js +18 -24
  366. package/dist/tree-view/virtualized/get-virtual-tree-paths.d.ts +1 -3
  367. package/dist/tree-view/virtualized/get-virtual-tree-paths.js +12 -11
  368. package/dist/tree-view/virtualized/make-virtual-tree.d.ts +21 -26
  369. package/dist/tree-view/virtualized/make-virtual-tree.js +85 -79
  370. package/dist/tree-view/virtualized/use-flattened-tree.d.ts +8 -17
  371. package/dist/tree-view/virtualized/use-flattened-tree.js +31 -30
  372. package/dist/tree-view/virtualized/use-row-start-and-end.d.ts +1 -6
  373. package/dist/tree-view/virtualized/use-row-start-and-end.js +23 -21
  374. package/dist/tree-view/virtualized/use-virtualized-tree.d.ts +15 -21
  375. package/dist/tree-view/virtualized/use-virtualized-tree.js +90 -103
  376. package/dist/utils/cycle-sorts.js +14 -12
  377. package/dist/viewport/begin-editing.d.ts +2 -6
  378. package/dist/viewport/begin-editing.js +13 -9
  379. package/dist/viewport/viewport.d.ts +1 -10
  380. package/dist/viewport/viewport.js +70 -93
  381. package/package.json +7 -7
@@ -2,12 +2,7 @@ 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 { equal, get, itemsWithIdToMap } from "@1771technologies/lytenyte-js-utils";
12
7
  import { computeFilteredRows } from "./filter/compute-filtered-rows.js";
13
8
  import { builtIns } from "./built-ins/built-ins.js";
@@ -15,704 +10,687 @@ import { createPivotColumns } from "./pivots/create-pivot-columns.js";
15
10
  import { createAggModel } from "./pivots/create-agg-model.js";
16
11
  import { makeClientTree } from "./tree/client-tree.js";
17
12
  export function makeClientDataSource(p) {
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],
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 };
112
+ });
113
+ return makeClientTree({
114
+ rowData: filtered,
115
+ rowAggModel: rowAggModel,
116
+ rowBranchModel: rowGroups,
117
+ rowIdGroup: p.rowIdBranch,
118
+ rowIdLeaf: p.rowIdLeaf,
35
119
  });
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
- };
99
- })
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
- ),
125
- };
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 };
135
120
  });
136
- return makeClientTree({
137
- rowData: filtered,
138
- rowAggModel: rowAggModel,
139
- rowBranchModel: rowGroups,
140
- rowIdGroup: p.rowIdBranch,
141
- rowIdLeaf: p.rowIdLeaf,
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);
135
+ })
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
+ });
142
159
  });
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
- ),
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;
176
202
  };
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 };
203
+ return comparator;
186
204
  });
187
- return makeClientTree({
188
- rowData: filtered,
189
- rowAggModel: grid ? rowAggModel : [],
190
- rowBranchModel: grid ? rowGroups : [],
191
- rowIdGroup: p.rowIdBranch,
192
- rowIdLeaf: p.rowIdLeaf,
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;
193
211
  });
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);
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 };
240
249
  });
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, () => {
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 };
286
+ });
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
336
296
  const centerCount = rdsStore.get(flatLength);
337
297
  store.rowCenterCount.set(centerCount);
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, () => {
298
+ cleanup.push(rdsStore.sub(flatLength, () => {
299
+ const centerCount = rdsStore.get(flatLength);
300
+ store.rowCenterCount.set(centerCount);
301
+ grid.state.rowDataStore.rowClearCache();
302
+ }));
345
303
  const top = rdsStore.get(topData).length;
346
304
  store.rowTopCount.set(top);
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
- equal(prevPivotColumnModel, model.columns) &&
375
- equal(prevPivotColumnValues, model.values)
376
- )
377
- return;
378
- const lookup = itemsWithIdToMap(grid.state.columns.get());
379
- const pivotColumns = createPivotColumns(model, lookup, grid, rdsStore.get(centerNodes));
380
- grid.state.columnPivotColumns.set(pivotColumns);
381
- prevPivotColumnModel = model.columns;
382
- prevPivotColumnValues = model.values;
383
- };
384
- if (pivotMode) updatePivotColumns(pivotModel);
385
- rdsStore.set(models, {
386
- agg,
387
- filter,
388
- filterIn,
389
- group,
390
- quickSearch,
391
- groupExpansions,
392
- sort,
393
- pivotMode,
394
- pivotModel,
395
- columnPivotGroupExpansions,
396
- });
397
- rdsStore.set(initialized, true);
398
- rdsStore.sub(centerNodes, () => {
399
- updatePivotColumns(grid.state.columnPivotModel.get(), true);
400
- });
401
- // Pivot model monitoring
402
- cleanup.push(
403
- grid.state.columnPivotMode.watch(() => {
404
- const model = grid.state.columnPivotModel.get();
405
- updatePivotColumns(model);
406
- rdsStore.set(models, (prev) => ({ ...prev, pivotMode: grid.state.columnPivotMode.get() }));
407
- grid.state.rowDataStore.rowClearCache();
408
- }),
409
- );
410
- cleanup.push(
411
- grid.state.columnPivotModel.watch(() => {
412
- const model = grid.state.columnPivotModel.get();
413
- updatePivotColumns(model);
414
- rdsStore.set(models, (prev) => ({
415
- ...prev,
416
- pivotModel: model,
305
+ cleanup.push(rdsStore.sub(topData, () => {
306
+ const top = rdsStore.get(topData).length;
307
+ store.rowTopCount.set(top);
308
+ grid.state.rowDataStore.rowClearCache();
417
309
  }));
418
- grid.state.rowDataStore.rowClearCache();
419
- }),
420
- );
421
- grid.state.columnPivotRowGroupExpansions.watch(() => {
422
- rdsStore.set(models, (prev) => ({
423
- ...prev,
424
- columnPivotGroupExpansions: grid.state.columnPivotRowGroupExpansions.get(),
425
- }));
426
- grid.state.rowDataStore.rowClearCache();
427
- });
428
- // Sort model monitoring
429
- cleanup.push(
430
- grid.state.sortModel.watch(() => {
431
- rdsStore.set(models, (prev) => ({ ...prev, sort: grid.state.sortModel.get() }));
432
- grid.state.rowDataStore.rowClearCache();
433
- }),
434
- );
435
- // Filter model monitoring
436
- cleanup.push(
437
- grid.state.filterModel.watch(() => {
438
- rdsStore.set(models, (prev) => ({ ...prev, filter: grid.state.filterModel.get() }));
439
- grid.state.rowDataStore.rowClearCache();
440
- }),
441
- );
442
- cleanup.push(
443
- grid.state.quickSearch.watch(() => {
444
- rdsStore.set(models, (prev) => ({ ...prev, quickSearch: grid.state.quickSearch.get() }));
445
- grid.state.rowDataStore.rowClearCache();
446
- }),
447
- );
448
- cleanup.push(
449
- grid.state.filterInModel.watch(() => {
450
- rdsStore.set(models, (prev) => ({ ...prev, filterIn: grid.state.filterInModel.get() }));
451
- grid.state.rowDataStore.rowClearCache();
452
- }),
453
- );
454
- // Row group model monitoring
455
- cleanup.push(
456
- grid.state.rowGroupModel.watch(() => {
457
- rdsStore.set(models, (prev) => ({ ...prev, group: grid.state.rowGroupModel.get() }));
458
- grid.state.rowDataStore.rowClearCache();
459
- }),
460
- );
461
- // Row group expansions monitoring
462
- cleanup.push(
463
- grid.state.rowGroupExpansions.watch(() => {
464
- rdsStore.set(models, (prev) => ({
465
- ...prev,
466
- groupExpansions: grid.state.rowGroupExpansions.get(),
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();
467
316
  }));
468
- grid.state.rowDataStore.rowClearCache();
469
- }),
470
- );
471
- // Agg model monitoring
472
- cleanup.push(
473
- grid.state.aggModel.watch(() => {
474
- rdsStore.set(models, (prev) => ({ ...prev, agg: grid.state.aggModel.get() }));
475
- grid.state.rowDataStore.rowClearCache();
476
- }),
477
- );
478
- };
479
- const rowById = (id) => {
480
- const pinned = rdsStore.get(pinnedIdMap);
481
- if (pinned.has(id)) return pinned.get(id);
482
- const t = rdsStore.get(flat);
483
- return t.idMap.get(id) ?? null;
484
- };
485
- const rowByIndex = (index) => {
486
- const top = rdsStore.get(topNodes);
487
- const bot = rdsStore.get(botNodes);
488
- const center = rdsStore.get(flat).flat;
489
- const topOffset = top.length;
490
- const centerOffset = topOffset + center.length;
491
- const botOffset = centerOffset + bot.length;
492
- if (index < topOffset) return top[index];
493
- if (index < centerOffset) return center[index - topOffset];
494
- if (index < botOffset) return bot[index - centerOffset];
495
- return null;
496
- };
497
- const rowUpdate = (updates) => {
498
- const grid = rdsStore.get(grid$);
499
- const d = rdsStore.get(data);
500
- const idMap = rdsStore.get(idToNode);
501
- const dataToSrc = rdsStore.get(dataToSrc$);
502
- for (const [key, next] of updates.entries()) {
503
- const row = typeof key === "string" ? rowById(key) : rowByIndex(key);
504
- const treeNode = typeof key === "string" ? idMap.get(key) : null;
505
- if ((!row && !treeNode) || !grid) {
506
- console.error(`Failed to find the row with identifier ${key} which is being updated.`);
507
- continue;
508
- }
509
- if (row?.kind === "branch") {
510
- row.data = next;
511
- } else {
512
- const data = row?.kind === "leaf" ? row.data : treeNode?.data.data;
513
- const source = dataToSrc.get(data);
514
- if (source == null) {
515
- console.error(`Failed to find the row with identifier ${key} which is being updated.`);
516
- continue;
517
- }
518
- d[source] = next;
519
- }
520
- }
521
- rdsStore.set(data, [...d]);
522
- rdsStore.set(snapshot, (prev) => prev + 1);
523
- grid.state.rowDataStore.rowClearCache();
524
- };
525
- const rowToIndex = (rowId) => {
526
- const f = rdsStore.get(flat);
527
- const top = rdsStore.get(topNodes);
528
- const bot = rdsStore.get(botNodes);
529
- const topCount = top.length;
530
- const center = f.flat.length;
531
- const rowIndex = f.idToIndexMap.get(rowId);
532
- if (rowIndex != null) return rowIndex;
533
- if (rowIndex == null) {
534
- const foundTop = top.findIndex((row) => row.id === rowId);
535
- if (foundTop !== -1) return foundTop;
536
- const foundBot = bot.findIndex((row) => row.id === rowId);
537
- if (foundBot !== -1) return foundBot + topCount + center;
538
- }
539
- return null;
540
- };
541
- const rowAllChildIds = (rowId) => {
542
- const t = rdsStore.get(tree);
543
- const ids = [];
544
- const node = t.idToNode.get(rowId);
545
- if (node?.kind === 2) {
546
- traverse(node, (n) => {
547
- ids.push(n.id);
548
- });
549
- }
550
- return ids;
551
- };
552
- return [
553
- {
554
- init,
555
- rowById,
556
- rowByIndex,
557
- rowAllChildIds,
558
- rowUpdate,
559
- inFilterItems: (c) => {
560
- const grid = rdsStore.get(grid$);
561
- if (!grid) return [];
562
- const data = rdsStore.get(centerNodes);
563
- const values = new Set(
564
- data.map((row) => {
565
- const field = grid.api.columnField(c, row);
566
- return field;
567
- }),
568
- );
569
- if (p.transformInFilterItem) {
570
- return p.transformInFilterItem({ column: c, values: [...values] });
571
- }
572
- return [...values].map((x) => ({ id: `${x}`, label: `${x}`, value: x }));
573
- },
574
- rowAdd: (newRows, place = "end") => {
575
- rdsStore.set(data, (prev) => {
576
- if (!newRows.length) return prev;
577
- let next;
578
- if (place === "beginning") next = [...newRows, ...prev];
579
- else if (place === "end") next = [...prev, ...newRows];
580
- else {
581
- next = [...prev];
582
- next.splice(place, 0, ...newRows);
583
- }
584
- return next;
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
+ equal(prevPivotColumnModel, model.columns) &&
332
+ equal(prevPivotColumnValues, model.values))
333
+ return;
334
+ const lookup = itemsWithIdToMap(grid.state.columns.get());
335
+ const pivotColumns = createPivotColumns(model, lookup, grid, rdsStore.get(centerNodes));
336
+ grid.state.columnPivotColumns.set(pivotColumns);
337
+ prevPivotColumnModel = model.columns;
338
+ prevPivotColumnValues = model.values;
339
+ };
340
+ if (pivotMode)
341
+ updatePivotColumns(pivotModel);
342
+ rdsStore.set(models, {
343
+ agg,
344
+ filter,
345
+ filterIn,
346
+ group,
347
+ quickSearch,
348
+ groupExpansions,
349
+ sort,
350
+ pivotMode,
351
+ pivotModel,
352
+ columnPivotGroupExpansions,
585
353
  });
586
- const grid = rdsStore.get(grid$);
587
- grid?.state.rowDataStore.rowClearCache();
588
- },
589
- rowDelete: (rows) => {
590
- const rowData = new Set(
591
- rows
592
- .map((c) => {
593
- if (typeof c === "number") return rowByIndex(c)?.data;
594
- else return rowById(c)?.data;
595
- })
596
- .filter((c) => !!c),
597
- );
598
- rdsStore.set(data, (prev) => {
599
- if (!rowData.size) return prev;
600
- return prev.filter((d) => !rowData.has(d));
354
+ rdsStore.set(initialized, true);
355
+ rdsStore.sub(centerNodes, () => {
356
+ updatePivotColumns(grid.state.columnPivotModel.get(), true);
601
357
  });
358
+ // Pivot model monitoring
359
+ cleanup.push(grid.state.columnPivotMode.watch(() => {
360
+ const model = grid.state.columnPivotModel.get();
361
+ updatePivotColumns(model);
362
+ rdsStore.set(models, (prev) => ({ ...prev, pivotMode: grid.state.columnPivotMode.get() }));
363
+ grid.state.rowDataStore.rowClearCache();
364
+ }));
365
+ cleanup.push(grid.state.columnPivotModel.watch(() => {
366
+ const model = grid.state.columnPivotModel.get();
367
+ updatePivotColumns(model);
368
+ rdsStore.set(models, (prev) => ({
369
+ ...prev,
370
+ pivotModel: model,
371
+ }));
372
+ grid.state.rowDataStore.rowClearCache();
373
+ }));
374
+ grid.state.columnPivotRowGroupExpansions.watch(() => {
375
+ rdsStore.set(models, (prev) => ({
376
+ ...prev,
377
+ columnPivotGroupExpansions: grid.state.columnPivotRowGroupExpansions.get(),
378
+ }));
379
+ grid.state.rowDataStore.rowClearCache();
380
+ });
381
+ // Sort model monitoring
382
+ cleanup.push(grid.state.sortModel.watch(() => {
383
+ rdsStore.set(models, (prev) => ({ ...prev, sort: grid.state.sortModel.get() }));
384
+ grid.state.rowDataStore.rowClearCache();
385
+ }));
386
+ // Filter model monitoring
387
+ cleanup.push(grid.state.filterModel.watch(() => {
388
+ rdsStore.set(models, (prev) => ({ ...prev, filter: grid.state.filterModel.get() }));
389
+ grid.state.rowDataStore.rowClearCache();
390
+ }));
391
+ cleanup.push(grid.state.quickSearch.watch(() => {
392
+ rdsStore.set(models, (prev) => ({ ...prev, quickSearch: grid.state.quickSearch.get() }));
393
+ grid.state.rowDataStore.rowClearCache();
394
+ }));
395
+ cleanup.push(grid.state.filterInModel.watch(() => {
396
+ rdsStore.set(models, (prev) => ({ ...prev, filterIn: grid.state.filterInModel.get() }));
397
+ grid.state.rowDataStore.rowClearCache();
398
+ }));
399
+ // Row group model monitoring
400
+ cleanup.push(grid.state.rowGroupModel.watch(() => {
401
+ rdsStore.set(models, (prev) => ({ ...prev, group: grid.state.rowGroupModel.get() }));
402
+ grid.state.rowDataStore.rowClearCache();
403
+ }));
404
+ // Row group expansions monitoring
405
+ cleanup.push(grid.state.rowGroupExpansions.watch(() => {
406
+ rdsStore.set(models, (prev) => ({
407
+ ...prev,
408
+ groupExpansions: grid.state.rowGroupExpansions.get(),
409
+ }));
410
+ grid.state.rowDataStore.rowClearCache();
411
+ }));
412
+ // Agg model monitoring
413
+ cleanup.push(grid.state.aggModel.watch(() => {
414
+ rdsStore.set(models, (prev) => ({ ...prev, agg: grid.state.aggModel.get() }));
415
+ grid.state.rowDataStore.rowClearCache();
416
+ }));
417
+ };
418
+ const rowById = (id) => {
419
+ const pinned = rdsStore.get(pinnedIdMap);
420
+ if (pinned.has(id))
421
+ return pinned.get(id);
422
+ const t = rdsStore.get(flat);
423
+ return t.idMap.get(id) ?? null;
424
+ };
425
+ const rowByIndex = (index) => {
426
+ const top = rdsStore.get(topNodes);
427
+ const bot = rdsStore.get(botNodes);
428
+ const center = rdsStore.get(flat).flat;
429
+ const topOffset = top.length;
430
+ const centerOffset = topOffset + center.length;
431
+ const botOffset = centerOffset + bot.length;
432
+ if (index < topOffset)
433
+ return top[index];
434
+ if (index < centerOffset)
435
+ return center[index - topOffset];
436
+ if (index < botOffset)
437
+ return bot[index - centerOffset];
438
+ return null;
439
+ };
440
+ const rowUpdate = (updates) => {
602
441
  const grid = rdsStore.get(grid$);
603
- grid?.state.rowDataStore.rowClearCache();
604
- },
605
- rowSetBotData: (data) => {
606
- rdsStore.set(bottomData, data);
607
- const grid = rdsStore.get(grid$);
608
- grid?.state.rowDataStore.rowClearCache();
609
- },
610
- rowSetCenterData: (d) => {
611
- rdsStore.set(data, d);
612
- const grid = rdsStore.get(grid$);
613
- grid?.state.rowDataStore.rowClearCache();
614
- },
615
- rowSetTopData: (data) => {
616
- rdsStore.set(topData, data);
617
- const grid = rdsStore.get(grid$);
618
- grid?.state.rowDataStore.rowClearCache();
619
- },
620
- rowExpand: (expansions) => {
621
- const grid = rdsStore.get(grid$);
622
- if (!grid) return;
623
- const mode = grid.state.columnPivotMode.get();
624
- if (mode)
625
- grid.state.columnPivotRowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
626
- else grid.state.rowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
627
- },
628
- rowToIndex,
629
- rowSelect: (params) => {
630
- const grid = rdsStore.get(grid$);
631
- if (!grid) return;
632
- if (params.mode === "none") return;
633
- if (params.mode === "single") {
634
- if (params.deselect) {
635
- grid.state.rowSelectedIds.set(new Set());
636
- } else {
637
- grid.state.rowSelectedIds.set(new Set([params.startId]));
638
- }
639
- return;
640
- }
641
- const ids = new Set();
642
- if (params.startId === params.endId) {
643
- ids.add(params.startId);
644
- if (params.selectChildren) {
645
- rowAllChildIds(params.startId).forEach((c) => ids.add(c));
646
- }
647
- } else {
648
- const first = rowToIndex(params.startId);
649
- const last = rowToIndex(params.endId);
650
- if (first == null || last == null) return;
651
- const start = Math.min(first, last);
652
- const end = Math.max(first, last);
653
- for (let i = start; i <= end; i++) {
654
- const row = rowByIndex(i);
655
- if (!row) continue;
656
- if (params.selectChildren) {
657
- rowAllChildIds(row.id).forEach((c) => ids.add(c));
442
+ const d = rdsStore.get(data);
443
+ const idMap = rdsStore.get(idToNode);
444
+ const dataToSrc = rdsStore.get(dataToSrc$);
445
+ for (const [key, next] of updates.entries()) {
446
+ const row = typeof key === "string" ? rowById(key) : rowByIndex(key);
447
+ const treeNode = typeof key === "string" ? idMap.get(key) : null;
448
+ if ((!row && !treeNode) || !grid) {
449
+ console.error(`Failed to find the row with identifier ${key} which is being updated.`);
450
+ continue;
451
+ }
452
+ if (row?.kind === "branch") {
453
+ row.data = next;
454
+ }
455
+ else {
456
+ const data = row?.kind === "leaf" ? row.data : treeNode?.data.data;
457
+ const source = dataToSrc.get(data);
458
+ if (source == null) {
459
+ console.error(`Failed to find the row with identifier ${key} which is being updated.`);
460
+ continue;
461
+ }
462
+ d[source] = next;
658
463
  }
659
- if (row?.id) ids.add(row.id);
660
- }
661
- }
662
- if (params.deselect) {
663
- const current = grid.state.rowSelectedIds.get();
664
- const next = current.difference(ids);
665
- grid.state.rowSelectedIds.set(next);
666
- } else {
667
- const current = grid.state.rowSelectedIds.get();
668
- const next = current.union(ids);
669
- grid.state.rowSelectedIds.set(next);
670
464
  }
671
- },
672
- rowSelectAll: (params) => {
673
- const grid = rdsStore.get(grid$);
674
- if (!grid) return;
675
- if (params.deselect) {
676
- grid.state.rowSelectedIds.set(new Set());
677
- return;
465
+ rdsStore.set(data, [...d]);
466
+ rdsStore.set(snapshot, (prev) => prev + 1);
467
+ grid.state.rowDataStore.rowClearCache();
468
+ };
469
+ const rowToIndex = (rowId) => {
470
+ const f = rdsStore.get(flat);
471
+ const top = rdsStore.get(topNodes);
472
+ const bot = rdsStore.get(botNodes);
473
+ const topCount = top.length;
474
+ const center = f.flat.length;
475
+ const rowIndex = f.idToIndexMap.get(rowId);
476
+ if (rowIndex != null)
477
+ return rowIndex;
478
+ if (rowIndex == null) {
479
+ const foundTop = top.findIndex((row) => row.id === rowId);
480
+ if (foundTop !== -1)
481
+ return foundTop;
482
+ const foundBot = bot.findIndex((row) => row.id === rowId);
483
+ if (foundBot !== -1)
484
+ return foundBot + topCount + center;
678
485
  }
486
+ return null;
487
+ };
488
+ const rowAllChildIds = (rowId) => {
679
489
  const t = rdsStore.get(tree);
680
- grid.state.rowSelectedIds.set(new Set(t.idsAll));
681
- },
682
- rowAreAllSelected: (rowId) => {
683
- const g = rdsStore.get(grid$);
684
- if (!g) return false;
685
- const selected = g.state.rowSelectedIds.get();
686
- if (rowId) {
687
- const row = rowById(rowId);
688
- if (!row) return false;
689
- const childIds = new Set(rowAllChildIds(rowId));
690
- return childIds.isSubsetOf(selected);
490
+ const ids = [];
491
+ const node = t.idToNode.get(rowId);
492
+ if (node?.kind === 2) {
493
+ traverse(node, (n) => {
494
+ ids.push(n.id);
495
+ });
691
496
  }
692
- const f = rdsStore.get(tree);
693
- return f.idsAll.isSubsetOf(selected);
694
- },
695
- },
696
- {
697
- top: makeGridAtom(topData, rdsStore),
698
- center: makeGridAtom(data, rdsStore),
699
- bottom: makeGridAtom(bottomData, rdsStore),
700
- },
701
- ];
497
+ return ids;
498
+ };
499
+ return [
500
+ {
501
+ init,
502
+ rowById,
503
+ rowByIndex,
504
+ rowAllChildIds,
505
+ rowUpdate,
506
+ inFilterItems: (c) => {
507
+ const grid = rdsStore.get(grid$);
508
+ if (!grid)
509
+ return [];
510
+ const data = rdsStore.get(centerNodes);
511
+ const values = new Set(data.map((row) => {
512
+ const field = grid.api.columnField(c, row);
513
+ return field;
514
+ }));
515
+ if (p.transformInFilterItem) {
516
+ return p.transformInFilterItem({ column: c, values: [...values] });
517
+ }
518
+ return [...values].map((x) => ({ id: `${x}`, label: `${x}`, value: x }));
519
+ },
520
+ rowAdd: (newRows, place = "end") => {
521
+ rdsStore.set(data, (prev) => {
522
+ if (!newRows.length)
523
+ return prev;
524
+ let next;
525
+ if (place === "beginning")
526
+ next = [...newRows, ...prev];
527
+ else if (place === "end")
528
+ next = [...prev, ...newRows];
529
+ else {
530
+ next = [...prev];
531
+ next.splice(place, 0, ...newRows);
532
+ }
533
+ return next;
534
+ });
535
+ const grid = rdsStore.get(grid$);
536
+ grid?.state.rowDataStore.rowClearCache();
537
+ },
538
+ rowDelete: (rows) => {
539
+ const rowData = new Set(rows
540
+ .map((c) => {
541
+ if (typeof c === "number")
542
+ return rowByIndex(c)?.data;
543
+ else
544
+ return rowById(c)?.data;
545
+ })
546
+ .filter((c) => !!c));
547
+ rdsStore.set(data, (prev) => {
548
+ if (!rowData.size)
549
+ return prev;
550
+ return prev.filter((d) => !rowData.has(d));
551
+ });
552
+ const grid = rdsStore.get(grid$);
553
+ grid?.state.rowDataStore.rowClearCache();
554
+ },
555
+ rowSetBotData: (data) => {
556
+ rdsStore.set(bottomData, data);
557
+ const grid = rdsStore.get(grid$);
558
+ grid?.state.rowDataStore.rowClearCache();
559
+ },
560
+ rowSetCenterData: (d) => {
561
+ rdsStore.set(data, d);
562
+ const grid = rdsStore.get(grid$);
563
+ grid?.state.rowDataStore.rowClearCache();
564
+ },
565
+ rowSetTopData: (data) => {
566
+ rdsStore.set(topData, data);
567
+ const grid = rdsStore.get(grid$);
568
+ grid?.state.rowDataStore.rowClearCache();
569
+ },
570
+ rowData: (section) => {
571
+ const d = [];
572
+ if (section === "top" || section === "flat") {
573
+ d.push(...rdsStore.get(topData));
574
+ }
575
+ if (section === "center" || section === "flat") {
576
+ d.push(...rdsStore.get(data));
577
+ }
578
+ if (section === "bottom" || section === "flat") {
579
+ d.push(...rdsStore.get(bottomData));
580
+ }
581
+ return d;
582
+ },
583
+ rowExpand: (expansions) => {
584
+ const grid = rdsStore.get(grid$);
585
+ if (!grid)
586
+ return;
587
+ const mode = grid.state.columnPivotMode.get();
588
+ if (mode)
589
+ grid.state.columnPivotRowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
590
+ else
591
+ grid.state.rowGroupExpansions.set((prev) => ({ ...prev, ...expansions }));
592
+ },
593
+ rowToIndex,
594
+ rowSelect: (params) => {
595
+ const grid = rdsStore.get(grid$);
596
+ if (!grid)
597
+ return;
598
+ if (params.mode === "none")
599
+ return;
600
+ if (params.mode === "single") {
601
+ if (params.deselect) {
602
+ grid.state.rowSelectedIds.set(new Set());
603
+ }
604
+ else {
605
+ grid.state.rowSelectedIds.set(new Set([params.startId]));
606
+ }
607
+ return;
608
+ }
609
+ const ids = new Set();
610
+ if (params.startId === params.endId) {
611
+ ids.add(params.startId);
612
+ if (params.selectChildren) {
613
+ rowAllChildIds(params.startId).forEach((c) => ids.add(c));
614
+ }
615
+ }
616
+ else {
617
+ const first = rowToIndex(params.startId);
618
+ const last = rowToIndex(params.endId);
619
+ if (first == null || last == null)
620
+ return;
621
+ const start = Math.min(first, last);
622
+ const end = Math.max(first, last);
623
+ for (let i = start; i <= end; i++) {
624
+ const row = rowByIndex(i);
625
+ if (!row)
626
+ continue;
627
+ if (params.selectChildren) {
628
+ rowAllChildIds(row.id).forEach((c) => ids.add(c));
629
+ }
630
+ if (row?.id)
631
+ ids.add(row.id);
632
+ }
633
+ }
634
+ if (params.deselect) {
635
+ const current = grid.state.rowSelectedIds.get();
636
+ const next = current.difference(ids);
637
+ grid.state.rowSelectedIds.set(next);
638
+ }
639
+ else {
640
+ const current = grid.state.rowSelectedIds.get();
641
+ const next = current.union(ids);
642
+ grid.state.rowSelectedIds.set(next);
643
+ }
644
+ },
645
+ rowSelectAll: (params) => {
646
+ const grid = rdsStore.get(grid$);
647
+ if (!grid)
648
+ return;
649
+ if (params.deselect) {
650
+ grid.state.rowSelectedIds.set(new Set());
651
+ return;
652
+ }
653
+ const t = rdsStore.get(tree);
654
+ grid.state.rowSelectedIds.set(new Set(t.idsAll));
655
+ },
656
+ rowAreAllSelected: (rowId) => {
657
+ const g = rdsStore.get(grid$);
658
+ if (!g)
659
+ return false;
660
+ const selected = g.state.rowSelectedIds.get();
661
+ if (rowId) {
662
+ const row = rowById(rowId);
663
+ if (!row)
664
+ return false;
665
+ const childIds = new Set(rowAllChildIds(rowId));
666
+ return childIds.isSubsetOf(selected);
667
+ }
668
+ const f = rdsStore.get(tree);
669
+ return f.idsAll.isSubsetOf(selected);
670
+ },
671
+ },
672
+ {
673
+ top: makeGridAtom(topData, rdsStore),
674
+ center: makeGridAtom(data, rdsStore),
675
+ bottom: makeGridAtom(bottomData, rdsStore),
676
+ },
677
+ ];
702
678
  }
703
679
  export function useClientRowDataSource(p) {
704
- const ds = useRef(null);
705
- const dataAtomRef = useRef(null);
706
- if (!ds.current) [ds.current, dataAtomRef.current] = makeClientDataSource(p);
707
- const da = dataAtomRef.current;
708
- if (p.reflectData) {
709
- // Need to queue the microtask since it we cannot update state during render.
710
- if (p.data !== da.center.get()) queueMicrotask(() => ds.current.rowSetCenterData(p.data));
711
- if (!equal(p.topData ?? [], da.top.get())) {
712
- queueMicrotask(() => ds.current.rowSetTopData(p.topData ?? []));
680
+ const ds = useRef(null);
681
+ const dataAtomRef = useRef(null);
682
+ if (!ds.current)
683
+ [ds.current, dataAtomRef.current] = makeClientDataSource(p);
684
+ const da = dataAtomRef.current;
685
+ if (p.reflectData) {
686
+ // Need to queue the microtask since it we cannot update state during render.
687
+ if (p.data !== da.center.get())
688
+ queueMicrotask(() => ds.current.rowSetCenterData(p.data));
689
+ if (!equal(p.topData ?? [], da.top.get())) {
690
+ queueMicrotask(() => ds.current.rowSetTopData(p.topData ?? []));
691
+ }
692
+ if (!equal(p.bottomData ?? [], da.bottom.get()))
693
+ queueMicrotask(() => ds.current.rowSetBotData(p.bottomData ?? []));
713
694
  }
714
- if (!equal(p.bottomData ?? [], da.bottom.get()))
715
- queueMicrotask(() => ds.current.rowSetBotData(p.bottomData ?? []));
716
- }
717
- return ds.current;
695
+ return ds.current;
718
696
  }