@rowsncolumns/spreadsheet 10.3.0 → 10.4.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 (484) hide show
  1. package/dist/cjs/api/banded-ranges.d.ts.map +1 -1
  2. package/dist/cjs/api/banded-ranges.js +40 -14
  3. package/dist/cjs/api/calculated-column-fill.d.ts +43 -0
  4. package/dist/cjs/api/calculated-column-fill.d.ts.map +1 -0
  5. package/dist/cjs/api/calculated-column-fill.js +16 -0
  6. package/dist/cjs/api/chart-sheet.d.ts +8 -0
  7. package/dist/cjs/api/chart-sheet.d.ts.map +1 -0
  8. package/dist/cjs/api/chart-sheet.js +20 -0
  9. package/dist/cjs/api/chart-source-ranges.d.ts +64 -0
  10. package/dist/cjs/api/chart-source-ranges.d.ts.map +1 -0
  11. package/dist/cjs/api/chart-source-ranges.js +175 -0
  12. package/dist/cjs/api/selections.d.ts +3 -3
  13. package/dist/cjs/api/selections.d.ts.map +1 -1
  14. package/dist/cjs/api/selections.js +28 -2
  15. package/dist/cjs/api/spreadsheet-api.d.ts +16 -3
  16. package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
  17. package/dist/cjs/api/spreadsheet-api.js +22 -2
  18. package/dist/cjs/api/table-auto-expansion.d.ts +37 -0
  19. package/dist/cjs/api/table-auto-expansion.d.ts.map +1 -0
  20. package/dist/cjs/api/table-auto-expansion.js +16 -0
  21. package/dist/cjs/api/table.d.ts +49 -1
  22. package/dist/cjs/api/table.d.ts.map +1 -1
  23. package/dist/cjs/api/table.js +145 -1
  24. package/dist/cjs/api/validation.d.ts +26 -1
  25. package/dist/cjs/api/validation.d.ts.map +1 -1
  26. package/dist/cjs/api/validation.js +127 -9
  27. package/dist/cjs/atoms/calculated-column-fill.atom.d.ts +15 -0
  28. package/dist/cjs/atoms/calculated-column-fill.atom.d.ts.map +1 -0
  29. package/dist/cjs/atoms/calculated-column-fill.atom.js +18 -0
  30. package/dist/cjs/atoms/chart-actions.atom.d.ts +40 -0
  31. package/dist/cjs/atoms/chart-actions.atom.d.ts.map +1 -0
  32. package/dist/cjs/atoms/chart-actions.atom.js +66 -0
  33. package/dist/cjs/atoms/index.d.ts +5 -0
  34. package/dist/cjs/atoms/index.d.ts.map +1 -1
  35. package/dist/cjs/atoms/index.js +5 -0
  36. package/dist/cjs/atoms/move-chart-dialog.atom.d.ts +28 -0
  37. package/dist/cjs/atoms/move-chart-dialog.atom.d.ts.map +1 -0
  38. package/dist/cjs/atoms/move-chart-dialog.atom.js +34 -0
  39. package/dist/cjs/atoms/selected-chart-embed.atom.d.ts +9 -1
  40. package/dist/cjs/atoms/selected-chart-embed.atom.d.ts.map +1 -1
  41. package/dist/cjs/atoms/selected-chart-embed.atom.js +18 -1
  42. package/dist/cjs/atoms/selected-chart-series.atom.d.ts +24 -0
  43. package/dist/cjs/atoms/selected-chart-series.atom.d.ts.map +1 -0
  44. package/dist/cjs/atoms/selected-chart-series.atom.js +11 -0
  45. package/dist/cjs/atoms/sheet-context.atom.d.ts +2 -0
  46. package/dist/cjs/atoms/sheet-context.atom.d.ts.map +1 -1
  47. package/dist/cjs/atoms/sheet-context.atom.js +5 -2
  48. package/dist/cjs/atoms/sparkline-dialog.atom.d.ts +34 -0
  49. package/dist/cjs/atoms/sparkline-dialog.atom.d.ts.map +1 -0
  50. package/dist/cjs/atoms/sparkline-dialog.atom.js +30 -0
  51. package/dist/cjs/atoms/table-auto-expansion.atom.d.ts +14 -0
  52. package/dist/cjs/atoms/table-auto-expansion.atom.d.ts.map +1 -0
  53. package/dist/cjs/atoms/table-auto-expansion.atom.js +17 -0
  54. package/dist/cjs/components/calculated-column-smart-tag/index.d.ts +25 -0
  55. package/dist/cjs/components/calculated-column-smart-tag/index.d.ts.map +1 -0
  56. package/dist/cjs/components/calculated-column-smart-tag/index.js +31 -0
  57. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  58. package/dist/cjs/components/canvas-grid/index.js +407 -77
  59. package/dist/cjs/components/canvas-grid/typings.d.ts +127 -14
  60. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  61. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  62. package/dist/cjs/components/cell/index.js +3 -3
  63. package/dist/cjs/components/cell/typings.d.ts +13 -0
  64. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  65. package/dist/cjs/components/cell-filter/index.d.ts.map +1 -1
  66. package/dist/cjs/components/cell-filter/index.js +13 -2
  67. package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  68. package/dist/cjs/components/cell-input/formula-bar-cell-input.js +4 -1
  69. package/dist/cjs/components/cell-structured/sparkline-math.d.ts +28 -5
  70. package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
  71. package/dist/cjs/components/cell-structured/sparkline-math.js +93 -5
  72. package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
  73. package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
  74. package/dist/cjs/components/cell-structured/sparkline.js +3 -3
  75. package/dist/cjs/components/cell-structured/types.d.ts +1 -1
  76. package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
  77. package/dist/cjs/components/chart-sheet-view/index.d.ts +27 -0
  78. package/dist/cjs/components/chart-sheet-view/index.d.ts.map +1 -0
  79. package/dist/cjs/components/chart-sheet-view/index.js +35 -0
  80. package/dist/cjs/components/context-menu/embed-context-menu.d.ts +48 -0
  81. package/dist/cjs/components/context-menu/embed-context-menu.d.ts.map +1 -0
  82. package/dist/cjs/components/context-menu/embed-context-menu.js +123 -0
  83. package/dist/cjs/components/context-menu/index.d.ts +23 -2
  84. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  85. package/dist/cjs/components/context-menu/index.js +217 -39
  86. package/dist/cjs/components/context-menu/total-row-function-menu.d.ts +33 -0
  87. package/dist/cjs/components/context-menu/total-row-function-menu.d.ts.map +1 -0
  88. package/dist/cjs/components/context-menu/total-row-function-menu.js +58 -0
  89. package/dist/cjs/components/context-menu/total-row-functions.d.ts +12 -12
  90. package/dist/cjs/components/context-menu/total-row-functions.d.ts.map +1 -1
  91. package/dist/cjs/components/context-menu/total-row-functions.js +39 -39
  92. package/dist/cjs/components/embeds/chart-component.d.ts +17 -0
  93. package/dist/cjs/components/embeds/chart-component.d.ts.map +1 -1
  94. package/dist/cjs/components/embeds/embed-draggable.d.ts +61 -4
  95. package/dist/cjs/components/embeds/embed-draggable.d.ts.map +1 -1
  96. package/dist/cjs/components/embeds/embed-draggable.js +218 -42
  97. package/dist/cjs/components/filter-box/date-tree.d.ts +28 -0
  98. package/dist/cjs/components/filter-box/date-tree.d.ts.map +1 -0
  99. package/dist/cjs/components/filter-box/date-tree.js +147 -0
  100. package/dist/cjs/components/filter-box/filter-by-condition.d.ts +14 -2
  101. package/dist/cjs/components/filter-box/filter-by-condition.d.ts.map +1 -1
  102. package/dist/cjs/components/filter-box/filter-by-condition.js +95 -19
  103. package/dist/cjs/components/filter-box/filter-by-value.d.ts.map +1 -1
  104. package/dist/cjs/components/filter-box/filter-by-value.js +126 -40
  105. package/dist/cjs/components/filter-box/index.d.ts +7 -1
  106. package/dist/cjs/components/filter-box/index.d.ts.map +1 -1
  107. package/dist/cjs/components/filter-box/index.js +102 -11
  108. package/dist/cjs/components/move-chart-dialog/index.d.ts +34 -0
  109. package/dist/cjs/components/move-chart-dialog/index.d.ts.map +1 -0
  110. package/dist/cjs/components/move-chart-dialog/index.js +96 -0
  111. package/dist/cjs/components/print-preview/page-block.d.ts +9 -1
  112. package/dist/cjs/components/print-preview/page-block.d.ts.map +1 -1
  113. package/dist/cjs/components/print-preview/page-block.js +28 -2
  114. package/dist/cjs/components/print-preview/print-preview-dialog.d.ts +8 -1
  115. package/dist/cjs/components/print-preview/print-preview-dialog.d.ts.map +1 -1
  116. package/dist/cjs/components/print-preview/print-preview-dialog.js +144 -3
  117. package/dist/cjs/components/print-preview/run-print.d.ts.map +1 -1
  118. package/dist/cjs/components/print-preview/run-print.js +19 -7
  119. package/dist/cjs/components/print-preview/use-page-layout.d.ts +47 -0
  120. package/dist/cjs/components/print-preview/use-page-layout.d.ts.map +1 -1
  121. package/dist/cjs/components/print-preview/use-page-layout.js +81 -7
  122. package/dist/cjs/components/resizer/index.d.ts.map +1 -1
  123. package/dist/cjs/components/resizer/index.js +10 -5
  124. package/dist/cjs/components/selection/index.d.ts +1 -1
  125. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  126. package/dist/cjs/components/selection/index.js +6 -2
  127. package/dist/cjs/components/selection/types.d.ts +15 -0
  128. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  129. package/dist/cjs/components/sheet-search/index.d.ts.map +1 -1
  130. package/dist/cjs/components/sheet-search/index.js +6 -2
  131. package/dist/cjs/components/sheet-tabs/index.d.ts.map +1 -1
  132. package/dist/cjs/components/sheet-tabs/index.js +2 -2
  133. package/dist/cjs/components/sheet-tabs/sheet-tab.d.ts +1 -1
  134. package/dist/cjs/components/sheet-tabs/sheet-tab.d.ts.map +1 -1
  135. package/dist/cjs/components/sheet-tabs/sheet-tab.js +3 -1
  136. package/dist/cjs/components/sparkline-dialog/index.d.ts +43 -0
  137. package/dist/cjs/components/sparkline-dialog/index.d.ts.map +1 -0
  138. package/dist/cjs/components/sparkline-dialog/index.js +127 -0
  139. package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -1
  140. package/dist/cjs/components/subtotal-dialog/index.js +10 -1
  141. package/dist/cjs/components/table-auto-expansion-smart-tag/index.d.ts +24 -0
  142. package/dist/cjs/components/table-auto-expansion-smart-tag/index.d.ts.map +1 -0
  143. package/dist/cjs/components/table-auto-expansion-smart-tag/index.js +31 -0
  144. package/dist/cjs/components/toolbar/index.d.ts +1 -0
  145. package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
  146. package/dist/cjs/components/toolbar/index.js +1 -0
  147. package/dist/cjs/components/toolbar/insert-menu.d.ts +2 -1
  148. package/dist/cjs/components/toolbar/insert-menu.d.ts.map +1 -1
  149. package/dist/cjs/components/toolbar/insert-menu.js +24 -1
  150. package/dist/cjs/components/toolbar/merge-cells-selector.d.ts +4 -1
  151. package/dist/cjs/components/toolbar/merge-cells-selector.d.ts.map +1 -1
  152. package/dist/cjs/components/toolbar/merge-cells-selector.js +11 -5
  153. package/dist/cjs/components/toolbar/sparkline-actions.d.ts +31 -0
  154. package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -0
  155. package/dist/cjs/components/toolbar/sparkline-actions.js +273 -0
  156. package/dist/cjs/components/toolbar/table-actions.d.ts +9 -1
  157. package/dist/cjs/components/toolbar/table-actions.d.ts.map +1 -1
  158. package/dist/cjs/components/toolbar/table-actions.js +17 -7
  159. package/dist/cjs/components/toolbar/table-style-selector.d.ts +38 -2
  160. package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
  161. package/dist/cjs/components/toolbar/table-style-selector.js +241 -389
  162. package/dist/cjs/config.d.ts +2 -0
  163. package/dist/cjs/config.d.ts.map +1 -1
  164. package/dist/cjs/config.js +31 -1
  165. package/dist/cjs/helpers.d.ts +1 -1
  166. package/dist/cjs/helpers.d.ts.map +1 -1
  167. package/dist/cjs/helpers.js +13 -2
  168. package/dist/cjs/hooks/use-cell-renderer.d.ts +16 -1
  169. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  170. package/dist/cjs/hooks/use-cell-renderer.js +20 -8
  171. package/dist/cjs/hooks/use-chart-clipboard.d.ts +55 -0
  172. package/dist/cjs/hooks/use-chart-clipboard.d.ts.map +1 -0
  173. package/dist/cjs/hooks/use-chart-clipboard.js +231 -0
  174. package/dist/cjs/hooks/use-chart-source-ranges.d.ts +27 -0
  175. package/dist/cjs/hooks/use-chart-source-ranges.d.ts.map +1 -0
  176. package/dist/cjs/hooks/use-chart-source-ranges.js +211 -0
  177. package/dist/cjs/hooks/use-context-setter.d.ts.map +1 -1
  178. package/dist/cjs/hooks/use-context-setter.js +3 -1
  179. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  180. package/dist/cjs/hooks/use-copy-paste-cut.js +6 -3
  181. package/dist/cjs/hooks/use-editable.d.ts +9 -1
  182. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  183. package/dist/cjs/hooks/use-editable.js +25 -1
  184. package/dist/cjs/hooks/use-embeds-charts.d.ts +64 -4
  185. package/dist/cjs/hooks/use-embeds-charts.d.ts.map +1 -1
  186. package/dist/cjs/hooks/use-embeds-charts.js +412 -41
  187. package/dist/cjs/hooks/use-grid-children.d.ts +2 -2
  188. package/dist/cjs/hooks/use-grid-children.d.ts.map +1 -1
  189. package/dist/cjs/hooks/use-grid-children.js +12 -6
  190. package/dist/cjs/hooks/use-header-actions.d.ts.map +1 -1
  191. package/dist/cjs/hooks/use-header-actions.js +17 -10
  192. package/dist/cjs/hooks/use-isomorphic-layout-effect.d.ts +2 -2
  193. package/dist/cjs/hooks/use-isomorphic-layout-effect.d.ts.map +1 -1
  194. package/dist/cjs/hooks/use-keyboard-handler.d.ts +2 -1
  195. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  196. package/dist/cjs/hooks/use-keyboard-handler.js +8 -2
  197. package/dist/cjs/hooks/use-move-columns-rows.d.ts.map +1 -1
  198. package/dist/cjs/hooks/use-move-columns-rows.js +21 -15
  199. package/dist/cjs/hooks/use-reveal-chart-embed.d.ts +17 -0
  200. package/dist/cjs/hooks/use-reveal-chart-embed.d.ts.map +1 -0
  201. package/dist/cjs/hooks/use-reveal-chart-embed.js +40 -0
  202. package/dist/cjs/hooks/use-selection-move.d.ts.map +1 -1
  203. package/dist/cjs/hooks/use-selection-move.js +14 -6
  204. package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -1
  205. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  206. package/dist/cjs/hooks/use-selection-renderer.js +37 -7
  207. package/dist/cjs/hooks/use-selection-resize.d.ts.map +1 -1
  208. package/dist/cjs/hooks/use-selection-resize.js +13 -6
  209. package/dist/cjs/hooks/use-selection.d.ts +9 -1
  210. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  211. package/dist/cjs/hooks/use-selection.js +177 -55
  212. package/dist/cjs/hooks/use-structured-reference-selection.d.ts +1 -1
  213. package/dist/cjs/hooks/use-structured-reference-selection.d.ts.map +1 -1
  214. package/dist/cjs/hooks/use-structured-reference-selection.js +10 -0
  215. package/dist/cjs/hooks/use-table-hit-zones.d.ts +61 -0
  216. package/dist/cjs/hooks/use-table-hit-zones.d.ts.map +1 -0
  217. package/dist/cjs/hooks/use-table-hit-zones.js +157 -0
  218. package/dist/cjs/hooks/use-table-resizer.d.ts +7 -0
  219. package/dist/cjs/hooks/use-table-resizer.d.ts.map +1 -1
  220. package/dist/cjs/hooks/use-table-resizer.js +38 -18
  221. package/dist/cjs/hooks/use-touch.d.ts.map +1 -1
  222. package/dist/cjs/hooks/use-touch.js +16 -8
  223. package/dist/cjs/index.d.ts +13 -0
  224. package/dist/cjs/index.d.ts.map +1 -1
  225. package/dist/cjs/index.js +17 -1
  226. package/dist/cjs/release-date.js +1 -1
  227. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  228. package/dist/cjs/types.d.ts +289 -4
  229. package/dist/cjs/types.d.ts.map +1 -1
  230. package/dist/cjs/utils/copy-as-picture.d.ts +13 -0
  231. package/dist/cjs/utils/copy-as-picture.d.ts.map +1 -0
  232. package/dist/cjs/utils/copy-as-picture.js +70 -0
  233. package/dist/cjs/utils/pivot-chart-field-buttons.d.ts +19 -0
  234. package/dist/cjs/utils/pivot-chart-field-buttons.d.ts.map +1 -0
  235. package/dist/cjs/utils/pivot-chart-field-buttons.js +25 -0
  236. package/dist/cjs/utils/z-order.d.ts +47 -0
  237. package/dist/cjs/utils/z-order.d.ts.map +1 -0
  238. package/dist/cjs/utils/z-order.js +124 -0
  239. package/dist/esm/api/banded-ranges.d.ts.map +1 -1
  240. package/dist/esm/api/banded-ranges.js +39 -12
  241. package/dist/esm/api/calculated-column-fill.d.ts +43 -0
  242. package/dist/esm/api/calculated-column-fill.d.ts.map +1 -0
  243. package/dist/esm/api/calculated-column-fill.js +10 -0
  244. package/dist/esm/api/chart-sheet.d.ts +8 -0
  245. package/dist/esm/api/chart-sheet.d.ts.map +1 -0
  246. package/dist/esm/api/chart-sheet.js +15 -0
  247. package/dist/esm/api/chart-source-ranges.d.ts +64 -0
  248. package/dist/esm/api/chart-source-ranges.d.ts.map +1 -0
  249. package/dist/esm/api/chart-source-ranges.js +168 -0
  250. package/dist/esm/api/selections.d.ts +3 -3
  251. package/dist/esm/api/selections.d.ts.map +1 -1
  252. package/dist/esm/api/selections.js +26 -2
  253. package/dist/esm/api/spreadsheet-api.d.ts +16 -3
  254. package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
  255. package/dist/esm/api/spreadsheet-api.js +18 -2
  256. package/dist/esm/api/table-auto-expansion.d.ts +37 -0
  257. package/dist/esm/api/table-auto-expansion.d.ts.map +1 -0
  258. package/dist/esm/api/table-auto-expansion.js +10 -0
  259. package/dist/esm/api/table.d.ts +49 -1
  260. package/dist/esm/api/table.d.ts.map +1 -1
  261. package/dist/esm/api/table.js +138 -1
  262. package/dist/esm/api/validation.d.ts +26 -1
  263. package/dist/esm/api/validation.d.ts.map +1 -1
  264. package/dist/esm/api/validation.js +119 -9
  265. package/dist/esm/atoms/calculated-column-fill.atom.d.ts +15 -0
  266. package/dist/esm/atoms/calculated-column-fill.atom.d.ts.map +1 -0
  267. package/dist/esm/atoms/calculated-column-fill.atom.js +12 -0
  268. package/dist/esm/atoms/chart-actions.atom.d.ts +40 -0
  269. package/dist/esm/atoms/chart-actions.atom.d.ts.map +1 -0
  270. package/dist/esm/atoms/chart-actions.atom.js +58 -0
  271. package/dist/esm/atoms/index.d.ts +5 -0
  272. package/dist/esm/atoms/index.d.ts.map +1 -1
  273. package/dist/esm/atoms/index.js +5 -0
  274. package/dist/esm/atoms/move-chart-dialog.atom.d.ts +28 -0
  275. package/dist/esm/atoms/move-chart-dialog.atom.d.ts.map +1 -0
  276. package/dist/esm/atoms/move-chart-dialog.atom.js +25 -0
  277. package/dist/esm/atoms/selected-chart-embed.atom.d.ts +9 -1
  278. package/dist/esm/atoms/selected-chart-embed.atom.d.ts.map +1 -1
  279. package/dist/esm/atoms/selected-chart-embed.atom.js +19 -2
  280. package/dist/esm/atoms/selected-chart-series.atom.d.ts +24 -0
  281. package/dist/esm/atoms/selected-chart-series.atom.d.ts.map +1 -0
  282. package/dist/esm/atoms/selected-chart-series.atom.js +4 -0
  283. package/dist/esm/atoms/sheet-context.atom.d.ts +2 -0
  284. package/dist/esm/atoms/sheet-context.atom.d.ts.map +1 -1
  285. package/dist/esm/atoms/sheet-context.atom.js +2 -0
  286. package/dist/esm/atoms/sparkline-dialog.atom.d.ts +34 -0
  287. package/dist/esm/atoms/sparkline-dialog.atom.d.ts.map +1 -0
  288. package/dist/esm/atoms/sparkline-dialog.atom.js +21 -0
  289. package/dist/esm/atoms/table-auto-expansion.atom.d.ts +14 -0
  290. package/dist/esm/atoms/table-auto-expansion.atom.d.ts.map +1 -0
  291. package/dist/esm/atoms/table-auto-expansion.atom.js +11 -0
  292. package/dist/esm/components/calculated-column-smart-tag/index.d.ts +25 -0
  293. package/dist/esm/components/calculated-column-smart-tag/index.d.ts.map +1 -0
  294. package/dist/esm/components/calculated-column-smart-tag/index.js +25 -0
  295. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  296. package/dist/esm/components/canvas-grid/index.js +346 -26
  297. package/dist/esm/components/canvas-grid/typings.d.ts +127 -14
  298. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  299. package/dist/esm/components/cell/index.d.ts.map +1 -1
  300. package/dist/esm/components/cell/index.js +3 -3
  301. package/dist/esm/components/cell/typings.d.ts +13 -0
  302. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  303. package/dist/esm/components/cell-filter/index.d.ts.map +1 -1
  304. package/dist/esm/components/cell-filter/index.js +14 -3
  305. package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  306. package/dist/esm/components/cell-input/formula-bar-cell-input.js +4 -1
  307. package/dist/esm/components/cell-structured/sparkline-math.d.ts +28 -5
  308. package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
  309. package/dist/esm/components/cell-structured/sparkline-math.js +58 -4
  310. package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
  311. package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
  312. package/dist/esm/components/cell-structured/sparkline.js +3 -3
  313. package/dist/esm/components/cell-structured/types.d.ts +1 -1
  314. package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
  315. package/dist/esm/components/chart-sheet-view/index.d.ts +27 -0
  316. package/dist/esm/components/chart-sheet-view/index.d.ts.map +1 -0
  317. package/dist/esm/components/chart-sheet-view/index.js +30 -0
  318. package/dist/esm/components/context-menu/embed-context-menu.d.ts +48 -0
  319. package/dist/esm/components/context-menu/embed-context-menu.d.ts.map +1 -0
  320. package/dist/esm/components/context-menu/embed-context-menu.js +112 -0
  321. package/dist/esm/components/context-menu/index.d.ts +23 -2
  322. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  323. package/dist/esm/components/context-menu/index.js +174 -38
  324. package/dist/esm/components/context-menu/total-row-function-menu.d.ts +33 -0
  325. package/dist/esm/components/context-menu/total-row-function-menu.d.ts.map +1 -0
  326. package/dist/esm/components/context-menu/total-row-function-menu.js +50 -0
  327. package/dist/esm/components/context-menu/total-row-functions.d.ts +12 -12
  328. package/dist/esm/components/context-menu/total-row-functions.d.ts.map +1 -1
  329. package/dist/esm/components/context-menu/total-row-functions.js +29 -31
  330. package/dist/esm/components/embeds/chart-component.d.ts +17 -0
  331. package/dist/esm/components/embeds/chart-component.d.ts.map +1 -1
  332. package/dist/esm/components/embeds/embed-draggable.d.ts +61 -4
  333. package/dist/esm/components/embeds/embed-draggable.d.ts.map +1 -1
  334. package/dist/esm/components/embeds/embed-draggable.js +207 -47
  335. package/dist/esm/components/filter-box/date-tree.d.ts +28 -0
  336. package/dist/esm/components/filter-box/date-tree.d.ts.map +1 -0
  337. package/dist/esm/components/filter-box/date-tree.js +107 -0
  338. package/dist/esm/components/filter-box/filter-by-condition.d.ts +14 -2
  339. package/dist/esm/components/filter-box/filter-by-condition.d.ts.map +1 -1
  340. package/dist/esm/components/filter-box/filter-by-condition.js +72 -16
  341. package/dist/esm/components/filter-box/filter-by-value.d.ts.map +1 -1
  342. package/dist/esm/components/filter-box/filter-by-value.js +110 -39
  343. package/dist/esm/components/filter-box/index.d.ts +7 -1
  344. package/dist/esm/components/filter-box/index.d.ts.map +1 -1
  345. package/dist/esm/components/filter-box/index.js +88 -2
  346. package/dist/esm/components/move-chart-dialog/index.d.ts +34 -0
  347. package/dist/esm/components/move-chart-dialog/index.d.ts.map +1 -0
  348. package/dist/esm/components/move-chart-dialog/index.js +88 -0
  349. package/dist/esm/components/print-preview/page-block.d.ts +9 -1
  350. package/dist/esm/components/print-preview/page-block.d.ts.map +1 -1
  351. package/dist/esm/components/print-preview/page-block.js +27 -2
  352. package/dist/esm/components/print-preview/print-preview-dialog.d.ts +8 -1
  353. package/dist/esm/components/print-preview/print-preview-dialog.d.ts.map +1 -1
  354. package/dist/esm/components/print-preview/print-preview-dialog.js +92 -4
  355. package/dist/esm/components/print-preview/run-print.d.ts.map +1 -1
  356. package/dist/esm/components/print-preview/run-print.js +17 -7
  357. package/dist/esm/components/print-preview/use-page-layout.d.ts +47 -0
  358. package/dist/esm/components/print-preview/use-page-layout.d.ts.map +1 -1
  359. package/dist/esm/components/print-preview/use-page-layout.js +55 -0
  360. package/dist/esm/components/resizer/index.d.ts.map +1 -1
  361. package/dist/esm/components/resizer/index.js +8 -4
  362. package/dist/esm/components/selection/index.d.ts +1 -1
  363. package/dist/esm/components/selection/index.d.ts.map +1 -1
  364. package/dist/esm/components/selection/index.js +6 -2
  365. package/dist/esm/components/selection/types.d.ts +15 -0
  366. package/dist/esm/components/selection/types.d.ts.map +1 -1
  367. package/dist/esm/components/sheet-search/index.d.ts.map +1 -1
  368. package/dist/esm/components/sheet-search/index.js +5 -2
  369. package/dist/esm/components/sheet-tabs/index.d.ts.map +1 -1
  370. package/dist/esm/components/sheet-tabs/index.js +2 -2
  371. package/dist/esm/components/sheet-tabs/sheet-tab.d.ts +1 -1
  372. package/dist/esm/components/sheet-tabs/sheet-tab.d.ts.map +1 -1
  373. package/dist/esm/components/sheet-tabs/sheet-tab.js +4 -2
  374. package/dist/esm/components/sparkline-dialog/index.d.ts +43 -0
  375. package/dist/esm/components/sparkline-dialog/index.d.ts.map +1 -0
  376. package/dist/esm/components/sparkline-dialog/index.js +123 -0
  377. package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -1
  378. package/dist/esm/components/subtotal-dialog/index.js +10 -1
  379. package/dist/esm/components/table-auto-expansion-smart-tag/index.d.ts +24 -0
  380. package/dist/esm/components/table-auto-expansion-smart-tag/index.d.ts.map +1 -0
  381. package/dist/esm/components/table-auto-expansion-smart-tag/index.js +25 -0
  382. package/dist/esm/components/toolbar/index.d.ts +1 -0
  383. package/dist/esm/components/toolbar/index.d.ts.map +1 -1
  384. package/dist/esm/components/toolbar/index.js +1 -0
  385. package/dist/esm/components/toolbar/insert-menu.d.ts +2 -1
  386. package/dist/esm/components/toolbar/insert-menu.d.ts.map +1 -1
  387. package/dist/esm/components/toolbar/insert-menu.js +24 -1
  388. package/dist/esm/components/toolbar/merge-cells-selector.d.ts +4 -1
  389. package/dist/esm/components/toolbar/merge-cells-selector.d.ts.map +1 -1
  390. package/dist/esm/components/toolbar/merge-cells-selector.js +10 -6
  391. package/dist/esm/components/toolbar/sparkline-actions.d.ts +31 -0
  392. package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -0
  393. package/dist/esm/components/toolbar/sparkline-actions.js +238 -0
  394. package/dist/esm/components/toolbar/table-actions.d.ts +9 -1
  395. package/dist/esm/components/toolbar/table-actions.d.ts.map +1 -1
  396. package/dist/esm/components/toolbar/table-actions.js +15 -7
  397. package/dist/esm/components/toolbar/table-style-selector.d.ts +38 -2
  398. package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
  399. package/dist/esm/components/toolbar/table-style-selector.js +210 -399
  400. package/dist/esm/config.d.ts +2 -0
  401. package/dist/esm/config.d.ts.map +1 -1
  402. package/dist/esm/config.js +30 -0
  403. package/dist/esm/helpers.d.ts +1 -1
  404. package/dist/esm/helpers.d.ts.map +1 -1
  405. package/dist/esm/helpers.js +12 -1
  406. package/dist/esm/hooks/use-cell-renderer.d.ts +16 -1
  407. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  408. package/dist/esm/hooks/use-cell-renderer.js +14 -4
  409. package/dist/esm/hooks/use-chart-clipboard.d.ts +55 -0
  410. package/dist/esm/hooks/use-chart-clipboard.d.ts.map +1 -0
  411. package/dist/esm/hooks/use-chart-clipboard.js +213 -0
  412. package/dist/esm/hooks/use-chart-source-ranges.d.ts +27 -0
  413. package/dist/esm/hooks/use-chart-source-ranges.d.ts.map +1 -0
  414. package/dist/esm/hooks/use-chart-source-ranges.js +186 -0
  415. package/dist/esm/hooks/use-context-setter.d.ts.map +1 -1
  416. package/dist/esm/hooks/use-context-setter.js +3 -1
  417. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  418. package/dist/esm/hooks/use-copy-paste-cut.js +6 -4
  419. package/dist/esm/hooks/use-editable.d.ts +9 -1
  420. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  421. package/dist/esm/hooks/use-editable.js +25 -1
  422. package/dist/esm/hooks/use-embeds-charts.d.ts +64 -4
  423. package/dist/esm/hooks/use-embeds-charts.d.ts.map +1 -1
  424. package/dist/esm/hooks/use-embeds-charts.js +394 -39
  425. package/dist/esm/hooks/use-grid-children.d.ts +2 -2
  426. package/dist/esm/hooks/use-grid-children.d.ts.map +1 -1
  427. package/dist/esm/hooks/use-grid-children.js +8 -2
  428. package/dist/esm/hooks/use-header-actions.d.ts.map +1 -1
  429. package/dist/esm/hooks/use-header-actions.js +11 -4
  430. package/dist/esm/hooks/use-isomorphic-layout-effect.d.ts +2 -2
  431. package/dist/esm/hooks/use-isomorphic-layout-effect.d.ts.map +1 -1
  432. package/dist/esm/hooks/use-keyboard-handler.d.ts +2 -1
  433. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  434. package/dist/esm/hooks/use-keyboard-handler.js +8 -2
  435. package/dist/esm/hooks/use-move-columns-rows.d.ts.map +1 -1
  436. package/dist/esm/hooks/use-move-columns-rows.js +12 -6
  437. package/dist/esm/hooks/use-reveal-chart-embed.d.ts +17 -0
  438. package/dist/esm/hooks/use-reveal-chart-embed.d.ts.map +1 -0
  439. package/dist/esm/hooks/use-reveal-chart-embed.js +35 -0
  440. package/dist/esm/hooks/use-selection-move.d.ts.map +1 -1
  441. package/dist/esm/hooks/use-selection-move.js +11 -4
  442. package/dist/esm/hooks/use-selection-renderer.d.ts +13 -1
  443. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  444. package/dist/esm/hooks/use-selection-renderer.js +35 -6
  445. package/dist/esm/hooks/use-selection-resize.d.ts.map +1 -1
  446. package/dist/esm/hooks/use-selection-resize.js +11 -5
  447. package/dist/esm/hooks/use-selection.d.ts +9 -1
  448. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  449. package/dist/esm/hooks/use-selection.js +172 -54
  450. package/dist/esm/hooks/use-structured-reference-selection.d.ts +1 -1
  451. package/dist/esm/hooks/use-structured-reference-selection.d.ts.map +1 -1
  452. package/dist/esm/hooks/use-structured-reference-selection.js +16 -0
  453. package/dist/esm/hooks/use-table-hit-zones.d.ts +61 -0
  454. package/dist/esm/hooks/use-table-hit-zones.d.ts.map +1 -0
  455. package/dist/esm/hooks/use-table-hit-zones.js +146 -0
  456. package/dist/esm/hooks/use-table-resizer.d.ts +7 -0
  457. package/dist/esm/hooks/use-table-resizer.d.ts.map +1 -1
  458. package/dist/esm/hooks/use-table-resizer.js +36 -19
  459. package/dist/esm/hooks/use-touch.d.ts.map +1 -1
  460. package/dist/esm/hooks/use-touch.js +15 -7
  461. package/dist/esm/index.d.ts +13 -0
  462. package/dist/esm/index.d.ts.map +1 -1
  463. package/dist/esm/index.js +13 -0
  464. package/dist/esm/release-date.js +1 -1
  465. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  466. package/dist/esm/types.d.ts +289 -4
  467. package/dist/esm/types.d.ts.map +1 -1
  468. package/dist/esm/utils/copy-as-picture.d.ts +13 -0
  469. package/dist/esm/utils/copy-as-picture.d.ts.map +1 -0
  470. package/dist/esm/utils/copy-as-picture.js +45 -0
  471. package/dist/esm/utils/pivot-chart-field-buttons.d.ts +19 -0
  472. package/dist/esm/utils/pivot-chart-field-buttons.d.ts.map +1 -0
  473. package/dist/esm/utils/pivot-chart-field-buttons.js +18 -0
  474. package/dist/esm/utils/z-order.d.ts +47 -0
  475. package/dist/esm/utils/z-order.d.ts.map +1 -0
  476. package/dist/esm/utils/z-order.js +111 -0
  477. package/dist/spreadsheet.min.css +1 -1
  478. package/package.json +8 -6
  479. package/dist/cjs/components/cell-editor/helpers.spec.d.ts +0 -2
  480. package/dist/cjs/components/cell-editor/helpers.spec.d.ts.map +0 -1
  481. package/dist/cjs/components/cell-editor/helpers.spec.js +0 -32
  482. package/dist/esm/components/cell-editor/helpers.spec.d.ts +0 -2
  483. package/dist/esm/components/cell-editor/helpers.spec.d.ts.map +0 -1
  484. package/dist/esm/components/cell-editor/helpers.spec.js +0 -30
