@rowsncolumns/spreadsheet 10.2.73 → 10.2.75

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 (270) hide show
  1. package/dist/cjs/api/evaluate-formula.d.ts +17 -0
  2. package/dist/cjs/api/evaluate-formula.d.ts.map +1 -0
  3. package/dist/cjs/api/evaluate-formula.js +141 -0
  4. package/dist/cjs/api/excel-validation-kinds.d.ts +71 -0
  5. package/dist/cjs/api/excel-validation-kinds.d.ts.map +1 -0
  6. package/dist/cjs/api/excel-validation-kinds.js +304 -0
  7. package/dist/cjs/api/go-to-special.d.ts +32 -0
  8. package/dist/cjs/api/go-to-special.d.ts.map +1 -0
  9. package/dist/cjs/api/go-to-special.js +111 -0
  10. package/dist/cjs/api/go-to.d.ts +19 -0
  11. package/dist/cjs/api/go-to.d.ts.map +1 -0
  12. package/dist/cjs/api/go-to.js +49 -0
  13. package/dist/cjs/api/validation-tooltip.d.ts +17 -0
  14. package/dist/cjs/api/validation-tooltip.d.ts.map +1 -0
  15. package/dist/cjs/api/validation-tooltip.js +42 -0
  16. package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts +28 -0
  17. package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
  18. package/dist/cjs/atoms/advanced-filter-dialog.atom.js +32 -0
  19. package/dist/cjs/atoms/evaluate-formula-dialog.atom.d.ts +36 -0
  20. package/dist/cjs/atoms/evaluate-formula-dialog.atom.d.ts.map +1 -0
  21. package/dist/cjs/atoms/evaluate-formula-dialog.atom.js +36 -0
  22. package/dist/cjs/atoms/go-to-dialog.atom.d.ts +46 -0
  23. package/dist/cjs/atoms/go-to-dialog.atom.d.ts.map +1 -0
  24. package/dist/cjs/atoms/go-to-dialog.atom.js +34 -0
  25. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts +29 -0
  26. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
  27. package/dist/cjs/atoms/goal-seek-dialog.atom.js +30 -0
  28. package/dist/cjs/atoms/index.d.ts +5 -0
  29. package/dist/cjs/atoms/index.d.ts.map +1 -1
  30. package/dist/cjs/atoms/index.js +5 -0
  31. package/dist/cjs/atoms/paste-special-dialog.atom.d.ts +29 -0
  32. package/dist/cjs/atoms/paste-special-dialog.atom.d.ts.map +1 -0
  33. package/dist/cjs/atoms/paste-special-dialog.atom.js +34 -0
  34. package/dist/cjs/atoms/remove-duplicates-dialog.atom.d.ts +45 -0
  35. package/dist/cjs/atoms/remove-duplicates-dialog.atom.d.ts.map +1 -0
  36. package/dist/cjs/atoms/remove-duplicates-dialog.atom.js +37 -0
  37. package/dist/cjs/atoms/subtotal-dialog.atom.d.ts +39 -0
  38. package/dist/cjs/atoms/subtotal-dialog.atom.d.ts.map +1 -0
  39. package/dist/cjs/atoms/subtotal-dialog.atom.js +30 -0
  40. package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts +34 -0
  41. package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
  42. package/dist/cjs/atoms/text-to-columns-dialog.atom.js +36 -0
  43. package/dist/cjs/atoms/watch-window.atom.d.ts +37 -0
  44. package/dist/cjs/atoms/watch-window.atom.d.ts.map +1 -0
  45. package/dist/cjs/atoms/watch-window.atom.js +61 -0
  46. package/dist/cjs/components/advanced-filter-dialog/index.d.ts +28 -0
  47. package/dist/cjs/components/advanced-filter-dialog/index.d.ts.map +1 -0
  48. package/dist/cjs/components/advanced-filter-dialog/index.js +134 -0
  49. package/dist/cjs/components/calculation-options-dialog/index.d.ts +33 -0
  50. package/dist/cjs/components/calculation-options-dialog/index.d.ts.map +1 -0
  51. package/dist/cjs/components/calculation-options-dialog/index.js +69 -0
  52. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  53. package/dist/cjs/components/canvas-grid/index.js +208 -19
  54. package/dist/cjs/components/canvas-grid/typings.d.ts +72 -9
  55. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  56. package/dist/cjs/components/cell/alignment.d.ts +30 -0
  57. package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
  58. package/dist/cjs/components/cell/alignment.js +56 -1
  59. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  60. package/dist/cjs/components/cell/index.js +15 -7
  61. package/dist/cjs/components/cell-diff/index.d.ts +3 -2
  62. package/dist/cjs/components/cell-diff/index.d.ts.map +1 -1
  63. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  64. package/dist/cjs/components/cell-editor/index.js +2 -1
  65. package/dist/cjs/components/context-menu/index.d.ts +21 -3
  66. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  67. package/dist/cjs/components/context-menu/index.js +256 -6
  68. package/dist/cjs/components/context-menu/total-row-functions.d.ts +32 -0
  69. package/dist/cjs/components/context-menu/total-row-functions.d.ts.map +1 -0
  70. package/dist/cjs/components/context-menu/total-row-functions.js +62 -0
  71. package/dist/cjs/components/embeds/embed-component.d.ts.map +1 -1
  72. package/dist/cjs/components/embeds/embed-component.js +16 -1
  73. package/dist/cjs/components/evaluate-formula-dialog/index.d.ts +34 -0
  74. package/dist/cjs/components/evaluate-formula-dialog/index.d.ts.map +1 -0
  75. package/dist/cjs/components/evaluate-formula-dialog/index.js +106 -0
  76. package/dist/cjs/components/go-to-dialog/index.d.ts +45 -0
  77. package/dist/cjs/components/go-to-dialog/index.d.ts.map +1 -0
  78. package/dist/cjs/components/go-to-dialog/index.js +136 -0
  79. package/dist/cjs/components/goal-seek-dialog/index.d.ts +32 -0
  80. package/dist/cjs/components/goal-seek-dialog/index.d.ts.map +1 -0
  81. package/dist/cjs/components/goal-seek-dialog/index.js +149 -0
  82. package/dist/cjs/components/paste-special-dialog/index.d.ts +29 -0
  83. package/dist/cjs/components/paste-special-dialog/index.d.ts.map +1 -0
  84. package/dist/cjs/components/paste-special-dialog/index.js +99 -0
  85. package/dist/cjs/components/remove-duplicates-dialog/index.d.ts +37 -0
  86. package/dist/cjs/components/remove-duplicates-dialog/index.d.ts.map +1 -0
  87. package/dist/cjs/components/remove-duplicates-dialog/index.js +91 -0
  88. package/dist/cjs/components/subtotal-dialog/index.d.ts +30 -0
  89. package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -0
  90. package/dist/cjs/components/subtotal-dialog/index.js +126 -0
  91. package/dist/cjs/components/text-to-columns-dialog/index.d.ts +37 -0
  92. package/dist/cjs/components/text-to-columns-dialog/index.d.ts.map +1 -0
  93. package/dist/cjs/components/text-to-columns-dialog/index.js +166 -0
  94. package/dist/cjs/components/toolbar/background-color-selector.d.ts +13 -1
  95. package/dist/cjs/components/toolbar/background-color-selector.d.ts.map +1 -1
  96. package/dist/cjs/components/toolbar/background-color-selector.js +57 -11
  97. package/dist/cjs/components/toolbar/cell-style-selector.d.ts +15 -2
  98. package/dist/cjs/components/toolbar/cell-style-selector.d.ts.map +1 -1
  99. package/dist/cjs/components/toolbar/cell-style-selector.js +56 -3
  100. package/dist/cjs/components/toolbar/fill-selectors.d.ts +49 -0
  101. package/dist/cjs/components/toolbar/fill-selectors.d.ts.map +1 -0
  102. package/dist/cjs/components/toolbar/fill-selectors.js +196 -0
  103. package/dist/cjs/components/toolbar/index.d.ts +2 -0
  104. package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
  105. package/dist/cjs/components/toolbar/index.js +2 -0
  106. package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
  107. package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
  108. package/dist/cjs/components/toolbar/text-horizontal-align-selector.js +23 -4
  109. package/dist/cjs/components/toolbar/text-rotation-selector.d.ts +29 -0
  110. package/dist/cjs/components/toolbar/text-rotation-selector.d.ts.map +1 -0
  111. package/dist/cjs/components/toolbar/text-rotation-selector.js +78 -0
  112. package/dist/cjs/components/toolbar/text-wrap-selector.d.ts +7 -1
  113. package/dist/cjs/components/toolbar/text-wrap-selector.d.ts.map +1 -1
  114. package/dist/cjs/components/toolbar/text-wrap-selector.js +10 -3
  115. package/dist/cjs/components/watch-window/index.d.ts +25 -0
  116. package/dist/cjs/components/watch-window/index.d.ts.map +1 -0
  117. package/dist/cjs/components/watch-window/index.js +63 -0
  118. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  119. package/dist/cjs/hooks/use-cell-renderer.js +17 -6
  120. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +20 -1
  121. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  122. package/dist/cjs/hooks/use-copy-paste-cut.js +25 -20
  123. package/dist/cjs/hooks/use-get-tooltip.d.ts.map +1 -1
  124. package/dist/cjs/hooks/use-get-tooltip.js +7 -2
  125. package/dist/cjs/hooks/use-keyboard-handler.d.ts +17 -2
  126. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  127. package/dist/cjs/hooks/use-keyboard-handler.js +206 -31
  128. package/dist/cjs/index.d.ts +14 -1
  129. package/dist/cjs/index.d.ts.map +1 -1
  130. package/dist/cjs/index.js +15 -1
  131. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  132. package/dist/cjs/types.d.ts +289 -4
  133. package/dist/cjs/types.d.ts.map +1 -1
  134. package/dist/cjs/types.js +19 -1
  135. package/dist/esm/api/evaluate-formula.d.ts +17 -0
  136. package/dist/esm/api/evaluate-formula.d.ts.map +1 -0
  137. package/dist/esm/api/evaluate-formula.js +109 -0
  138. package/dist/esm/api/excel-validation-kinds.d.ts +71 -0
  139. package/dist/esm/api/excel-validation-kinds.d.ts.map +1 -0
  140. package/dist/esm/api/excel-validation-kinds.js +287 -0
  141. package/dist/esm/api/go-to-special.d.ts +32 -0
  142. package/dist/esm/api/go-to-special.d.ts.map +1 -0
  143. package/dist/esm/api/go-to-special.js +96 -0
  144. package/dist/esm/api/go-to.d.ts +19 -0
  145. package/dist/esm/api/go-to.d.ts.map +1 -0
  146. package/dist/esm/api/go-to.js +41 -0
  147. package/dist/esm/api/validation-tooltip.d.ts +17 -0
  148. package/dist/esm/api/validation-tooltip.d.ts.map +1 -0
  149. package/dist/esm/api/validation-tooltip.js +34 -0
  150. package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts +28 -0
  151. package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
  152. package/dist/esm/atoms/advanced-filter-dialog.atom.js +21 -0
  153. package/dist/esm/atoms/evaluate-formula-dialog.atom.d.ts +36 -0
  154. package/dist/esm/atoms/evaluate-formula-dialog.atom.d.ts.map +1 -0
  155. package/dist/esm/atoms/evaluate-formula-dialog.atom.js +25 -0
  156. package/dist/esm/atoms/go-to-dialog.atom.d.ts +46 -0
  157. package/dist/esm/atoms/go-to-dialog.atom.d.ts.map +1 -0
  158. package/dist/esm/atoms/go-to-dialog.atom.js +25 -0
  159. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts +29 -0
  160. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
  161. package/dist/esm/atoms/goal-seek-dialog.atom.js +21 -0
  162. package/dist/esm/atoms/index.d.ts +5 -0
  163. package/dist/esm/atoms/index.d.ts.map +1 -1
  164. package/dist/esm/atoms/index.js +5 -0
  165. package/dist/esm/atoms/paste-special-dialog.atom.d.ts +29 -0
  166. package/dist/esm/atoms/paste-special-dialog.atom.d.ts.map +1 -0
  167. package/dist/esm/atoms/paste-special-dialog.atom.js +25 -0
  168. package/dist/esm/atoms/remove-duplicates-dialog.atom.d.ts +45 -0
  169. package/dist/esm/atoms/remove-duplicates-dialog.atom.d.ts.map +1 -0
  170. package/dist/esm/atoms/remove-duplicates-dialog.atom.js +26 -0
  171. package/dist/esm/atoms/subtotal-dialog.atom.d.ts +39 -0
  172. package/dist/esm/atoms/subtotal-dialog.atom.d.ts.map +1 -0
  173. package/dist/esm/atoms/subtotal-dialog.atom.js +21 -0
  174. package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts +34 -0
  175. package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
  176. package/dist/esm/atoms/text-to-columns-dialog.atom.js +25 -0
  177. package/dist/esm/atoms/watch-window.atom.d.ts +37 -0
  178. package/dist/esm/atoms/watch-window.atom.d.ts.map +1 -0
  179. package/dist/esm/atoms/watch-window.atom.js +37 -0
  180. package/dist/esm/components/advanced-filter-dialog/index.d.ts +28 -0
  181. package/dist/esm/components/advanced-filter-dialog/index.d.ts.map +1 -0
  182. package/dist/esm/components/advanced-filter-dialog/index.js +125 -0
  183. package/dist/esm/components/calculation-options-dialog/index.d.ts +33 -0
  184. package/dist/esm/components/calculation-options-dialog/index.d.ts.map +1 -0
  185. package/dist/esm/components/calculation-options-dialog/index.js +61 -0
  186. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  187. package/dist/esm/components/canvas-grid/index.js +202 -19
  188. package/dist/esm/components/canvas-grid/typings.d.ts +72 -9
  189. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  190. package/dist/esm/components/cell/alignment.d.ts +30 -0
  191. package/dist/esm/components/cell/alignment.d.ts.map +1 -1
  192. package/dist/esm/components/cell/alignment.js +51 -0
  193. package/dist/esm/components/cell/index.d.ts.map +1 -1
  194. package/dist/esm/components/cell/index.js +16 -8
  195. package/dist/esm/components/cell-diff/index.d.ts +3 -2
  196. package/dist/esm/components/cell-diff/index.d.ts.map +1 -1
  197. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  198. package/dist/esm/components/cell-editor/index.js +2 -1
  199. package/dist/esm/components/context-menu/index.d.ts +21 -3
  200. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  201. package/dist/esm/components/context-menu/index.js +251 -9
  202. package/dist/esm/components/context-menu/total-row-functions.d.ts +32 -0
  203. package/dist/esm/components/context-menu/total-row-functions.d.ts.map +1 -0
  204. package/dist/esm/components/context-menu/total-row-functions.js +50 -0
  205. package/dist/esm/components/embeds/embed-component.d.ts.map +1 -1
  206. package/dist/esm/components/embeds/embed-component.js +17 -1
  207. package/dist/esm/components/evaluate-formula-dialog/index.d.ts +34 -0
  208. package/dist/esm/components/evaluate-formula-dialog/index.d.ts.map +1 -0
  209. package/dist/esm/components/evaluate-formula-dialog/index.js +86 -0
  210. package/dist/esm/components/go-to-dialog/index.d.ts +45 -0
  211. package/dist/esm/components/go-to-dialog/index.d.ts.map +1 -0
  212. package/dist/esm/components/go-to-dialog/index.js +124 -0
  213. package/dist/esm/components/goal-seek-dialog/index.d.ts +32 -0
  214. package/dist/esm/components/goal-seek-dialog/index.d.ts.map +1 -0
  215. package/dist/esm/components/goal-seek-dialog/index.js +125 -0
  216. package/dist/esm/components/paste-special-dialog/index.d.ts +29 -0
  217. package/dist/esm/components/paste-special-dialog/index.d.ts.map +1 -0
  218. package/dist/esm/components/paste-special-dialog/index.js +90 -0
  219. package/dist/esm/components/remove-duplicates-dialog/index.d.ts +37 -0
  220. package/dist/esm/components/remove-duplicates-dialog/index.d.ts.map +1 -0
  221. package/dist/esm/components/remove-duplicates-dialog/index.js +82 -0
  222. package/dist/esm/components/subtotal-dialog/index.d.ts +30 -0
  223. package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -0
  224. package/dist/esm/components/subtotal-dialog/index.js +115 -0
  225. package/dist/esm/components/text-to-columns-dialog/index.d.ts +37 -0
  226. package/dist/esm/components/text-to-columns-dialog/index.d.ts.map +1 -0
  227. package/dist/esm/components/text-to-columns-dialog/index.js +147 -0
  228. package/dist/esm/components/toolbar/background-color-selector.d.ts +13 -1
  229. package/dist/esm/components/toolbar/background-color-selector.d.ts.map +1 -1
  230. package/dist/esm/components/toolbar/background-color-selector.js +61 -11
  231. package/dist/esm/components/toolbar/cell-style-selector.d.ts +15 -2
  232. package/dist/esm/components/toolbar/cell-style-selector.d.ts.map +1 -1
  233. package/dist/esm/components/toolbar/cell-style-selector.js +46 -2
  234. package/dist/esm/components/toolbar/fill-selectors.d.ts +49 -0
  235. package/dist/esm/components/toolbar/fill-selectors.d.ts.map +1 -0
  236. package/dist/esm/components/toolbar/fill-selectors.js +162 -0
  237. package/dist/esm/components/toolbar/index.d.ts +2 -0
  238. package/dist/esm/components/toolbar/index.d.ts.map +1 -1
  239. package/dist/esm/components/toolbar/index.js +2 -0
  240. package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
  241. package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
  242. package/dist/esm/components/toolbar/text-horizontal-align-selector.js +21 -5
  243. package/dist/esm/components/toolbar/text-rotation-selector.d.ts +29 -0
  244. package/dist/esm/components/toolbar/text-rotation-selector.d.ts.map +1 -0
  245. package/dist/esm/components/toolbar/text-rotation-selector.js +71 -0
  246. package/dist/esm/components/toolbar/text-wrap-selector.d.ts +7 -1
  247. package/dist/esm/components/toolbar/text-wrap-selector.d.ts.map +1 -1
  248. package/dist/esm/components/toolbar/text-wrap-selector.js +10 -3
  249. package/dist/esm/components/watch-window/index.d.ts +25 -0
  250. package/dist/esm/components/watch-window/index.d.ts.map +1 -0
  251. package/dist/esm/components/watch-window/index.js +54 -0
  252. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  253. package/dist/esm/hooks/use-cell-renderer.js +17 -6
  254. package/dist/esm/hooks/use-copy-paste-cut.d.ts +20 -1
  255. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  256. package/dist/esm/hooks/use-copy-paste-cut.js +8 -3
  257. package/dist/esm/hooks/use-get-tooltip.d.ts.map +1 -1
  258. package/dist/esm/hooks/use-get-tooltip.js +7 -2
  259. package/dist/esm/hooks/use-keyboard-handler.d.ts +17 -2
  260. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  261. package/dist/esm/hooks/use-keyboard-handler.js +193 -31
  262. package/dist/esm/index.d.ts +14 -1
  263. package/dist/esm/index.d.ts.map +1 -1
  264. package/dist/esm/index.js +13 -0
  265. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  266. package/dist/esm/types.d.ts +289 -4
  267. package/dist/esm/types.d.ts.map +1 -1
  268. package/dist/esm/types.js +18 -0
  269. package/dist/spreadsheet.min.css +1 -1
  270. package/package.json +6 -6
