@rowsncolumns/spreadsheet 10.6.5 → 10.7.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 (284) hide show
  1. package/dist/cjs/api/autocomplete.d.ts +42 -0
  2. package/dist/cjs/api/autocomplete.d.ts.map +1 -0
  3. package/dist/cjs/api/autocomplete.js +114 -0
  4. package/dist/cjs/api/banded-ranges.d.ts.map +1 -1
  5. package/dist/cjs/api/banded-ranges.js +51 -1
  6. package/dist/cjs/api/error-checking.d.ts +82 -0
  7. package/dist/cjs/api/error-checking.d.ts.map +1 -0
  8. package/dist/cjs/api/error-checking.js +207 -0
  9. package/dist/cjs/api/move-overwrite.d.ts +8 -2
  10. package/dist/cjs/api/move-overwrite.d.ts.map +1 -1
  11. package/dist/cjs/api/move-overwrite.js +19 -3
  12. package/dist/cjs/api/selections.d.ts +2 -2
  13. package/dist/cjs/api/validation.d.ts +39 -1
  14. package/dist/cjs/api/validation.d.ts.map +1 -1
  15. package/dist/cjs/api/validation.js +87 -1
  16. package/dist/cjs/atoms/cell-input-context.atom.d.ts +4 -1
  17. package/dist/cjs/atoms/cell-input-context.atom.d.ts.map +1 -1
  18. package/dist/cjs/atoms/enter-key-direction.atom.d.ts +11 -0
  19. package/dist/cjs/atoms/enter-key-direction.atom.d.ts.map +1 -0
  20. package/dist/cjs/atoms/enter-key-direction.atom.js +13 -0
  21. package/dist/cjs/atoms/index.d.ts +1 -0
  22. package/dist/cjs/atoms/index.d.ts.map +1 -1
  23. package/dist/cjs/atoms/index.js +1 -0
  24. package/dist/cjs/atoms/paste-menu.atom.d.ts +22 -0
  25. package/dist/cjs/atoms/paste-menu.atom.d.ts.map +1 -1
  26. package/dist/cjs/atoms/paste-menu.atom.js +13 -1
  27. package/dist/cjs/atoms/pick-list.atom.d.ts +15 -0
  28. package/dist/cjs/atoms/pick-list.atom.d.ts.map +1 -0
  29. package/dist/cjs/atoms/pick-list.atom.js +7 -0
  30. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  31. package/dist/cjs/components/canvas-grid/index.js +305 -70
  32. package/dist/cjs/components/canvas-grid/typings.d.ts +96 -11
  33. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  34. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  35. package/dist/cjs/components/cell/index.js +7 -8
  36. package/dist/cjs/components/cell/typings.d.ts +9 -0
  37. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  38. package/dist/cjs/components/cell-editor/helpers.d.ts +22 -2
  39. package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
  40. package/dist/cjs/components/cell-editor/helpers.js +32 -8
  41. package/dist/cjs/components/cell-editor/index.d.ts +7 -1
  42. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  43. package/dist/cjs/components/cell-editor/index.js +85 -13
  44. package/dist/cjs/components/cell-indicator/index.d.ts +41 -0
  45. package/dist/cjs/components/cell-indicator/index.d.ts.map +1 -0
  46. package/dist/cjs/components/cell-indicator/index.js +90 -0
  47. package/dist/cjs/components/cell-input/cell-input.d.ts +10 -2
  48. package/dist/cjs/components/cell-input/cell-input.d.ts.map +1 -1
  49. package/dist/cjs/components/cell-input/cell-input.js +5 -3
  50. package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  51. package/dist/cjs/components/cell-input/formula-bar-cell-input.js +9 -2
  52. package/dist/cjs/components/cell-structured/sparkline-math.d.ts +27 -1
  53. package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
  54. package/dist/cjs/components/cell-structured/sparkline-math.js +48 -1
  55. package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
  56. package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
  57. package/dist/cjs/components/cell-structured/sparkline.js +36 -92
  58. package/dist/cjs/components/cell-structured/types.d.ts +6 -0
  59. package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
  60. package/dist/cjs/components/data-table-dialog/index.d.ts +22 -0
  61. package/dist/cjs/components/data-table-dialog/index.d.ts.map +1 -0
  62. package/dist/cjs/components/data-table-dialog/index.js +93 -0
  63. package/dist/cjs/components/error-check-smart-tag/index.d.ts +27 -0
  64. package/dist/cjs/components/error-check-smart-tag/index.d.ts.map +1 -0
  65. package/dist/cjs/components/error-check-smart-tag/index.js +39 -0
  66. package/dist/cjs/components/forecast-sheet-dialog/index.d.ts +26 -0
  67. package/dist/cjs/components/forecast-sheet-dialog/index.d.ts.map +1 -0
  68. package/dist/cjs/components/forecast-sheet-dialog/index.js +92 -0
  69. package/dist/cjs/components/paste-special-dialog/index.d.ts +3 -3
  70. package/dist/cjs/components/paste-special-dialog/index.d.ts.map +1 -1
  71. package/dist/cjs/components/paste-special-dialog/index.js +61 -23
  72. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
  73. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
  74. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +196 -0
  75. package/dist/cjs/components/protect-sheet-dialog/constants.d.ts +3 -0
  76. package/dist/cjs/components/protect-sheet-dialog/constants.d.ts.map +1 -0
  77. package/dist/cjs/components/protect-sheet-dialog/constants.js +5 -0
  78. package/dist/cjs/components/protect-sheet-dialog/index.d.ts +2 -2
  79. package/dist/cjs/components/protect-sheet-dialog/index.d.ts.map +1 -1
  80. package/dist/cjs/components/protect-sheet-dialog/index.js +5 -3
  81. package/dist/cjs/components/scenario-manager-dialog/index.d.ts +51 -0
  82. package/dist/cjs/components/scenario-manager-dialog/index.d.ts.map +1 -0
  83. package/dist/cjs/components/scenario-manager-dialog/index.js +257 -0
  84. package/dist/cjs/components/selection/index.d.ts +1 -1
  85. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  86. package/dist/cjs/components/selection/index.js +9 -4
  87. package/dist/cjs/components/selection/paste-menu.d.ts +14 -1
  88. package/dist/cjs/components/selection/paste-menu.d.ts.map +1 -1
  89. package/dist/cjs/components/selection/paste-menu.js +78 -6
  90. package/dist/cjs/components/selection/paste-options.d.ts +28 -0
  91. package/dist/cjs/components/selection/paste-options.d.ts.map +1 -0
  92. package/dist/cjs/components/selection/paste-options.js +70 -0
  93. package/dist/cjs/components/selection/types.d.ts +12 -1
  94. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  95. package/dist/cjs/components/selection-drop-menu/index.d.ts +18 -0
  96. package/dist/cjs/components/selection-drop-menu/index.d.ts.map +1 -0
  97. package/dist/cjs/components/selection-drop-menu/index.js +62 -0
  98. package/dist/cjs/components/solver-dialog/index.d.ts +57 -0
  99. package/dist/cjs/components/solver-dialog/index.d.ts.map +1 -0
  100. package/dist/cjs/components/solver-dialog/index.js +204 -0
  101. package/dist/cjs/components/toolbar/sparkline-actions.d.ts +3 -2
  102. package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -1
  103. package/dist/cjs/components/toolbar/sparkline-actions.js +6 -2
  104. package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
  105. package/dist/cjs/components/toolbar/table-style-selector.js +33 -2
  106. package/dist/cjs/config.d.ts +5 -4
  107. package/dist/cjs/config.d.ts.map +1 -1
  108. package/dist/cjs/config.js +13 -9
  109. package/dist/cjs/hooks/use-cell-renderer.d.ts +12 -1
  110. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  111. package/dist/cjs/hooks/use-cell-renderer.js +6 -3
  112. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +36 -2
  113. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  114. package/dist/cjs/hooks/use-copy-paste-cut.js +131 -5
  115. package/dist/cjs/hooks/use-editable.d.ts +6 -0
  116. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  117. package/dist/cjs/hooks/use-editor-submit.d.ts +45 -3
  118. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  119. package/dist/cjs/hooks/use-editor-submit.js +91 -7
  120. package/dist/cjs/hooks/use-keyboard-handler.d.ts +5 -1
  121. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  122. package/dist/cjs/hooks/use-keyboard-handler.js +10 -1
  123. package/dist/cjs/hooks/use-selection-drag-copy.d.ts +55 -0
  124. package/dist/cjs/hooks/use-selection-drag-copy.d.ts.map +1 -0
  125. package/dist/cjs/hooks/use-selection-drag-copy.js +274 -0
  126. package/dist/cjs/hooks/use-selection-renderer.d.ts +8 -1
  127. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  128. package/dist/cjs/hooks/use-selection-renderer.js +7 -2
  129. package/dist/cjs/hooks/use-selection.d.ts +59 -1
  130. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  131. package/dist/cjs/hooks/use-selection.js +270 -61
  132. package/dist/cjs/index.d.ts +6 -1
  133. package/dist/cjs/index.d.ts.map +1 -1
  134. package/dist/cjs/index.js +5 -0
  135. package/dist/cjs/release-date.js +1 -1
  136. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  137. package/dist/cjs/types.d.ts +50 -1
  138. package/dist/cjs/types.d.ts.map +1 -1
  139. package/dist/esm/api/autocomplete.d.ts +42 -0
  140. package/dist/esm/api/autocomplete.d.ts.map +1 -0
  141. package/dist/esm/api/autocomplete.js +91 -0
  142. package/dist/esm/api/banded-ranges.d.ts.map +1 -1
  143. package/dist/esm/api/banded-ranges.js +52 -2
  144. package/dist/esm/api/error-checking.d.ts +82 -0
  145. package/dist/esm/api/error-checking.d.ts.map +1 -0
  146. package/dist/esm/api/error-checking.js +156 -0
  147. package/dist/esm/api/move-overwrite.d.ts +8 -2
  148. package/dist/esm/api/move-overwrite.d.ts.map +1 -1
  149. package/dist/esm/api/move-overwrite.js +17 -2
  150. package/dist/esm/api/selections.d.ts +2 -2
  151. package/dist/esm/api/validation.d.ts +39 -1
  152. package/dist/esm/api/validation.d.ts.map +1 -1
  153. package/dist/esm/api/validation.js +70 -0
  154. package/dist/esm/atoms/cell-input-context.atom.d.ts +4 -1
  155. package/dist/esm/atoms/cell-input-context.atom.d.ts.map +1 -1
  156. package/dist/esm/atoms/enter-key-direction.atom.d.ts +11 -0
  157. package/dist/esm/atoms/enter-key-direction.atom.d.ts.map +1 -0
  158. package/dist/esm/atoms/enter-key-direction.atom.js +8 -0
  159. package/dist/esm/atoms/index.d.ts +1 -0
  160. package/dist/esm/atoms/index.d.ts.map +1 -1
  161. package/dist/esm/atoms/index.js +1 -0
  162. package/dist/esm/atoms/paste-menu.atom.d.ts +22 -0
  163. package/dist/esm/atoms/paste-menu.atom.d.ts.map +1 -1
  164. package/dist/esm/atoms/paste-menu.atom.js +10 -1
  165. package/dist/esm/atoms/pick-list.atom.d.ts +15 -0
  166. package/dist/esm/atoms/pick-list.atom.d.ts.map +1 -0
  167. package/dist/esm/atoms/pick-list.atom.js +3 -0
  168. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  169. package/dist/esm/components/canvas-grid/index.js +239 -13
  170. package/dist/esm/components/canvas-grid/typings.d.ts +96 -11
  171. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  172. package/dist/esm/components/cell/index.d.ts.map +1 -1
  173. package/dist/esm/components/cell/index.js +8 -9
  174. package/dist/esm/components/cell/typings.d.ts +9 -0
  175. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  176. package/dist/esm/components/cell-editor/helpers.d.ts +22 -2
  177. package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
  178. package/dist/esm/components/cell-editor/helpers.js +25 -7
  179. package/dist/esm/components/cell-editor/index.d.ts +7 -1
  180. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  181. package/dist/esm/components/cell-editor/index.js +80 -9
  182. package/dist/esm/components/cell-indicator/index.d.ts +41 -0
  183. package/dist/esm/components/cell-indicator/index.d.ts.map +1 -0
  184. package/dist/esm/components/cell-indicator/index.js +76 -0
  185. package/dist/esm/components/cell-input/cell-input.d.ts +10 -2
  186. package/dist/esm/components/cell-input/cell-input.d.ts.map +1 -1
  187. package/dist/esm/components/cell-input/cell-input.js +5 -3
  188. package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  189. package/dist/esm/components/cell-input/formula-bar-cell-input.js +9 -2
  190. package/dist/esm/components/cell-structured/sparkline-math.d.ts +27 -1
  191. package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
  192. package/dist/esm/components/cell-structured/sparkline-math.js +35 -0
  193. package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
  194. package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
  195. package/dist/esm/components/cell-structured/sparkline.js +34 -88
  196. package/dist/esm/components/cell-structured/types.d.ts +6 -0
  197. package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
  198. package/dist/esm/components/data-table-dialog/index.d.ts +22 -0
  199. package/dist/esm/components/data-table-dialog/index.d.ts.map +1 -0
  200. package/dist/esm/components/data-table-dialog/index.js +75 -0
  201. package/dist/esm/components/error-check-smart-tag/index.d.ts +27 -0
  202. package/dist/esm/components/error-check-smart-tag/index.d.ts.map +1 -0
  203. package/dist/esm/components/error-check-smart-tag/index.js +33 -0
  204. package/dist/esm/components/forecast-sheet-dialog/index.d.ts +26 -0
  205. package/dist/esm/components/forecast-sheet-dialog/index.d.ts.map +1 -0
  206. package/dist/esm/components/forecast-sheet-dialog/index.js +83 -0
  207. package/dist/esm/components/paste-special-dialog/index.d.ts +3 -3
  208. package/dist/esm/components/paste-special-dialog/index.d.ts.map +1 -1
  209. package/dist/esm/components/paste-special-dialog/index.js +58 -23
  210. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
  211. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
  212. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +177 -0
  213. package/dist/esm/components/protect-sheet-dialog/constants.d.ts +3 -0
  214. package/dist/esm/components/protect-sheet-dialog/constants.d.ts.map +1 -0
  215. package/dist/esm/components/protect-sheet-dialog/constants.js +2 -0
  216. package/dist/esm/components/protect-sheet-dialog/index.d.ts +2 -2
  217. package/dist/esm/components/protect-sheet-dialog/index.d.ts.map +1 -1
  218. package/dist/esm/components/protect-sheet-dialog/index.js +3 -2
  219. package/dist/esm/components/scenario-manager-dialog/index.d.ts +51 -0
  220. package/dist/esm/components/scenario-manager-dialog/index.d.ts.map +1 -0
  221. package/dist/esm/components/scenario-manager-dialog/index.js +213 -0
  222. package/dist/esm/components/selection/index.d.ts +1 -1
  223. package/dist/esm/components/selection/index.d.ts.map +1 -1
  224. package/dist/esm/components/selection/index.js +9 -4
  225. package/dist/esm/components/selection/paste-menu.d.ts +14 -1
  226. package/dist/esm/components/selection/paste-menu.d.ts.map +1 -1
  227. package/dist/esm/components/selection/paste-menu.js +76 -8
  228. package/dist/esm/components/selection/paste-options.d.ts +28 -0
  229. package/dist/esm/components/selection/paste-options.d.ts.map +1 -0
  230. package/dist/esm/components/selection/paste-options.js +62 -0
  231. package/dist/esm/components/selection/types.d.ts +12 -1
  232. package/dist/esm/components/selection/types.d.ts.map +1 -1
  233. package/dist/esm/components/selection-drop-menu/index.d.ts +18 -0
  234. package/dist/esm/components/selection-drop-menu/index.d.ts.map +1 -0
  235. package/dist/esm/components/selection-drop-menu/index.js +56 -0
  236. package/dist/esm/components/solver-dialog/index.d.ts +57 -0
  237. package/dist/esm/components/solver-dialog/index.d.ts.map +1 -0
  238. package/dist/esm/components/solver-dialog/index.js +176 -0
  239. package/dist/esm/components/toolbar/sparkline-actions.d.ts +3 -2
  240. package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -1
  241. package/dist/esm/components/toolbar/sparkline-actions.js +6 -2
  242. package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
  243. package/dist/esm/components/toolbar/table-style-selector.js +29 -3
  244. package/dist/esm/config.d.ts +5 -4
  245. package/dist/esm/config.d.ts.map +1 -1
  246. package/dist/esm/config.js +12 -8
  247. package/dist/esm/hooks/use-cell-renderer.d.ts +12 -1
  248. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  249. package/dist/esm/hooks/use-cell-renderer.js +5 -2
  250. package/dist/esm/hooks/use-copy-paste-cut.d.ts +36 -2
  251. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  252. package/dist/esm/hooks/use-copy-paste-cut.js +117 -6
  253. package/dist/esm/hooks/use-editable.d.ts +6 -0
  254. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  255. package/dist/esm/hooks/use-editor-submit.d.ts +45 -3
  256. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  257. package/dist/esm/hooks/use-editor-submit.js +81 -6
  258. package/dist/esm/hooks/use-keyboard-handler.d.ts +5 -1
  259. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  260. package/dist/esm/hooks/use-keyboard-handler.js +10 -1
  261. package/dist/esm/hooks/use-selection-drag-copy.d.ts +55 -0
  262. package/dist/esm/hooks/use-selection-drag-copy.d.ts.map +1 -0
  263. package/dist/esm/hooks/use-selection-drag-copy.js +245 -0
  264. package/dist/esm/hooks/use-selection-renderer.d.ts +8 -1
  265. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  266. package/dist/esm/hooks/use-selection-renderer.js +7 -2
  267. package/dist/esm/hooks/use-selection.d.ts +59 -1
  268. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  269. package/dist/esm/hooks/use-selection.js +245 -52
  270. package/dist/esm/index.d.ts +6 -1
  271. package/dist/esm/index.d.ts.map +1 -1
  272. package/dist/esm/index.js +5 -0
  273. package/dist/esm/release-date.js +1 -1
  274. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  275. package/dist/esm/types.d.ts +50 -1
  276. package/dist/esm/types.d.ts.map +1 -1
  277. package/dist/spreadsheet.min.css +1 -1
  278. package/package.json +6 -5
  279. package/dist/cjs/components/cell-error/index.d.ts +0 -14
  280. package/dist/cjs/components/cell-error/index.d.ts.map +0 -1
  281. package/dist/cjs/components/cell-error/index.js +0 -24
  282. package/dist/esm/components/cell-error/index.d.ts +0 -14
  283. package/dist/esm/components/cell-error/index.d.ts.map +0 -1
  284. package/dist/esm/components/cell-error/index.js +0 -18
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScenarioManagerDialog = exports.parseCellList = exports.MAX_SCENARIO_CHANGING_CELLS = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var icons_1 = require("@rowsncolumns/icons");
6
+ var ui_1 = require("@rowsncolumns/ui");
7
+ var utils_1 = require("@rowsncolumns/utils");
8
+ var react_1 = tslib_1.__importStar(require("react"));
9
+ /** Excel's cap on changing cells per scenario. */
10
+ exports.MAX_SCENARIO_CHANGING_CELLS = 32;
11
+ /**
12
+ * `B1:B3, D5` → its cells in order (deduplicated), or `null` when a part is not a
13
+ * cell or range reference.
14
+ */
15
+ var parseCellList = function (text) {
16
+ var e_1, _a;
17
+ var cells = [];
18
+ var parts = text
19
+ .split(/[,;]/)
20
+ .map(function (p) { return p.trim().replace(/\$/g, ""); })
21
+ .filter(function (p) { return p !== ""; });
22
+ if (parts.length === 0)
23
+ return null;
24
+ try {
25
+ for (var parts_1 = tslib_1.__values(parts), parts_1_1 = parts_1.next(); !parts_1_1.done; parts_1_1 = parts_1.next()) {
26
+ var part = parts_1_1.value;
27
+ var _b = tslib_1.__read(part.split(":"), 2), a = _b[0], _c = _b[1], b = _c === void 0 ? a : _c;
28
+ if (!/^[A-Za-z]{1,3}\d+$/.test(a) || !/^[A-Za-z]{1,3}\d+$/.test(b))
29
+ return null;
30
+ var start = (0, utils_1.addressToCell)(a);
31
+ var end = (0, utils_1.addressToCell)(b);
32
+ if (!start || !end)
33
+ return null;
34
+ var _loop_1 = function (r) {
35
+ var _loop_2 = function (c) {
36
+ if (!cells.some(function (x) { return x.rowIndex === r && x.columnIndex === c; })) {
37
+ cells.push({ rowIndex: r, columnIndex: c });
38
+ }
39
+ if (cells.length > exports.MAX_SCENARIO_CHANGING_CELLS)
40
+ return { value: cells };
41
+ };
42
+ for (var c = Math.min(start.columnIndex, end.columnIndex); c <= Math.max(start.columnIndex, end.columnIndex); c++) {
43
+ var state_2 = _loop_2(c);
44
+ if (typeof state_2 === "object")
45
+ return state_2;
46
+ }
47
+ };
48
+ for (var r = Math.min(start.rowIndex, end.rowIndex); r <= Math.max(start.rowIndex, end.rowIndex); r++) {
49
+ var state_1 = _loop_1(r);
50
+ if (typeof state_1 === "object")
51
+ return state_1.value;
52
+ }
53
+ }
54
+ }
55
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
56
+ finally {
57
+ try {
58
+ if (parts_1_1 && !parts_1_1.done && (_a = parts_1.return)) _a.call(parts_1);
59
+ }
60
+ finally { if (e_1) throw e_1.error; }
61
+ }
62
+ return cells;
63
+ };
64
+ exports.parseCellList = parseCellList;
65
+ var cellsText = function (cells) {
66
+ return cells.map(function (c) { var _a; return (_a = (0, utils_1.cellToAddress)(c)) !== null && _a !== void 0 ? _a : ""; }).join(",");
67
+ };
68
+ /**
69
+ * Excel's Scenario Manager: the sheet's scenarios with Show / Add / Delete /
70
+ * Edit / Summary. Add and Edit ask for the name, changing cells and comment,
71
+ * then a value for each changing cell (Scenario Values). Merge is not offered.
72
+ */
73
+ exports.ScenarioManagerDialog = (0, react_1.memo)(function (_a) {
74
+ var open = _a.open, onOpenChange = _a.onOpenChange, scenarios = _a.scenarios, defaultChangingCells = _a.defaultChangingCells, getCellValue = _a.getCellValue, onAdd = _a.onAdd, onUpdate = _a.onUpdate, onDelete = _a.onDelete, onShow = _a.onShow, onSummary = _a.onSummary;
75
+ var _b = tslib_1.__read((0, react_1.useState)({ kind: "list" }), 2), view = _b[0], setView = _b[1];
76
+ var _c = tslib_1.__read((0, react_1.useState)(0), 2), selected = _c[0], setSelected = _c[1];
77
+ var _d = tslib_1.__read((0, react_1.useState)(""), 2), name = _d[0], setName = _d[1];
78
+ var _e = tslib_1.__read((0, react_1.useState)(""), 2), changing = _e[0], setChanging = _e[1];
79
+ var _f = tslib_1.__read((0, react_1.useState)(""), 2), comment = _f[0], setComment = _f[1];
80
+ var _g = tslib_1.__read((0, react_1.useState)(true), 2), locked = _g[0], setLocked = _g[1];
81
+ var _h = tslib_1.__read((0, react_1.useState)(false), 2), hidden = _h[0], setHidden = _h[1];
82
+ var _j = tslib_1.__read((0, react_1.useState)(""), 2), resultCells = _j[0], setResultCells = _j[1];
83
+ var _k = tslib_1.__read((0, react_1.useState)(undefined), 2), error = _k[0], setError = _k[1];
84
+ (0, react_1.useEffect)(function () {
85
+ if (open) {
86
+ setView({ kind: "list" });
87
+ setSelected(0);
88
+ setError(undefined);
89
+ }
90
+ }, [open]);
91
+ var current = scenarios[Math.min(selected, scenarios.length - 1)];
92
+ var run = (0, react_1.useCallback)(function (action, after) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
93
+ var refusal;
94
+ return tslib_1.__generator(this, function (_a) {
95
+ switch (_a.label) {
96
+ case 0: return [4 /*yield*/, action()];
97
+ case 1:
98
+ refusal = _a.sent();
99
+ if (refusal) {
100
+ setError(refusal);
101
+ return [2 /*return*/];
102
+ }
103
+ setError(undefined);
104
+ after === null || after === void 0 ? void 0 : after();
105
+ return [2 /*return*/];
106
+ }
107
+ });
108
+ }); }, []);
109
+ var startEdit = function (scenario) {
110
+ var _a, _b, _c, _d;
111
+ setName((_a = scenario === null || scenario === void 0 ? void 0 : scenario.name) !== null && _a !== void 0 ? _a : "");
112
+ setChanging(scenario ? cellsText(scenario.cells) : defaultChangingCells);
113
+ setComment((_b = scenario === null || scenario === void 0 ? void 0 : scenario.comment) !== null && _b !== void 0 ? _b : "");
114
+ setLocked((_c = scenario === null || scenario === void 0 ? void 0 : scenario.locked) !== null && _c !== void 0 ? _c : true);
115
+ setHidden((_d = scenario === null || scenario === void 0 ? void 0 : scenario.hidden) !== null && _d !== void 0 ? _d : false);
116
+ setError(undefined);
117
+ setView({ kind: "edit", editing: scenario === null || scenario === void 0 ? void 0 : scenario.name });
118
+ };
119
+ var toValues = function (event) {
120
+ event.preventDefault();
121
+ if (view.kind !== "edit")
122
+ return;
123
+ if (name.trim() === "") {
124
+ setError("Type a scenario name.");
125
+ return;
126
+ }
127
+ var cells = (0, exports.parseCellList)(changing);
128
+ if (!cells) {
129
+ setError("Changing cell reference is not valid.");
130
+ return;
131
+ }
132
+ if (cells.length > exports.MAX_SCENARIO_CHANGING_CELLS) {
133
+ setError("Too many changing cells. A scenario can have up to 32.");
134
+ return;
135
+ }
136
+ var previous = scenarios.find(function (s) { return s.name === view.editing; });
137
+ setError(undefined);
138
+ setView({
139
+ kind: "values",
140
+ editing: view.editing,
141
+ draft: {
142
+ name: name.trim(),
143
+ comment: comment.trim() === "" ? undefined : comment,
144
+ locked: locked,
145
+ hidden: hidden,
146
+ cells: cells.map(function (c) {
147
+ var _a, _b;
148
+ return (tslib_1.__assign(tslib_1.__assign({}, c), { value: (_b = (_a = previous === null || previous === void 0 ? void 0 : previous.cells.find(function (p) { return p.rowIndex === c.rowIndex && p.columnIndex === c.columnIndex; })) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : getCellValue(c.rowIndex, c.columnIndex) }));
149
+ }),
150
+ },
151
+ });
152
+ };
153
+ var saveValues = function (event) {
154
+ event.preventDefault();
155
+ if (view.kind !== "values")
156
+ return;
157
+ var draft = view.draft, editing = view.editing;
158
+ void run(function () { return (editing === undefined ? onAdd(draft) : onUpdate(editing, draft)); }, function () { return setView({ kind: "list" }); });
159
+ };
160
+ var summary = function (event) {
161
+ event.preventDefault();
162
+ var cells = resultCells.trim() === "" ? [] : (0, exports.parseCellList)(resultCells);
163
+ if (!cells) {
164
+ setError("Result cell reference is not valid.");
165
+ return;
166
+ }
167
+ void run(function () { return onSummary(cells); }, function () { return onOpenChange(false); });
168
+ };
169
+ var footer = function (primary, back) {
170
+ if (back === void 0) { back = true; }
171
+ return (react_1.default.createElement(react_1.default.Fragment, null,
172
+ error ? (react_1.default.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
173
+ react_1.default.createElement(ui_1.Separator, null),
174
+ react_1.default.createElement("div", { className: "flex justify-end gap-2" },
175
+ back ? (react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "sm", onClick: function () {
176
+ setError(undefined);
177
+ setView({ kind: "list" });
178
+ } }, "Cancel")) : null,
179
+ react_1.default.createElement(ui_1.Button, { type: "submit", size: "sm" }, primary))));
180
+ };
181
+ var title = view.kind === "list"
182
+ ? "Scenario Manager"
183
+ : view.kind === "values"
184
+ ? "Scenario Values"
185
+ : view.kind === "summary"
186
+ ? "Scenario Summary"
187
+ : view.editing === undefined
188
+ ? "Add Scenario"
189
+ : "Edit Scenario";
190
+ return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange },
191
+ react_1.default.createElement(ui_1.DialogContent, { className: "w-[400px] max-w-[92vw] pointer-events-auto" },
192
+ react_1.default.createElement(ui_1.DialogTitle, null, title),
193
+ react_1.default.createElement(ui_1.DialogDescription, null, "Save and switch between sets of input values."),
194
+ react_1.default.createElement(ui_1.DialogCloseButton, { onClick: function () { return onOpenChange(false); } },
195
+ react_1.default.createElement(icons_1.Cross1Icon, null)),
196
+ react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-3 font-system text-sm" },
197
+ view.kind === "list" ? (react_1.default.createElement("div", { className: "flex flex-col gap-3" },
198
+ scenarios.length === 0 ? (react_1.default.createElement("p", { className: "text-xs" }, "No Scenarios defined. Choose Add to add scenarios.")) : (react_1.default.createElement("ul", { "aria-label": "Scenarios", className: "max-h-40 overflow-auto rounded border border-rnc-border" }, scenarios.map(function (s, i) { return (react_1.default.createElement("li", { key: s.name },
199
+ react_1.default.createElement("button", { type: "button", "aria-pressed": i === selected, className: "w-full px-2 py-1 text-left text-xs ".concat(i === selected ? "bg-rnc-accent" : ""), onClick: function () { return setSelected(i); } }, s.name))); }))),
200
+ current ? (react_1.default.createElement("div", { className: "text-xs" },
201
+ react_1.default.createElement("div", null,
202
+ "Changing cells: ",
203
+ cellsText(current.cells)),
204
+ current.comment ? react_1.default.createElement("div", null,
205
+ "Comment: ",
206
+ current.comment) : null)) : null,
207
+ error ? (react_1.default.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
208
+ react_1.default.createElement(ui_1.Separator, null),
209
+ react_1.default.createElement("div", { className: "flex flex-wrap justify-end gap-2" },
210
+ react_1.default.createElement(ui_1.Button, { type: "button", size: "sm", variant: "outline", onClick: function () { return startEdit(undefined); } }, "Add\u2026"),
211
+ react_1.default.createElement(ui_1.Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: function () { return current && void run(function () { return onDelete(current.name); }); } }, "Delete"),
212
+ react_1.default.createElement(ui_1.Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: function () { return startEdit(current); } }, "Edit\u2026"),
213
+ react_1.default.createElement(ui_1.Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: function () {
214
+ setResultCells("");
215
+ setError(undefined);
216
+ setView({ kind: "summary" });
217
+ } }, "Summary\u2026"),
218
+ react_1.default.createElement(ui_1.Button, { type: "button", size: "sm", disabled: !current, onClick: function () { return current && void run(function () { return onShow(current.name); }); } }, "Show")))) : null,
219
+ view.kind === "edit" ? (react_1.default.createElement("form", { className: "flex flex-col gap-3", onSubmit: toValues },
220
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
221
+ "Scenario name:",
222
+ react_1.default.createElement(ui_1.Input, { autoFocus: true, "aria-label": "Scenario name", value: name, onChange: function (e) { return setName(e.target.value); } })),
223
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
224
+ "Changing cells:",
225
+ react_1.default.createElement(ui_1.Input, { "aria-label": "Changing cells", value: changing, onChange: function (e) { return setChanging(e.target.value); } })),
226
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
227
+ "Comment:",
228
+ react_1.default.createElement(ui_1.Input, { "aria-label": "Comment", value: comment, onChange: function (e) { return setComment(e.target.value); } })),
229
+ react_1.default.createElement("label", { className: "flex items-center gap-2 text-xs" },
230
+ react_1.default.createElement("input", { type: "checkbox", checked: locked, onChange: function (e) { return setLocked(e.target.checked); } }),
231
+ "Prevent changes"),
232
+ react_1.default.createElement("label", { className: "flex items-center gap-2 text-xs" },
233
+ react_1.default.createElement("input", { type: "checkbox", checked: hidden, onChange: function (e) { return setHidden(e.target.checked); } }),
234
+ "Hide"),
235
+ footer("OK"))) : null,
236
+ view.kind === "values" ? (react_1.default.createElement("form", { className: "flex flex-col gap-2", onSubmit: saveValues },
237
+ react_1.default.createElement("p", { className: "text-xs" }, "Enter values for each of the changing cells."),
238
+ view.draft.cells.map(function (cell, i) {
239
+ var _a;
240
+ var address = (_a = (0, utils_1.cellToAddress)(cell)) !== null && _a !== void 0 ? _a : "";
241
+ return (react_1.default.createElement("label", { key: address, className: "flex items-center gap-2 text-xs" },
242
+ react_1.default.createElement("span", { className: "w-16" }, address),
243
+ react_1.default.createElement(ui_1.Input, { "aria-label": address, value: cell.value, onChange: function (e) {
244
+ var cells = view.draft.cells.map(function (c, k) {
245
+ return k === i ? tslib_1.__assign(tslib_1.__assign({}, c), { value: e.target.value }) : c;
246
+ });
247
+ setView(tslib_1.__assign(tslib_1.__assign({}, view), { draft: tslib_1.__assign(tslib_1.__assign({}, view.draft), { cells: cells }) }));
248
+ } })));
249
+ }),
250
+ footer("OK"))) : null,
251
+ view.kind === "summary" ? (react_1.default.createElement("form", { className: "flex flex-col gap-3", onSubmit: summary },
252
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
253
+ "Result cells:",
254
+ react_1.default.createElement(ui_1.Input, { autoFocus: true, "aria-label": "Result cells", value: resultCells, onChange: function (e) { return setResultCells(e.target.value); } })),
255
+ footer("OK"))) : null))));
256
+ });
257
+ exports.ScenarioManagerDialog.displayName = "ScenarioManagerDialog";
@@ -5,5 +5,5 @@ import type { SelectionNewProps } from "./types";
5
5
  * @param param0