@@ -1,22 +1,24 @@
1
1
  import { Direction, isCellWithinBounds, selectionFromActiveCell, } from "@rowsncolumns/grid";
2
2
  import { ArrowLeftIcon, ArrowRightIcon, CheckIcon, ChevronRightIcon, ClipboardIcon, CodeIcon, CopyIcon, Cross1Icon, DotsVerticalIcon, EyeNoneIcon, EyeOpenIcon, FunnelIcon, MdBrush, MdOutlineFactCheck, PaintBrush, PlusIcon, ReaderIcon, RemoveDuplicatesIcon, ScissorsIcon, SizeIcon, SortDownIcon, SortUpIcon, SpaceBetweenHorizontallyIcon, TableIcon, TrashIcon, ViewGridIcon, WandIcon, } from "@rowsncolumns/icons";
3
3
  import { DropdownLeftSlot, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownRightSlot, } from "@rowsncolumns/ui";
4
- import { addressToCell, cellToAddress, number2Alpha } from "@rowsncolumns/utils";
4
+ import { addressToCell, cellToAddress, getCellUserEnteredValue, isSparklineFormula, iterateCellsInRange, number2Alpha, resolveSparklineGroup, } from "@rowsncolumns/utils";
5
5
  import React, { useCallback, useMemo, useRef } from "react";
