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

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