6
6
  * @returns
7
7
  */
8
- export declare const Selection: React.MemoExoticComponent<({ x, y, width, height, fillHandleSize, showFillHandle, offset, stroke, strokeLeftColor, strokeTopColor, strokeRightColor, strokeBottomColor, strokeWidth, strokeTopWidth, strokeRightWidth, strokeBottomWidth, strokeLeftWidth, strokeStyle, fillOpacity, draggable, isDragging, borderCoverWidth, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent, metadata, readonly, showPasteMenu, onSplitTextToColumns, agentSuggestion, isHovered, MagicFillContent, QuickEdit, PasteMenu, FillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, SuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }: SelectionNewProps) => React.JSX.Element>;
8
+ export declare const Selection: React.MemoExoticComponent<({ x, y, width, height, fillHandleSize, showFillHandle, offset, stroke, strokeLeftColor, strokeTopColor, strokeRightColor, strokeBottomColor, strokeWidth, strokeTopWidth, strokeRightWidth, strokeBottomWidth, strokeLeftWidth, strokeStyle, fillOpacity, draggable, isDragging, borderCoverWidth, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent, metadata, readonly, showPasteMenu, onSplitTextToColumns, onChoosePasteOption, agentSuggestion, isHovered, MagicFillContent, QuickEdit, PasteMenu, FillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, errorCheck, errorCheckMenuOpen, onErrorCheckMenuOpenChange, onChooseErrorCheckOption, SuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }: SelectionNewProps) => React.JSX.Element>;
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/selection/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAiBpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,SAAS,urCA8EjB,iBAAiB,uBA0VrB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/selection/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAkBpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,SAAS,kyCAmFjB,iBAAiB,uBA2WrB,CAAC"}
@@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Selection = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var react_1 = tslib_1.__importStar(require("react"));
6
+ var calculated_column_smart_tag_1 = require("../calculated-column-smart-tag");
7
+ var error_check_smart_tag_1 = require("../error-check-smart-tag");
6
8
  var insert_options_smart_tag_1 = require("../insert-options-smart-tag");