@@ -1,6 +1,6 @@
1
1
  import type { CellInterface, SelectionArea } from "@rowsncolumns/grid";
2
2
  import React from "react";
3
- import type { PasteSpecialType } from "../../hooks/use-copy-paste-cut";
3
+ import type { PasteSpecialRequest } from "../../hooks/use-copy-paste-cut";
4
4
  import type { SheetRange } from "../../types";
5
5
  import type { CanvasGridProps, SelectionAttributes } from "../canvas-grid/typings";
6
6
  export type ContextMenuProps = {
@@ -62,6 +62,13 @@ export type ContextMenuProps = {
62
62
  onSortTable: CanvasGridProps["onSortTable"];
63
63
  onSplitTextToColumns: CanvasGridProps["onSplitTextToColumns"];
64
64
  onRemoveDuplicates: CanvasGridProps["onRemoveDuplicates"];
65
+ onGoalSeek?: CanvasGridProps["onGoalSeek"];
66
+ onSubtotal?: CanvasGridProps["onSubtotal"];
67
+ onAdvancedFilter?: CanvasGridProps["onAdvancedFilter"];
68
+ /** Writes a table totals-row aggregation formula into the active cell. */
69
+ onChange?: CanvasGridProps["onChange"];
70
+ /** Reads the active cell's formula to highlight its totals-row function. */
71
+ getCellData?: CanvasGridProps["getCellData"];
65
72
  isHiddenColumn(columnIndex: number): boolean;
66
73
  isHiddenRow(rowIndex: number): boolean;
67
74
  getFormattedValue: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined;
@@ -70,11 +77,22 @@ export type ContextMenuProps = {
70
77
  isTableHeader(rowIndex: number, columnIndex: number): boolean;
71
78
  focusSheet(): void;
72
79
  onCopy?(): void;
73
- onPaste?(pasteSpecialType?: PasteSpecialType): void;
80
+ onPaste?(pasteSpecial?: PasteSpecialRequest): void;
81
+ /** Opens the Paste Special dialog (Excel `Ctrl+Alt+V`). */
82
+ onRequestPasteSpecial?(): void;
83
+ /**
84
+ * Opens the Evaluate Formula stepper for the active cell. Only rendered
85
+ * when the active cell holds a formula.
86
+ */
87
+ onRequestEvaluateFormula?(sheetId: number, cell: CellInterface): void;
88
+ /** Whether the active cell holds a formula (drives the Evaluate Formula item). */
89
+ isActiveCellFormula?: boolean;
90
+ /** Adds the active cell to the Watch Window (only while a host is mounted). */
91
+ onRequestAddWatch?(sheetId: number, cell: CellInterface): void;
74
92
  onCut?(): void;
75
93
  readonly?: boolean;
76
94
  onAddQuickEdit(range: SheetRange): void;
77
95
  enableMagicFill?: boolean;
78
96
  };
79
- export declare 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, onPaste, 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, isHiddenColumn, isHiddenRow, onShowColumn, onShowRow, tables, pivotTables, protectedRanges, sheetId, frozenRows, frozenColumns, selectedRowHeadersIds, selectedColumnHeadersIds, readonly, onAddQuickEdit, enableMagicFill, }: ContextMenuProps) => React.JSX.Element;
97
+ export declare 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, 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, readonly, onAddQuickEdit, enableMagicFill, }: ContextMenuProps) => React.JSX.Element;
80
98
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/context-menu/index.tsx"],"names":[],"mappings":"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"}
@@ -9,11 +9,17 @@ var utils_1 = require("@rowsncolumns/utils");
9
9
  var react_1 = tslib_1.__importStar(require("react"));
