@svgrid/grid 3.0.3 → 4.0.0

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 (318) hide show
  1. package/README.md +5 -4
  2. package/dist/GridMenus.svelte +44 -2
  3. package/dist/SvChartMenu.svelte +69 -0
  4. package/dist/SvChartMenu.svelte.d.ts +11 -0
  5. package/dist/SvChartPanes.svelte +113 -0
  6. package/dist/SvChartPanes.svelte.d.ts +20 -0
  7. package/dist/SvGrid.controller.svelte.d.ts +122 -41
  8. package/dist/SvGrid.controller.svelte.js +845 -207
  9. package/dist/SvGrid.css +178 -2
  10. package/dist/SvGrid.svelte +467 -516
  11. package/dist/SvGrid.types.d.ts +315 -12
  12. package/dist/SvGridCellEditor.svelte +17 -0
  13. package/dist/SvGridChart.svelte +2257 -329
  14. package/dist/SvGridChart.svelte.d.ts +6 -106
  15. package/dist/SvGridChart.types.d.ts +338 -0
  16. package/dist/SvGridChart.types.js +1 -0
  17. package/dist/SvGridChartBuilder.svelte +323 -0
  18. package/dist/SvGridChartBuilder.svelte.d.ts +34 -0
  19. package/dist/SvGridChartPanel.svelte +221 -275
  20. package/dist/SvGridChartPickers.svelte +417 -0
  21. package/dist/SvGridChartPickers.svelte.d.ts +70 -0
  22. package/dist/SvGridChartView.svelte +13 -14
  23. package/dist/SvModal.svelte +7 -1
  24. package/dist/SvModal.svelte.d.ts +5 -0
  25. package/dist/ai.d.ts +40 -8
  26. package/dist/ai.js +135 -24
  27. package/dist/aria.d.ts +11 -0
  28. package/dist/build-api.js +119 -28
  29. package/dist/cdn/GridMenus-CLI93jke.js +635 -0
  30. package/dist/cdn/{GridMenus-DhdPF700.js → GridMenus-CwooL3QA.js} +240 -207
  31. package/dist/cdn/SvChartMenu-Bl6PBbkT.js +58 -0
  32. package/dist/cdn/SvChartMenu-FBSMINA6.js +59 -0
  33. package/dist/cdn/{SvDateRangeInput-DMLKmGEc.js → SvDateRangeInput-BeU_TkbQ.js} +15 -14
  34. package/dist/cdn/{SvDateRangeInput-CaOuMs8O.js → SvDateRangeInput-yX8vzleW.js} +38 -37
  35. package/dist/cdn/{SvDateTimePicker-sonaH0oh.js → SvDateTimePicker-DQwt4UAs.js} +139 -180
  36. package/dist/cdn/SvDateTimePicker-vNU6bZ-q.js +775 -0
  37. package/dist/cdn/{SvGridCellEditor-CjEJMJKc.js → SvGridCellEditor-B1p-vCK5.js} +188 -178
  38. package/dist/cdn/{SvGridCellEditor-BWnTi2N7.js → SvGridCellEditor-D_0q4xAu.js} +98 -88
  39. package/dist/cdn/SvGridChart-C3EWAZaM.js +3574 -0
  40. package/dist/cdn/SvGridChart-DzLkSwCH.js +3572 -0
  41. package/dist/cdn/SvGridChartBuilder-BE2T1ykB.js +783 -0
  42. package/dist/cdn/SvGridChartBuilder-CfII62sZ.js +784 -0
  43. package/dist/cdn/SvGridChartPanel-CCX5_Wgd.js +675 -0
  44. package/dist/cdn/SvGridChartPanel-xf4sWVTo.js +699 -0
  45. package/dist/cdn/SvGridChartView-CfuXmY5I.js +48 -0
  46. package/dist/cdn/SvGridChartView-DYwabQWj.js +47 -0
  47. package/dist/cdn/SvMenuList-CLN8OuIK.js +452 -0
  48. package/dist/cdn/SvMenuList-DkGhNKjf.js +451 -0
  49. package/dist/cdn/SvModal-BAE-pjZX.js +396 -0
  50. package/dist/cdn/SvModal-CIZWCcad.js +397 -0
  51. package/dist/cdn/chart-Dz7SqMXH.js +4341 -0
  52. package/dist/cdn/chart-export-BXqueeWJ.js +135 -0
  53. package/dist/cdn/chart-export-pdf-DONFUnNY.js +110 -0
  54. package/dist/cdn/chart-panel-messages-CUbf2R4i.js +1052 -0
  55. package/dist/cdn/chart-panel-messages-CmNrMdsr.js +1053 -0
  56. package/dist/cdn/chart-summary-BJW_tg_X.js +138 -0
  57. package/dist/cdn/chart-trend-CaN9mDEV.js +50 -0
  58. package/dist/cdn/chart-validate-HcOVFAfJ.js +188 -0
  59. package/dist/cdn/{column-resize-DsfNXMom.js → column-resize-DpmOLfRp.js} +3 -3
  60. package/dist/cdn/{date-format-BnnHlqGw.js → date-format-CtquV-p3.js} +583 -603
  61. package/dist/cdn/{date-format-BNii4zeD.js → date-format-D6KFzU_W.js} +347 -367
  62. package/dist/cdn/dismissable-DAHetSNk.js +44 -0
  63. package/dist/cdn/editor-contract-LXgQJAgd.js +22 -0
  64. package/dist/cdn/focus-trap-BBOQYBma.js +65 -0
  65. package/dist/cdn/{row-resize-BRcimkUT.js → row-resize-niQCp040.js} +44 -36
  66. package/dist/cdn/server-block-cache-CGoWz-87.js +237 -0
  67. package/dist/cdn/{src-D6XvA1Ij.js → src-B6HXdfHY.js} +10448 -10049
  68. package/dist/cdn/{src-Bugf5XlI.js → src-C6Iowdvs.js} +6908 -6509
  69. package/dist/cdn/svgrid.js +27 -15
  70. package/dist/cdn/svgrid.svelte-external.js +27 -15
  71. package/dist/cdn/validate-CchXzyrX.js +76 -0
  72. package/dist/chart-axes.d.ts +53 -0
  73. package/dist/chart-axes.js +351 -0
  74. package/dist/chart-cartesian.d.ts +88 -0
  75. package/dist/chart-cartesian.js +1862 -0
  76. package/dist/chart-decimate.d.ts +51 -0
  77. package/dist/chart-decimate.js +199 -0
  78. package/dist/chart-export-pdf.d.ts +47 -0
  79. package/dist/chart-export-pdf.js +187 -0
  80. package/dist/chart-export.d.ts +2 -1
  81. package/dist/chart-export.js +18 -3
  82. package/dist/chart-financial.d.ts +91 -0
  83. package/dist/chart-financial.js +175 -0
  84. package/dist/chart-flow.d.ts +10 -0
  85. package/dist/chart-flow.js +298 -0
  86. package/dist/chart-format.d.ts +18 -0
  87. package/dist/chart-format.js +65 -0
  88. package/dist/chart-grid.d.ts +8 -0
  89. package/dist/chart-grid.js +190 -0
  90. package/dist/chart-hierarchy.d.ts +17 -0
  91. package/dist/chart-hierarchy.js +146 -0
  92. package/dist/chart-indicators.d.ts +115 -0
  93. package/dist/chart-indicators.js +389 -0
  94. package/dist/chart-messages.d.ts +95 -0
  95. package/dist/chart-messages.js +92 -0
  96. package/dist/chart-motion.d.ts +16 -0
  97. package/dist/chart-motion.js +141 -0
  98. package/dist/chart-panel-messages.d.ts +265 -0
  99. package/dist/chart-panel-messages.js +285 -0
  100. package/dist/chart-pivot.d.ts +87 -0
  101. package/dist/chart-pivot.js +156 -0
  102. package/dist/chart-polar.d.ts +25 -0
  103. package/dist/chart-polar.js +700 -0
  104. package/dist/chart-samples.d.ts +16 -0
  105. package/dist/chart-samples.js +153 -0
  106. package/dist/chart-scale.d.ts +113 -0
  107. package/dist/chart-scale.js +405 -0
  108. package/dist/chart-stats.d.ts +111 -0
  109. package/dist/chart-stats.js +419 -0
  110. package/dist/chart-stream.d.ts +45 -0
  111. package/dist/chart-stream.js +91 -0
  112. package/dist/chart-summary.d.ts +27 -0
  113. package/dist/chart-summary.js +205 -0
  114. package/dist/chart-sync.svelte.d.ts +32 -0
  115. package/dist/chart-sync.svelte.js +23 -0
  116. package/dist/chart-table.d.ts +35 -0
  117. package/dist/chart-table.js +165 -0
  118. package/dist/chart-trend.d.ts +19 -0
  119. package/dist/chart-trend.js +61 -0
  120. package/dist/chart-types.d.ts +1456 -0
  121. package/dist/chart-types.js +6 -0
  122. package/dist/chart-validate.d.ts +43 -0
  123. package/dist/chart-validate.js +272 -0
  124. package/dist/chart-zoom.d.ts +40 -0
  125. package/dist/chart-zoom.js +145 -0
  126. package/dist/chart.d.ts +186 -865
  127. package/dist/chart.js +460 -2204
  128. package/dist/clipboard.d.ts +1 -0
  129. package/dist/clipboard.js +137 -18
  130. package/dist/column-resize.d.ts +3 -0
  131. package/dist/column-resize.js +4 -1
  132. package/dist/columns.js +3 -0
  133. package/dist/command-context.d.ts +19 -0
  134. package/dist/command-context.js +116 -0
  135. package/dist/core.d.ts +7 -0
  136. package/dist/core.js +36 -13
  137. package/dist/createPopoverSelect.svelte.d.ts +2 -2
  138. package/dist/editing.d.ts +2 -8
  139. package/dist/editing.js +272 -33
  140. package/dist/fill-patterns.d.ts +0 -5
  141. package/dist/fill-patterns.js +56 -2
  142. package/dist/grid-icons.d.ts +2 -2
  143. package/dist/grid-icons.js +2 -2
  144. package/dist/grid-messages.d.ts +12 -3
  145. package/dist/grid-messages.js +7 -0
  146. package/dist/history.d.ts +83 -0
  147. package/dist/history.js +133 -0
  148. package/dist/index.d.ts +27 -10
  149. package/dist/index.js +22 -5
  150. package/dist/keyboard-handlers.js +88 -31
  151. package/dist/keyboard.d.ts +55 -0
  152. package/dist/keyboard.js +132 -0
  153. package/dist/menus.d.ts +3 -1
  154. package/dist/menus.js +7 -2
  155. package/dist/merges.d.ts +97 -0
  156. package/dist/merges.js +147 -0
  157. package/dist/row-model.d.ts +133 -0
  158. package/dist/row-model.js +16 -0
  159. package/dist/row-resize.d.ts +3 -0
  160. package/dist/row-resize.js +14 -0
  161. package/dist/scroll-sync.d.ts +1 -0
  162. package/dist/scroll-sync.js +24 -0
  163. package/dist/selection.d.ts +18 -1
  164. package/dist/selection.js +138 -18
  165. package/dist/server-block-cache.d.ts +214 -0
  166. package/dist/server-block-cache.js +531 -0
  167. package/dist/server-data-source.d.ts +240 -6
  168. package/dist/server-data-source.js +220 -20
  169. package/dist/server.d.ts +13 -0
  170. package/dist/server.js +13 -0
  171. package/dist/shortcut-registry.d.ts +145 -0
  172. package/dist/shortcut-registry.js +44 -0
  173. package/dist/svgrid-wrapper.types.d.ts +213 -22
  174. package/dist/validate.d.ts +2 -0
  175. package/dist/validate.js +8 -3
  176. package/dist/virtualization/virtualizer.js +38 -17
  177. package/package.json +11 -1
  178. package/src/GridMenus.svelte +44 -2
  179. package/src/SvChartMenu.svelte +69 -0
  180. package/src/SvChartPanes.svelte +113 -0
  181. package/src/SvChartPanes.test.ts +66 -0
  182. package/src/SvGrid.controller.svelte.ts +818 -179
  183. package/src/SvGrid.css +178 -2
  184. package/src/SvGrid.svelte +467 -516
  185. package/src/SvGrid.types.ts +293 -11
  186. package/src/SvGridCellEditor.svelte +17 -0
  187. package/src/SvGridChart.svelte +2257 -329
  188. package/src/SvGridChart.test.ts +1419 -1
  189. package/src/SvGridChart.types.ts +336 -0
  190. package/src/SvGridChartBuilder.svelte +323 -0
  191. package/src/SvGridChartPanel.svelte +221 -275
  192. package/src/SvGridChartPickers.svelte +417 -0
  193. package/src/SvGridChartView.svelte +13 -14
  194. package/src/SvModal.svelte +7 -1
  195. package/src/SvModal.test.ts +9 -0
  196. package/src/ai.test.ts +57 -2
  197. package/src/ai.ts +166 -22
  198. package/src/aria.d.ts +11 -0
  199. package/src/build-api.coverage.test.ts +184 -0
  200. package/src/build-api.ts +118 -22
  201. package/src/chart-axes.test.ts +573 -0
  202. package/src/chart-axes.ts +342 -0
  203. package/src/chart-cartesian.ts +1863 -0
  204. package/src/chart-decimate.test.ts +249 -0
  205. package/src/chart-decimate.ts +186 -0
  206. package/src/chart-export-pdf.test.ts +91 -0
  207. package/src/chart-export-pdf.ts +207 -0
  208. package/src/chart-export.test.ts +14 -0
  209. package/src/chart-export.ts +13 -3
  210. package/src/chart-financial.ts +208 -0
  211. package/src/chart-flow.ts +286 -0
  212. package/src/chart-format.ts +67 -0
  213. package/src/chart-grid.ts +179 -0
  214. package/src/chart-hierarchy.ts +135 -0
  215. package/src/chart-indicators.test.ts +443 -0
  216. package/src/chart-indicators.ts +384 -0
  217. package/src/chart-messages.test.ts +21 -0
  218. package/src/chart-messages.ts +184 -0
  219. package/src/chart-motion.test.ts +71 -0
  220. package/src/chart-motion.ts +148 -0
  221. package/src/chart-panel-messages.test.ts +29 -0
  222. package/src/chart-panel-messages.ts +550 -0
  223. package/src/chart-pivot.test.ts +54 -0
  224. package/src/chart-pivot.ts +225 -0
  225. package/src/chart-polar.ts +674 -0
  226. package/src/chart-samples.ts +106 -0
  227. package/src/chart-scale.ts +394 -0
  228. package/src/chart-series-types.test.ts +714 -0
  229. package/src/chart-stats.ts +409 -0
  230. package/src/chart-stream.test.ts +75 -0
  231. package/src/chart-stream.ts +114 -0
  232. package/src/chart-summary.test.ts +90 -0
  233. package/src/chart-summary.ts +197 -0
  234. package/src/chart-sync.svelte.ts +41 -0
  235. package/src/chart-table.test.ts +76 -0
  236. package/src/chart-table.ts +178 -0
  237. package/src/chart-trend.ts +47 -0
  238. package/src/chart-types.ts +1309 -0
  239. package/src/chart-validate.test.ts +100 -0
  240. package/src/chart-validate.ts +247 -0
  241. package/src/chart-zoom.test.ts +137 -0
  242. package/src/chart-zoom.ts +124 -0
  243. package/src/chart.coverage.test.ts +81 -0
  244. package/src/chart.test.ts +56 -3
  245. package/src/chart.ts +557 -2784
  246. package/src/clipboard.test.ts +151 -0
  247. package/src/clipboard.ts +145 -16
  248. package/src/column-resize.ts +7 -1
  249. package/src/columns.ts +2 -0
  250. package/src/command-context.test.ts +200 -0
  251. package/src/command-context.ts +137 -0
  252. package/src/core.rowmodel-cache.test.ts +51 -0
  253. package/src/core.ts +40 -12
  254. package/src/editing.test.ts +281 -3
  255. package/src/editing.ts +264 -38
  256. package/src/fill-patterns.test.ts +35 -0
  257. package/src/fill-patterns.ts +56 -2
  258. package/src/grid-icons.ts +2 -2
  259. package/src/grid-messages.ts +21 -3
  260. package/src/history.test.ts +196 -0
  261. package/src/history.ts +162 -0
  262. package/src/icon-seam.test.ts +5 -6
  263. package/src/index.ts +169 -12
  264. package/src/keyboard-handlers.coverage.test.ts +126 -6
  265. package/src/keyboard-handlers.ts +91 -30
  266. package/src/keyboard-shortcuts.seam.test.ts +200 -0
  267. package/src/keyboard.test.ts +124 -1
  268. package/src/keyboard.ts +142 -0
  269. package/src/menus.test.ts +26 -0
  270. package/src/menus.ts +10 -3
  271. package/src/merges.test.ts +112 -0
  272. package/src/merges.ts +168 -0
  273. package/src/pivot.grid.test.ts +40 -5
  274. package/src/row-model.ts +146 -0
  275. package/src/row-resize.test.ts +44 -0
  276. package/src/row-resize.ts +17 -0
  277. package/src/scroll-sync.test.ts +42 -1
  278. package/src/scroll-sync.ts +25 -0
  279. package/src/selection.multi-range.test.ts +34 -0
  280. package/src/selection.test.ts +33 -2
  281. package/src/selection.ts +143 -21
  282. package/src/server-block-cache.test.ts +645 -0
  283. package/src/server-block-cache.ts +677 -0
  284. package/src/server-data-source.infinite.test.ts +343 -0
  285. package/src/server-data-source.ts +450 -27
  286. package/src/server.ts +47 -0
  287. package/src/shortcut-registry.test.ts +97 -0
  288. package/src/shortcut-registry.ts +181 -0
  289. package/src/svgrid-wrapper.types.ts +184 -13
  290. package/src/svgrid.behavior.test.ts +135 -0
  291. package/src/svgrid.charting.test.ts +513 -3
  292. package/src/svgrid.context-menu.test.ts +31 -0
  293. package/src/svgrid.new-features.wrapper.test.ts +10 -3
  294. package/src/svgrid.row-model-prop.svelte.test.ts +352 -0
  295. package/src/svgrid.row-model-seam.svelte.test.ts +289 -0
  296. package/src/validate.test.ts +10 -0
  297. package/src/validate.ts +10 -3
  298. package/src/virtualization/virtualizer.ts +39 -17
  299. package/dist/SvGroupCell.svelte +0 -141
  300. package/dist/SvGroupCell.svelte.d.ts +0 -49
  301. package/dist/SvRowGroupPanel.svelte +0 -186
  302. package/dist/SvRowGroupPanel.svelte.d.ts +0 -25
  303. package/dist/cdn/GridMenus-CHOMnW-c.js +0 -602
  304. package/dist/cdn/SvDateTimePicker-CCbDZNZB.js +0 -816
  305. package/dist/cdn/SvGridChart-1PMSp2LZ.js +0 -1481
  306. package/dist/cdn/SvGridChart-D02avhyr.js +0 -1480
  307. package/dist/cdn/SvGridChartPanel-DJnViOv4.js +0 -834
  308. package/dist/cdn/SvGridChartPanel-vPTNerFZ.js +0 -810
  309. package/dist/cdn/SvGridChartView-C--HhdUo.js +0 -56
  310. package/dist/cdn/SvGridChartView-KyyFG-wY.js +0 -55
  311. package/dist/cdn/chart-DLg3_zTQ.js +0 -1652
  312. package/dist/cdn/validate-_CDJzgIo.js +0 -75
  313. package/dist/server-group-model.d.ts +0 -98
  314. package/dist/server-group-model.js +0 -263
  315. package/src/SvGroupCell.svelte +0 -141
  316. package/src/SvRowGroupPanel.svelte +0 -186
  317. package/src/server-group-model.test.ts +0 -294
  318. package/src/server-group-model.ts +0 -370