7
9
  var table_auto_expansion_smart_tag_1 = require("../table-auto-expansion-smart-tag");
8
- var calculated_column_smart_tag_1 = require("../calculated-column-smart-tag");
9
10
  var fill_options_menu_1 = require("./fill-options-menu");
10
11
  var magic_fill_1 = require("./magic-fill");
11
12
  var paste_menu_1 = require("./paste-menu");
@@ -19,7 +20,7 @@ var title_1 = require("./title");
19
20
  * @returns
20
21
  */
21
22
  exports.Selection = (0, react_1.memo)(function (_a) {
22
- var _b = _a.x, x = _b === void 0 ? 0 : _b, _c = _a.y, y = _c === void 0 ? 0 : _c, _d = _a.width, width = _d === void 0 ? 0 : _d, _e = _a.height, height = _e === void 0 ? 0 : _e, _f = _a.fillHandleSize, fillHandleSize = _f === void 0 ? 8 : _f, showFillHandle = _a.showFillHandle, _g = _a.offset, offset = _g === void 0 ? 0 : _g, stroke = _a.stroke, _h = _a.strokeLeftColor, strokeLeftColor = _h === void 0 ? stroke : _h, _j = _a.strokeTopColor, strokeTopColor = _j === void 0 ? stroke : _j, _k = _a.strokeRightColor, strokeRightColor = _k === void 0 ? stroke : _k, _l = _a.strokeBottomColor, strokeBottomColor = _l === void 0 ? stroke : _l, _m = _a.strokeWidth, strokeWidth = _m === void 0 ? 0 : _m, _o = _a.strokeTopWidth, strokeTopWidth = _o === void 0 ? strokeWidth : _o, _p = _a.strokeRightWidth, strokeRightWidth = _p === void 0 ? strokeWidth : _p, _q = _a.strokeBottomWidth, strokeBottomWidth = _q === void 0 ? strokeWidth : _q, _r = _a.strokeLeftWidth, strokeLeftWidth = _r === void 0 ? strokeWidth : _r, _s = _a.strokeStyle, strokeStyle = _s === void 0 ? "solid" : _s, _t = _a.fillOpacity, fillOpacity = _t === void 0 ? 1 : _t, draggable = _a.draggable, isDragging = _a.isDragging, _u = _a.borderCoverWidth, borderCoverWidth = _u === void 0 ? 5 : _u, type = _a.type, range = _a.range, title = _a.title, keepTitleWithinBounds = _a.keepTitleWithinBounds, keepTitleWithinVerticalBounds = _a.keepTitleWithinVerticalBounds, flipTitleToBottom = _a.flipTitleToBottom, table = _a.table, pivotTable = _a.pivotTable, onMouseDownTitle = _a.onMouseDownTitle, onMouseDownResizeHandle = _a.onMouseDownResizeHandle, onMouseDownMoveHandle = _a.onMouseDownMoveHandle, _v = _a.TitleComponent, TitleComponent = _v === void 0 ? title_1.SelectionTitle : _v, onMouseDown = _a.onMouseDown, onRequestEditTable = _a.onRequestEditTable, onRequestEditPivotTable = _a.onRequestEditPivotTable, onFlashEnd = _a.onFlashEnd, zIndex = _a.zIndex, index = _a.index, id = _a.id, showResizeHandles = _a.showResizeHandles, resizeHandleBorderColor = _a.resizeHandleBorderColor, _w = _a.resizeHandleSize, resizeHandleSize = _w === void 0 ? 6 : _w, fill = _a.fill, duration = _a.duration, selectionCount = _a.selectionCount, enableMagicFill = _a.enableMagicFill, sheetId = _a.sheetId, activeCell = _a.activeCell, selection = _a.selection, _x = _a.MagicFillComponent, MagicFillComponent = _x === void 0 ? magic_fill_1.MagicFill : _x, metadata = _a.metadata, readonly = _a.readonly, showPasteMenu = _a.showPasteMenu, onSplitTextToColumns = _a.onSplitTextToColumns, agentSuggestion = _a.agentSuggestion, isHovered = _a.isHovered, MagicFillContent = _a.MagicFillContent, _y = _a.QuickEdit, QuickEdit = _y === void 0 ? quick_edit_1.QuickEdit : _y, _z = _a.PasteMenu, PasteMenu = _z === void 0 ? paste_menu_1.PasteMenu : _z, _0 = _a.FillOptionsMenu, FillOptionsMenu = _0 === void 0 ? fill_options_menu_1.FillOptionsMenu : _0, fillOptions = _a.fillOptions, onChooseFillType = _a.onChooseFillType, onOpenFillSeriesDialog = _a.onOpenFillSeriesDialog, onCloseFillOptions = _a.onCloseFillOptions, _1 = _a.InsertOptionsSmartTag, InsertOptionsSmartTag = _1 === void 0 ? insert_options_smart_tag_1.InsertOptionsSmartTag : _1, insertOptions = _a.insertOptions, onChooseInsertOption = _a.onChooseInsertOption, tableAutoExpansion = _a.tableAutoExpansion, onChooseTableAutoExpansionOption = _a.onChooseTableAutoExpansionOption, calculatedColumnFill = _a.calculatedColumnFill, onChooseCalculatedColumnOption = _a.onChooseCalculatedColumnOption, _2 = _a.SuggestionAction, SuggestionAction = _2 === void 0 ? suggestion_action_1.SuggestionAction : _2, onRemoveQuickEdit = _a.onRemoveQuickEdit, onAddQuickEdit = _a.onAddQuickEdit;
23
+ var _b = _a.x, x = _b === void 0 ? 0 : _b, _c = _a.y, y = _c === void 0 ? 0 : _c, _d = _a.width, width = _d === void 0 ? 0 : _d, _e = _a.height, height = _e === void 0 ? 0 : _e, _f = _a.fillHandleSize, fillHandleSize = _f === void 0 ? 8 : _f, showFillHandle = _a.showFillHandle, _g = _a.offset, offset = _g === void 0 ? 0 : _g, stroke = _a.stroke, _h = _a.strokeLeftColor, strokeLeftColor = _h === void 0 ? stroke : _h, _j = _a.strokeTopColor, strokeTopColor = _j === void 0 ? stroke : _j, _k = _a.strokeRightColor, strokeRightColor = _k === void 0 ? stroke : _k, _l = _a.strokeBottomColor, strokeBottomColor = _l === void 0 ? stroke : _l, _m = _a.strokeWidth, strokeWidth = _m === void 0 ? 0 : _m, _o = _a.strokeTopWidth, strokeTopWidth = _o === void 0 ? strokeWidth : _o, _p = _a.strokeRightWidth, strokeRightWidth = _p === void 0 ? strokeWidth : _p, _q = _a.strokeBottomWidth, strokeBottomWidth = _q === void 0 ? strokeWidth : _q, _r = _a.strokeLeftWidth, strokeLeftWidth = _r === void 0 ? strokeWidth : _r, _s = _a.strokeStyle, strokeStyle = _s === void 0 ? "solid" : _s, _t = _a.fillOpacity, fillOpacity = _t === void 0 ? 1 : _t, draggable = _a.draggable, isDragging = _a.isDragging, _u = _a.borderCoverWidth, borderCoverWidth = _u === void 0 ? 5 : _u, type = _a.type, range = _a.range, title = _a.title, keepTitleWithinBounds = _a.keepTitleWithinBounds, keepTitleWithinVerticalBounds = _a.keepTitleWithinVerticalBounds, flipTitleToBottom = _a.flipTitleToBottom, table = _a.table, pivotTable = _a.pivotTable, onMouseDownTitle = _a.onMouseDownTitle, onMouseDownResizeHandle = _a.onMouseDownResizeHandle, onMouseDownMoveHandle = _a.onMouseDownMoveHandle, _v = _a.TitleComponent, TitleComponent = _v === void 0 ? title_1.SelectionTitle : _v, onMouseDown = _a.onMouseDown, onRequestEditTable = _a.onRequestEditTable, onRequestEditPivotTable = _a.onRequestEditPivotTable, onFlashEnd = _a.onFlashEnd, zIndex = _a.zIndex, index = _a.index, id = _a.id, showResizeHandles = _a.showResizeHandles, resizeHandleBorderColor = _a.resizeHandleBorderColor, _w = _a.resizeHandleSize, resizeHandleSize = _w === void 0 ? 6 : _w, fill = _a.fill, duration = _a.duration, selectionCount = _a.selectionCount, enableMagicFill = _a.enableMagicFill, sheetId = _a.sheetId, activeCell = _a.activeCell, selection = _a.selection, _x = _a.MagicFillComponent, MagicFillComponent = _x === void 0 ? magic_fill_1.MagicFill : _x, metadata = _a.metadata, readonly = _a.readonly, showPasteMenu = _a.showPasteMenu, onSplitTextToColumns = _a.onSplitTextToColumns, onChoosePasteOption = _a.onChoosePasteOption, agentSuggestion = _a.agentSuggestion, isHovered = _a.isHovered, MagicFillContent = _a.MagicFillContent, _y = _a.QuickEdit, QuickEdit = _y === void 0 ? quick_edit_1.QuickEdit : _y, _z = _a.PasteMenu, PasteMenu = _z === void 0 ? paste_menu_1.PasteMenu : _z, _0 = _a.FillOptionsMenu, FillOptionsMenu = _0 === void 0 ? fill_options_menu_1.FillOptionsMenu : _0, fillOptions = _a.fillOptions, onChooseFillType = _a.onChooseFillType, onOpenFillSeriesDialog = _a.onOpenFillSeriesDialog, onCloseFillOptions = _a.onCloseFillOptions, _1 = _a.InsertOptionsSmartTag, InsertOptionsSmartTag = _1 === void 0 ? insert_options_smart_tag_1.InsertOptionsSmartTag : _1, insertOptions = _a.insertOptions, onChooseInsertOption = _a.onChooseInsertOption, tableAutoExpansion = _a.tableAutoExpansion, onChooseTableAutoExpansionOption = _a.onChooseTableAutoExpansionOption, calculatedColumnFill = _a.calculatedColumnFill, onChooseCalculatedColumnOption = _a.onChooseCalculatedColumnOption, errorCheck = _a.errorCheck, _2 = _a.errorCheckMenuOpen, errorCheckMenuOpen = _2 === void 0 ? false : _2, onErrorCheckMenuOpenChange = _a.onErrorCheckMenuOpenChange, onChooseErrorCheckOption = _a.onChooseErrorCheckOption, _3 = _a.SuggestionAction, SuggestionAction = _3 === void 0 ? suggestion_action_1.SuggestionAction : _3, onRemoveQuickEdit = _a.onRemoveQuickEdit, onAddQuickEdit = _a.onAddQuickEdit;
23
24
  // Show paste menu
24
25
  var finalShowPasteMenu = !showPasteMenu
25
26
  ? false
@@ -178,10 +179,14 @@ exports.Selection = (0, react_1.memo)(function (_a) {
178
179
  (type === "selection" ||
179
180
  (type === "activeCell" && selectionCount === 0)) ? (react_1.default.createElement(MagicFillComponent, { sheetId: sheetId, x: x, y: y, height: height, width: width, type: type, activeCell: activeCell, selection: selection, isHovered: isHovered, MagicFillContent: MagicFillContent, onAddQuickEdit: onAddQuickEdit, backgroundColor: stroke })) : null,
180
181
  type === "quickedit" ? (react_1.default.createElement(QuickEdit, { x: x, y: y, width: width, height: height, range: range, sheetId: sheetId, onRemoveQuickEdit: onRemoveQuickEdit })) : null,
181
- finalShowPasteMenu && (react_1.default.createElement(PasteMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, onSplitTextToColumns: onSplitTextToColumns })),
182
+ finalShowPasteMenu && (react_1.default.createElement(PasteMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, onSplitTextToColumns: onSplitTextToColumns, onChoosePasteOption: onChoosePasteOption })),
182
183
  fillOptions && type === "selection" && onChooseFillType ? (react_1.default.createElement(FillOptionsMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, mode: fillOptions.mode, fillType: fillOptions.fillType, hasDates: fillOptions.hasDates, onChooseFillType: onChooseFillType, onOpenSeriesDialog: onOpenFillSeriesDialog, onClose: onCloseFillOptions })) : null,
183
184
  insertOptions && onChooseInsertOption ? (react_1.default.createElement(InsertOptionsSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, axis: insertOptions.axis, option: insertOptions.option, onChooseOption: onChooseInsertOption })) : null,