10
10
  var validation_1 = require("../../api/validation");
11
11
  var atoms_1 = require("../../atoms");
12
+ var advanced_filter_dialog_atom_1 = require("../../atoms/advanced-filter-dialog.atom");
13
+ var goal_seek_dialog_atom_1 = require("../../atoms/goal-seek-dialog.atom");
14
+ var remove_duplicates_dialog_atom_1 = require("../../atoms/remove-duplicates-dialog.atom");
15
+ var subtotal_dialog_atom_1 = require("../../atoms/subtotal-dialog.atom");
16
+ var text_to_columns_dialog_atom_1 = require("../../atoms/text-to-columns-dialog.atom");
12
17
  var config_1 = require("../../config");
13
18
  var helpers_1 = require("../../helpers");
19
+ var total_row_functions_1 = require("./total-row-functions");
14
20
  var ContextMenu = function (_a) {
15
21
  var _b;
16
- var isRowHeader = _a.isRowHeader, isColumnHeader = _a.isColumnHeader, activeCell = _a.activeCell, selections = _a.selections, basicFilter = _a.basicFilter, isTableHeader = _a.isTableHeader, onClearContents = _a.onClearContents, onHideColumn = _a.onHideColumn, onHideRow = _a.onHideRow, onGroupRows = _a.onGroupRows, onUngroupRows = _a.onUngroupRows, onGroupColumns = _a.onGroupColumns, onUngroupColumns = _a.onUngroupColumns, onDeleteRow = _a.onDeleteRow, onDeleteColumn = _a.onDeleteColumn, onInsertColumn = _a.onInsertColumn, onInsertRow = _a.onInsertRow, onInsertCellsShiftDown = _a.onInsertCellsShiftDown, onInsertCellsShiftRight = _a.onInsertCellsShiftRight, onDeleteCellsShiftLeft = _a.onDeleteCellsShiftLeft, onDeleteCellsShiftUp = _a.onDeleteCellsShiftUp, onFreezeRow = _a.onFreezeRow, onFreezeColumn = _a.onFreezeColumn, onCopy = _a.onCopy, onCut = _a.onCut, onPaste = _a.onPaste, onInsertNote = _a.onInsertNote, onProtectRange = _a.onProtectRange, onUnProtectRange = _a.onUnProtectRange, onSortRange = _a.onSortRange, onSortColumn = _a.onSortColumn, onRequestDefineNamedRange = _a.onRequestDefineNamedRange, onRequestResize = _a.onRequestResize, onRequestEditTable = _a.onRequestEditTable, onRequestEditPivotTable = _a.onRequestEditPivotTable, onRequestDeletePivotTable = _a.onRequestDeletePivotTable, onPivotDrillDown = _a.onPivotDrillDown, onRequestFormatCells = _a.onRequestFormatCells, onRequestConditionalFormat = _a.onRequestConditionalFormat, onRequestDataValidation = _a.onRequestDataValidation, onRemoveTable = _a.onRemoveTable, onClearFormatting = _a.onClearFormatting, onCreateTable = _a.onCreateTable, onCreateBasicFilter = _a.onCreateBasicFilter, onFilterTable = _a.onFilterTable, onSortTable = _a.onSortTable, getFormattedValuesFromRange = _a.getFormattedValuesFromRange, focusSheet = _a.focusSheet, isSheetFocused = _a.isSheetFocused, getFormattedValue = _a.getFormattedValue, onInsertTableColumn = _a.onInsertTableColumn, onDeleteTableColumn = _a.onDeleteTableColumn, onInsertTableRow = _a.onInsertTableRow, onDeleteTableRow = _a.onDeleteTableRow, onSplitTextToColumns = _a.onSplitTextToColumns, onRemoveDuplicates = _a.onRemoveDuplicates, isHiddenColumn = _a.isHiddenColumn, isHiddenRow = _a.isHiddenRow, onShowColumn = _a.onShowColumn, onShowRow = _a.onShowRow, tables = _a.tables, pivotTables = _a.pivotTables, protectedRanges = _a.protectedRanges, sheetId = _a.sheetId, frozenRows = _a.frozenRows, frozenColumns = _a.frozenColumns, selectedRowHeadersIds = _a.selectedRowHeadersIds, selectedColumnHeadersIds = _a.selectedColumnHeadersIds, _c = _a.readonly, readonly = _c === void 0 ? false : _c, onAddQuickEdit = _a.onAddQuickEdit, enableMagicFill = _a.enableMagicFill;
22
+ var isRowHeader = _a.isRowHeader, isColumnHeader = _a.isColumnHeader, activeCell = _a.activeCell, selections = _a.selections, basicFilter = _a.basicFilter, isTableHeader = _a.isTableHeader, onClearContents = _a.onClearContents, onHideColumn = _a.onHideColumn, onHideRow = _a.onHideRow, onGroupRows = _a.onGroupRows, onUngroupRows = _a.onUngroupRows, onGroupColumns = _a.onGroupColumns, onUngroupColumns = _a.onUngroupColumns, onDeleteRow = _a.onDeleteRow, onDeleteColumn = _a.onDeleteColumn, onInsertColumn = _a.onInsertColumn, onInsertRow = _a.onInsertRow, onInsertCellsShiftDown = _a.onInsertCellsShiftDown, onInsertCellsShiftRight = _a.onInsertCellsShiftRight, onDeleteCellsShiftLeft = _a.onDeleteCellsShiftLeft, onDeleteCellsShiftUp = _a.onDeleteCellsShiftUp, onFreezeRow = _a.onFreezeRow, onFreezeColumn = _a.onFreezeColumn, onCopy = _a.onCopy, onCut = _a.onCut, onPaste = _a.onPaste, onRequestPasteSpecial = _a.onRequestPasteSpecial, onRequestEvaluateFormula = _a.onRequestEvaluateFormula, onRequestAddWatch = _a.onRequestAddWatch, isActiveCellFormula = _a.isActiveCellFormula, onInsertNote = _a.onInsertNote, onProtectRange = _a.onProtectRange, onUnProtectRange = _a.onUnProtectRange, onSortRange = _a.onSortRange, onSortColumn = _a.onSortColumn, onRequestDefineNamedRange = _a.onRequestDefineNamedRange, onRequestResize = _a.onRequestResize, onRequestEditTable = _a.onRequestEditTable, onRequestEditPivotTable = _a.onRequestEditPivotTable, onRequestDeletePivotTable = _a.onRequestDeletePivotTable, onPivotDrillDown = _a.onPivotDrillDown, onRequestFormatCells = _a.onRequestFormatCells, onRequestConditionalFormat = _a.onRequestConditionalFormat, onRequestDataValidation = _a.onRequestDataValidation, onRemoveTable = _a.onRemoveTable, onClearFormatting = _a.onClearFormatting, onCreateTable = _a.onCreateTable, onCreateBasicFilter = _a.onCreateBasicFilter, onFilterTable = _a.onFilterTable, onSortTable = _a.onSortTable, getFormattedValuesFromRange = _a.getFormattedValuesFromRange, focusSheet = _a.focusSheet, isSheetFocused = _a.isSheetFocused, getFormattedValue = _a.getFormattedValue, onInsertTableColumn = _a.onInsertTableColumn, onDeleteTableColumn = _a.onDeleteTableColumn, onInsertTableRow = _a.onInsertTableRow, onDeleteTableRow = _a.onDeleteTableRow, onSplitTextToColumns = _a.onSplitTextToColumns, onRemoveDuplicates = _a.onRemoveDuplicates, onGoalSeek = _a.onGoalSeek, onSubtotal = _a.onSubtotal, onAdvancedFilter = _a.onAdvancedFilter, onChange = _a.onChange, getCellData = _a.getCellData, isHiddenColumn = _a.isHiddenColumn, isHiddenRow = _a.isHiddenRow, onShowColumn = _a.onShowColumn, onShowRow = _a.onShowRow, tables = _a.tables, pivotTables = _a.pivotTables, protectedRanges = _a.protectedRanges, sheetId = _a.sheetId, frozenRows = _a.frozenRows, frozenColumns = _a.frozenColumns, selectedRowHeadersIds = _a.selectedRowHeadersIds, selectedColumnHeadersIds = _a.selectedColumnHeadersIds, _c = _a.readonly, readonly = _c === void 0 ? false : _c, onAddQuickEdit = _a.onAddQuickEdit, enableMagicFill = _a.enableMagicFill;
17
23
  var isHeader = isColumnHeader || isRowHeader;
18
24
  var shouldFocusSheetRef = (0, react_1.useRef)(true);
19
25
  var multiColumnTitle = (0, helpers_1.generateMultiDimTitle)(selectedColumnHeadersIds, "y");
@@ -53,6 +59,192 @@ var ContextMenu = function (_a) {
53
59
  var lastSelectedRowIndex = selectedRowHeadersIds.reduce(function (m, v) { return (v > m ? v : m); }, -Infinity);
54
60
  // Get contentful range
55
61
  var getContentfulRangeAroundCell = (0, atoms_1.useGetContentfulRangeAroundCell)();
62
+ // The data block the data tools act on: a table's own rows, the selection,
63
+ // or (from a lone cell) the contentful region around it — like Excel.
64
+ var dataRangeAroundSelection = (0, react_1.useCallback)(function () {
65
+ var _a;
66
+ if (activeTable) {
67
+ return tslib_1.__assign(tslib_1.__assign({}, activeTable.range), { endRowIndex: activeTable.range.endRowIndex - (activeTable.totalRow ? 1 : 0) });
68
+ }
69
+ if (selections.length) {
70
+ return selection.range;
71
+ }
72
+ return (_a = getContentfulRangeAroundCell === null || getContentfulRangeAroundCell === void 0 ? void 0 : getContentfulRangeAroundCell(sheetId, activeCell)) !== null && _a !== void 0 ? _a : selection.range;
73
+ }, [activeTable, selections.length, selection.range, getContentfulRangeAroundCell, sheetId, activeCell]);
74
+ // Excel pre-ticks "my data has headers" when the first row reads as labels:
75
+ // every cell filled and none of them a number.
76
+ var headerColumnsOf = (0, react_1.useCallback)(function (range) {
77
+ var _a, _b, _c, _d;
78
+ var columns = [];
79
+ for (var columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
80
+ var header = (_c = (_b = (_a = activeTable === null || activeTable === void 0 ? void 0 : activeTable.columns) === null || _a === void 0 ? void 0 : _a[columnIndex - activeTable.range.startColumnIndex]) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : getFormattedValue(sheetId, range.startRowIndex, columnIndex);
81
+ columns.push({
82
+ columnIndex: columnIndex,
83
+ label: "Column ".concat((0, utils_1.number2Alpha)(columnIndex - 1)),
84
+ header: header || undefined,
85
+ });
86
+ }
87
+ var hasHeader = activeTable
88
+ ? ((_d = activeTable.headerRow) !== null && _d !== void 0 ? _d : true)
89
+ : range.endRowIndex > range.startRowIndex &&
90
+ columns.every(function (column) { return !!column.header && Number.isNaN(Number(column.header)); });
91
+ return { columns: columns, hasHeader: hasHeader };
92
+ }, [activeTable, getFormattedValue, sheetId]);
93
+ var rangeAddress = function (range) {
94
+ return "".concat((0, utils_1.cellToAddress)({ rowIndex: range.startRowIndex, columnIndex: range.startColumnIndex }), ":").concat((0, utils_1.cellToAddress)({ rowIndex: range.endRowIndex, columnIndex: range.endColumnIndex }));
95
+ };
96
+ // Text to Columns → Fixed width (dialog with a ruler over the selected column).
97
+ var isTextToColumnsDialogMounted = (0, text_to_columns_dialog_atom_1.useIsTextToColumnsDialogMounted)();
98
+ var openTextToColumnsDialog = (0, text_to_columns_dialog_atom_1.useOpenTextToColumnsDialog)();
99
+ var handleTextToColumnsDialog = (0, react_1.useCallback)(function () {
100
+ var _a;
101
+ var range = selections.length ? selection.range : dataRangeAroundSelection();
102
+ var columnIndex = selections.length ? range.startColumnIndex : activeCell.columnIndex;
103
+ var preview = [];
104
+ var firstRow = selections.length ? range.startRowIndex : activeCell.rowIndex;
105
+ var lastRow = selections.length ? range.endRowIndex : range.endRowIndex;
106
+ for (var rowIndex = firstRow; rowIndex <= lastRow && preview.length < 8; rowIndex++) {
107
+ preview.push((_a = getFormattedValue(sheetId, rowIndex, columnIndex)) !== null && _a !== void 0 ? _a : "");
108
+ }
109
+ var target = selections.length
110
+ ? selections
111
+ : [
112
+ {
113
+ range: {
114
+ startRowIndex: activeCell.rowIndex,
115
+ endRowIndex: range.endRowIndex,
116
+ startColumnIndex: columnIndex,
117
+ endColumnIndex: columnIndex,
118
+ },
119
+ },
120
+ ];
121
+ openTextToColumnsDialog({
122
+ preview: preview,
123
+ onApply: function (_a) {
124
+ var delimiter = _a.delimiter, columnBreaks = _a.columnBreaks;
125
+ return onSplitTextToColumns === null || onSplitTextToColumns === void 0 ? void 0 : onSplitTextToColumns(sheetId, activeCell, target, delimiter, { columnBreaks: columnBreaks });
126
+ },
127
+ });
128
+ }, [
129
+ selections,
130
+ selection.range,
131
+ dataRangeAroundSelection,
132
+ activeCell,
133
+ getFormattedValue,
134
+ sheetId,
135
+ openTextToColumnsDialog,
136
+ onSplitTextToColumns,
137
+ ]);
138
+ // Data → Subtotal.
139
+ var isSubtotalDialogMounted = (0, subtotal_dialog_atom_1.useIsSubtotalDialogMounted)();
140
+ var openSubtotalDialog = (0, subtotal_dialog_atom_1.useOpenSubtotalDialog)();
141
+ var handleSubtotal = (0, react_1.useCallback)(function () {
142
+ var range = dataRangeAroundSelection();
143
+ var _a = headerColumnsOf(range), columns = _a.columns, hasHeader = _a.hasHeader;
144
+ openSubtotalDialog({
145
+ columns: columns,
146
+ hasHeader: hasHeader,
147
+ onApply: function (choices) { return onSubtotal === null || onSubtotal === void 0 ? void 0 : onSubtotal(sheetId, tslib_1.__assign({ range: range }, choices)); },
148
+ });
149
+ }, [dataRangeAroundSelection, headerColumnsOf, openSubtotalDialog, onSubtotal, sheetId]);
150
+ // Data → Advanced filter.
151
+ var isAdvancedFilterDialogMounted = (0, advanced_filter_dialog_atom_1.useIsAdvancedFilterDialogMounted)();
152
+ var openAdvancedFilterDialog = (0, advanced_filter_dialog_atom_1.useOpenAdvancedFilterDialog)();
153
+ var handleAdvancedFilter = (0, react_1.useCallback)(function () {
154
+ openAdvancedFilterDialog({
155
+ listRange: rangeAddress(dataRangeAroundSelection()),
156
+ onApply: function (options) { return onAdvancedFilter === null || onAdvancedFilter === void 0 ? void 0 : onAdvancedFilter(sheetId, options); },
157
+ });
158
+ }, [openAdvancedFilterDialog, dataRangeAroundSelection, onAdvancedFilter, sheetId]);
159
+ // Data → What-If Analysis → Goal Seek.
160
+ var isGoalSeekDialogMounted = (0, goal_seek_dialog_atom_1.useIsGoalSeekDialogMounted)();
161
+ var openGoalSeekDialog = (0, goal_seek_dialog_atom_1.useOpenGoalSeekDialog)();
162
+ var handleGoalSeek = (0, react_1.useCallback)(function () {
163
+ var _a;
164
+ openGoalSeekDialog({
165
+ setCell: (_a = (0, utils_1.cellToAddress)(activeCell)) !== null && _a !== void 0 ? _a : "",
166
+ onApply: function (setCellAddress, targetValue, changingCellAddress) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
167
+ var setCell, changingCell;
168
+ return tslib_1.__generator(this, function (_a) {
169
+ setCell = (0, utils_1.addressToCell)(setCellAddress);
170
+ changingCell = (0, utils_1.addressToCell)(changingCellAddress);
171
+ if (!setCell || !changingCell || !onGoalSeek)
172
+ return [2 /*return*/, undefined];
173
+ return [2 /*return*/, onGoalSeek(sheetId, setCell, targetValue, changingCell)];
174
+ });
175
+ }); },
176
+ });
177
+ }, [openGoalSeekDialog, activeCell, onGoalSeek, sheetId]);
178
+ // Remove duplicates — Excel's dialog (column checklist + "my data has
179
+ // headers") when a host mounts `RemoveDuplicatesDialogHost`, otherwise the
180
+ // one-click de-dupe over the selection.
181
+ var isRemoveDuplicatesDialogMounted = (0, remove_duplicates_dialog_atom_1.useIsRemoveDuplicatesDialogMounted)();
182
+ var openRemoveDuplicatesDialog = (0, remove_duplicates_dialog_atom_1.useOpenRemoveDuplicatesDialog)();
183
+ var handleRemoveDuplicates = (0, react_1.useCallback)(function () {
184
+ var _a, _b, _c, _d, _e;
185
+ if (!isRemoveDuplicatesDialogMounted) {
186
+ onRemoveDuplicates === null || onRemoveDuplicates === void 0 ? void 0 : onRemoveDuplicates(sheetId, activeCell, selections);
187
+ return;
188
+ }
189
+ // A table de-dupes its own rows; a lone cell expands to the data region
190
+ // around it, like Excel.
191
+ var range;
192
+ if (activeTable) {
193
+ range = tslib_1.__assign(tslib_1.__assign({}, activeTable.range), { endRowIndex: activeTable.range.endRowIndex - (activeTable.totalRow ? 1 : 0) });
194
+ }
195
+ else if (selections.length) {
196
+ range = selection.range;
197
+ }
198
+ else {
199
+ range = (_a = getContentfulRangeAroundCell === null || getContentfulRangeAroundCell === void 0 ? void 0 : getContentfulRangeAroundCell(sheetId, activeCell)) !== null && _a !== void 0 ? _a : selection.range;
200
+ }
201
+ var columns = [];
202
+ for (var columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
203
+ var header = (_d = (_c = (_b = activeTable === null || activeTable === void 0 ? void 0 : activeTable.columns) === null || _b === void 0 ? void 0 : _b[columnIndex - activeTable.range.startColumnIndex]) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : getFormattedValue(sheetId, range.startRowIndex, columnIndex);
204
+ columns.push({
205
+ columnIndex: columnIndex,
206
+ label: "Column ".concat((0, utils_1.number2Alpha)(columnIndex - 1)),
207
+ header: header || undefined,
208
+ });
209
+ }
210
+ // Excel pre-ticks "my data has headers" when the first row reads as
211
+ // labels: every cell filled and none of them a number.
212
+ var hasHeader = activeTable
213
+ ? ((_e = activeTable.headerRow) !== null && _e !== void 0 ? _e : true)
214
+ : range.endRowIndex > range.startRowIndex &&
215
+ columns.every(function (column) { return !!column.header && Number.isNaN(Number(column.header)); });
216
+ var target = range;
217
+ openRemoveDuplicatesDialog({
218
+ columns: columns,
219
+ hasHeader: hasHeader,
220
+ onApply: function (options) {
221
+ return onRemoveDuplicates === null || onRemoveDuplicates === void 0 ? void 0 : onRemoveDuplicates(sheetId, activeCell, [{ range: target }], options);
222
+ },
223
+ });
224
+ }, [
225
+ isRemoveDuplicatesDialogMounted,
226
+ openRemoveDuplicatesDialog,
227
+ onRemoveDuplicates,
228
+ sheetId,
229
+ activeCell,
230
+ selections,
231
+ selection,
232
+ activeTable,
233
+ getContentfulRangeAroundCell,
234
+ getFormattedValue,
235
+ ]);
236
+ // Totals-row function picker: the active cell sits on a table's totals row.
237
+ var isActiveCellTableTotal = !!(activeTable === null || activeTable === void 0 ? void 0 : activeTable.totalRow) &&
238
+ activeCell.rowIndex === activeTable.range.endRowIndex;
239
+ var activeTotalRowFunction = (0, react_1.useMemo)(function () {
240
+ var _a, _b;
241
+ if (!isActiveCellTableTotal) {
242
+ return "none";
243
+ }
244
+ var cellData = getCellData === null || getCellData === void 0 ? void 0 : getCellData(sheetId, activeCell.rowIndex, activeCell.columnIndex);
245
+ var ue = (_a = cellData === null || cellData === void 0 ? void 0 : cellData.ue) !== null && _a !== void 0 ? _a : cellData === null || cellData === void 0 ? void 0 : cellData.userEnteredValue;
246
+ return (0, total_row_functions_1.getTotalRowFunctionFromFormula)((_b = ue === null || ue === void 0 ? void 0 : ue.fv) !== null && _b !== void 0 ? _b : ue === null || ue === void 0 ? void 0 : ue.formulaValue);
247
+ }, [isActiveCellTableTotal, getCellData, sheetId, activeCell]);
56
248
  // Sort table or filter
57
249
  var onSortTableOrFilterView = (0, react_1.useCallback)(function (direction) {
58
250
  // Found a table
@@ -169,7 +361,16 @@ var ContextMenu = function (_a) {
169
361
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onPaste === null || onPaste === void 0 ? void 0 : onPaste("Formatting"); } }, "Formatting only"),
170
362
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onPaste === null || onPaste === void 0 ? void 0 : onPaste("Formula"); } }, "Formula"),
171
363
  react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