package/src/build-api.ts CHANGED
@@ -26,6 +26,44 @@ import {
26
26
  columnDefMatchesId,
27
27
  } from "./cell-values";
28
28
  import { hasAdvancedFilterEngine } from "./advanced-filter.svelte";
29
+ import { undoHistory, redoHistory } from "./history";
30
+ import { buildCommandContext } from "./command-context";
31
+
32
+ type OrientedRange = {
33
+ from: { row: number; col: number }
34
+ to: { row: number; col: number }
35
+ highlight: { row: number; col: number }
36
+ }
37
+
38
+ /**
39
+ * The selection as the user made it: committed ranges first, the active one
40
+ * last, each keeping its anchor as `from` and its focus as `to`. The active
41
+ * cell is the highlight of the range it sits in and of no other, which is
42
+ * how Handsontable reports it and what a range-aware paste needs to know.
43
+ */
44
+ function selectedRanges(ctx: any): OrientedRange[] {
45
+ type Point = { rowIndex: number; colIndex: number } | null
46
+ type Range = { anchor: Point; focus: Point }
47
+ const committed: Range[] = ctx.selectionRanges ?? []
48
+ const active: Range = ctx.selectionRange ?? { anchor: null, focus: null }
49
+ const cursor = ctx.grid.getState().activeCell as Point
50
+ const toRange = (r: Range): OrientedRange | null => {
51
+ if (!r.anchor || !r.focus) return null
52
+ const from = { row: r.anchor.rowIndex, col: r.anchor.colIndex }
53
+ const to = { row: r.focus.rowIndex, col: r.focus.colIndex }
54
+ const inside =
55
+ cursor &&
56
+ cursor.rowIndex >= Math.min(from.row, to.row) && cursor.rowIndex <= Math.max(from.row, to.row) &&
57
+ cursor.colIndex >= Math.min(from.col, to.col) && cursor.colIndex <= Math.max(from.col, to.col)
58
+ const highlight = inside ? { row: cursor!.rowIndex, col: cursor!.colIndex } : from
59
+ return { from, to, highlight }
60
+ }
61
+ const out: OrientedRange[] = []
62
+ for (const r of committed) { const o = toRange(r); if (o) out.push(o) }
63
+ const last = toRange(active)
64
+ if (last) out.push(last)
65
+ return out
66
+ }
29
67
 