184
185
  tableAutoExpansion && onChooseTableAutoExpansionOption ? (react_1.default.createElement(table_auto_expansion_smart_tag_1.TableAutoExpansionSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, canStop: tableAutoExpansion.canStop, onChooseOption: onChooseTableAutoExpansionOption })) : null,
185
- calculatedColumnFill && onChooseCalculatedColumnOption ? (react_1.default.createElement(calculated_column_smart_tag_1.CalculatedColumnSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, kind: calculatedColumnFill.kind, canStop: calculatedColumnFill.canStop, onChooseOption: onChooseCalculatedColumnOption })) : null));
186
+ calculatedColumnFill && onChooseCalculatedColumnOption ? (react_1.default.createElement(calculated_column_smart_tag_1.CalculatedColumnSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, kind: calculatedColumnFill.kind, canStop: calculatedColumnFill.canStop, onChooseOption: onChooseCalculatedColumnOption })) : null,
187
+ errorCheck &&
188
+ type === "activeCell" &&
189
+ onChooseErrorCheckOption &&
190
+ onErrorCheckMenuOpenChange ? (react_1.default.createElement(error_check_smart_tag_1.ErrorCheckSmartTag, { x: x, y: y, width: width, height: height, kind: errorCheck.kind, errorName: errorCheck.errorName, open: errorCheckMenuOpen, onOpenChange: onErrorCheckMenuOpenChange, onChooseOption: onChooseErrorCheckOption })) : null));
186
191
  });