172
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onPaste === null || onPaste === void 0 ? void 0 : onPaste("Transposed"); } }, "Transposed"))),
364
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onPaste === null || onPaste === void 0 ? void 0 : onPaste("Transposed"); } }, "Transposed"),
365
+ onRequestPasteSpecial ? (react_1.default.createElement(react_1.default.Fragment, null,
366
+ react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
367
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
368
+ // Focus moves to the dialog, not back to the sheet
369
+ shouldFocusSheetRef.current = false;
370
+ onRequestPasteSpecial();
371
+ } },
372
+ "Paste special\u2026",
373
+ react_1.default.createElement(ui_1.DropdownRightSlot, null, "\u2318\u2325V")))) : null)),
173
374
  enableMagicFill ? (react_1.default.createElement(react_1.default.Fragment, null,
174
375
  react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
175
376
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
@@ -499,7 +700,26 @@ var ContextMenu = function (_a) {
499
700
  react_1.default.createElement(icons_1.ChevronRightIcon, null))),
500
701
  react_1.default.createElement(ui_1.DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
501
702
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onRemoveTable === null || onRemoveTable === void 0 ? void 0 : onRemoveTable(activeTable); }, disabled: readonly }, "Convert to range"),
502
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onRequestEditTable === null || onRequestEditTable === void 0 ? void 0 : onRequestEditTable(activeTable); }, disabled: readonly }, "Edit table")))) : null,
703
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onRequestEditTable === null || onRequestEditTable === void 0 ? void 0 : onRequestEditTable(activeTable); }, disabled: readonly }, "Edit table"),
704
+ isActiveCellTableTotal ? (react_1.default.createElement(ui_1.DropdownMenuSub, null,
705
+ react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
706
+ "Total row function",
707
+ react_1.default.createElement(ui_1.DropdownRightSlot, null,
708
+ react_1.default.createElement(icons_1.ChevronRightIcon, null))),
709
+ react_1.default.createElement(ui_1.DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 }, total_row_functions_1.TOTAL_ROW_FUNCTIONS.map(function (option) { return (react_1.default.createElement(ui_1.DropdownMenuCheckboxItem, { key: option.id, checked: activeTotalRowFunction === option.id, disabled: readonly, onSelect: function () {
710
+ var formula = (0, total_row_functions_1.getTotalRowFunctionFormula)(option.id, activeTable, activeCell.columnIndex);
711
+ if (formula === undefined) {
712
+ return;
713
+ }
714
+ if (formula === "") {
715
+ onClearContents === null || onClearContents === void 0 ? void 0 : onClearContents(sheetId, activeCell, (0, grid_1.selectionFromActiveCell)(activeCell));
716
+ return;
717
+ }
718
+ onChange === null || onChange === void 0 ? void 0 : onChange(sheetId, activeCell, formula, null);
719
+ } },
720
+ react_1.default.createElement(ui_1.DropdownMenuItemIndicator, null,
721
+ react_1.default.createElement(icons_1.CheckIcon, null)),
722
+ option.label)); })))) : null))) : null,
503
723
  activePivotTable ? (react_1.default.createElement(ui_1.DropdownMenuSub, null,
504
724
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
505
725
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
@@ -607,9 +827,23 @@ var ContextMenu = function (_a) {
607
827
  }, disabled: readonly },
608
828
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
609
829
  react_1.default.createElement(icons_1.PlusIcon, null)),
