@1771technologies/lytenyte-pro 1.0.0-beta.0 → 1.0.0-beta.10

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