30
68
  export function createGridApi<
31
69
  TFeatures extends TableFeatures = TableFeatures,
@@ -129,12 +167,28 @@ export function createGridApi<
129
167
  ctx.setActiveCell(active.anchor.rowIndex, active.anchor.colIndex);
130
168
  },
131
169
  getSelected() {
170
+ // Rectangles only. With cell selection off none is ever recorded and
171
+ // this stays [], which is how `selectable={false}` is observable from
172
+ // the API; the focused cell is `getActiveCell()`, not a selection.
132
173
  return ctx
133
174
  .getSelectionRects()
134
175
  .map((r: { minRow: number; minCol: number; maxRow: number; maxCol: number }) =>
135
176
  [r.minRow, r.minCol, r.maxRow, r.maxCol] as [number, number, number, number],
136
177
  );
137
178
  },
179
+ getSelectedLast() {
180
+ const all = selectedRanges(ctx);
181
+ const last = all[all.length - 1];
182
+ return last ? [last.from.row, last.from.col, last.to.row, last.to.col] : undefined;
183
+ },
184
+ getSelectedRange() {
185
+ const all = selectedRanges(ctx);
186
+ return all.length ? all : undefined;
187
+ },
188
+ getSelectedRangeLast() {
189
+ const all = selectedRanges(ctx);
190
+ return all[all.length - 1];
191
+ },
138
192
  openChart() {
139
193
  ctx.chartPanelOpen = true;
140
194
  },