610
- "Define named range"))),
830
+ "Define named range"),
831
+ onRequestEvaluateFormula && isActiveCellFormula ? (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
832
+ shouldFocusSheetRef.current = false;
833
+ onRequestEvaluateFormula(sheetId, activeCell);
834
+ } },
835
+ react_1.default.createElement(ui_1.DropdownLeftSlot, null,
836
+ react_1.default.createElement(icons_1.CodeIcon, null)),
837
+ "Evaluate formula")) : null,
838
+ onRequestAddWatch ? (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
839
+ shouldFocusSheetRef.current = false;
840
+ onRequestAddWatch(sheetId, activeCell);
841
+ } },
842
+ react_1.default.createElement(ui_1.DropdownLeftSlot, null,
843
+ react_1.default.createElement(icons_1.EyeOpenIcon, null)),
844
+ "Add to Watch Window")) : null)),
611
845
  react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
612
- react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () { return onRemoveDuplicates === null || onRemoveDuplicates === void 0 ? void 0 : onRemoveDuplicates(sheetId, activeCell, selections); }, disabled: readonly },
846
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleRemoveDuplicates, disabled: readonly },
613
847
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
614
848
  react_1.default.createElement(icons_1.RemoveDuplicatesIcon, null)),
615
849
  "Remove duplicates"),