6
6
  import { bandsForAreas, bandsFromIndexes, classifyMultiSelection, defaultDeleteCellsChoice, defaultInsertCellsChoice, indexesForAreas, wholeColumnPredicate, wholeColumnPredicateFromHeaderIds, wholeRowPredicate, wholeRowPredicateFromHeaderIds, } from "../../api/multi-selection";
7
+ import { getDeletableTableRowIndexes } from "../../api/table";
7
8
  import { getProtectedRange, isProtectedRange } from "../../api/validation";
8
9
  import { useGetContentfulRangeAroundCell } from "../../atoms";
9
10
  import { useIsAdvancedFilterDialogMounted, useOpenAdvancedFilterDialog, } from "../../atoms/advanced-filter-dialog.atom";
10
11
  import { useIsGoalSeekDialogMounted, useOpenGoalSeekDialog, } from "../../atoms/goal-seek-dialog.atom";
11
12
  import { useIsInsertCellsDialogMounted, useOpenInsertCellsDialog, } from "../../atoms/insert-cells-dialog.atom";
12
13
  import { useIsRemoveDuplicatesDialogMounted, useOpenRemoveDuplicatesDialog, } from "../../atoms/remove-duplicates-dialog.atom";
14
+ import { useIsSparklineDialogMounted, useOpenSparklineDialog, } from "../../atoms/sparkline-dialog.atom";
13
15
  import { useIsSubtotalDialogMounted, useOpenSubtotalDialog, } from "../../atoms/subtotal-dialog.atom";