@@ -151,6 +205,21 @@ export function createGridApi<
151
205
  configureChart(config) {
152
206
  if (ctx.chartingEnabled) ctx.applyChartConfig(config);
153
207
  },
208
+ saveChart(name) {
209
+ if (ctx.chartingEnabled) ctx.saveChart(name);
210
+ },
211
+ applySavedChart(name) {
212
+ return ctx.chartingEnabled ? ctx.applySavedChart(name) : false;
213
+ },
214
+ removeSavedChart(name) {
215
+ if (ctx.chartingEnabled) ctx.removeSavedChart(name);
216
+ },
217
+ getSavedCharts() {
218
+ return ctx.chartingEnabled ? ctx.getSavedCharts() : [];
219
+ },
220
+ setChartExplainHandler(handler) {
221
+ ctx.chartExplainHandler = handler ?? null;
222
+ },
154
223
  setChartAiHandler(handler) {
155
224
  ctx.chartAiHandler = handler ?? null;
156
225
  },
@@ -351,6 +420,11 @@ export function createGridApi<
351
420
  clearFilter(columnId) {
352
421
  ctx.clearColumnFilter(columnId);
353
422
  },
423
+ openContextMenu(event, rowIndex, colIndex) {
424
+ const columnId = ctx.allColumns[colIndex]?.id;
425
+ if (columnId == null) return;
426
+ ctx.openContextMenu(event, rowIndex, colIndex, columnId);
427
+ },
354
428
  refreshEditorOptions(columnId) {
355
429
  // Async `editorOptions` are cached per column (or per column+row for a
356
430
  // per-row source) so opening an editor twice does not refetch. This
@@ -556,6 +630,30 @@ export function createGridApi<
556
630
  autosizeColumn(columnId: string) {
557
631
  ctx.autosizeColumn(columnId);
558
632
  },
633
+ getRowHeight(rowIndex: number) {
634
+ const own = ctx.rowResizeHeightPx(rowIndex);
635
+ if (own != null) return own;
636
+ const declared = ctx.props.rowHeight;
637
+ return typeof declared === "function" ? declared(rowIndex) : (declared ?? 30);
638
+ },
639
+ setRowHeight(rowIndex: number, height: number | null) {
640
+ ctx.setRowResizeHeight(rowIndex, height);
641
+ },
642
+ setColumnCollapsed(columnId: string, collapsed: boolean) {
643
+ ctx.setColumnCollapsed(columnId, collapsed);
644
+ },
645
+ isColumnCollapsed(columnId: string) {
646
+ return !!ctx.collapsedColumns[columnId];
647
+ },
648
+ setRowCollapsed(rowIndex: number, collapsed: boolean) {
649
+ ctx.setRowCollapsed(rowIndex, collapsed);
650
+ },
651
+ getMergedCells() {
652
+ return (ctx.props.mergedCells ?? []).map((m: { rowIndex: number; colIndex: number; rowSpan: number; colSpan: number }) => ({ ...m }));
653
+ },
654
+ isRowCollapsed(rowIndex: number) {
655
+ return ctx.isRowCollapsed(rowIndex);
656
+ },
559
657
  autosizeAllColumns() {
560
658
  ctx.autosizeAllColumns();
561
659
  },
@@ -598,24 +696,12 @@ export function createGridApi<
598
696
  ctx.grid.setExpanded(() => ({}));
599
697
  },
