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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/dist/+types.d.ts +4203 -4009
  2. package/dist/cell-selection/adjust-rect-for-row-and-cell-span.js +38 -38
  3. package/dist/cell-selection/are-rects-equal.js +6 -4
  4. package/dist/cell-selection/bound-selection-rect.js +14 -14
  5. package/dist/cell-selection/cell-selection-containers.js +108 -78
  6. package/dist/cell-selection/cell-selection-driver.js +250 -262
  7. package/dist/cell-selection/cell-style-row.d.ts +12 -6
  8. package/dist/cell-selection/cell-style-row.js +82 -79
  9. package/dist/cell-selection/deselect-rect-range.js +41 -40
  10. package/dist/cell-selection/expand-cell-selection-down.d.ts +5 -2
  11. package/dist/cell-selection/expand-cell-selection-down.js +29 -33
  12. package/dist/cell-selection/expand-cell-selection-end.d.ts +5 -2
  13. package/dist/cell-selection/expand-cell-selection-end.js +30 -34
  14. package/dist/cell-selection/expand-cell-selection-start.d.ts +5 -2
  15. package/dist/cell-selection/expand-cell-selection-start.js +29 -33
  16. package/dist/cell-selection/expand-cell-selection-up.d.ts +5 -2
  17. package/dist/cell-selection/expand-cell-selection-up.js +29 -33
  18. package/dist/cell-selection/full-width-start-end-index.js +3 -3
  19. package/dist/cell-selection/get-root-cell.d.ts +5 -1
  20. package/dist/cell-selection/get-root-cell.js +77 -79
  21. package/dist/cell-selection/is-bottom-rect.js +5 -5
  22. package/dist/cell-selection/is-center-col-rect.d.ts +5 -2
  23. package/dist/cell-selection/is-center-col-rect.js +5 -3
  24. package/dist/cell-selection/is-center-rect.js +3 -3
  25. package/dist/cell-selection/is-end-rect.d.ts +5 -2
  26. package/dist/cell-selection/is-end-rect.js +2 -2
  27. package/dist/cell-selection/is-overlapping-rect.js +6 -4
  28. package/dist/cell-selection/is-start-rect.d.ts +5 -2
  29. package/dist/cell-selection/is-start-rect.js +2 -2
  30. package/dist/cell-selection/is-top-rect.js +2 -2
  31. package/dist/cell-selection/is-within-selection-rect.js +1 -1
  32. package/dist/cell-selection/split-cell-selection-rect.d.ts +12 -6
  33. package/dist/cell-selection/split-cell-selection-rect.js +53 -47
  34. package/dist/cell-selection/update-additive-cell-selection.d.ts +5 -2
  35. package/dist/cell-selection/update-additive-cell-selection.js +16 -17
  36. package/dist/cell-selection/use-edge-scroll.d.ts +8 -6
  37. package/dist/cell-selection/use-edge-scroll.js +65 -63
  38. package/dist/cells/cell-default.d.ts +5 -1
  39. package/dist/cells/cell-default.js +5 -5
  40. package/dist/cells/cell-editor.d.ts +4 -2
  41. package/dist/cells/cell-editor.js +129 -92
  42. package/dist/cells/cell.d.ts +16 -3
  43. package/dist/cells/cell.js +56 -27
  44. package/dist/column-manager/branch-lookup-context.d.ts +3 -1
  45. package/dist/column-manager/branch.d.ts +17 -9
  46. package/dist/column-manager/branch.js +64 -46
  47. package/dist/column-manager/column-manager.d.ts +57 -8
  48. package/dist/column-manager/column-manager.js +8 -8
  49. package/dist/column-manager/context.d.ts +1 -1
  50. package/dist/column-manager/label.d.ts +10 -2
  51. package/dist/column-manager/label.js +11 -12
  52. package/dist/column-manager/leaf.d.ts +10 -2
  53. package/dist/column-manager/leaf.js +61 -49
  54. package/dist/column-manager/move-handle.d.ts +14 -6
  55. package/dist/column-manager/move-handle.js +52 -48
  56. package/dist/column-manager/panel.d.ts +10 -1
  57. package/dist/column-manager/root.d.ts +7 -3
  58. package/dist/column-manager/root.js +4 -1
  59. package/dist/column-manager/use-column-manager.d.ts +6 -3
  60. package/dist/column-manager/use-column-manager.js +14 -15
  61. package/dist/column-manager/use-columns-from-context.d.ts +3 -1
  62. package/dist/column-manager/use-columns-from-context.js +18 -18
  63. package/dist/column-manager/visibility-checkbox.d.ts +14 -6
  64. package/dist/column-manager/visibility-checkbox.js +36 -23
  65. package/dist/context.d.ts +4 -4
  66. package/dist/filter-tree/branch.d.ts +16 -5
  67. package/dist/filter-tree/branch.js +23 -13
  68. package/dist/filter-tree/context.d.ts +16 -16
  69. package/dist/filter-tree/filter-tree.d.ts +49 -8
  70. package/dist/filter-tree/filter-tree.js +8 -8
  71. package/dist/filter-tree/hooks/use-filter-tree.d.ts +35 -29
  72. package/dist/filter-tree/hooks/use-filter-tree.js +94 -92
  73. package/dist/filter-tree/hooks/use-tree-item.d.ts +4 -4
  74. package/dist/filter-tree/hooks/use-tree-item.js +99 -106
  75. package/dist/filter-tree/inclusion-checkbox.d.ts +14 -6
  76. package/dist/filter-tree/inclusion-checkbox.js +19 -9
  77. package/dist/filter-tree/label.d.ts +10 -2
  78. package/dist/filter-tree/label.js +11 -12
  79. package/dist/filter-tree/leaf.d.ts +10 -2
  80. package/dist/filter-tree/leaf.js +15 -5
  81. package/dist/filter-tree/root.d.ts +23 -7
  82. package/dist/filter-tree/root.js +51 -23
  83. package/dist/grid-box/+types.d.ts +11 -11
  84. package/dist/grid-box/context.d.ts +3 -3
  85. package/dist/grid-box/grid-box.d.ts +26 -6
  86. package/dist/grid-box/grid-box.js +6 -6
  87. package/dist/grid-box/item.d.ts +13 -5
  88. package/dist/grid-box/item.js +73 -56
  89. package/dist/grid-box/panel.d.ts +13 -1
  90. package/dist/grid-box/panel.js +9 -2
  91. package/dist/grid-box/root.d.ts +11 -5
  92. package/dist/grid-box/root.js +11 -2
  93. package/dist/grid-box/use-aggregation-box-items.d.ts +16 -13
  94. package/dist/grid-box/use-aggregation-box-items.js +56 -57
  95. package/dist/grid-box/use-column-box-items.d.ts +33 -23
  96. package/dist/grid-box/use-column-box-items.js +87 -75
  97. package/dist/grid-box/use-row-group-box-items.d.ts +17 -12
  98. package/dist/grid-box/use-row-group-box-items.js +120 -123
  99. package/dist/grid-provider/context.d.ts +4 -2
  100. package/dist/grid-provider/provider.d.ts +4 -2
  101. package/dist/grid-provider/use-grid.d.ts +1 -1
  102. package/dist/grid.d.ts +126 -14
  103. package/dist/grid.js +14 -14
  104. package/dist/header/header-cell.d.ts +13 -5
  105. package/dist/header/header-cell.js +41 -15
  106. package/dist/header/header-group-cell.d.ts +10 -2
  107. package/dist/header/header-group-cell.js +26 -8
  108. package/dist/header/header-row.d.ts +10 -2
  109. package/dist/header/header-row.js +2 -2
  110. package/dist/header/header.d.ts +10 -1
  111. package/dist/header/header.js +11 -2
  112. package/dist/header/resize-handler.d.ts +15 -6
  113. package/dist/header/resize-handler.js +131 -122
  114. package/dist/header/use-drag-move.d.ts +22 -11
  115. package/dist/header/use-drag-move.js +95 -94
  116. package/dist/header/use-header-cell-renderer.d.ts +9 -2
  117. package/dist/header/use-header-cell-renderer.js +25 -29
  118. package/dist/icons/index.d.ts +92 -1
  119. package/dist/icons/index.js +92 -1
  120. package/dist/index.d.ts +22 -5
  121. package/dist/index.js +22 -5
  122. package/dist/license.js +174 -174
  123. package/dist/listbox/context.d.ts +2 -2
  124. package/dist/listbox/item.d.ts +10 -1
  125. package/dist/listbox/item.js +23 -19
  126. package/dist/listbox/panel.d.ts +10 -1
  127. package/dist/listbox/panel.js +69 -43
  128. package/dist/listbox/root.d.ts +5 -3
  129. package/dist/listbox/root.js +7 -7
  130. package/dist/root/dialog-driver.js +22 -16
  131. package/dist/root/popover-driver.js +27 -16
  132. package/dist/root/root.d.ts +7 -3
  133. package/dist/root/root.js +111 -107
  134. package/dist/row-data-source-client/+types.d.ts +17 -17
  135. package/dist/row-data-source-client/built-ins/avg.js +3 -4
  136. package/dist/row-data-source-client/built-ins/built-ins.d.ts +16 -16
  137. package/dist/row-data-source-client/built-ins/built-ins.js +16 -16
  138. package/dist/row-data-source-client/built-ins/count.js +3 -5
  139. package/dist/row-data-source-client/built-ins/first.js +1 -1
  140. package/dist/row-data-source-client/built-ins/group.js +1 -1
  141. package/dist/row-data-source-client/built-ins/last.js +1 -1
  142. package/dist/row-data-source-client/built-ins/max.js +9 -13
  143. package/dist/row-data-source-client/built-ins/min.js +9 -13
  144. package/dist/row-data-source-client/built-ins/sum.js +8 -10
  145. package/dist/row-data-source-client/filter/+types.d.ts +35 -13
  146. package/dist/row-data-source-client/filter/compute-filtered-rows.d.ts +16 -2
  147. package/dist/row-data-source-client/filter/compute-filtered-rows.js +102 -102
  148. package/dist/row-data-source-client/pivots/create-agg-model.d.ts +8 -4
  149. package/dist/row-data-source-client/pivots/create-agg-model.js +8 -9
  150. package/dist/row-data-source-client/pivots/create-pivot-columns-from-paths.d.ts +6 -1
  151. package/dist/row-data-source-client/pivots/create-pivot-columns-from-paths.js +42 -46
  152. package/dist/row-data-source-client/pivots/create-pivot-columns.d.ts +6 -1
  153. package/dist/row-data-source-client/pivots/create-pivot-columns.js +16 -17
  154. package/dist/row-data-source-client/pivots/create-pivot-tree.d.ts +7 -1
  155. package/dist/row-data-source-client/pivots/create-pivot-tree.js +19 -19
  156. package/dist/row-data-source-client/tree/client-tree.d.ts +19 -13
  157. package/dist/row-data-source-client/tree/client-tree.js +64 -67
  158. package/dist/row-data-source-client/tree/evaluator-aggregation.d.ts +4 -1
  159. package/dist/row-data-source-client/tree/evaluator-aggregation.js +6 -6
  160. package/dist/row-data-source-client/tree/evaluator-group.d.ts +4 -1
  161. package/dist/row-data-source-client/tree/evaluator-group.js +6 -7
  162. package/dist/row-data-source-client/tree/traverse.d.ts +5 -1
  163. package/dist/row-data-source-client/tree/traverse.js +15 -18
  164. package/dist/row-data-source-client/use-client-data-source-paginated.d.ts +9 -5
  165. package/dist/row-data-source-client/use-client-data-source-paginated.js +566 -551
  166. package/dist/row-data-source-client/use-client-data-source.d.ts +9 -5
  167. package/dist/row-data-source-client/use-client-data-source.js +696 -661
  168. package/dist/row-data-source-client/use-client-tree-data-source.d.ts +9 -5
  169. package/dist/row-data-source-client/use-client-tree-data-source.js +523 -512
  170. package/dist/row-data-source-server/async-tree/+types.async-tree.d.ts +36 -33
  171. package/dist/row-data-source-server/async-tree/apply-delete-action-to-tree.d.ts +4 -1
  172. package/dist/row-data-source-server/async-tree/apply-delete-action-to-tree.js +18 -22
  173. package/dist/row-data-source-server/async-tree/apply-set-action-to-tree.d.ts +4 -1
  174. package/dist/row-data-source-server/async-tree/apply-set-action-to-tree.js +17 -25
  175. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-are-unique.js +18 -18
  176. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-are-valid.js +9 -10
  177. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-fit.d.ts +4 -1
  178. package/dist/row-data-source-server/async-tree/check-set-action-item-keys-fit.js +13 -14
  179. package/dist/row-data-source-server/async-tree/check-set-action-item-kinds.js +9 -10
  180. package/dist/row-data-source-server/async-tree/get-parent-node-by-path.d.ts +4 -1
  181. package/dist/row-data-source-server/async-tree/get-parent-node-by-path.js +13 -13
  182. package/dist/row-data-source-server/async-tree/is-set-action-a-no-op-on-node.d.ts +4 -1
  183. package/dist/row-data-source-server/async-tree/is-set-action-a-no-op-on-node.js +1 -1
  184. package/dist/row-data-source-server/async-tree/make-async-tree.js +14 -14
  185. package/dist/row-data-source-server/async-tree/maybe-apply-parent-remove-self.d.ts +3 -1
  186. package/dist/row-data-source-server/async-tree/maybe-apply-parent-remove-self.js +6 -6
  187. package/dist/row-data-source-server/async-tree/maybe-apply-resize.d.ts +5 -1
  188. package/dist/row-data-source-server/async-tree/maybe-apply-resize.js +11 -14
  189. package/dist/row-data-source-server/async-tree/maybe-apply-set-action-items.d.ts +4 -1
  190. package/dist/row-data-source-server/async-tree/maybe-apply-set-action-items.js +42 -46
  191. package/dist/row-data-source-server/range-tree/range-tree.d.ts +28 -28
  192. package/dist/row-data-source-server/range-tree/range-tree.js +49 -48
  193. package/dist/row-data-source-server/use-server-data-source.d.ts +11 -2
  194. package/dist/row-data-source-server/use-server-data-source.js +688 -675
  195. package/dist/row-data-source-server/utils/get-node-depth.js +7 -7
  196. package/dist/row-data-source-server/utils/get-node-path.js +7 -7
  197. package/dist/row-data-source-server/utils/get-request-id.js +3 -4
  198. package/dist/rows/row/context.d.ts +2 -2
  199. package/dist/rows/row/row.d.ts +16 -3
  200. package/dist/rows/row/row.js +19 -4
  201. package/dist/rows/row/use-row-context-value.d.ts +5 -2
  202. package/dist/rows/row/use-row-context-value.js +23 -26
  203. package/dist/rows/row-detail-row.d.ts +4 -2
  204. package/dist/rows/row-detail-row.js +147 -124
  205. package/dist/rows/row-full-width.d.ts +12 -4
  206. package/dist/rows/row-full-width.js +35 -7
  207. package/dist/rows/rows-container.d.ts +10 -1
  208. package/dist/rows/rows-container.js +12 -3
  209. package/dist/rows/rows-sections.d.ts +30 -3
  210. package/dist/rows/rows-sections.js +42 -10
  211. package/dist/rows/scrollers/native-scroller.d.ts +3 -1
  212. package/dist/rows/scrollers/native-scroller.js +17 -13
  213. package/dist/sort-manager/+types.d.ts +14 -7
  214. package/dist/sort-manager/context.d.ts +4 -4
  215. package/dist/sort-manager/hooks/use-sort-manager.d.ts +9 -9
  216. package/dist/sort-manager/hooks/use-sort-manager.js +45 -49
  217. package/dist/sort-manager/hooks/use-sort-row-item.d.ts +57 -46
  218. package/dist/sort-manager/hooks/use-sort-row-item.js +126 -131
  219. package/dist/sort-manager/hooks/use-sortable-column-items.d.ts +6 -3
  220. package/dist/sort-manager/hooks/use-sortable-column-items.js +10 -10
  221. package/dist/sort-manager/root.d.ts +7 -1
  222. package/dist/sort-manager/root.js +10 -10
  223. package/dist/sort-manager/sort-add.d.ts +13 -5
  224. package/dist/sort-manager/sort-add.js +8 -8
  225. package/dist/sort-manager/sort-apply.d.ts +12 -4
  226. package/dist/sort-manager/sort-apply.js +16 -16
  227. package/dist/sort-manager/sort-cancel.d.ts +12 -4
  228. package/dist/sort-manager/sort-cancel.js +19 -19
  229. package/dist/sort-manager/sort-clear.d.ts +12 -4
  230. package/dist/sort-manager/sort-clear.js +15 -16
  231. package/dist/sort-manager/sort-column-select.d.ts +14 -6
  232. package/dist/sort-manager/sort-column-select.js +22 -14
  233. package/dist/sort-manager/sort-direction-select.d.ts +14 -6
  234. package/dist/sort-manager/sort-direction-select.js +27 -19
  235. package/dist/sort-manager/sort-manager.d.ts +93 -12
  236. package/dist/sort-manager/sort-manager.js +12 -12
  237. package/dist/sort-manager/sort-remove.d.ts +12 -4
  238. package/dist/sort-manager/sort-remove.js +8 -8
  239. package/dist/sort-manager/sort-row.d.ts +10 -2
  240. package/dist/sort-manager/sort-row.js +4 -1
  241. package/dist/sort-manager/sort-rows.d.ts +10 -1
  242. package/dist/sort-manager/sort-rows.js +1 -1
  243. package/dist/sort-manager/sort-value-select.d.ts +15 -7
  244. package/dist/sort-manager/sort-value-select.js +28 -19
  245. package/dist/sort-manager/utils/sort-item-to-sort-model.d.ts +4 -1
  246. package/dist/sort-manager/utils/sort-item-to-sort-model.js +46 -49
  247. package/dist/sort-manager/utils/sort-model-to-sort-items.d.ts +4 -1
  248. package/dist/sort-manager/utils/sort-model-to-sort-items.js +36 -44
  249. package/dist/state/+types.d.ts +43 -29
  250. package/dist/state/api/column-autosize.d.ts +4 -2
  251. package/dist/state/api/column-autosize.js +62 -63
  252. package/dist/state/api/column-by-id.js +4 -4
  253. package/dist/state/api/column-field.js +17 -20
  254. package/dist/state/api/column-from-index.js +4 -4
  255. package/dist/state/api/column-group-toggle.js +8 -8
  256. package/dist/state/api/column-index.js +5 -5
  257. package/dist/state/api/column-move.js +48 -46
  258. package/dist/state/api/column-resize.js +9 -7
  259. package/dist/state/api/column-update.d.ts +4 -2
  260. package/dist/state/api/column-update.js +23 -23
  261. package/dist/state/api/dialog-frame.d.ts +8 -4
  262. package/dist/state/api/dialog-frame.js +11 -12
  263. package/dist/state/api/edit-begin.d.ts +4 -2
  264. package/dist/state/api/edit-begin.js +71 -84
  265. package/dist/state/api/edit-end.d.ts +4 -2
  266. package/dist/state/api/edit-end.js +38 -41
  267. package/dist/state/api/edit-is-cell-active.d.ts +4 -2
  268. package/dist/state/api/edit-is-cell-active.js +17 -24
  269. package/dist/state/api/edit-update.d.ts +4 -2
  270. package/dist/state/api/edit-update.js +74 -85
  271. package/dist/state/api/event-listeners.d.ts +12 -3
  272. package/dist/state/api/event-listeners.js +16 -17
  273. package/dist/state/api/export-csv.js +33 -35
  274. package/dist/state/api/export-data-rect.js +21 -21
  275. package/dist/state/api/focus-cell.d.ts +4 -2
  276. package/dist/state/api/focus-cell.js +110 -109
  277. package/dist/state/api/popover-frame.d.ts +8 -4
  278. package/dist/state/api/popover-frame.js +11 -12
  279. package/dist/state/api/position-from-element.js +5 -6
  280. package/dist/state/api/row-by-id.js +3 -3
  281. package/dist/state/api/row-by-index.js +11 -6
  282. package/dist/state/api/row-detail-is-expanded.d.ts +3 -1
  283. package/dist/state/api/row-detail-is-expanded.js +4 -4
  284. package/dist/state/api/row-detail-rendered-height.d.ts +4 -2
  285. package/dist/state/api/row-detail-rendered-height.js +10 -12
  286. package/dist/state/api/row-detail-toggle.js +26 -30
  287. package/dist/state/api/row-group-apply-expansions.d.ts +3 -1
  288. package/dist/state/api/row-group-apply-expansions.js +15 -17
  289. package/dist/state/api/row-group-column-index.d.ts +3 -1
  290. package/dist/state/api/row-group-column-index.js +14 -12
  291. package/dist/state/api/row-group-is-expanded.d.ts +3 -1
  292. package/dist/state/api/row-group-is-expanded.js +11 -13
  293. package/dist/state/api/row-group-toggle.js +5 -5
  294. package/dist/state/api/row-handle-select.d.ts +4 -2
  295. package/dist/state/api/row-handle-select.js +36 -40
  296. package/dist/state/api/row-select-all.js +14 -15
  297. package/dist/state/api/row-select.d.ts +4 -2
  298. package/dist/state/api/row-select.js +30 -33
  299. package/dist/state/api/row-selected.js +10 -11
  300. package/dist/state/api/scroll-into-view.d.ts +4 -2
  301. package/dist/state/api/scroll-into-view.js +47 -47
  302. package/dist/state/api/sort-for-column.js +6 -7
  303. package/dist/state/api/use-row-drag.js +22 -24
  304. package/dist/state/helpers/cell-row-group.d.ts +5 -1
  305. package/dist/state/helpers/cell-row-group.js +18 -16
  306. package/dist/state/helpers/column-add-row-group.d.ts +18 -7
  307. package/dist/state/helpers/column-add-row-group.js +71 -66
  308. package/dist/state/helpers/column-layout.d.ts +7 -1
  309. package/dist/state/helpers/column-layout.js +60 -60
  310. package/dist/state/helpers/column-marker.d.ts +8 -4
  311. package/dist/state/helpers/column-marker.js +38 -34
  312. package/dist/state/helpers/column-view.d.ts +21 -15
  313. package/dist/state/helpers/column-view.js +56 -32
  314. package/dist/state/helpers/edit-on-change.d.ts +18 -10
  315. package/dist/state/helpers/edit-on-change.js +25 -25
  316. package/dist/state/helpers/empty-row-data-source.js +16 -16
  317. package/dist/state/helpers/get-data-rect.d.ts +20 -10
  318. package/dist/state/helpers/get-data-rect.js +67 -62
  319. package/dist/state/helpers/get-full-width-callback.d.ts +5 -1
  320. package/dist/state/helpers/get-full-width-callback.js +5 -6
  321. package/dist/state/helpers/get-span-callback.d.ts +6 -1
  322. package/dist/state/helpers/get-span-callback.js +15 -18
  323. package/dist/state/helpers/resolve-column.d.ts +6 -2
  324. package/dist/state/helpers/resolve-column.js +23 -23
  325. package/dist/state/helpers/row-layout/get-focus-criteria.d.ts +15 -12
  326. package/dist/state/helpers/row-layout/get-focus-criteria.js +57 -56
  327. package/dist/state/helpers/row-layout/row-layout.d.ts +15 -9
  328. package/dist/state/helpers/row-layout/row-layout.js +387 -401
  329. package/dist/state/use-lytenyte.js +567 -528
  330. package/dist/tree-view/branch/branch.d.ts +19 -11
  331. package/dist/tree-view/branch/branch.js +106 -54
  332. package/dist/tree-view/branch/use-branch-keys.d.ts +5 -1
  333. package/dist/tree-view/branch/use-branch-keys.js +71 -74
  334. package/dist/tree-view/context.d.ts +21 -17
  335. package/dist/tree-view/hooks/use-tree-view-paths.d.ts +7 -1
  336. package/dist/tree-view/hooks/use-tree-view-paths.js +5 -5
  337. package/dist/tree-view/index.d.ts +35 -7
  338. package/dist/tree-view/index.js +7 -7
  339. package/dist/tree-view/leaf.d.ts +10 -2
  340. package/dist/tree-view/leaf.js +30 -21
  341. package/dist/tree-view/navigation/get-all-ids.js +3 -3
  342. package/dist/tree-view/navigation/get-first-node.js +3 -3
  343. package/dist/tree-view/navigation/get-last-node.js +3 -3
  344. package/dist/tree-view/navigation/get-next-node.js +6 -8
  345. package/dist/tree-view/navigation/get-prev-node.js +6 -8
  346. package/dist/tree-view/panel/make-handle-navigation.js +23 -31
  347. package/dist/tree-view/panel/make-handle-selection.js +68 -77
  348. package/dist/tree-view/panel/make-handle-typeahead.js +34 -40
  349. package/dist/tree-view/panel/panel.d.ts +10 -1
  350. package/dist/tree-view/panel/panel.js +40 -20
  351. package/dist/tree-view/panel/use-tree-navigation.js +64 -52
  352. package/dist/tree-view/root.d.ts +20 -14
  353. package/dist/tree-view/root.js +53 -55
  354. package/dist/tree-view/utils/get-focusable-nodes.js +4 -2
  355. package/dist/tree-view/utils/get-focused-node.js +11 -11
  356. package/dist/tree-view/utils/get-ids-between-nodes.d.ts +5 -1
  357. package/dist/tree-view/utils/get-ids-between-nodes.js +10 -11
  358. package/dist/tree-view/utils/get-panel.js +5 -5
  359. package/dist/tree-view/utils/get-parent-node.js +6 -7
  360. package/dist/tree-view/utils/get-sibling-branches.js +8 -10
  361. package/dist/tree-view/utils/get-tree-node-id.js +1 -1
  362. package/dist/tree-view/utils/is-branch-node.js +1 -1
  363. package/dist/tree-view/utils/is-leaf-node.js +1 -1
  364. package/dist/tree-view/utils/is-tree-node-disabled.js +1 -1
  365. package/dist/tree-view/utils/select-node.d.ts +5 -1
  366. package/dist/tree-view/utils/select-node.js +8 -11
  367. package/dist/tree-view/utils/toggle-all-selections.js +4 -6
  368. package/dist/tree-view/utils/toggle-selection.js +15 -18
  369. package/dist/tree-view/virtualized/force-sync-scrolling.d.ts +3 -1
  370. package/dist/tree-view/virtualized/force-sync-scrolling.js +24 -18
  371. package/dist/tree-view/virtualized/get-virtual-tree-paths.d.ts +3 -1
  372. package/dist/tree-view/virtualized/get-virtual-tree-paths.js +11 -12
  373. package/dist/tree-view/virtualized/make-virtual-tree.d.ts +26 -21
  374. package/dist/tree-view/virtualized/make-virtual-tree.js +79 -85
  375. package/dist/tree-view/virtualized/use-flattened-tree.d.ts +17 -8
  376. package/dist/tree-view/virtualized/use-flattened-tree.js +30 -31
  377. package/dist/tree-view/virtualized/use-row-start-and-end.d.ts +6 -1
  378. package/dist/tree-view/virtualized/use-row-start-and-end.js +21 -23
  379. package/dist/tree-view/virtualized/use-virtualized-tree.d.ts +21 -15
  380. package/dist/tree-view/virtualized/use-virtualized-tree.js +103 -90
  381. package/dist/utils/cycle-sorts.js +12 -14
  382. package/dist/viewport/begin-editing.d.ts +6 -2
  383. package/dist/viewport/begin-editing.js +9 -13
  384. package/dist/viewport/viewport.d.ts +10 -1
  385. package/dist/viewport/viewport.js +93 -70
  386. package/package.json +7 -7