14
16
  import { useIsTextToColumnsDialogMounted, useOpenTextToColumnsDialog, } from "../../atoms/text-to-columns-dialog.atom";
15
17
  import { useShowValidationAlert } from "../../atoms/validation-alert.atom";
16
18
  import { BLANK_LABEL, MULTIPLE_SELECTIONS_ERROR } from "../../config";
17
19
  import { generateMultiDimTitle } from "../../helpers";
18
- import { getTotalRowFunctionFormula, getTotalRowFunctionFromFormula, TOTAL_ROW_FUNCTIONS, } from "./total-row-functions";
19
- export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selections, basicFilter, isTableHeader, onClearContents, onHideColumn, onHideRow, onGroupRows, onUngroupRows, onGroupColumns, onUngroupColumns, onDeleteRow, onDeleteColumn, onInsertColumn, onInsertRow, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onFreezeRow, onFreezeColumn, onCopy, onCut, hasCutSelection, onInsertCutCells, onPaste, onRequestPasteSpecial, onRequestEvaluateFormula, onRequestAddWatch, isActiveCellFormula, onInsertNote, onProtectRange, onUnProtectRange, onSortRange, onSortColumn, onRequestDefineNamedRange, onRequestResize, onRequestEditTable, onRequestEditPivotTable, onRequestDeletePivotTable, onPivotDrillDown, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRemoveTable, onClearFormatting, onCreateTable, onCreateBasicFilter, onFilterTable, onSortTable, getFormattedValuesFromRange, focusSheet, isSheetFocused, getFormattedValue, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onChange, getCellData, isHiddenColumn, isHiddenRow, onShowColumn, onShowRow, tables, pivotTables, protectedRanges, sheetId, frozenRows, frozenColumns, selectedRowHeadersIds, selectedColumnHeadersIds, rowCount, columnCount, readonly = false, onAddQuickEdit, enableMagicFill, }) => {
20
+ import { TotalRowFunctionMenuItems } from "./total-row-function-menu";
21
+ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selections, basicFilter, isTableHeader, onClearContents, onHideColumn, onHideRow, onGroupRows, onUngroupRows, onGroupColumns, onUngroupColumns, onDeleteRow, onDeleteColumn, onInsertColumn, onInsertRow, onInsertCellsShiftDown, onInsertCellsShiftRight, onDeleteCellsShiftLeft, onDeleteCellsShiftUp, onFreezeRow, onFreezeColumn, onCopy, onCut, hasCutSelection, onInsertCutCells, onPaste, onRequestPasteSpecial, onRequestEvaluateFormula, onRequestAddWatch, isActiveCellFormula, onInsertNote, onProtectRange, onUnProtectRange, onSortRange, onSortColumn, onRequestDefineNamedRange, onRequestResize, onRequestEditTable, onRequestResizeTable, onRequestInsertSlicer, onRequestEditPivotTable, onRequestDeletePivotTable, onRequestCreatePivotChart, onPivotDrillDown, onRequestFormatCells, onRequestConditionalFormat, onRequestDataValidation, onRemoveTable, onClearFormatting, onCreateTable, onRequestCreateTable, onCreateBasicFilter, onFilterTable, onSortTable, getFormattedValuesFromRange, focusSheet, isSheetFocused, getFormattedValue, onInsertTableColumn, onDeleteTableColumn, onInsertTableRow, onDeleteTableRow, onSplitTextToColumns, onRemoveDuplicates, onGoalSeek, onSubtotal, onAdvancedFilter, onChange, onUpdateTable, onRequestEditCell, onSelectRange, getCellData, isHiddenColumn, isHiddenRow, onShowColumn, onShowRow, tables, pivotTables, protectedRanges, sheetId, frozenRows, frozenColumns, selectedRowHeadersIds, selectedColumnHeadersIds, rowCount, columnCount, readonly = false, onAddQuickEdit, enableMagicFill, }) => {
20
22
  const isHeader = isColumnHeader || isRowHeader;
21
23
  const shouldFocusSheetRef = useRef(true);
22
24
  const multiColumnTitle = generateMultiDimTitle(selectedColumnHeadersIds, "y");
@@ -194,10 +196,44 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
194
196
  const hiddenRows = selectedRowIndexes.filter((index) => isHiddenRow(index));
195
197
  // Check for active table
196
198
  const activeTable = useMemo(() => tables?.find(({ range }) => isCellWithinBounds(activeCell, range)), [tables, activeCell]);
199
+ // Excel sparkline group under the active cell (a run of same-option =SPARKLINE() cells). Only
200
+ // offered while a `SparklineDialogHost` is mounted — the Edit entry has nowhere to go without one.
201
+ const isSparklineDialogMounted = useIsSparklineDialogMounted();
202
+ const openSparklineDialog = useOpenSparklineDialog();
203
+ const getSparklineFormula = useCallback((targetSheetId, rowIndex, columnIndex) => {
204
+ const formula = getCellUserEnteredValue(getCellData?.(targetSheetId, rowIndex, columnIndex))?.fv;
205
+ return isSparklineFormula(formula) ? formula : undefined;
206
+ }, [getCellData]);
207
+ const activeSparklineGroup = useMemo(() => isSparklineDialogMounted && getCellData
208
+ ? resolveSparklineGroup({
209
+ sheetId,
210
+ cell: activeCell,
211
+ getFormula: getSparklineFormula,
212
+ })
213
+ : undefined, [isSparklineDialogMounted, getCellData, sheetId, activeCell, getSparklineFormula]);
214
+ // Clear Selected Sparklines: the SPARKLINE cells inside the selection (Excel leaves the rest alone).
215
+ const clearSparklineCells = useCallback((cells) => {
216
+ const targets = cells.filter((cell) => getSparklineFormula(sheetId, cell.rowIndex, cell.columnIndex));
217
+ if (!targets.length)
218
+ return;
219
+ onClearContents?.(sheetId, targets[0], targets.map((cell) => ({
220
+ range: {
221
+ startRowIndex: cell.rowIndex,
222
+ endRowIndex: cell.rowIndex,
223
+ startColumnIndex: cell.columnIndex,
224
+ endColumnIndex: cell.columnIndex,
225
+ },
226
+ })));
227
+ }, [getSparklineFormula, onClearContents, sheetId]);
197
228
  // Check for active pivot table
198
229
  const activePivotTable = useMemo(() => pivotTables?.find(({ pivotRange: range }) => isCellWithinBounds(activeCell, range)), [pivotTables, activeCell]);
199
230
  // Check if the active cell is table header
200
231
  const isActiveCellTableHeader = isTableHeader(activeCell.rowIndex, activeCell.columnIndex);
232
+ // Excel's "Delete table rows" only ever removes body rows: the header and totals rows are
233
+ // dropped from the selection, and the item is hidden when nothing else is selected.
234
+ const deletableTableRowIndexes = activeTable
235
+ ? getDeletableTableRowIndexes(activeTable, selectedRowIndexes)
236
+ : selectedRowIndexes;
201
237
  // Basic filter
202
238
  const activeBasicFilter = basicFilter && isCellWithinBounds(activeCell, basicFilter.range)
203
239
  ? basicFilter
@@ -380,14 +416,47 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
380
416
  // Totals-row function picker: the active cell sits on a table's totals row.
381
417
  const isActiveCellTableTotal = !!activeTable?.totalRow &&
382
418
  activeCell.rowIndex === activeTable.range.endRowIndex;
383
- const activeTotalRowFunction = useMemo(() => {
384
- if (!isActiveCellTableTotal) {
385
- return "none";
419
+ /**
420
+ * The selection clipped to the active table, in table terms (Excel's table
421
+ * Insert / Select items): the selected data-body rows (none when only the
422
+ * header / totals row is selected), the selected rows including header and
423
+ * totals, and the selected columns. Counts follow the selection — N
424
+ * selected rows insert N table rows.
425
+ */
426
+ const tableSelection = useMemo(() => {
427
+ if (!activeTable) {
428
+ return undefined;
386
429
  }
387
- const cellData = getCellData?.(sheetId, activeCell.rowIndex, activeCell.columnIndex);
388
- const ue = cellData?.ue ?? cellData?.userEnteredValue;
389
- return getTotalRowFunctionFromFormula(ue?.fv ?? ue?.formulaValue);
390
- }, [isActiveCellTableTotal, getCellData, sheetId, activeCell]);
430
+ const { range } = activeTable;
431
+ const firstBodyRow = range.startRowIndex + ((activeTable.headerRow ?? true) ? 1 : 0);
432
+ const lastDataRow = range.endRowIndex - (activeTable.totalRow ? 1 : 0);
433
+ const sel = selection.range;
434
+ const clip = (start, end, lo, hi) => {
435
+ const s = Math.max(start, lo);
436
+ const e = Math.min(end, hi);
437
+ return e >= s ? { start: s, end: e, count: e - s + 1 } : undefined;
438
+ };
439
+ const activeColumn = {
440
+ start: activeCell.columnIndex,
441
+ end: activeCell.columnIndex,
442
+ count: 1,
443
+ };
444
+ const bodyRows = clip(sel.startRowIndex, sel.endRowIndex, firstBodyRow, lastDataRow);
445
+ return {
446
+ firstBodyRow,
447
+ lastDataRow,
448
+ bodyRows,
449
+ rows: clip(sel.startRowIndex, sel.endRowIndex, range.startRowIndex, range.endRowIndex) ?? {
450
+ start: activeCell.rowIndex,
451
+ end: activeCell.rowIndex,
452
+ count: 1,
453
+ },
454
+ columns: clip(sel.startColumnIndex, sel.endColumnIndex, range.startColumnIndex, range.endColumnIndex) ?? activeColumn,
455
+ touchesLastDataRow: !!bodyRows && bodyRows.end === lastDataRow && lastDataRow >= firstBodyRow,
456
+ };
457
+ }, [activeTable, selection.range, activeCell]);
458
+ /** `rowData` for `onInsertTableRow`: one blank record per row to insert. */
459
+ const blankTableRows = (count) => Array.from({ length: count }, () => ({}));
391
460
  // Sort table or filter
392
461
  const onSortTableOrFilterView = useCallback((direction) => {
393
462
  // Found a table
@@ -686,28 +755,38 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
686
755
  "Insert",
687
756
  React.createElement(DropdownRightSlot, null,
688
757
  React.createElement(ChevronRightIcon, null))),
689
- React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, activeTable ? (React.createElement(React.Fragment, null,
758
+ React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, activeTable && tableSelection ? (React.createElement(React.Fragment, null,
690
759
  isActiveCellTableHeader ? null : (React.createElement(DropdownMenuItem, { onClick: () => {
691
- onInsertTableRow?.(activeTable, activeCell.rowIndex -
692
- activeTable.range.startRowIndex);
760
+ // Above the selected body rows; from the totals
761
+ // row, above the totals row (Excel).
762
+ const { bodyRows, lastDataRow } = tableSelection;
763
+ onInsertTableRow?.(activeTable, (bodyRows?.start ?? lastDataRow + 1) -
764
+ activeTable.range.startRowIndex, blankTableRows(bodyRows?.count ?? 1));
765
+ }, disabled: readonly },
766
+ React.createElement(DropdownLeftSlot, null,
767
+ React.createElement(PlusIcon, null)),
768
+ "Table Rows Above")),
769
+ tableSelection.touchesLastDataRow ? (React.createElement(DropdownMenuItem, { onClick: () => {
770
+ const { bodyRows, lastDataRow } = tableSelection;
771
+ onInsertTableRow?.(activeTable, lastDataRow + 1 - activeTable.range.startRowIndex, blankTableRows(bodyRows?.count ?? 1));
693
772
  }, disabled: readonly },
694
773
  React.createElement(DropdownLeftSlot, null,
695
774
  React.createElement(PlusIcon, null)),
696
- "Insert table row")),
775
+ "Table Row Below")) : null,
697
776
  React.createElement(DropdownMenuItem, { onClick: () => {
698
- onInsertTableColumn?.(activeTable, activeCell.columnIndex -
699
- activeTable.range.startColumnIndex, Direction.Left);
777
+ const { columns } = tableSelection;
778
+ onInsertTableColumn?.(activeTable, columns.start - activeTable.range.startColumnIndex, Direction.Left, columns.count);
700
779
  }, disabled: readonly },
701
780
  React.createElement(DropdownLeftSlot, null,
702
781
  React.createElement(ArrowLeftIcon, null)),
703
- "Insert table column to the left"),
782
+ "Table Columns to the Left"),
704
783
  React.createElement(DropdownMenuItem, { onClick: () => {
705
- onInsertTableColumn?.(activeTable, activeCell.columnIndex -
706
- activeTable.range.startColumnIndex, Direction.Right);
784
+ const { columns } = tableSelection;
785
+ onInsertTableColumn?.(activeTable, columns.end - activeTable.range.startColumnIndex, Direction.Right, columns.count);
707
786
  }, disabled: readonly },
708
787
  React.createElement(DropdownLeftSlot, null,
709
788
  React.createElement(ArrowRightIcon, null)),
710
- "Insert table column to the right"))) : (React.createElement(React.Fragment, null,
789
+ "Table Columns to the Right"))) : (React.createElement(React.Fragment, null,
711
790
  React.createElement(DropdownMenuItem, { onClick: () => onInsertRow?.(sheetId, activeCell.rowIndex, selectedRowIndexes.length), disabled: readonly },
712
791
  React.createElement(DropdownLeftSlot, null,
713
792
  React.createElement(PlusIcon, null)),
@@ -739,7 +818,7 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
739
818
  React.createElement(DropdownRightSlot, null,
740
819
  React.createElement(ChevronRightIcon, null))),
741
820
  React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, activeTable ? (React.createElement(React.Fragment, null,
742
- isActiveCellTableHeader ? null : (React.createElement(DropdownMenuItem, { onClick: () => onDeleteTableRow?.(activeTable, selectedRowIndexes), disabled: readonly },
821
+ deletableTableRowIndexes.length === 0 ? null : (React.createElement(DropdownMenuItem, { onClick: () => onDeleteTableRow?.(activeTable, deletableTableRowIndexes), disabled: readonly },
743
822
  React.createElement(DropdownLeftSlot, null,
744
823
  React.createElement(TrashIcon, null)),
745
824
  "Delete table row")),
@@ -771,6 +850,32 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
771
850
  React.createElement(DropdownLeftSlot, null,
772
851
  React.createElement(TrashIcon, null)),
773
852
  deleteCellsLabel)),
853
+ activeTable && tableSelection && onSelectRange ? (React.createElement(DropdownMenuSub, null,
854
+ React.createElement(DropdownMenuSubTrigger, null,
855
+ React.createElement(DropdownLeftSlot, null,
856
+ React.createElement(ViewGridIcon, null)),
857
+ "Select",
858
+ React.createElement(DropdownRightSlot, null,
859
+ React.createElement(ChevronRightIcon, null))),
860
+ React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
861
+ React.createElement(DropdownMenuItem, { onClick: () => onSelectRange(sheetId, {
862
+ startRowIndex: tableSelection.firstBodyRow,
863
+ endRowIndex: Math.max(tableSelection.firstBodyRow, tableSelection.lastDataRow),
864
+ startColumnIndex: tableSelection.columns.start,
865
+ endColumnIndex: tableSelection.columns.end,
866
+ }) }, "Table Column Data"),
867
+ React.createElement(DropdownMenuItem, { onClick: () => onSelectRange(sheetId, {
868
+ startRowIndex: activeTable.range.startRowIndex,
869
+ endRowIndex: activeTable.range.endRowIndex,
870
+ startColumnIndex: tableSelection.columns.start,
871
+ endColumnIndex: tableSelection.columns.end,
872
+ }) }, "Entire Table Column"),
873
+ React.createElement(DropdownMenuItem, { onClick: () => onSelectRange(sheetId, {
874
+ startRowIndex: tableSelection.rows.start,
875
+ endRowIndex: tableSelection.rows.end,
876
+ startColumnIndex: activeTable.range.startColumnIndex,
877
+ endColumnIndex: activeTable.range.endColumnIndex,
878
+ }) }, "Table Row")))) : null,
774
879
  React.createElement(DropdownMenuSeparator, null),
775
880
  React.createElement(DropdownMenuSub, null,
776
881
  React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
@@ -812,27 +917,29 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
812
917
  React.createElement(DropdownRightSlot, null,
813
918
  React.createElement(ChevronRightIcon, null))),
814
919
  React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
920
+ onUpdateTable ? (React.createElement(DropdownMenuCheckboxItem, { checked: !!activeTable.totalRow, disabled: readonly, onSelect: () => onUpdateTable(sheetId, activeTable.id, {
921
+ totalRow: !activeTable.totalRow,
922
+ }) },
923
+ React.createElement(DropdownMenuItemIndicator, null,
924
+ React.createElement(CheckIcon, null)),
925
+ "Totals Row")) : null,
815
926
  React.createElement(DropdownMenuItem, { onClick: () => onRemoveTable?.(activeTable), disabled: readonly }, "Convert to range"),
816
927
  React.createElement(DropdownMenuItem, { onClick: () => onRequestEditTable?.(activeTable), disabled: readonly }, "Edit table"),
928
+ onRequestResizeTable ? (React.createElement(DropdownMenuItem, { onClick: () => {
929
+ shouldFocusSheetRef.current = false;
930
+ onRequestResizeTable(activeTable);
931
+ }, disabled: readonly }, "Resize Table\u2026")) : null,
932
+ onRequestInsertSlicer ? (React.createElement(DropdownMenuItem, { onClick: () => {
933
+ shouldFocusSheetRef.current = false;
934
+ onRequestInsertSlicer(activeTable);
935
+ }, disabled: readonly }, "Insert Slicer\u2026")) : null,
817
936
  isActiveCellTableTotal ? (React.createElement(DropdownMenuSub, null,
818
937
  React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
819
938
  "Total row function",
820
939
  React.createElement(DropdownRightSlot, null,
821
940
  React.createElement(ChevronRightIcon, null))),
822
- React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, TOTAL_ROW_FUNCTIONS.map((option) => (React.createElement(DropdownMenuCheckboxItem, { key: option.id, checked: activeTotalRowFunction === option.id, disabled: readonly, onSelect: () => {
823
- const formula = getTotalRowFunctionFormula(option.id, activeTable, activeCell.columnIndex);
824
- if (formula === undefined) {
825
- return;
826
- }
827
- if (formula === "") {
828
- onClearContents?.(sheetId, activeCell, selectionFromActiveCell(activeCell));
829
- return;
830
- }
831
- onChange?.(sheetId, activeCell, formula, null);
832
- } },
833
- React.createElement(DropdownMenuItemIndicator, null,
834
- React.createElement(CheckIcon, null)),
835
- option.label)))))) : null))) : null,
941
+ React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
942
+ React.createElement(TotalRowFunctionMenuItems, { sheetId: sheetId, table: activeTable, cell: activeCell, readonly: readonly, getCellData: getCellData, onChange: onChange, onClearContents: onClearContents, onUpdateTable: onUpdateTable, onRequestEditCell: onRequestEditCell })))) : null))) : null,
836
943
  activePivotTable ? (React.createElement(DropdownMenuSub, null,
837
944
  React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
838
945
  React.createElement(DropdownLeftSlot, null,
@@ -843,13 +950,36 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
843
950
  React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
844
951
  onPivotDrillDown ? (React.createElement(DropdownMenuItem, { onClick: () => onPivotDrillDown?.(activePivotTable.pivotId, activeCell.rowIndex, activeCell.columnIndex) }, "Drill Down")) : null,
845
952
  React.createElement(DropdownMenuItem, { onClick: () => onRequestEditPivotTable?.(activePivotTable), disabled: readonly }, "Edit PivotTable"),
846
- React.createElement(DropdownMenuItem, { onClick: () => onRequestDeletePivotTable?.(activePivotTable.pivotId), disabled: readonly }, "Delete PivotTable")))) : null,
953
+ React.createElement(DropdownMenuItem, { onClick: () => onRequestDeletePivotTable?.(activePivotTable.pivotId), disabled: readonly }, "Delete PivotTable"),
954
+ onRequestCreatePivotChart ? (React.createElement(DropdownMenuItem, { onClick: () => onRequestCreatePivotChart(sheetId, activeCell, selections, activePivotTable.pivotId), disabled: readonly }, "PivotChart")) : null))) : null,
955
+ activeSparklineGroup ? (React.createElement(DropdownMenuSub, null,
956
+ React.createElement(DropdownMenuSubTrigger, { disabled: readonly },
957
+ "Sparklines",
958
+ React.createElement(DropdownRightSlot, null,
959
+ React.createElement(ChevronRightIcon, null))),
960
+ React.createElement(DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
961
+ React.createElement(DropdownMenuItem, { disabled: readonly, onClick: () => {
962
+ shouldFocusSheetRef.current = false;
963
+ openSparklineDialog({ mode: "edit", group: activeSparklineGroup });
964
+ } }, "Edit Group Location & Data\u2026"),
965
+ React.createElement(DropdownMenuItem, { disabled: readonly, onClick: () => {
966
+ const cells = [];
967
+ for (const { range } of selections.length
968
+ ? selections
969
+ : selectionFromActiveCell(activeCell)) {
970
+ for (const [rowIndex, columnIndex] of iterateCellsInRange(range)) {
971
+ cells.push({ rowIndex, columnIndex });
972
+ }
973
+ }
974
+ clearSparklineCells(cells);
975
+ } }, "Clear Selected Sparklines"),
976
+ React.createElement(DropdownMenuItem, { disabled: readonly, onClick: () => clearSparklineCells(activeSparklineGroup.members.map((m) => m.cell)) }, "Clear Selected Sparkline Groups")))) : null,
847
977
  React.createElement(DropdownMenuSeparator, null),