600
698
  // ---- Undo / redo (history + pointer)
601
- undo() {
602
- if (ctx.historyPtr < 0) return false
603
- const step = ctx.history[ctx.historyPtr]
604
- if (!step) return false
605
- ctx.applyHistoryStep(step, 'undo')
606
- ctx.historyPtr -= 1
607
- ctx.historyVersion += 1
608
- return true
609
- },
610
- redo() {
611
- if (ctx.historyPtr >= ctx.history.length - 1) return false
612
- const step = ctx.history[ctx.historyPtr + 1]
613
- if (!step) return false
614
- ctx.applyHistoryStep(step, 'redo')
615
- ctx.historyPtr += 1
616
- ctx.historyVersion += 1
617
- return true
618
- },
699
+ undo() { return undoHistory(ctx) },
700
+ redo() { return redoHistory(ctx) },
701
+ // Built fresh per call rather than memoized: it is a handful of getters
702
+ // over `ctx`, and a caller that holds one keeps reading live state
703
+ // anyway, so caching would only add a slot to keep in sync.
704
+ getCommandContext() { return buildCommandContext(ctx, false) },
619
705
  canUndo() { void ctx.historyVersion; return ctx.historyPtr >= 0 },
620
706
  canRedo() { void ctx.historyVersion; return ctx.historyPtr < ctx.history.length - 1 },