@@ -7,699 +7,712 @@ import { getRequestId } from "./utils/get-request-id.js";
7
7
  import { RangeTree } from "./range-tree/range-tree.js";
8
8
  import { getNodePath } from "./utils/get-node-path.js";
9
9
  import { equal } from "@1771technologies/lytenyte-js-utils";
10
- export function makeServerDataSource({ dataFetcher, dataColumnPivotFetcher, dataInFilterItemFetcher, cellUpdateHandler, cellUpdateOptimistically = true, blockSize = 200, }) {
11
- let grid = null;
12
- const snapshot$ = atom(Date.now());
13
- const rdsStore = createStore();
14
- const tree$ = atom(makeAsyncTree());
15
- const tree = makeGridAtom(tree$, rdsStore);
16
- const isLoading$ = atom(false);
17
- const isLoading = makeGridAtom(isLoading$, rdsStore);
18
- const error$ = atom();
19
- const loadError = makeGridAtom(error$, rdsStore);
20
- const nodesWithError = atom(new Map());
21
- const initialized = atom(false);
22
- const model$ = atom({
23
- sorts: [],
24
- filters: {},
25
- filtersIn: {},
26
- quickSearch: null,
27
- group: [],
28
- groupExpansions: {},
29
- aggregations: {},
30
- pivotGroupExpansions: {},
31
- pivotMode: false,
32
- pivotModel: {
33
- columns: [],
34
- filters: {},
35
- filtersIn: {},
36
- rows: [],
37
- sorts: [],
38
- values: [],
39
- },
10
+ export function makeServerDataSource({
11
+ dataFetcher,
12
+ dataColumnPivotFetcher,
13
+ dataInFilterItemFetcher,
14
+ cellUpdateHandler,
15
+ cellUpdateOptimistically = true,
16
+ blockSize = 200,
17
+ }) {
18
+ let grid = null;
19
+ const snapshot$ = atom(Date.now());
20
+ const rdsStore = createStore();
21
+ const tree$ = atom(makeAsyncTree());
22
+ const tree = makeGridAtom(tree$, rdsStore);
23
+ const isLoading$ = atom(false);
24
+ const isLoading = makeGridAtom(isLoading$, rdsStore);
25
+ const error$ = atom();
26
+ const loadError = makeGridAtom(error$, rdsStore);
27
+ const nodesWithError = atom(new Map());
28
+ const initialized = atom(false);
29
+ const model$ = atom({
30
+ sorts: [],
31
+ filters: {},
32
+ filtersIn: {},
33
+ quickSearch: null,
34
+ group: [],
35
+ groupExpansions: {},
36
+ aggregations: {},
37
+ pivotGroupExpansions: {},
38
+ pivotMode: false,
39
+ pivotModel: {
40
+ columns: [],
41
+ filters: {},
42
+ filtersIn: {},
43
+ rows: [],
44
+ sorts: [],
45
+ values: [],
46
+ },
47
+ });
48
+ const model = makeGridAtom(model$, rdsStore);
49
+ const pivotGroupExpansions = atom((g) => g(model$).pivotGroupExpansions);
50
+ const rowGroupExpansions = atom((g) => g(model$).groupExpansions);
51
+ const pivotMode = atom((g) => g(model$).pivotMode);
52
+ const topData = atom([]);
53
+ const botData = atom([]);
54
+ const seenRequests = new Set();
55
+ const dataResponseHandler = (res) => {
56
+ const t = tree.get();
57
+ const dataResponses = res.filter((r) => {
58
+ return !("kind" in r && (r.kind === "top" || r.kind === "bottom"));
40
59
  });
41
- const model = makeGridAtom(model$, rdsStore);
42
- const pivotGroupExpansions = atom((g) => g(model$).pivotGroupExpansions);
43
- const rowGroupExpansions = atom((g) => g(model$).groupExpansions);
44
- const pivotMode = atom((g) => g(model$).pivotMode);
45
- const topData = atom([]);
46
- const botData = atom([]);
47
- const seenRequests = new Set();
48
- const dataResponseHandler = (res) => {
49
- const t = tree.get();
50
- const dataResponses = res.filter((r) => {
51
- return !("kind" in r && (r.kind === "top" || r.kind === "bottom"));
52
- });
53
- dataResponses.sort((l, r) => l.path.length - r.path.length);
54
- const pinResponses = res.filter((r) => {
55
- return "kind" in r && (r.kind === "top" || r.kind === "bottom");
56
- });
57
- pinResponses.forEach((p) => {
58
- if (p.kind === "top") {
59
- rdsStore.set(topData, p.data);
60
- }
61
- else {
62
- rdsStore.set(botData, p.data);
63
- }
64
- });
65
- dataResponses.forEach((r) => {
66
- t.set({
67
- path: r.path,
68
- items: r.data.map((c, i) => {
69
- if (c.kind === "leaf") {
70
- return {
71
- kind: "leaf",
72
- data: c,
73
- relIndex: r.start + i,
74
- };
75
- }
76
- else {
77
- return {
78
- kind: "parent",
79
- data: c,
80
- path: c.key,
81
- relIndex: r.start + i,
82
- size: c.childCount,
83
- };
84
- }
85
- }),
86
- size: r.size,
87
- });
88
- });
89
- };
90
- const dataRequestHandler = async (p, force = false, onSuccess, onFailure) => {
91
- if (!grid)
92
- return;
93
- const unseen = p.filter((x) => force || !seenRequests.has(x.id));
94
- unseen.forEach((x) => seenRequests.add(x.id));
95
- if (unseen.length === 0) {
96
- onSuccess?.();
97
- return;
60
+ dataResponses.sort((l, r) => l.path.length - r.path.length);
61
+ const pinResponses = res.filter((r) => {
62
+ return "kind" in r && (r.kind === "top" || r.kind === "bottom");
63
+ });
64
+ pinResponses.forEach((p) => {
65
+ if (p.kind === "top") {
66
+ rdsStore.set(topData, p.data);
67
+ } else {
68
+ rdsStore.set(botData, p.data);
69
+ }
70
+ });
71
+ dataResponses.forEach((r) => {
72
+ t.set({
73
+ path: r.path,
74
+ items: r.data.map((c, i) => {
75
+ if (c.kind === "leaf") {
76
+ return {
77
+ kind: "leaf",
78
+ data: c,
79
+ relIndex: r.start + i,
80
+ };
81
+ } else {
82
+ return {
83
+ kind: "parent",
84
+ data: c,
85
+ path: c.key,
86
+ relIndex: r.start + i,
87
+ size: c.childCount,
88
+ };
89
+ }
90
+ }),
91
+ size: r.size,
92
+ });
93
+ });
94
+ };
95
+ const dataRequestHandler = async (p, force = false, onSuccess, onFailure) => {
96
+ if (!grid) return;
97
+ const unseen = p.filter((x) => force || !seenRequests.has(x.id));
98
+ unseen.forEach((x) => seenRequests.add(x.id));
99
+ if (unseen.length === 0) {
100
+ onSuccess?.();
101
+ return;
102
+ }
103
+ rdsStore.set(nodesWithError, (prev) => {
104
+ const next = new Map(prev);
105
+ p.forEach((r) => {
106
+ for (let i = r.rowStartIndex; i < r.rowEndIndex; i++) {
107
+ next.delete(i);
98
108
  }
109
+ });
110
+ return prev;
111
+ });
112
+ try {
113
+ const res = await dataFetcher({
114
+ grid: grid,
115
+ model: model.get(),
116
+ reqTime: Date.now(),
117
+ requests: p,
118
+ });
119
+ dataResponseHandler(res);
120
+ onSuccess?.();
121
+ } catch (e) {
122
+ // Mark them as unseen since the request failed.
123
+ unseen.forEach((x) => seenRequests.delete(x.id));
124
+ onFailure?.(e);
125
+ console.error(e);
126
+ } finally {
127
+ rdsStore.set(snapshot$, Date.now());
128
+ grid.state.rowDataStore.rowClearCache();
129
+ }
130
+ };
131
+ const viewChange = () => {
132
+ if (!grid) return;
133
+ const bounds = grid.state.viewBounds.get();
134
+ const f = flat.get();
135
+ const te = bounds.rowTopEnd;
136
+ const seen = new Set();
137
+ const requests = [];
138
+ for (let i = bounds.rowCenterStart - te; i < bounds.rowCenterEnd - te; i++) {
139
+ const ranges = f.rangeTree.findRangesForRowIndex(i);
140
+ ranges.forEach((c) => {
141
+ if (c.parent.kind === "root") {
142
+ const blockIndex = Math.floor(i / blockSize);
143
+ const start = blockIndex * blockSize;
144
+ const end = Math.min(start + blockSize, c.parent.size);
145
+ const reqId = getRequestId([], start, end);
146
+ if (seen.has(reqId)) return;
147
+ seen.add(reqId);
148
+ const size = start + blockSize > c.parent.size ? c.parent.size - start : blockSize;
149
+ requests.push({
150
+ id: reqId,
151
+ path: [],
152
+ start,
153
+ end,
154
+ rowStartIndex: i,
155
+ rowEndIndex: i + size,
156
+ });
157
+ } else {
158
+ const blockIndex = Math.floor(c.parent.relIndex / blockSize);
159
+ const start = blockIndex * blockSize;
160
+ const end = Math.min(start + blockSize, c.parent.size);
161
+ const path = getNodePath(c.parent);
162
+ const reqId = getRequestId(path, start, end);
163
+ if (seen.has(reqId)) return;
164
+ seen.add(reqId);
165
+ const size = start + blockSize > c.parent.size ? c.parent.size - start : blockSize;
166
+ requests.push({
167
+ id: reqId,
168
+ path,
169
+ start,
170
+ end,
171
+ rowStartIndex: i,
172
+ rowEndIndex: i + size,
173
+ });
174
+ }
175
+ });
176
+ }
177
+ dataRequestHandler(
178
+ requests,
179
+ false,
180
+ () => {},
181
+ (e) => {
99
182
  rdsStore.set(nodesWithError, (prev) => {
100
- const next = new Map(prev);
101
- p.forEach((r) => {
102
- for (let i = r.rowStartIndex; i < r.rowEndIndex; i++) {
103
- next.delete(i);
104
- }
105
- });
106
- return prev;
183
+ const next = new Map(prev);
184
+ requests.forEach((r) => {
185
+ for (let i = r.rowStartIndex; i < r.rowEndIndex; i++) {
186
+ next.set(i, e);
187
+ }
188
+ });
189
+ return prev;
107
190
  });
108
- try {
109
- const res = await dataFetcher({
110
- grid: grid,
111
- model: model.get(),
112
- reqTime: Date.now(),
113
- requests: p,
114
- });
115
- dataResponseHandler(res);
116
- onSuccess?.();
117
- }
118
- catch (e) {
119
- // Mark them as unseen since the request failed.
120
- unseen.forEach((x) => seenRequests.delete(x.id));
121
- onFailure?.(e);
122
- console.error(e);
123
- }
124
- finally {
125
- rdsStore.set(snapshot$, Date.now());
126
- grid.state.rowDataStore.rowClearCache();
127
- }
191
+ },
192
+ );
193
+ };
194
+ const resetRequest = async () => {
195
+ seenRequests.clear();
196
+ tree.set(makeAsyncTree());
197
+ rdsStore.set(nodesWithError, new Map());
198
+ // Initialize the grid.
199
+ const initialDataRequest = {
200
+ path: [],
201
+ id: getRequestId([], 0, blockSize),
202
+ rowStartIndex: 0,
203
+ rowEndIndex: blockSize,
204
+ start: 0,
205
+ end: blockSize,
128
206
  };
129
- const viewChange = () => {
130
- if (!grid)
131
- return;
132
- const bounds = grid.state.viewBounds.get();
133
- const f = flat.get();
134
- const te = bounds.rowTopEnd;
135
- const seen = new Set();
136
- const requests = [];
137
- for (let i = bounds.rowCenterStart - te; i < bounds.rowCenterEnd - te; i++) {
138
- const ranges = f.rangeTree.findRangesForRowIndex(i);
139
- ranges.forEach((c) => {
140
- if (c.parent.kind === "root") {
141
- const blockIndex = Math.floor(i / blockSize);
142
- const start = blockIndex * blockSize;
143
- const end = Math.min(start + blockSize, c.parent.size);
144
- const reqId = getRequestId([], start, end);
145
- if (seen.has(reqId))
146
- return;
147
- seen.add(reqId);
148
- const size = start + blockSize > c.parent.size ? c.parent.size - start : blockSize;
149
- requests.push({
150
- id: reqId,
151
- path: [],
152
- start,
153
- end,
154
- rowStartIndex: i,
155
- rowEndIndex: i + size,
156
- });
157
- }
158
- else {
159
- const blockIndex = Math.floor(c.parent.relIndex / blockSize);
160
- const start = blockIndex * blockSize;
161
- const end = Math.min(start + blockSize, c.parent.size);
162
- const path = getNodePath(c.parent);
163
- const reqId = getRequestId(path, start, end);
164
- if (seen.has(reqId))
165
- return;
166
- seen.add(reqId);
167
- const size = start + blockSize > c.parent.size ? c.parent.size - start : blockSize;
168
- requests.push({
169
- id: reqId,
170
- path,
171
- start,
172
- end,
173
- rowStartIndex: i,
174
- rowEndIndex: i + size,
175
- });
176
- }
177
- });
207
+ loadError.set(null);
208
+ isLoading.set(true);
209
+ await dataRequestHandler(
210
+ [initialDataRequest],
211
+ false,
212
+ () => {},
213
+ (e) => {
214
+ loadError.set(e);
215
+ },
216
+ );
217
+ isLoading.set(false);
218
+ };
219
+ const flat$ = atom((g) => {
220
+ g(snapshot$);
221
+ const mode = rdsStore.get(pivotMode);
222
+ const expansions = mode ? g(pivotGroupExpansions) : g(rowGroupExpansions);
223
+ const t = g(tree$);
224
+ const rowIdToRow = new Map();
225
+ const rowIndexToRow = new Map();
226
+ const rowIdToRowIndex = new Map();
227
+ const ranges = [];
228
+ function processParent(node, start) {
229
+ const rows = [...node.byIndex.values()].sort((l, r) => l.relIndex - r.relIndex);
230
+ // Track the additional rows added by expanded groups
231
+ let offset = 0;
232
+ for (let i = 0; i < rows.length; i++) {
233
+ const row = rows[i];
234
+ const rowIndex = row.relIndex + start + offset;
235
+ rowIndexToRow.set(rowIndex, row);
236
+ rowIdToRowIndex.set(row.data.id, rowIndex);
237
+ rowIdToRow.set(row.data.id, row);
238
+ if (row.kind === "parent" && expansions[row.data.id]) {
239
+ offset += processParent(row, rowIndex + 1);
178
240
  }
179
- dataRequestHandler(requests, false, () => { }, (e) => {
180
- rdsStore.set(nodesWithError, (prev) => {
181
- const next = new Map(prev);
182
- requests.forEach((r) => {
183
- for (let i = r.rowStartIndex; i < r.rowEndIndex; i++) {
184
- next.set(i, e);
185
- }
186
- });
187
- return prev;
188
- });
189
- });
241
+ }
242
+ ranges.push({ rowStart: start, rowEnd: offset + node.size + start, parent: node });
243
+ return offset + node.size;
244
+ }
245
+ const size = processParent(t, 0);
246
+ const rangeTree = new RangeTree(ranges);
247
+ return {
248
+ size,
249
+ rowIndexToRow,
250
+ rowIdToRow,
251
+ rowIdToRowIndex,
252
+ rangeTree,
190
253
  };
191
- const resetRequest = async () => {
192
- seenRequests.clear();
193
- tree.set(makeAsyncTree());
194
- rdsStore.set(nodesWithError, new Map());
195
- // Initialize the grid.
196
- const initialDataRequest = {
197
- path: [],
198
- id: getRequestId([], 0, blockSize),
199
- rowStartIndex: 0,
200
- rowEndIndex: blockSize,
201
- start: 0,
202
- end: blockSize,
203
- };
204
- loadError.set(null);
205
- isLoading.set(true);
206
- await dataRequestHandler([initialDataRequest], false, () => { }, (e) => {
207
- loadError.set(e);
208
- });
209
- isLoading.set(false);
254
+ });
255
+ const flat = makeGridAtom(flat$, rdsStore);
256
+ const cleanup = [];
257
+ const init = (g) => {
258
+ grid = g;
259
+ const sorts = g.state.sortModel.get();
260
+ const filters = g.state.filterModel.get();
261
+ const filtersIn = g.state.filterInModel.get();
262
+ const quickSearch = g.state.quickSearch.get();
263
+ const group = g.state.rowGroupModel.get();
264
+ const groupExpansions = g.state.rowGroupExpansions.get();
265
+ const aggregations = g.state.aggModel.get();
266
+ const pivotMode = g.state.columnPivotMode.get();
267
+ const pivotModel = g.state.columnPivotModel.get();
268
+ const pivotGroupExpansions = g.state.columnPivotRowGroupExpansions.get();
269
+ rdsStore.set(model$, {
270
+ sorts,
271
+ filters,
272
+ filtersIn,
273
+ quickSearch,
274
+ aggregations,
275
+ group,
276
+ groupExpansions,
277
+ pivotMode,
278
+ pivotModel,
279
+ pivotGroupExpansions,
280
+ });
281
+ rdsStore.set(initialized, true);
282
+ // Handle row count changes
283
+ const f = flat.get();
284
+ g.state.rowDataStore.rowCenterCount.set(f.size);
285
+ g.state.rowDataStore.rowBottomCount.set(rdsStore.get(botData).length);
286
+ g.state.rowDataStore.rowTopCount.set(rdsStore.get(topData).length);
287
+ rdsStore.sub(flat$, () => {
288
+ const f = flat.get();
289
+ g.state.rowDataStore.rowCenterCount.set(f.size);
290
+ viewChange();
291
+ });
292
+ rdsStore.sub(topData, () => {
293
+ g.state.rowDataStore.rowTopCount.set(rdsStore.get(topData).length);
294
+ g.state.rowDataStore.rowClearCache();
295
+ });
296
+ rdsStore.sub(botData, () => {
297
+ g.state.rowDataStore.rowBottomCount.set(rdsStore.get(botData).length);
298
+ g.state.rowDataStore.rowClearCache();
299
+ });
300
+ resetRequest();
301
+ // Watch the view bound changes.
302
+ g.state.viewBounds.watch(() => {
303
+ viewChange();
304
+ });
305
+ let prevPivotColumnModel = pivotModel.columns;
306
+ let prevPivotColumnValues = pivotModel.values;
307
+ const updatePivotColumns = async (mdl, ignoreEqualCheck = false) => {
308
+ if (
309
+ !ignoreEqualCheck &&
310
+ equal(prevPivotColumnModel, mdl.columns) &&
311
+ equal(prevPivotColumnValues, mdl.values)
312
+ )
313
+ return;
314
+ const cols = await dataColumnPivotFetcher?.({
315
+ grid: grid,
316
+ model: model.get(),
317
+ reqTime: Date.now(),
318
+ });
319
+ if (cols) grid?.state.columnPivotColumns.set(cols);
320
+ resetRequest();
321
+ prevPivotColumnModel = mdl.columns;
322
+ prevPivotColumnValues = mdl.values;
210
323
  };
211
- const flat$ = atom((g) => {
212
- g(snapshot$);
213
- const mode = rdsStore.get(pivotMode);
214
- const expansions = mode ? g(pivotGroupExpansions) : g(rowGroupExpansions);
215
- const t = g(tree$);
216
- const rowIdToRow = new Map();
217
- const rowIndexToRow = new Map();
218
- const rowIdToRowIndex = new Map();
219
- const ranges = [];
220
- function processParent(node, start) {
221
- const rows = [...node.byIndex.values()].sort((l, r) => l.relIndex - r.relIndex);
222
- // Track the additional rows added by expanded groups
223
- let offset = 0;
224
- for (let i = 0; i < rows.length; i++) {
225
- const row = rows[i];
226
- const rowIndex = row.relIndex + start + offset;
227
- rowIndexToRow.set(rowIndex, row);
228
- rowIdToRowIndex.set(row.data.id, rowIndex);
229
- rowIdToRow.set(row.data.id, row);
230
- if (row.kind === "parent" && expansions[row.data.id]) {
231
- offset += processParent(row, rowIndex + 1);
232
- }
233
- }
234
- ranges.push({ rowStart: start, rowEnd: offset + node.size + start, parent: node });
235
- return offset + node.size;
236
- }
237
- const size = processParent(t, 0);
238
- const rangeTree = new RangeTree(ranges);
239
- return {
240
- size,
241
- rowIndexToRow,
242
- rowIdToRow,
243
- rowIdToRowIndex,
244
- rangeTree,
245
- };
324
+ if (pivotMode) updatePivotColumns(pivotModel);
325
+ // Make these deep equality checks
326
+ cleanup.push(
327
+ g.state.columnPivotMode.watch(() => {
328
+ const model = g.state.columnPivotModel.get();
329
+ updatePivotColumns(model, true);
330
+ rdsStore.set(model$, (prev) => ({ ...prev, pivotMode: g.state.columnPivotMode.get() }));
331
+ g.state.rowDataStore.rowClearCache();
332
+ }),
333
+ );
334
+ cleanup.push(
335
+ g.state.columnPivotModel.watch(() => {
336
+ const model = g.state.columnPivotModel.get();
337
+ updatePivotColumns(model);
338
+ rdsStore.set(model$, (prev) => ({
339
+ ...prev,
340
+ pivotModel: model,
341
+ }));
342
+ g.state.rowDataStore.rowClearCache();
343
+ }),
344
+ );
345
+ g.state.columnPivotRowGroupExpansions.watch(() => {
346
+ rdsStore.set(model$, (prev) => ({
347
+ ...prev,
348
+ columnPivotGroupExpansions: g.state.columnPivotRowGroupExpansions.get(),
349
+ }));
350
+ grid?.state.rowDataStore.rowClearCache();
246
351
  });
247
- const flat = makeGridAtom(flat$, rdsStore);
248
- const cleanup = [];
249
- const init = (g) => {
250
- grid = g;
251
- const sorts = g.state.sortModel.get();
252
- const filters = g.state.filterModel.get();
253
- const filtersIn = g.state.filterInModel.get();
254
- const quickSearch = g.state.quickSearch.get();
255
- const group = g.state.rowGroupModel.get();
256
- const groupExpansions = g.state.rowGroupExpansions.get();
257
- const aggregations = g.state.aggModel.get();
258
- const pivotMode = g.state.columnPivotMode.get();
259
- const pivotModel = g.state.columnPivotModel.get();
260
- const pivotGroupExpansions = g.state.columnPivotRowGroupExpansions.get();
261
- rdsStore.set(model$, {
262
- sorts,
263
- filters,
264
- filtersIn,
265
- quickSearch,
266
- aggregations,
267
- group,
268
- groupExpansions,
269
- pivotMode,
270
- pivotModel,
271
- pivotGroupExpansions,
272
- });
273
- rdsStore.set(initialized, true);
274
- // Handle row count changes
275
- const f = flat.get();
276
- g.state.rowDataStore.rowCenterCount.set(f.size);
277
- g.state.rowDataStore.rowBottomCount.set(rdsStore.get(botData).length);
278
- g.state.rowDataStore.rowTopCount.set(rdsStore.get(topData).length);
279
- rdsStore.sub(flat$, () => {
280
- const f = flat.get();
281
- g.state.rowDataStore.rowCenterCount.set(f.size);
282
- viewChange();
283
- });
284
- rdsStore.sub(topData, () => {
285
- g.state.rowDataStore.rowTopCount.set(rdsStore.get(topData).length);
286
- g.state.rowDataStore.rowClearCache();
287
- });
288
- rdsStore.sub(botData, () => {
289
- g.state.rowDataStore.rowBottomCount.set(rdsStore.get(botData).length);
290
- g.state.rowDataStore.rowClearCache();
291
- });
352
+ // Sort model monitoring
353
+ cleanup.push(
354
+ g.state.sortModel.watch(() => {
355
+ rdsStore.set(model$, (prev) => ({ ...prev, sorts: g.state.sortModel.get() }));
292
356
  resetRequest();
293
- // Watch the view bound changes.
294
- g.state.viewBounds.watch(() => {
295
- viewChange();
296
- });
297
- let prevPivotColumnModel = pivotModel.columns;
298
- let prevPivotColumnValues = pivotModel.values;
299
- const updatePivotColumns = async (mdl, ignoreEqualCheck = false) => {
300
- if (!ignoreEqualCheck &&
301
- equal(prevPivotColumnModel, mdl.columns) &&
302
- equal(prevPivotColumnValues, mdl.values))
303
- return;
304
- const cols = await dataColumnPivotFetcher?.({
305
- grid: grid,
306
- model: model.get(),
307
- reqTime: Date.now(),
308
- });
309
- if (cols)
310
- grid?.state.columnPivotColumns.set(cols);
311
- resetRequest();
312
- prevPivotColumnModel = mdl.columns;
313
- prevPivotColumnValues = mdl.values;
314
- };
315
- if (pivotMode)
316
- updatePivotColumns(pivotModel);
317
- // Make these deep equality checks
318
- cleanup.push(g.state.columnPivotMode.watch(() => {
319
- const model = g.state.columnPivotModel.get();
320
- updatePivotColumns(model, true);
321
- rdsStore.set(model$, (prev) => ({ ...prev, pivotMode: g.state.columnPivotMode.get() }));
322
- g.state.rowDataStore.rowClearCache();
323
- }));
324
- cleanup.push(g.state.columnPivotModel.watch(() => {
325
- const model = g.state.columnPivotModel.get();
326
- updatePivotColumns(model);
327
- rdsStore.set(model$, (prev) => ({
328
- ...prev,
329
- pivotModel: model,
330
- }));
331
- g.state.rowDataStore.rowClearCache();
332
- }));
333
- g.state.columnPivotRowGroupExpansions.watch(() => {
334
- rdsStore.set(model$, (prev) => ({
335
- ...prev,
336
- columnPivotGroupExpansions: g.state.columnPivotRowGroupExpansions.get(),
337
- }));
338
- grid?.state.rowDataStore.rowClearCache();
339
- });
340
- // Sort model monitoring
341
- cleanup.push(g.state.sortModel.watch(() => {
342
- rdsStore.set(model$, (prev) => ({ ...prev, sorts: g.state.sortModel.get() }));
343
- resetRequest();
344
- }));
345
- // Filter model monitoring
346
- cleanup.push(g.state.filterModel.watch(() => {
347
- rdsStore.set(model$, (prev) => ({ ...prev, filters: g.state.filterModel.get() }));
348
- resetRequest();
349
- }));
350
- cleanup.push(g.state.quickSearch.watch(() => {
351
- rdsStore.set(model$, (prev) => ({ ...prev, quickSearch: g.state.quickSearch.get() }));
352
- resetRequest();
353
- }));
354
- cleanup.push(g.state.filterInModel.watch(() => {
355
- rdsStore.set(model$, (prev) => ({ ...prev, filtersIn: g.state.filterInModel.get() }));
356
- resetRequest();
357
- }));
358
- // Row group model monitoring
359
- cleanup.push(g.state.rowGroupModel.watch(() => {
360
- rdsStore.set(model$, (prev) => ({ ...prev, group: g.state.rowGroupModel.get() }));
361
- resetRequest();
362
- }));
363
- // Row group expansions monitoring
364
- cleanup.push(g.state.rowGroupExpansions.watch(() => {
365
- rdsStore.set(model$, (prev) => ({
366
- ...prev,
367
- groupExpansions: g.state.rowGroupExpansions.get(),
368
- }));
369
- grid?.state.rowDataStore.rowClearCache();
370
- }));
371
- // Agg model monitoring
372
- cleanup.push(g.state.aggModel.watch(() => {
373
- rdsStore.set(model$, (prev) => ({ ...prev, agg: g.state.aggModel.get() }));
374
- resetRequest();
357
+ }),
358
+ );
359
+ // Filter model monitoring
360
+ cleanup.push(
361
+ g.state.filterModel.watch(() => {
362
+ rdsStore.set(model$, (prev) => ({ ...prev, filters: g.state.filterModel.get() }));
363
+ resetRequest();
364
+ }),
365
+ );
366
+ cleanup.push(
367
+ g.state.quickSearch.watch(() => {
368
+ rdsStore.set(model$, (prev) => ({ ...prev, quickSearch: g.state.quickSearch.get() }));
369
+ resetRequest();
370
+ }),
371
+ );
372
+ cleanup.push(
373
+ g.state.filterInModel.watch(() => {
374
+ rdsStore.set(model$, (prev) => ({ ...prev, filtersIn: g.state.filterInModel.get() }));
375
+ resetRequest();
376
+ }),
377
+ );
378
+ // Row group model monitoring
379
+ cleanup.push(
380
+ g.state.rowGroupModel.watch(() => {
381
+ rdsStore.set(model$, (prev) => ({ ...prev, group: g.state.rowGroupModel.get() }));
382
+ resetRequest();
383
+ }),
384
+ );
385
+ // Row group expansions monitoring
386
+ cleanup.push(
387
+ g.state.rowGroupExpansions.watch(() => {
388
+ rdsStore.set(model$, (prev) => ({
389
+ ...prev,
390
+ groupExpansions: g.state.rowGroupExpansions.get(),
375
391
  }));
392
+ grid?.state.rowDataStore.rowClearCache();
393
+ }),
394
+ );
395
+ // Agg model monitoring
396
+ cleanup.push(
397
+ g.state.aggModel.watch(() => {
398
+ rdsStore.set(model$, (prev) => ({ ...prev, agg: g.state.aggModel.get() }));
399
+ resetRequest();
400
+ }),
401
+ );
402
+ };
403
+ const rowById = (id) => {
404
+ const f = flat.get();
405
+ const node = f.rowIdToRow.get(id);
406
+ if (!node) {
407
+ {
408
+ const top = rdsStore.get(topData);
409
+ const node = top.find((c) => c.id === id);
410
+ if (node) return { kind: "leaf", data: node.data, id: node.id };
411
+ }
412
+ {
413
+ const bot = rdsStore.get(topData);
414
+ const node = bot.find((c) => c.id === id);
415
+ if (node) return { kind: "leaf", data: node.data, id: node.id };
416
+ }
417
+ return null;
418
+ }
419
+ if (node.kind === "parent") {
420
+ return {
421
+ kind: "branch",
422
+ data: node.data.data,
423
+ id: node.data.id,
424
+ key: node.path,
425
+ depth: getNodeDepth(node),
426
+ };
427
+ }
428
+ return {
429
+ kind: "leaf",
430
+ data: node.data.data,
431
+ id: node.data.id,
376
432
  };
377
- const rowById = (id) => {
378
- const f = flat.get();
379
- const node = f.rowIdToRow.get(id);
380
- if (!node) {
381
- {
382
- const top = rdsStore.get(topData);
383
- const node = top.find((c) => c.id === id);
384
- if (node)
385
- return { kind: "leaf", data: node.data, id: node.id };
386
- }
387
- {
388
- const bot = rdsStore.get(topData);
389
- const node = bot.find((c) => c.id === id);
390
- if (node)
391
- return { kind: "leaf", data: node.data, id: node.id };
392
- }
393
- return null;
394
- }
395
- if (node.kind === "parent") {
396
- return {
397
- kind: "branch",
398
- data: node.data.data,
399
- id: node.data.id,
400
- key: node.path,
401
- depth: getNodeDepth(node),
402
- };
403
- }
404
- return {
405
- kind: "leaf",
406
- data: node.data.data,
407
- id: node.data.id,
408
- };
409
- };
410
- const rowAllChildIds = (rowId) => {
411
- const f = flat.get();
412
- const row = f.rowIdToRow.get(rowId);
413
- if (!row || row.kind === "leaf")
414
- return [];
415
- const ids = new Set();
416
- const stack = [...row.byPath.values()];
417
- while (stack.length) {
418
- const item = stack.pop();
419
- if (item.kind === "leaf") {
420
- ids.add(item.data.id);
421
- }
422
- else {
423
- stack.push(...item.byPath.values());
424
- ids.add(item.data.id);
425
- }
426
- }
427
- return [...ids];
433
+ };
434
+ const rowAllChildIds = (rowId) => {
435
+ const f = flat.get();
436
+ const row = f.rowIdToRow.get(rowId);
437
+ if (!row || row.kind === "leaf") return [];
438
+ const ids = new Set();
439
+ const stack = [...row.byPath.values()];
440
+ while (stack.length) {
441
+ const item = stack.pop();
442
+ if (item.kind === "leaf") {
443
+ ids.add(item.data.id);
444
+ } else {
445
+ stack.push(...item.byPath.values());
446
+ ids.add(item.data.id);
447
+ }
448
+ }
449
+ return [...ids];
450
+ };
451
+ const rowByIndex = (ri) => {
452
+ const f = flat.get();
453
+ const top = rdsStore.get(topData);
454
+ const bot = rdsStore.get(botData);
455
+ const errors = rdsStore.get(nodesWithError);
456
+ const error = errors.get(ri);
457
+ if (ri == null || ri < 0 || ri >= f.size + top.length + bot.length) return null;
458
+ // Top node
459
+ if (ri < top.length) {
460
+ const row = top[ri];
461
+ if (!row) return null;
462
+ return { kind: "leaf", data: row.data, id: row.id, error };
463
+ }
464
+ if (ri >= f.size + top.length) {
465
+ const i = ri - f.size - top.length;
466
+ const row = bot[i];
467
+ if (!row) return null;
468
+ return { kind: "leaf", data: row.data, id: row.id, error };
469
+ }
470
+ const node = f.rowIndexToRow.get(ri - top.length);
471
+ if (!node && error)
472
+ return { kind: "leaf", data: null, id: `error-${ri}`, loading: false, error };
473
+ if (!node) return { kind: "leaf", data: null, id: `loading-${ri}`, loading: true, error: null };
474
+ const isLoading = rdsStore.get(loadingGroups$);
475
+ if (node.kind === "parent") {
476
+ return {
477
+ kind: "branch",
478
+ data: node.data.data,
479
+ id: node.data.id,
480
+ key: node.path,
481
+ depth: getNodeDepth(node),
482
+ error,
483
+ loading: isLoading.has(node.data.id),
484
+ };
485
+ }
486
+ return {
487
+ kind: "leaf",
488
+ data: node.data.data,
489
+ id: node.data.id,
490
+ error,
428
491
  };
429
- const rowByIndex = (ri) => {
430
- const f = flat.get();
431
- const top = rdsStore.get(topData);
432
- const bot = rdsStore.get(botData);
433
- const errors = rdsStore.get(nodesWithError);
434
- const error = errors.get(ri);
435
- if (ri == null || ri < 0 || ri >= f.size + top.length + bot.length)
436
- return null;
437
- // Top node
438
- if (ri < top.length) {
439
- const row = top[ri];
440
- if (!row)
441
- return null;
442
- return { kind: "leaf", data: row.data, id: row.id, error };
443
- }
444
- if (ri >= f.size + top.length) {
445
- const i = ri - f.size - top.length;
446
- const row = bot[i];
447
- if (!row)
448
- return null;
449
- return { kind: "leaf", data: row.data, id: row.id, error };
450
- }
451
- const node = f.rowIndexToRow.get(ri - top.length);
452
- if (!node && error)
453
- return { kind: "leaf", data: null, id: `error-${ri}`, loading: false, error };
454
- if (!node)
455
- return { kind: "leaf", data: null, id: `loading-${ri}`, loading: true, error: null };
456
- const isLoading = rdsStore.get(loadingGroups$);
457
- if (node.kind === "parent") {
458
- return {
459
- kind: "branch",
460
- data: node.data.data,
461
- id: node.data.id,
462
- key: node.path,
463
- depth: getNodeDepth(node),
464
- error,
465
- loading: isLoading.has(node.data.id),
466
- };
467
- }
492
+ };
493
+ const loadingGroups$ = atom(new Set());
494
+ const rowExpand = (p) => {
495
+ const f = flat.get();
496
+ const loadingRows = new Set(rdsStore.get(loadingGroups$));
497
+ const rowsForThis = new Set();
498
+ const rowIndices = [];
499
+ const requests = Object.entries(p)
500
+ .map(([rowId, state]) => {
501
+ if (!state) return null;
502
+ // Mark as loading
503
+ loadingRows.add(rowId);
504
+ rowsForThis.add(rowId);
505
+ const rowIndex = rowToIndex(rowId);
506
+ if (rowIndex == null) return null;
507
+ const row = f.rowIndexToRow.get(rowIndex);
508
+ if (!row || row.kind === "leaf") return null;
509
+ const path = getNodePath(row);
510
+ rowIndices.push(rowIndex);
468
511
  return {
469
- kind: "leaf",
470
- data: node.data.data,
471
- id: node.data.id,
472
- error,
512
+ id: getRequestId(path, 0, Math.min(blockSize, row.size)),
513
+ start: 0,
514
+ end: Math.min(blockSize, row.size),
515
+ path,
516
+ rowStartIndex: rowIndex + 1,
517
+ rowEndIndex: Math.min(row.size, rowIndex + blockSize + 1),
473
518
  };
474
- };
475
- const loadingGroups$ = atom(new Set());
476
- const rowExpand = (p) => {
477
- const f = flat.get();
478
- const loadingRows = new Set(rdsStore.get(loadingGroups$));
479
- const rowsForThis = new Set();
480
- const rowIndices = [];
481
- const requests = Object.entries(p)
482
- .map(([rowId, state]) => {
483
- if (!state)
484
- return null;
485
- // Mark as loading
486
- loadingRows.add(rowId);
487
- rowsForThis.add(rowId);
488
- const rowIndex = rowToIndex(rowId);
489
- if (rowIndex == null)
490
- return null;
491
- const row = f.rowIndexToRow.get(rowIndex);
492
- if (!row || row.kind === "leaf")
493
- return null;
494
- const path = getNodePath(row);
495
- rowIndices.push(rowIndex);
496
- return {
497
- id: getRequestId(path, 0, Math.min(blockSize, row.size)),
498
- start: 0,
499
- end: Math.min(blockSize, row.size),
500
- path,
501
- rowStartIndex: rowIndex + 1,
502
- rowEndIndex: Math.min(row.size, rowIndex + blockSize + 1),
503
- };
504
- })
505
- .filter((c) => !!c);
506
- const mode = rdsStore.get(pivotMode);
507
- // Remove the errors before requesting.
508
- const errorRows = rdsStore.get(nodesWithError);
509
- if (rowIndices.some((c) => errorRows.has(c))) {
510
- rdsStore.set(nodesWithError, (prev) => {
511
- const n = new Map(prev);
512
- rowIndices.forEach((c) => n.delete(c));
513
- return prev;
514
- });
515
- }
516
- // Mark these groups as loading
517
- rdsStore.set(loadingGroups$, loadingRows);
518
- grid?.state.rowDataStore.rowClearCache();
519
- dataRequestHandler(requests, false, () => {
520
- if (mode)
521
- grid?.state.columnPivotColumnGroupExpansions.set((prev) => ({ ...prev, ...p }));
522
- else
523
- grid?.state.rowGroupExpansions.set((prev) => ({ ...prev, ...p }));
524
- const next = new Set(rdsStore.get(loadingGroups$));
525
- rowsForThis.forEach((c) => next.delete(c));
526
- rdsStore.set(loadingGroups$, next);
527
- setTimeout(() => {
528
- grid?.state.rowDataStore.rowClearCache();
529
- });
530
- }, (error) => {
531
- rdsStore.set(nodesWithError, (prev) => {
532
- const n = new Map(prev);
533
- rowIndices.forEach((c) => n.set(c, error));
534
- return prev;
535
- });
536
- const next = new Set(rdsStore.get(loadingGroups$));
537
- rowsForThis.forEach((c) => next.delete(c));
538
- rdsStore.set(loadingGroups$, next);
539
- setTimeout(() => {
540
- grid?.state.rowDataStore.rowClearCache();
541
- });
519
+ })
520
+ .filter((c) => !!c);
521
+ const mode = rdsStore.get(pivotMode);
522
+ // Remove the errors before requesting.
523
+ const errorRows = rdsStore.get(nodesWithError);
524
+ if (rowIndices.some((c) => errorRows.has(c))) {
525
+ rdsStore.set(nodesWithError, (prev) => {
526
+ const n = new Map(prev);
527
+ rowIndices.forEach((c) => n.delete(c));
528
+ return prev;
529
+ });
530
+ }
531
+ // Mark these groups as loading
532
+ rdsStore.set(loadingGroups$, loadingRows);
533
+ grid?.state.rowDataStore.rowClearCache();
534
+ dataRequestHandler(
535
+ requests,
536
+ false,
537
+ () => {
538
+ if (mode) grid?.state.columnPivotColumnGroupExpansions.set((prev) => ({ ...prev, ...p }));
539
+ else grid?.state.rowGroupExpansions.set((prev) => ({ ...prev, ...p }));
540
+ const next = new Set(rdsStore.get(loadingGroups$));
541
+ rowsForThis.forEach((c) => next.delete(c));
542
+ rdsStore.set(loadingGroups$, next);
543
+ setTimeout(() => {
544
+ grid?.state.rowDataStore.rowClearCache();
542
545
  });
543
- };
544
- const rowToIndex = (rowId) => {
545
- const f = flat.get();
546
- return f.rowIdToRowIndex.get(rowId) ?? null;
547
- };
548
- const rowSelect = (params) => {
549
- if (!grid || params.mode === "none")
550
- return;
551
- if (params.mode === "single") {
552
- if (params.deselect) {
553
- grid.state.rowSelectedIds.set(new Set());
554
- }
555
- else {
556
- grid.state.rowSelectedIds.set(new Set([params.startId]));
557
- }
558
- return;
559
- }
560
- const ids = new Set();
561
- if (params.startId === params.endId) {
562
- ids.add(params.startId);
563
- if (params.selectChildren) {
564
- rowAllChildIds(params.startId).forEach((c) => ids.add(c));
565
- }
566
- }
567
- else {
568
- const first = rowToIndex(params.startId);
569
- const last = rowToIndex(params.endId);
570
- if (first == null || last == null)
571
- return;
572
- const start = Math.min(first, last);
573
- const end = Math.max(first, last);
574
- for (let i = start; i <= end; i++) {
575
- const row = rowByIndex(i);
576
- if (!row)
577
- continue;
578
- if (params.selectChildren) {
579
- rowAllChildIds(row.id).forEach((c) => ids.add(c));
580
- }
581
- if (row?.id)
582
- ids.add(row.id);
583
- }
584
- }
585
- if (params.deselect) {
586
- const current = grid.state.rowSelectedIds.get();
587
- const next = current.difference(ids);
588
- grid.state.rowSelectedIds.set(next);
589
- }
590
- else {
591
- const current = grid.state.rowSelectedIds.get();
592
- const next = current.union(ids);
593
- grid.state.rowSelectedIds.set(next);
594
- }
595
- };
596
- const rowSelectAll = (params) => {
597
- if (!grid)
598
- return;
599
- if (params.deselect) {
600
- grid.state.rowSelectedIds.set(new Set());
601
- return;
546
+ },
547
+ (error) => {
548
+ rdsStore.set(nodesWithError, (prev) => {
549
+ const n = new Map(prev);
550
+ rowIndices.forEach((c) => n.set(c, error));
551
+ return prev;
552
+ });
553
+ const next = new Set(rdsStore.get(loadingGroups$));
554
+ rowsForThis.forEach((c) => next.delete(c));
555
+ rdsStore.set(loadingGroups$, next);
556
+ setTimeout(() => {
557
+ grid?.state.rowDataStore.rowClearCache();
558
+ });
559
+ },
560
+ );
561
+ };
562
+ const rowToIndex = (rowId) => {
563
+ const f = flat.get();
564
+ return f.rowIdToRowIndex.get(rowId) ?? null;
565
+ };
566
+ const rowSelect = (params) => {
567
+ if (!grid || params.mode === "none") return;
568
+ if (params.mode === "single") {
569
+ if (params.deselect) {
570
+ grid.state.rowSelectedIds.set(new Set());
571
+ } else {
572
+ grid.state.rowSelectedIds.set(new Set([params.startId]));
573
+ }
574
+ return;
575
+ }
576
+ const ids = new Set();
577
+ if (params.startId === params.endId) {
578
+ ids.add(params.startId);
579
+ if (params.selectChildren) {
580
+ rowAllChildIds(params.startId).forEach((c) => ids.add(c));
581
+ }
582
+ } else {
583
+ const first = rowToIndex(params.startId);
584
+ const last = rowToIndex(params.endId);
585
+ if (first == null || last == null) return;
586
+ const start = Math.min(first, last);
587
+ const end = Math.max(first, last);
588
+ for (let i = start; i <= end; i++) {
589
+ const row = rowByIndex(i);
590
+ if (!row) continue;
591
+ if (params.selectChildren) {
592
+ rowAllChildIds(row.id).forEach((c) => ids.add(c));
602
593
  }
603
- const t = flat.get();
604
- grid.state.rowSelectedIds.set(new Set(t.rowIdToRow.keys()));
605
- };
606
- const rowSetBotData = () => {
607
- throw new Error(`Server data source does not support directly setting pinned rows. Instead send a DataResponsePinned object via the pushData method`);
608
- };
609
- const rowSetTopData = () => {
610
- throw new Error(`Server data source does not support directly setting pinned rows. Instead send a DataResponsePinned object via the pushData method`);
611
- };
612
- // CRUD ops
613
- const rowAdd = () => {
614
- throw new Error(`Server data source does not support adding rows directly. Instead push updates via the pushResponses or pushRequests method`);
615
- };
616
- const rowDelete = () => {
617
- throw new Error(`Server data source does not support deleting rows directly. Instead push updates via the pushResponses or pushRequests method`);
618
- };
619
- const rowUpdate = (updates) => {
620
- const f = flat.get();
621
- const top = rdsStore.get(topData);
622
- const bot = rdsStore.get(botData);
623
- const firstBot = f.size + top.length;
624
- const idMap = new Map([...updates.entries()]
625
- .map(([key, data]) => {
626
- if (typeof key === "string")
627
- return [key, data];
628
- const row = rowByIndex(key);
629
- if (!row)
630
- return null;
631
- return [row.id, data];
594
+ if (row?.id) ids.add(row.id);
595
+ }
596
+ }
597
+ if (params.deselect) {
598
+ const current = grid.state.rowSelectedIds.get();
599
+ const next = current.difference(ids);
600
+ grid.state.rowSelectedIds.set(next);
601
+ } else {
602
+ const current = grid.state.rowSelectedIds.get();
603
+ const next = current.union(ids);
604
+ grid.state.rowSelectedIds.set(next);
605
+ }
606
+ };
607
+ const rowSelectAll = (params) => {
608
+ if (!grid) return;
609
+ if (params.deselect) {
610
+ grid.state.rowSelectedIds.set(new Set());
611
+ return;
612
+ }
613
+ const t = flat.get();
614
+ grid.state.rowSelectedIds.set(new Set(t.rowIdToRow.keys()));
615
+ };
616
+ const rowSetBotData = () => {
617
+ throw new Error(
618
+ `Server data source does not support directly setting pinned rows. Instead send a DataResponsePinned object via the pushData method`,
619
+ );
620
+ };
621
+ const rowSetTopData = () => {
622
+ throw new Error(
623
+ `Server data source does not support directly setting pinned rows. Instead send a DataResponsePinned object via the pushData method`,
624
+ );
625
+ };
626
+ // CRUD ops
627
+ const rowAdd = () => {
628
+ throw new Error(
629
+ `Server data source does not support adding rows directly. Instead push updates via the pushResponses or pushRequests method`,
630
+ );
631
+ };
632
+ const rowDelete = () => {
633
+ throw new Error(
634
+ `Server data source does not support deleting rows directly. Instead push updates via the pushResponses or pushRequests method`,
635
+ );
636
+ };
637
+ const rowUpdate = (updates) => {
638
+ const f = flat.get();
639
+ const top = rdsStore.get(topData);
640
+ const bot = rdsStore.get(botData);
641
+ const firstBot = f.size + top.length;
642
+ const idMap = new Map(
643
+ [...updates.entries()]
644
+ .map(([key, data]) => {
645
+ if (typeof key === "string") return [key, data];
646
+ const row = rowByIndex(key);
647
+ if (!row) return null;
648
+ return [row.id, data];
632
649
  })
633
- .filter((n) => n != null));
634
- cellUpdateHandler?.(idMap);
635
- if (!cellUpdateOptimistically)
636
- return;
637
- for (const [key, data] of updates.entries()) {
638
- const rowIndex = typeof key === "number" ? key : rowToIndex(key);
639
- const row = rowByIndex(rowIndex);
640
- if (!row || !grid) {
641
- console.error(`Failed to find the row at index ${rowIndex} which is being updated.`);
642
- continue;
643
- }
644
- if (rowIndex < top.length) {
645
- top[rowIndex].data = data;
646
- }
647
- else if (rowIndex >= firstBot) {
648
- bot[rowIndex].data = data;
649
- }
650
- else {
651
- const node = f.rowIndexToRow.get(rowIndex - top.length);
652
- if (node)
653
- node.data.data = data;
654
- }
655
- grid.state.rowDataStore.rowInvalidateIndex(rowIndex);
656
- }
657
- };
658
- const inFilterItems = (c) => {
659
- if (!dataInFilterItemFetcher || !grid)
660
- return [];
661
- return dataInFilterItemFetcher({ column: c, grid, reqTime: Date.now() });
662
- };
663
- const rowAreAllSelected = () => {
664
- return false;
665
- };
666
- return {
667
- init,
668
- rowAdd,
669
- rowById,
670
- rowAllChildIds,
671
- rowByIndex,
672
- rowDelete,
673
- rowExpand,
674
- rowSelect,
675
- rowSelectAll,
676
- rowSetBotData,
677
- rowSetCenterData: () => {
678
- throw new Error("Server side data source does not support full row updates");
679
- },
680
- rowSetTopData,
681
- rowToIndex,
682
- rowUpdate,
683
- inFilterItems,
684
- rowAreAllSelected,
685
- isLoading,
686
- loadError,
687
- pushResponses: (res) => {
688
- dataResponseHandler(res);
689
- },
690
- pushRequests: (req, onSuccess, onFailure) => {
691
- dataRequestHandler(req, true, onSuccess, onFailure);
692
- },
693
- reset: resetRequest,
694
- retry: () => {
695
- viewChange();
696
- },
697
- };
650
+ .filter((n) => n != null),
651
+ );
652
+ cellUpdateHandler?.(idMap);
653
+ if (!cellUpdateOptimistically) return;
654
+ for (const [key, data] of updates.entries()) {
655
+ const rowIndex = typeof key === "number" ? key : rowToIndex(key);
656
+ const row = rowByIndex(rowIndex);
657
+ if (!row || !grid) {
658
+ console.error(`Failed to find the row at index ${rowIndex} which is being updated.`);
659
+ continue;
660
+ }
661
+ if (rowIndex < top.length) {
662
+ top[rowIndex].data = data;
663
+ } else if (rowIndex >= firstBot) {
664
+ bot[rowIndex].data = data;
665
+ } else {
666
+ const node = f.rowIndexToRow.get(rowIndex - top.length);
667
+ if (node) node.data.data = data;
668
+ }
669
+ grid.state.rowDataStore.rowInvalidateIndex(rowIndex);
670
+ }
671
+ };
672
+ const inFilterItems = (c) => {
673
+ if (!dataInFilterItemFetcher || !grid) return [];
674
+ return dataInFilterItemFetcher({ column: c, grid, reqTime: Date.now() });
675
+ };
676
+ const rowAreAllSelected = () => {
677
+ return false;
678
+ };
679
+ return {
680
+ init,
681
+ rowAdd,
682
+ rowById,
683
+ rowAllChildIds,
684
+ rowByIndex,
685
+ rowDelete,
686
+ rowExpand,
687
+ rowSelect,
688
+ rowSelectAll,
689
+ rowSetBotData,
690
+ rowSetCenterData: () => {
691
+ throw new Error("Server side data source does not support full row updates");
692
+ },
693
+ rowSetTopData,
694
+ rowToIndex,
695
+ rowUpdate,
696
+ inFilterItems,
697
+ rowAreAllSelected,
698
+ isLoading,
699
+ loadError,
700
+ pushResponses: (res) => {
701
+ dataResponseHandler(res);
702
+ },
703
+ pushRequests: (req, onSuccess, onFailure) => {
704
+ dataRequestHandler(req, true, onSuccess, onFailure);
705
+ },
706
+ reset: resetRequest,
707
+ retry: () => {
708
+ viewChange();
709
+ },
710
+ };
698
711
  }
699
712
  export function useServerDataSource(p) {
700
- const ds = useRef(null);
701
- if (!ds.current) {
702
- ds.current = makeServerDataSource(p);
703
- }
704
- return ds.current;
713
+ const ds = useRef(null);
714
+ if (!ds.current) {
715
+ ds.current = makeServerDataSource(p);
716
+ }
717
+ return ds.current;
705
718
  }