187
192
  exports.Selection.displayName = "Selection";
@@ -1,10 +1,23 @@
1
1
  import React from "react";
2
+ import { type PasteOptionId } from "./paste-options";
2
3
  export type PasteMenuProps = {
3
4
  x: number;
4
5
  y: number;
5
6
  width: number;
6
7
  height: number;
7
8
  onSplitTextToColumns?: (delimiter?: string) => void;
9
+ /**
10
+ * Re-apply the last paste as this gallery entry (Excel's Paste Options).
11
+ * Without it the button offers only Split text to columns.
12
+ */
13
+ onChoosePasteOption?: (option: PasteOptionId) => void;
8
14
  };
9
- export declare const PasteMenu: ({ x, y, width, height, onSplitTextToColumns, }: PasteMenuProps) => React.JSX.Element;
15
+ /**
16
+ * Excel's Paste Options button, shown at the bottom-right of a pasted range.
17
+ * Its gallery re-applies the last paste as Paste, Formulas, Values, Transpose
18
+ * and the other entries (replacing the previous result, one undo step), opens
19
+ * on a click or on Ctrl pressed alone after the paste, and picks an entry with
20
+ * its letter. "Split text to columns" stays as Excel's Text Import option.
21
+ */
22
+ export declare const PasteMenu: ({ x, y, width, height, onSplitTextToColumns, onChoosePasteOption, }: PasteMenuProps) => React.JSX.Element;
10
23
  //# sourceMappingURL=paste-menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paste-menu.d.ts","sourceRoot":"","sources":["../../../../components/selection/paste-menu.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,gDAMvB,cAAc,sBAsDhB,CAAC"}