621
707
  clearHistory() { ctx.history = []; ctx.historyPtr = -1; ctx.historyVersion += 1 },
@@ -649,9 +735,10 @@ export function createGridApi<
649
735
  });
650
736
  },
651
737
  selectAllRows() {
652
- const next: Record<string, boolean> = {};
653
- for (const row of ctx.allRows) if (!isGroupRow(row)) next[row.id] = true;
654
- ctx.grid.setRowSelection(() => next);
738
+ // One implementation of "select everything", shared with the header
739
+ // checkbox, so it knows about an external selection model and about
740
+ // rows whose data has not arrived.
741
+ ctx.setSelectAllRows(true);
655
742
  },
656
743
  toggleRowSelected(id) {
657
744
  ctx.toggleRowSelectionById(id);
@@ -659,7 +746,13 @@ export function createGridApi<
659
746
  // ---- Pagination
660
747
  getPageInfo() {
661
748
  const { pageIndex, pageSize } = ctx.paginationState;
662
- const total = ctx.allRowsBeforePagination.length;
749
+ // Under external pagination the grid holds ONE page, so counting the
750
+ // rows in hand would report a 95-row table as a 20-row one. The
751
+ // consumer tells us the real total through rowCount, which is what
752
+ // the footer has always shown.
753
+ const total = ctx.externalPaginationEnabled
754
+ ? (ctx.props.rowCount ?? ctx.allRowsBeforePagination.length)
755
+ : ctx.allRowsBeforePagination.length;
663
756
  const pageCount = Math.max(1, Math.ceil(total / Math.max(1, pageSize)));
664
757
  return { pageIndex, pageSize, pageCount, total };
665
758
  },
@@ -769,6 +862,8 @@ export function createGridApi<
769
862
  },
770
863
  charts: ctx.getChartsState(),
771
864
  chartActive: ctx.activeChartIndex,
865
+ // Only when there is one, for the same snapshot-churn reason.
866
+ ...(ctx.savedCharts.length ? { savedCharts: ctx.getSavedCharts() } : {}),
772
867
  }
773
868
  : {}),
774
869
  };
@@ -818,6 +913,7 @@ export function createGridApi<
818
913
  if ("advancedFilter" in state) {
819
914
  ctx.advancedFilter = state.advancedFilter ?? null;
820
915
  }
916
+ if (Array.isArray(state.savedCharts) && ctx.chartingEnabled) ctx.applySavedCharts(state.savedCharts);
821
917
  if ((state.chart || state.charts) && ctx.chartingEnabled) {
822
918
  if (Array.isArray(state.charts) && state.charts.length) {
823
919
  ctx.applyChartsState(state.charts, state.chartActive);