848
978
  activeTable ? null : (React.createElement(React.Fragment, null,
849
979
  React.createElement(DropdownMenuItem, { onClick: () => {
850
980
  // We have to shift the focus to note editor
851
981
  shouldFocusSheetRef.current = false;
852
- onCreateTable?.(sheetId, activeCell, selections, undefined, "TableStyleLight1", {
982
+ const bandedRange = {
853
983
  rowProperties: {
854
984
  firstBandColor: {
855
985
  theme: 1,
@@ -884,7 +1014,13 @@ export const ContextMenu = ({ isRowHeader, isColumnHeader, activeCell, selection
884
1014
  },
885
1015
  },
886
1016
  },
887
- });
1017
+ };
1018
+ if (onRequestCreateTable) {
1019
+ onRequestCreateTable(sheetId, activeCell, selections, "TableStyleLight1", bandedRange);
1020
+ }
1021
+ else {
1022
+ onCreateTable?.(sheetId, activeCell, selections, undefined, "TableStyleLight1", bandedRange);
1023
+ }
888
1024
  }, disabled: readonly },
889
1025
  React.createElement(DropdownLeftSlot, null,
890
1026
  React.createElement(TableIcon, null)),
@@ -0,0 +1,33 @@
1
+ import type { CellInterface } from "@rowsncolumns/grid";
2
+ import React from "react";
3
+ import type { TableView } from "../../types";
4
+ import type { CanvasGridProps } from "../canvas-grid/typings";
5
+ export type TotalRowFunctionMenuItemsProps = {
6
+ sheetId: number;
7
+ table: TableView;
8
+ /** The totals-row cell the picker acts on. */
9
+ cell: CellInterface;
10
+ readonly?: boolean;
11
+ /** Reads the cell's formula to highlight its current function when the column records none. */
12
+ getCellData?: CanvasGridProps["getCellData"];
13
+ /** Writes the chosen aggregation formula into the cell (fallback without `onUpdateTable`). */
14
+ onChange?: CanvasGridProps["onChange"];
15
+ /** Clears the cell for "None" (fallback without `onUpdateTable`). */
16
+ onClearContents?: CanvasGridProps["onClearContents"];
17
+ /**
18
+ * Records the choice as the column's `totalsRowFunction`: both engines derive
19
+ * the totals cell from it and regenerate it when the totals row is toggled off
20
+ * and on. Without it the picker writes the formula with `onChange`.
21
+ */
22
+ onUpdateTable?: CanvasGridProps["onUpdateTable"];
23
+ /** Opens the cell editor pre-filled, for "More Functions…" (omitted when absent). */
24
+ onRequestEditCell?: (sheetId: number, cell: CellInterface, initialValue?: string) => void;
25
+ };
26
+ /**
27
+ * Excel's totals-row function list (None / Average / Count / … / Var, then
28
+ * "More Functions…") for one totals cell — the items of the context menu's
29
+ * "Total row function" submenu and of the dropdown the totals cell's in-cell
30
+ * arrow opens.
31
+ */
32
+ export declare const TotalRowFunctionMenuItems: ({ sheetId, table, cell, readonly, getCellData, onChange, onClearContents, onUpdateTable, onRequestEditCell, }: TotalRowFunctionMenuItemsProps) => React.JSX.Element;
33
+ //# sourceMappingURL=total-row-function-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"total-row-function-menu.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/total-row-function-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASxD,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS9D,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,8CAA8C;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACvC,qEAAqE;IACrE,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACrD;;;;OAIG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD,qFAAqF;IACrF,iBAAiB,CAAC,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,YAAY,CAAC,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GAAI,+GAUvC,8BAA8B,sBAiEhC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { selectionFromActiveCell } from "@rowsncolumns/grid";
2
+ import { CheckIcon } from "@rowsncolumns/icons";
3
+ import { DropdownMenuCheckboxItem, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuSeparator, } from "@rowsncolumns/ui";
4
+ import React, { useMemo } from "react";
5
+ import { getTotalRowFunctionFormula, getTotalRowFunctionFromFormula, MORE_FUNCTIONS_INITIAL_VALUE, TOTAL_ROW_FUNCTIONS, withTotalRowFunction, } from "./total-row-functions";
6
+ /**
7
+ * Excel's totals-row function list (None / Average / Count / … / Var, then
8
+ * "More Functions…") for one totals cell — the items of the context menu's
9
+ * "Total row function" submenu and of the dropdown the totals cell's in-cell
10
+ * arrow opens.
11
+ */
12
+ export const TotalRowFunctionMenuItems = ({ sheetId, table, cell, readonly, getCellData, onChange, onClearContents, onUpdateTable, onRequestEditCell, }) => {
13
+ const activeFunction = useMemo(() => {
14
+ // The column's recorded function is the source of truth; a totals cell
15
+ // without one (typed by hand, or from a file) is read off its formula.
16
+ const recorded = table.columns?.[cell.columnIndex - table.range.startColumnIndex]
17
+ ?.totalsRowFunction;
18
+ if (recorded && recorded !== "custom") {
19
+ return recorded;
20
+ }
21
+ const cellData = getCellData?.(sheetId, cell.rowIndex, cell.columnIndex);
22
+ const ue = cellData?.ue ?? cellData?.userEnteredValue;
23
+ return getTotalRowFunctionFromFormula(ue?.fv ?? ue?.formulaValue);
24
+ }, [table, getCellData, sheetId, cell]);
25
+ return (React.createElement(React.Fragment, null,
26
+ TOTAL_ROW_FUNCTIONS.map((option) => (React.createElement(DropdownMenuCheckboxItem, { key: option.id, checked: activeFunction === option.id, disabled: readonly, onSelect: () => {
27
+ const columns = onUpdateTable
28
+ ? withTotalRowFunction(table, cell.columnIndex, option.id)
29
+ : undefined;
30
+ if (columns) {
31
+ onUpdateTable?.(sheetId, table.id, { columns });
32
+ return;
33
+ }
34
+ const formula = getTotalRowFunctionFormula(option.id, table, cell.columnIndex);
35
+ if (formula === undefined) {
36
+ return;
37
+ }
38
+ if (formula === "") {
39
+ onClearContents?.(sheetId, cell, selectionFromActiveCell(cell));
40
+ return;
41
+ }
42
+ onChange?.(sheetId, cell, formula, null);
43
+ } },
44
+ React.createElement(DropdownMenuItemIndicator, null,
45
+ React.createElement(CheckIcon, null)),
46
+ option.label))),
47
+ onRequestEditCell ? (React.createElement(React.Fragment, null,
48
+ React.createElement(DropdownMenuSeparator, null),
49
+ React.createElement(DropdownMenuItem, { disabled: readonly, onSelect: () => onRequestEditCell(sheetId, cell, MORE_FUNCTIONS_INITIAL_VALUE) }, "More Functions\u2026"))) : null));
50
+ };
@@ -1,9 +1,11 @@
1
+ import { escapeStructuredColumnName, getTotalsRowFunctionFromFormula, type TotalsRowFunction } from "@rowsncolumns/utils";
1
2
  import type { TableView } from "../../types";
2
3
  /**
3
- * The aggregations Excel offers in a table's totals-row dropdown, each backed
4
- * by the `SUBTOTAL` function number that ignores hidden (filtered) rows.
4
+ * The aggregations Excel offers in a table's totals-row dropdown — the
5
+ * `totalsRowFunction` values a column records (`custom` is what "More
6
+ * Functions…" produces and is not a picker entry).
5
7
  */
6
- export type TotalRowFunction = "none" | "average" | "count" | "countNumbers" | "max" | "min" | "sum" | "stdDev" | "var";
8
+ export type TotalRowFunction = Exclude<TotalsRowFunction, "custom">;
7
9
  export type TotalRowFunctionOption = {
8
10
  id: TotalRowFunction;
9
11
  label: string;
@@ -11,11 +13,9 @@ export type TotalRowFunctionOption = {
11
13
  subtotal?: number;
12
14
  };
13
15
  export declare const TOTAL_ROW_FUNCTIONS: TotalRowFunctionOption[];
14
- /**
15
- * Escape a column name for use inside a structured reference: `[`, `]`, `#`
16
- * and `'` are prefixed with `'`, as Excel does.
17
- */
18
- export declare const escapeStructuredColumnName: (name: string) => string;
16
+ /** What "More Functions…" pre-fills in the cell editor for a custom totals formula. */
17
+ export declare const MORE_FUNCTIONS_INITIAL_VALUE = "=SUBTOTAL(";
18
+ export { escapeStructuredColumnName, getTotalsRowFunctionFromFormula as getTotalRowFunctionFromFormula };
19
19
  /**
20
20
  * Formula for a totals-row cell, e.g. `=SUBTOTAL(109,Table1[Amount])`.
21
21
  * Qualified with the table name so it evaluates from any engine and matches
@@ -24,9 +24,9 @@ export declare const escapeStructuredColumnName: (name: string) => string;
24
24
  */
25
25
  export declare const getTotalRowFunctionFormula: (fn: TotalRowFunction, table: Pick<TableView, "title" | "columns" | "range">, columnIndex: number) => string | undefined;
26
26
  /**
27
- * Recognise the aggregation a totals-row formula uses, so the picker can show
28
- * the active choice. Both the hidden-row-aware (1xx) and plain (1–11)
29
- * `SUBTOTAL` numbers map to the same option; anything else is "none".
27
+ * The table's columns with `columnIndex`'s `totalsRowFunction` set to `fn` —
28
+ * the shape `onUpdateTable` persists so the choice survives toggling the totals
29
+ * row off and on. `undefined` when the column list does not cover the cell.
30
30
  */
31
- export declare const getTotalRowFunctionFromFormula: (formula: string | null | undefined) => TotalRowFunction;
31
+ export declare const withTotalRowFunction: (table: Pick<TableView, "columns" | "range">, columnIndex: number, fn: TotalRowFunction) => TableView["columns"] | undefined;
32
32
  //# sourceMappingURL=total-row-functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"total-row-functions.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/total-row-functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,SAAS,GACT,OAAO,GACP,cAAc,GACd,KAAK,GACL,KAAK,GACL,KAAK,GACL,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,gBAAgB,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,sBAAsB,EAUvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,WACnB,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GACrC,IAAI,gBAAgB,EACpB,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,EACrD,aAAa,MAAM,KAClB,MAAM,GAAG,SAaX,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GACzC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,KACjC,gBAgBF,CAAC"}
1
+ {"version":3,"file":"total-row-functions.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/total-row-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAE1B,+BAA+B,EAE/B,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,gBAAgB,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,sBAAsB,EAgBrD,CAAC;AAEJ,uFAAuF;AACvF,eAAO,MAAM,4BAA4B,eAAe,CAAC;AAEzD,OAAO,EAAE,0BAA0B,EAAE,+BAA+B,IAAI,8BAA8B,EAAE,CAAC;AAEzG;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GACrC,IAAI,gBAAgB,EACpB,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,EACrD,aAAa,MAAM,KAClB,MAAM,GAAG,SAUX,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,EAC3C,aAAa,MAAM,EACnB,IAAI,gBAAgB,KACnB,SAAS,CAAC,SAAS,CAAC,GAAG,SASzB,CAAC"}
@@ -1,19 +1,22 @@
1
+ import { escapeStructuredColumnName, getTotalsRowFormula, getTotalsRowFunctionFromFormula, TOTALS_ROW_FUNCTION_SUBTOTAL, } from "@rowsncolumns/utils";
1
2
  export const TOTAL_ROW_FUNCTIONS = [
2
- { id: "none", label: "None" },
3
- { id: "average", label: "Average", subtotal: 101 },
4
- { id: "count", label: "Count", subtotal: 103 },
5
- { id: "countNumbers", label: "Count Numbers", subtotal: 102 },
6
- { id: "max", label: "Max", subtotal: 104 },
7
- { id: "min", label: "Min", subtotal: 105 },
8
- { id: "sum", label: "Sum", subtotal: 109 },
9
- { id: "stdDev", label: "StdDev", subtotal: 107 },
10
- { id: "var", label: "Var", subtotal: 110 },
11
- ];
12
- /**
13
- * Escape a column name for use inside a structured reference: `[`, `]`, `#`
14
- * and `'` are prefixed with `'`, as Excel does.
15
- */
16
- export const escapeStructuredColumnName = (name) => name.replace(/(['\[\]#])/g, "'$1");
3
+ ["none", "None"],
4
+ ["average", "Average"],
5
+ ["count", "Count"],
6
+ ["countNums", "Count Numbers"],
7
+ ["max", "Max"],
8
+ ["min", "Min"],
9
+ ["sum", "Sum"],
10
+ ["stdDev", "StdDev"],
11
+ ["var", "Var"],
12
+ ].map(([id, label]) => ({
13
+ id,
14
+ label,
15
+ subtotal: TOTALS_ROW_FUNCTION_SUBTOTAL[id],
16
+ }));
17
+ /** What "More Functions…" pre-fills in the cell editor for a custom totals formula. */
18
+ export const MORE_FUNCTIONS_INITIAL_VALUE = "=SUBTOTAL(";
19
+ export { escapeStructuredColumnName, getTotalsRowFunctionFromFormula as getTotalRowFunctionFromFormula };
17
20
  /**
18
21
  * Formula for a totals-row cell, e.g. `=SUBTOTAL(109,Table1[Amount])`.
19
22
  * Qualified with the table name so it evaluates from any engine and matches
@@ -24,27 +27,22 @@ export const getTotalRowFunctionFormula = (fn, table, columnIndex) => {
24
27
  if (fn === "none") {
25
28
  return "";
26
29
  }
27
- const option = TOTAL_ROW_FUNCTIONS.find((item) => item.id === fn);
28
30
  const columnName = table.columns?.[columnIndex - table.range.startColumnIndex]?.name;
29
- if (!option?.subtotal || !columnName || !table.title) {
31
+ if (!columnName || !table.title) {
30
32
  return undefined;
31
33
  }
32
- return `=SUBTOTAL(${option.subtotal},${table.title}[${escapeStructuredColumnName(columnName)}])`;
34
+ return getTotalsRowFormula(fn, table.title, columnName);
33
35
  };
34
36
  /**
35
- * Recognise the aggregation a totals-row formula uses, so the picker can show
36
- * the active choice. Both the hidden-row-aware (1xx) and plain (1–11)
37
- * `SUBTOTAL` numbers map to the same option; anything else is "none".
37
+ * The table's columns with `columnIndex`'s `totalsRowFunction` set to `fn` —
38
+ * the shape `onUpdateTable` persists so the choice survives toggling the totals
39
+ * row off and on. `undefined` when the column list does not cover the cell.
38
40
  */
39
- export const getTotalRowFunctionFromFormula = (formula) => {
40
- if (!formula) {
41
- return "none";
42
- }
43
- const match = /^\s*=\s*SUBTOTAL\s*\(\s*(\d{1,3})\s*,/i.exec(formula);
44
- if (!match) {
45
- return "none";
41
+ export const withTotalRowFunction = (table, columnIndex, fn) => {
42
+ const index = columnIndex - table.range.startColumnIndex;
43
+ const column = table.columns?.[index];
44
+ if (!column) {
45
+ return undefined;
46
46
  }
47
- const number = Number(match[1]);
48
- const normalized = number > 100 ? number - 100 : number;
49
- return (TOTAL_ROW_FUNCTIONS.find((item) => item.subtotal !== undefined && item.subtotal - 100 === normalized)?.id ?? "none");
47
+ return table.columns.map((item, i) => i === index ? { ...item, totalsRowFunction: fn } : item);
50
48
  };
@@ -11,6 +11,23 @@ export type ChartComponentProps = {
11
11
  isSelected: boolean;
12
12
  readonly?: boolean;
13
13
  onDeleteChart: CanvasGridProps["onDeleteChart"];
14
+ /**
15
+ * Persist an edited chart (the grid's `onUpdateChart`). Renderers use it
16
+ * for in-place operations such as Switch Row/Column.
17
+ */
18
+ onUpdateChart?: CanvasGridProps["onUpdateChart"];
19
+ /** Chart clipboard (Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D) — for a chart context menu. */
20
+ onCopyChart?: (chartId: EmbeddedChart["chartId"]) => boolean;
21
+ onCutChart?: (chartId: EmbeddedChart["chartId"]) => boolean;
22
+ onPasteChart?: () => boolean;
23
+ onDuplicateChart?: (chartId: EmbeddedChart["chartId"]) => EmbeddedChart | undefined;
24
+ /**
25
+ * Excel's PivotChart field buttons, drawn over the chart frame. The host
26
+ * composes them (`PivotChartFieldButtons` from `@rowsncolumns/pivot`
27
+ * with its pivot tables and sort / filter actions) because the renderer
28
+ * knows nothing about pivots; renderers place the node inside the frame.
29
+ */
30
+ fieldButtons?: React.ReactNode;
14
31
  };
15
32
  export declare const ChartComponent: React.MemoExoticComponent<({ backgroundColor }: ChartComponentProps) => React.JSX.Element>;
16
33
  //# sourceMappingURL=chart-component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-component.d.ts","sourceRoot":"","sources":["../../../../components/embeds/chart-component.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,cAAc,kDACH,mBAAmB,uBAY1C,CAAC"}
1
+ {"version":3,"file":"chart-component.d.ts","sourceRoot":"","sources":["../../../../components/embeds/chart-component.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD;;;OAGG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IACjD,sFAAsF;IACtF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;IAC5D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,CACjB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,KAC9B,aAAa,GAAG,SAAS,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,cAAc,kDACH,mBAAmB,uBAY1C,CAAC"}