1
+ {"version":3,"file":"paste-menu.d.ts","sourceRoot":"","sources":["../../../../components/selection/paste-menu.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAG3C,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CACvD,CAAC;AAwCF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,qEAOvB,cAAc,sBA2HhB,CAAC"}
@@ -4,22 +4,94 @@ exports.PasteMenu = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var icons_1 = require("@rowsncolumns/icons");
6
6
  var ui_1 = require("@rowsncolumns/ui");
7
- var react_1 = tslib_1.__importDefault(require("react"));
7
+ var react_1 = tslib_1.__importStar(require("react"));
8
+ var paste_menu_atom_1 = require("../../atoms/paste-menu.atom");
9
+ var paste_options_1 = require("./paste-options");
10
+ /** A small text glyph for the entries the icon set has no picture for. */
11
+ var Glyph = function (_a) {
12
+ var text = _a.text;
13
+ return (react_1.default.createElement("span", { "aria-hidden": true, className: "inline-flex min-w-[1.5em] justify-center font-mono text-[10px] leading-none" }, text));
14
+ };
15
+ var ICONS = {
16
+ paste: react_1.default.createElement(icons_1.MdPaste, { "aria-hidden": true }),
17
+ formulas: react_1.default.createElement(Glyph, { text: "fx" }),
18
+ formulasAndNumberFormats: react_1.default.createElement(Glyph, { text: "%fx" }),
19
+ keepSourceFormatting: react_1.default.createElement(icons_1.MdBrush, { "aria-hidden": true }),
20
+ noBorders: react_1.default.createElement(icons_1.MdBorderClear, { "aria-hidden": true }),
21
+ keepSourceColumnWidths: react_1.default.createElement(icons_1.ExpandIcon, { "aria-hidden": true }),
22
+ transpose: react_1.default.createElement(Glyph, { text: "\u2921" }),
23
+ values: react_1.default.createElement(Glyph, { text: "123" }),
24
+ valuesAndNumberFormats: react_1.default.createElement(Glyph, { text: "%123" }),
25
+ valuesAndSourceFormatting: react_1.default.createElement(Glyph, { text: "123\u270E" }),
26
+ formatting: react_1.default.createElement(icons_1.PaintBrush, { "aria-hidden": true }),
27
+ pasteLink: react_1.default.createElement(Glyph, { text: "=A1" }),
28
+ };
29
+ /** The label with its accelerator letter underlined, as Excel draws it. */
30
+ var AcceleratorLabel = function (_a) {
31
+ var option = _a.option;
32
+ var index = option.label.toLowerCase().indexOf(option.key);
33
+ if (index < 0)
34
+ return react_1.default.createElement(react_1.default.Fragment, null, option.label);
35
+ return (react_1.default.createElement(react_1.default.Fragment, null,
36
+ option.label.slice(0, index),
37
+ react_1.default.createElement("span", { className: "underline" }, option.label.slice(index, index + 1)),
38
+ option.label.slice(index + 1)));
39
+ };
40
+ /**
41
+ * Excel's Paste Options button, shown at the bottom-right of a pasted range.
42
+ * Its gallery re-applies the last paste as Paste, Formulas, Values, Transpose
43
+ * and the other entries (replacing the previous result, one undo step), opens
44
+ * on a click or on Ctrl pressed alone after the paste, and picks an entry with
45
+ * its letter. "Split text to columns" stays as Excel's Text Import option.
46
+ */
8
47
  var PasteMenu = function (_a) {
9
- var x = _a.x, y = _a.y, width = _a.width, height = _a.height, onSplitTextToColumns = _a.onSplitTextToColumns;
48
+ var x = _a.x, y = _a.y, width = _a.width, height = _a.height, onSplitTextToColumns = _a.onSplitTextToColumns, onChoosePasteOption = _a.onChoosePasteOption;
49
+ var _b = tslib_1.__read((0, paste_menu_atom_1.usePasteMenuState)(), 2), state = _b[0], setState = _b[1];
50
+ var showGallery = Boolean(onChoosePasteOption) && state.canReapply;
51
+ var isEnabled = (0, react_1.useCallback)(function (option) { return option.id !== "pasteLink" || state.canLink; }, [state.canLink]);
52
+ var choose = (0, react_1.useCallback)(function (option) {
53
+ setState(function (prev) { return (tslib_1.__assign(tslib_1.__assign({}, prev), { open: false })); });
54
+ onChoosePasteOption === null || onChoosePasteOption === void 0 ? void 0 : onChoosePasteOption(option.id);
55
+ }, [onChoosePasteOption, setState]);
56
+ var handleKeyDown = (0, react_1.useCallback)(function (e) {
57
+ if (!showGallery || e.ctrlKey || e.metaKey || e.altKey)
58
+ return;
59
+ if (e.key.length !== 1)
60
+ return;
61
+ var option = paste_options_1.PASTE_OPTIONS.find(function (entry) { return entry.key === e.key.toLowerCase(); });
62
+ if (!option || !isEnabled(option))
63
+ return;
64
+ e.preventDefault();
65
+ e.stopPropagation();
66
+ choose(option);
67
+ }, [showGallery, isEnabled, choose]);
10
68
  return (react_1.default.createElement("div", { className: "absolute pointer-events-auto shadow-sm bg-rnc-background border-rnc-border border border-solid rounded-md flex items-start justify-start", style: {
11
69
  left: x + width,
12
70
  top: y + height,
13
- }, onMouseDown: function (e) { return e.stopPropagation(); } },
14
- react_1.default.createElement(ui_1.DropdownMenu, null,
71
+ }, onMouseDown: function (e) { return e.stopPropagation(); }, "data-testid": "paste-options" },
72
+ react_1.default.createElement(ui_1.DropdownMenu, { modal: false, open: state.open, onOpenChange: function (open) { return setState(function (prev) { return (tslib_1.__assign(tslib_1.__assign({}, prev), { open: open })); }); } },
15
73
  react_1.default.createElement(ui_1.DropdownMenuTrigger, { asChild: true },
16
- react_1.default.createElement(ui_1.IconButton, { tooltip: "Paste formatting" },
74
+ react_1.default.createElement(ui_1.IconButton, { tooltip: "Paste Options (Ctrl)", "aria-label": "Paste Options" },
17
75
  react_1.default.createElement(icons_1.MdPaste, null),
18
76
  react_1.default.createElement(icons_1.MdOutlineArrowDropDown, null))),
19
77
  react_1.default.createElement(ui_1.DropdownMenuPortal, null,
20
- react_1.default.createElement(ui_1.DropdownMenuContent, { align: "start", onCloseAutoFocus: function (event) {
78
+ react_1.default.createElement(ui_1.DropdownMenuContent, { align: "start", "aria-label": "Paste Options", onKeyDown: handleKeyDown, onCloseAutoFocus: function (event) {
21
79
  event.preventDefault();
22
80
  } },
81
+ showGallery
82
+ ? paste_options_1.PASTE_OPTION_GROUPS.map(function (group) { return (react_1.default.createElement(react_1.default.Fragment, { key: group },
83
+ react_1.default.createElement(ui_1.DropdownMenuLabel, null, group),
84
+ paste_options_1.PASTE_OPTIONS.filter(function (option) { return option.group === group; }).map(function (option) { return (react_1.default.createElement(ui_1.DropdownMenuCheckboxItem, { key: option.id, checked: state.active === option.id, disabled: !isEnabled(option), "aria-keyshortcuts": option.key.toUpperCase(), "data-paste-option": option.id, onSelect: function () { return choose(option); } },
85
+ react_1.default.createElement(ui_1.DropdownMenuItemIndicator, null,
86
+ react_1.default.createElement(icons_1.CheckIcon, null)),
87
+ react_1.default.createElement("span", { className: "mr-2 inline-flex w-5 justify-center" }, ICONS[option.id]),
88
+ react_1.default.createElement(AcceleratorLabel, { option: option }),
89
+ react_1.default.createElement(ui_1.DropdownRightSlot, null,
90
+ "(",
91
+ option.key.toUpperCase(),
92
+ ")"))); }))); })
93
+ : null,
94
+ showGallery ? react_1.default.createElement(ui_1.DropdownMenuSeparator, null) : null,
23
95
  react_1.default.createElement(ui_1.DropdownMenuSub, null,
24
96
  react_1.default.createElement(ui_1.DropdownMenuSubTrigger, null,
25
97
  "Split text to columns",
@@ -0,0 +1,28 @@
1
+ import type { PasteSpecialOptions } from "../../hooks/use-copy-paste-cut";
2
+ /**
3
+ * Excel's Paste Options button gallery (the button that appears after a
4
+ * paste, opened by clicking it or pressing Ctrl alone), in Excel's groups and
5
+ * order with its accelerator letters (support.microsoft.com "Paste options").
6
+ * Picture and Linked Picture are left out: a grid paste never produces a
7
+ * picture of cells.
8
+ */
9
+ export type PasteOptionId = "paste" | "formulas" | "formulasAndNumberFormats" | "keepSourceFormatting" | "noBorders" | "keepSourceColumnWidths" | "transpose" | "values" | "valuesAndNumberFormats" | "valuesAndSourceFormatting" | "formatting" | "pasteLink";
10
+ export type PasteOptionGroup = "Paste" | "Paste Values" | "Other Paste Options";
11
+ export type PasteOption = {
12
+ id: PasteOptionId;
13
+ label: string;
14
+ /** Accelerator letter, picked with the letter key while the gallery is open. */
15
+ key: string;
16
+ group: PasteOptionGroup;
17
+ /** The paste this option re-applies. */
18
+ request: PasteSpecialOptions;
19
+ };
20
+ export declare const PASTE_OPTIONS: PasteOption[];
21
+ export declare const PASTE_OPTION_GROUPS: PasteOptionGroup[];
22
+ /**
23
+ * The gallery entry a paste request corresponds to, so the button shows which
24
+ * option is applied (a plain Ctrl+V is "Paste"). `undefined` for a Paste
25
+ * Special combination the gallery has no entry for (Operation, Skip blanks…).
26
+ */
27
+ export declare const pasteOptionForRequest: (request?: PasteSpecialOptions) => PasteOptionId | undefined;
28
+ //# sourceMappingURL=paste-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-options.d.ts","sourceRoot":"","sources":["../../../../components/selection/paste-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,UAAU,GACV,0BAA0B,GAC1B,sBAAsB,GACtB,WAAW,GACX,wBAAwB,GACxB,WAAW,GACX,QAAQ,GACR,wBAAwB,GACxB,2BAA2B,GAC3B,YAAY,GACZ,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,cAAc,GAAG,qBAAqB,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,gBAAgB,CAAC;IACxB,wCAAwC;IACxC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,EA2CtC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EAAqD,CAAC;AAExG;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,mBAAmB,KAAG,aAAa,GAAG,SAYrF,CAAC"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pasteOptionForRequest = exports.PASTE_OPTION_GROUPS = exports.PASTE_OPTIONS = void 0;
4
+ exports.PASTE_OPTIONS = [
5
+ { id: "paste", label: "Paste", key: "p", group: "Paste", request: { paste: "all" } },
6
+ { id: "formulas", label: "Formulas", key: "f", group: "Paste", request: { paste: "formulas" } },
7
+ {
8
+ id: "formulasAndNumberFormats",
9
+ label: "Formulas & Number Formatting",
10
+ key: "o",
11
+ group: "Paste",
12
+ request: { paste: "formulasAndNumberFormats" },
13
+ },
14
+ {
15
+ id: "keepSourceFormatting",
16
+ label: "Keep Source Formatting",
17
+ key: "k",
18
+ group: "Paste",
19
+ request: { paste: "allUsingSourceTheme" },
20
+ },
21
+ { id: "noBorders", label: "No Borders", key: "b", group: "Paste", request: { paste: "allExceptBorders" } },
22
+ {
23
+ id: "keepSourceColumnWidths",
24
+ label: "Keep Source Column Widths",
25
+ key: "w",
26
+ group: "Paste",
27
+ request: { paste: "all", keepSourceColumnWidths: true },
28
+ },
29
+ { id: "transpose", label: "Transpose", key: "t", group: "Paste", request: { paste: "all", transpose: true } },
30
+ { id: "values", label: "Values", key: "v", group: "Paste Values", request: { paste: "values" } },
31
+ {
32
+ id: "valuesAndNumberFormats",
33
+ label: "Values & Number Formatting",
34
+ key: "a",
35
+ group: "Paste Values",
36
+ request: { paste: "valuesAndNumberFormats" },
37
+ },
38
+ {
39
+ id: "valuesAndSourceFormatting",
40
+ label: "Values & Source Formatting",
41
+ key: "e",
42
+ group: "Paste Values",
43
+ request: { paste: "valuesAndSourceFormatting" },
44
+ },
45
+ { id: "formatting", label: "Formatting", key: "r", group: "Other Paste Options", request: { paste: "formats" } },
46
+ { id: "pasteLink", label: "Paste Link", key: "n", group: "Other Paste Options", request: { link: true } },
47
+ ];
48
+ exports.PASTE_OPTION_GROUPS = ["Paste", "Paste Values", "Other Paste Options"];
49
+ /**
50
+ * The gallery entry a paste request corresponds to, so the button shows which
51
+ * option is applied (a plain Ctrl+V is "Paste"). `undefined` for a Paste
52
+ * Special combination the gallery has no entry for (Operation, Skip blanks…).
53
+ */
54
+ var pasteOptionForRequest = function (request) {
55
+ var _a, _b;
56
+ if (!request)
57
+ return "paste";
58
+ var extra = request.operation || request.skipBlanks;
59
+ if (extra)
60
+ return undefined;
61
+ var paste = (_a = request.paste) !== null && _a !== void 0 ? _a : "all";
62
+ return (_b = exports.PASTE_OPTIONS.find(function (option) {
63
+ var _a;
64
+ return ((_a = option.request.paste) !== null && _a !== void 0 ? _a : "all") === paste &&
65
+ Boolean(option.request.transpose) === Boolean(request.transpose) &&
66
+ Boolean(option.request.keepSourceColumnWidths) === Boolean(request.keepSourceColumnWidths) &&
67
+ Boolean(option.request.link) === Boolean(request.link);
68
+ })) === null || _b === void 0 ? void 0 : _b.id;
69
+ };
70
+ exports.pasteOptionForRequest = pasteOptionForRequest;
@@ -3,10 +3,11 @@ import type { SelectionProps } from "@rowsncolumns/grid";
3
3
  import type { ElementType } from "react";
4
4
  import type { Maybe, PivotTable, SheetRange } from "../../types";
5
5
  import type { AutoFillType, TableView } from "../../types";
6
+ import type { CalculatedColumnSmartTagProps } from "../calculated-column-smart-tag";
6
7
  import type { SelectionAttributes } from "../canvas-grid/typings";
8
+ import type { ErrorCheckSmartTagProps } from "../error-check-smart-tag";
7
9
  import type { InsertOptionsSmartTagProps } from "../insert-options-smart-tag";
8
10
  import type { TableAutoExpansionSmartTagProps } from "../table-auto-expansion-smart-tag";
9
- import type { CalculatedColumnSmartTagProps } from "../calculated-column-smart-tag";
10
11
  import type { FillOptionsMenuProps } from "./fill-options-menu";
11
12
  import type { MagicFillContentProps, MagicFillProps } from "./magic-fill";
12
13
  import type { PasteMenuProps } from "./paste-menu";
@@ -64,8 +65,18 @@ export type SelectionNewProps = SelectionProps<SelectionAttributes> & {
64
65
  */
65
66
  calculatedColumnFill?: Pick<CalculatedColumnSmartTagProps, "kind" | "canStop">;
66
67
  onChooseCalculatedColumnOption?: CalculatedColumnSmartTagProps["onChooseOption"];
68
+ /**
69
+ * Excel's error-checking smart tag for THIS selection (present only on the active cell, when it
70
+ * carries the green ◤).
71
+ */
72
+ errorCheck?: Pick<ErrorCheckSmartTagProps, "kind" | "errorName">;
73
+ errorCheckMenuOpen?: boolean;
74
+ onErrorCheckMenuOpenChange?: ErrorCheckSmartTagProps["onOpenChange"];
75
+ onChooseErrorCheckOption?: ErrorCheckSmartTagProps["onChooseOption"];
67
76
  SuggestionAction?: React.ComponentType<SuggestionActionProps>;
68
77
  readonly?: boolean;
78
+ /** Paste Options gallery choice (re-applies the last paste). */
79
+ onChoosePasteOption?: PasteMenuProps["onChoosePasteOption"];
69
80
  showPasteMenu?: boolean;
70
81
  sheetId: number;
71
82
  onSplitTextToColumns: (delimiter?: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../components/selection/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,mBAAmB,CAAC,GAAG;IACpE,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAC7D,uBAAuB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACtE,qBAAqB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACpE,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,kBAAkB,CAAC,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5C,uBAAuB,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvD,UAAU,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACnC,kBAAkB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACzD,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAChD,eAAe,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC5D;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC;IAC3E,gBAAgB,CAAC,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD,sBAAsB,CAAC,IAAI,IAAI,CAAC;IAChC,kBAAkB,CAAC,IAAI,IAAI,CAAC;IAC5B,qBAAqB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;IACxE;;;OAGG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACpE,oBAAoB,CAAC,EAAE,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;IACpE;;;OAGG;IACH,kBAAkB,CAAC,EAAE,IAAI,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;IACtE,gCAAgC,CAAC,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IACrF;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,IAAI,CAAC,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/E,8BAA8B,CAAC,EAAE,6BAA6B,CAAC,gBAAgB,CAAC,CAAC;IACjF,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3C,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACzC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../components/selection/types.ts"],"names":[],"mappings":"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"}