@@ -635,7 +869,23 @@ var ContextMenu = function (_a) {
635
869
  } }, "Space"),
636
870
  react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: function () {
637
871
  return onSplitTextToColumns === null || onSplitTextToColumns === void 0 ? void 0 : onSplitTextToColumns(sheetId, activeCell, selections, "|");
638
- } }, "Pipe"))),
872
+ } }, "Pipe"),
873
+ isTextToColumnsDialogMounted ? (react_1.default.createElement(react_1.default.Fragment, null,
874
+ react_1.default.createElement(ui_1.DropdownMenuSeparator, null),
875
+ react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleTextToColumnsDialog }, "Fixed width\u2026"))) : null)),
876
+ (isSubtotalDialogMounted && onSubtotal) ||
877
+ (isAdvancedFilterDialogMounted && onAdvancedFilter) ||
878
+ (isGoalSeekDialogMounted && onGoalSeek) ? (react_1.default.createElement(ui_1.DropdownMenuSub, null,
879
+ react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
880
+ react_1.default.createElement(ui_1.DropdownLeftSlot, null,
881
+ react_1.default.createElement(icons_1.SpaceBetweenHorizontallyIcon, null)),
882
+ "Data tools",
883
+ react_1.default.createElement(ui_1.DropdownRightSlot, null,
884
+ react_1.default.createElement(icons_1.ChevronRightIcon, null))),
885
+ react_1.default.createElement(ui_1.DropdownMenuSubContent, { sideOffset: 2, alignOffset: -5 },
886
+ isSubtotalDialogMounted && onSubtotal ? (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleSubtotal }, "Subtotal\u2026")) : null,
887
+ isAdvancedFilterDialogMounted && onAdvancedFilter ? (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleAdvancedFilter }, "Advanced filter\u2026")) : null,
888
+ isGoalSeekDialogMounted && onGoalSeek ? (react_1.default.createElement(ui_1.DropdownMenuItem, { onClick: handleGoalSeek }, "Goal seek\u2026")) : null))) : null,
639
889
  react_1.default.createElement(ui_1.DropdownMenuSub, null,
640
890
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, { disabled: readonly },
641
891
  react_1.default.createElement(ui_1.DropdownLeftSlot, null,
@@ -0,0 +1,32 @@
1
+ import type { TableView } from "../../types";
2
+ /**
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.
5
+ */
6
+ export type TotalRowFunction = "none" | "average" | "count" | "countNumbers" | "max" | "min" | "sum" | "stdDev" | "var";
7
+ export type TotalRowFunctionOption = {
8
+ id: TotalRowFunction;
9
+ label: string;
10
+ /** `SUBTOTAL` function number (101–111 = ignore hidden rows). */
11
+ subtotal?: number;
12
+ };
13
+ 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;
19
+ /**
20
+ * Formula for a totals-row cell, e.g. `=SUBTOTAL(109,Table1[Amount])`.
21
+ * Qualified with the table name so it evaluates from any engine and matches
22
+ * what Excel writes for a totals row. Returns `""` for "none" (clear the
23
+ * cell) and `undefined` when the column has no name to reference.
24
+ */
25
+ export declare const getTotalRowFunctionFormula: (fn: TotalRowFunction, table: Pick<TableView, "title" | "columns" | "range">, columnIndex: number) => string | undefined;
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".
30
+ */
31
+ export declare const getTotalRowFunctionFromFormula: (formula: string | null | undefined) => TotalRowFunction;
32
+ //# sourceMappingURL=total-row-functions.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTotalRowFunctionFromFormula = exports.getTotalRowFunctionFormula = exports.escapeStructuredColumnName = exports.TOTAL_ROW_FUNCTIONS = void 0;
4
+ exports.TOTAL_ROW_FUNCTIONS = [
5
+ { id: "none", label: "None" },
6
+ { id: "average", label: "Average", subtotal: 101 },
7
+ { id: "count", label: "Count", subtotal: 103 },
8
+ { id: "countNumbers", label: "Count Numbers", subtotal: 102 },
9
+ { id: "max", label: "Max", subtotal: 104 },
10
+ { id: "min", label: "Min", subtotal: 105 },
11
+ { id: "sum", label: "Sum", subtotal: 109 },
12
+ { id: "stdDev", label: "StdDev", subtotal: 107 },
13
+ { id: "var", label: "Var", subtotal: 110 },
14
+ ];
15
+ /**
16
+ * Escape a column name for use inside a structured reference: `[`, `]`, `#`
17
+ * and `'` are prefixed with `'`, as Excel does.
18
+ */
19
+ var escapeStructuredColumnName = function (name) {
20
+ return name.replace(/(['\[\]#])/g, "'$1");
21
+ };
22
+ exports.escapeStructuredColumnName = escapeStructuredColumnName;
23
+ /**
24
+ * Formula for a totals-row cell, e.g. `=SUBTOTAL(109,Table1[Amount])`.
25
+ * Qualified with the table name so it evaluates from any engine and matches
26
+ * what Excel writes for a totals row. Returns `""` for "none" (clear the
27
+ * cell) and `undefined` when the column has no name to reference.
28
+ */
29
+ var getTotalRowFunctionFormula = function (fn, table, columnIndex) {
30
+ var _a, _b;
31
+ if (fn === "none") {
32
+ return "";
33
+ }
34
+ var option = exports.TOTAL_ROW_FUNCTIONS.find(function (item) { return item.id === fn; });
35
+ var columnName = (_b = (_a = table.columns) === null || _a === void 0 ? void 0 : _a[columnIndex - table.range.startColumnIndex]) === null || _b === void 0 ? void 0 : _b.name;
36
+ if (!(option === null || option === void 0 ? void 0 : option.subtotal) || !columnName || !table.title) {
37
+ return undefined;
38
+ }
39
+ return "=SUBTOTAL(".concat(option.subtotal, ",").concat(table.title, "[").concat((0, exports.escapeStructuredColumnName)(columnName), "])");
40
+ };
41
+ exports.getTotalRowFunctionFormula = getTotalRowFunctionFormula;
42
+ /**
43
+ * Recognise the aggregation a totals-row formula uses, so the picker can show
44
+ * the active choice. Both the hidden-row-aware (1xx) and plain (1–11)
45
+ * `SUBTOTAL` numbers map to the same option; anything else is "none".
46
+ */
47
+ var getTotalRowFunctionFromFormula = function (formula) {
48
+ var _a, _b;
49
+ if (!formula) {
50
+ return "none";
51
+ }
52
+ var match = /^\s*=\s*SUBTOTAL\s*\(\s*(\d{1,3})\s*,/i.exec(formula);
53
+ if (!match) {
54
+ return "none";
55
+ }
56
+ var number = Number(match[1]);
57
+ var normalized = number > 100 ? number - 100 : number;
58
+ return ((_b = (_a = exports.TOTAL_ROW_FUNCTIONS.find(function (item) {
59
+ return item.subtotal !== undefined && item.subtotal - 100 === normalized;
60
+ })) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : "none");
61
+ };
62
+ exports.getTotalRowFunctionFromFormula = getTotalRowFunctionFromFormula;
@@ -1 +1 @@
1
- {"version":3,"file":"embed-component.d.ts","sourceRoot":"","sources":["../../../../components/embeds/embed-component.tsx"],"names":[],"mappings":"AASA,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAIhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,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,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;CAC3D,CAAC;AAEF,eAAO,MAAM,cAAc,wHAUtB,mBAAmB,uBA+LvB,CAAC"}
1
+ {"version":3,"file":"embed-component.d.ts","sourceRoot":"","sources":["../../../../components/embeds/embed-component.tsx"],"names":[],"mappings":"AASA,OAAO,KAAe,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKhF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,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,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,kBAAkB,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;CAC3D,CAAC;AAEF,eAAO,MAAM,cAAc,wHAUtB,mBAAmB,uBA4NvB,CAAC"}
@@ -6,8 +6,10 @@ var icons_1 = require("@rowsncolumns/icons");
6
6
  var ui_1 = require("@rowsncolumns/ui");
7
7
  var react_1 = tslib_1.__importStar(require("react"));
8
8
  var themes_1 = require("../../themes");
9
+ var alignment_1 = require("../cell/alignment");
9
10
  var shape_svg_1 = require("./shape-svg");
10
11
  exports.EmbedComponent = (0, react_1.memo)(function (_a) {
12
+ var _b, _c, _d;
11
13
  var embed = _a.embed, width = _a.width, height = _a.height, readonly = _a.readonly, isSelected = _a.isSelected, onDeleteEmbed = _a.onDeleteEmbed, onRequestEditEmbed = _a.onRequestEditEmbed, theme = _a.theme;
12
14
  var renderTextBox = function (spec) {
13
15
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
@@ -45,7 +47,9 @@ exports.EmbedComponent = (0, react_1.memo)(function (_a) {
45
47
  height: "100%",
46
48
  backgroundColor: backgroundColor,
47
49
  padding: spec.padding ? "".concat(spec.padding, "px") : "4px",
48
- textAlign: spec.horizontalAlignment || undefined,
50
+ textAlign: spec.horizontalAlignment
51
+ ? (0, alignment_1.resolveCanvasTextAlign)(spec.horizontalAlignment)
52
+ : undefined,
49
53
  display: "flex",
50
54
  flexDirection: "column",
51
55
  justifyContent: spec.verticalAlignment === "top"
@@ -114,6 +118,17 @@ exports.EmbedComponent = (0, react_1.memo)(function (_a) {
114
118
  (embed === null || embed === void 0 ? void 0 : embed.spec.type) === "shape" ? (react_1.default.createElement("div", { style: { position: "relative", width: "100%", height: "100%" } },
115
119
  react_1.default.createElement(shape_svg_1.ShapeSvg, { spec: embed.spec, width: width, height: height, theme: theme }),
116
120
  embed.spec.textBody ? (react_1.default.createElement("div", { style: { position: "absolute", inset: 0 } }, renderTextBox(tslib_1.__assign({ type: "textbox" }, embed.spec.textBody)))) : null)) : null,
121
+ (embed === null || embed === void 0 ? void 0 : embed.spec.type) === "formControl" ? (
122
+ // Excel form controls round-trip but are not interactive here: draw
123
+ // the caption in a control-shaped placeholder so the layout reads.
124
+ react_1.default.createElement("div", { className: "flex h-full w-full items-center gap-1 overflow-hidden whitespace-nowrap px-1 text-xs", title: (_b = embed.spec.name) !== null && _b !== void 0 ? _b : undefined },
125
+ embed.spec.objectType === "CheckBox" ||
126
+ embed.spec.objectType === "Radio" ? (react_1.default.createElement("span", { className: "inline-block h-3 w-3 shrink-0 border border-current", style: {
127
+ borderRadius: embed.spec.objectType === "Radio"
128
+ ? "50%"
129
+ : 2,
130
+ } })) : null,
131
+ react_1.default.createElement("span", { className: "truncate" }, (_d = (_c = embed.spec.text) !== null && _c !== void 0 ? _c : embed.spec.name) !== null && _d !== void 0 ? _d : embed.spec.objectType))) : null,
117
132
  readonly || !isSelected ? null : (react_1.default.createElement(ui_1.DropdownMenu, null,
118
133
  react_1.default.createElement(ui_1.DropdownMenuTrigger, { asChild: true, className: "print:hidden" },
119
134
  react_1.default.createElement(ui_1.IconButton, { className: "absolute right-1 top-1 z-10" },
@@ -0,0 +1,34 @@
1
+ import { type EvaluationValue } from "@rowsncolumns/calculator";
2
+ import React from "react";
3
+ export type EvaluateFormulaDialogProps = {
4
+ /** Controls visibility. */
5
+ open: boolean;
6
+ onOpenChange(open: boolean): void;
7
+ /** Display label of the evaluated cell, e.g. `Sheet1!$A$1`. */
8
+ reference: string;
9
+ /** The cell's formula, including the leading `=`. */
10
+ formula: string;
11
+ /**
12
+ * Scratch-evaluates one sub-expression (no leading `=`) in the cell's
13
+ * context. Errors come back as `{ error: "#DIV/0!" }`, blanks as `null`.
14
+ */
15
+ evaluate(expression: string): Promise<EvaluationValue>;
16
+ };
17
+ /**
18
+ * Excel's Evaluate Formula dialog: a read-only stepper that underlines the
19
+ * next sub-expression the calculator would resolve and, on Evaluate,
20
+ * replaces it with its value until only the result remains. Nothing is
21
+ * written to the sheet.
22
+ */
23
+ export declare const EvaluateFormulaDialog: React.MemoExoticComponent<({ open, onOpenChange, reference, formula, evaluate, }: EvaluateFormulaDialogProps) => React.JSX.Element>;
24
+ /**
25
+ * Host-mounted, atom-driven wrapper around {@link EvaluateFormulaDialog}.
26
+ * Mount it once in the host alongside the other editor dialogs; the grid
27
+ * opens it from the context menu ("Evaluate formula…") for a formula cell.
28
+ * Keyed per request so each opening restarts from the cell's formula.
29
+ */
30
+ export declare const EvaluateFormulaDialogHost: {
31
+ (): React.JSX.Element | null;
32
+ displayName: string;
33
+ };
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/evaluate-formula-dialog/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,0BAA0B,CAAC;AAWlC,OAAO,KAAsC,MAAM,OAAO,CAAC;AAQ3D,MAAM,MAAM,0BAA0B,GAAG;IACvC,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACxD,CAAC;AAKF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,oFAO7B,0BAA0B,uBAiG9B,CAAC;AAUF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;CAiBrC,CAAC"}