@rowsncolumns/spreadsheet 10.6.4 → 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 (308) 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/alignment.d.ts +25 -0
  35. package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
  36. package/dist/cjs/components/cell/alignment.js +39 -1
  37. package/dist/cjs/components/cell/cell-background.d.ts +16 -0
  38. package/dist/cjs/components/cell/cell-background.d.ts.map +1 -1
  39. package/dist/cjs/components/cell/cell-background.js +141 -54
  40. package/dist/cjs/components/cell/cell-text-runs.d.ts +12 -5
  41. package/dist/cjs/components/cell/cell-text-runs.d.ts.map +1 -1
  42. package/dist/cjs/components/cell/cell-text-runs.js +18 -20
  43. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  44. package/dist/cjs/components/cell/index.js +26 -21
  45. package/dist/cjs/components/cell/typings.d.ts +9 -0
  46. package/dist/cjs/components/cell/typings.d.ts.map +1 -1
  47. package/dist/cjs/components/cell-editor/helpers.d.ts +22 -2
  48. package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
  49. package/dist/cjs/components/cell-editor/helpers.js +32 -8
  50. package/dist/cjs/components/cell-editor/index.d.ts +7 -1
  51. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  52. package/dist/cjs/components/cell-editor/index.js +85 -13
  53. package/dist/cjs/components/cell-indicator/index.d.ts +41 -0
  54. package/dist/cjs/components/cell-indicator/index.d.ts.map +1 -0
  55. package/dist/cjs/components/cell-indicator/index.js +90 -0
  56. package/dist/cjs/components/cell-input/cell-input.d.ts +10 -2
  57. package/dist/cjs/components/cell-input/cell-input.d.ts.map +1 -1
  58. package/dist/cjs/components/cell-input/cell-input.js +5 -3
  59. package/dist/cjs/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  60. package/dist/cjs/components/cell-input/formula-bar-cell-input.js +9 -2
  61. package/dist/cjs/components/cell-structured/sparkline-math.d.ts +27 -1
  62. package/dist/cjs/components/cell-structured/sparkline-math.d.ts.map +1 -1
  63. package/dist/cjs/components/cell-structured/sparkline-math.js +48 -1
  64. package/dist/cjs/components/cell-structured/sparkline.d.ts +1 -1
  65. package/dist/cjs/components/cell-structured/sparkline.d.ts.map +1 -1
  66. package/dist/cjs/components/cell-structured/sparkline.js +36 -92
  67. package/dist/cjs/components/cell-structured/types.d.ts +6 -0
  68. package/dist/cjs/components/cell-structured/types.d.ts.map +1 -1
  69. package/dist/cjs/components/data-table-dialog/index.d.ts +22 -0
  70. package/dist/cjs/components/data-table-dialog/index.d.ts.map +1 -0
  71. package/dist/cjs/components/data-table-dialog/index.js +93 -0
  72. package/dist/cjs/components/error-check-smart-tag/index.d.ts +27 -0
  73. package/dist/cjs/components/error-check-smart-tag/index.d.ts.map +1 -0
  74. package/dist/cjs/components/error-check-smart-tag/index.js +39 -0
  75. package/dist/cjs/components/forecast-sheet-dialog/index.d.ts +26 -0
  76. package/dist/cjs/components/forecast-sheet-dialog/index.d.ts.map +1 -0
  77. package/dist/cjs/components/forecast-sheet-dialog/index.js +92 -0
  78. package/dist/cjs/components/paste-special-dialog/index.d.ts +3 -3
  79. package/dist/cjs/components/paste-special-dialog/index.d.ts.map +1 -1
  80. package/dist/cjs/components/paste-special-dialog/index.js +61 -23
  81. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
  82. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
  83. package/dist/cjs/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +196 -0
  84. package/dist/cjs/components/protect-sheet-dialog/constants.d.ts +3 -0
  85. package/dist/cjs/components/protect-sheet-dialog/constants.d.ts.map +1 -0
  86. package/dist/cjs/components/protect-sheet-dialog/constants.js +5 -0
  87. package/dist/cjs/components/protect-sheet-dialog/index.d.ts +2 -2
  88. package/dist/cjs/components/protect-sheet-dialog/index.d.ts.map +1 -1
  89. package/dist/cjs/components/protect-sheet-dialog/index.js +5 -3
  90. package/dist/cjs/components/scenario-manager-dialog/index.d.ts +51 -0
  91. package/dist/cjs/components/scenario-manager-dialog/index.d.ts.map +1 -0
  92. package/dist/cjs/components/scenario-manager-dialog/index.js +257 -0
  93. package/dist/cjs/components/selection/index.d.ts +1 -1
  94. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  95. package/dist/cjs/components/selection/index.js +9 -4
  96. package/dist/cjs/components/selection/paste-menu.d.ts +14 -1
  97. package/dist/cjs/components/selection/paste-menu.d.ts.map +1 -1
  98. package/dist/cjs/components/selection/paste-menu.js +78 -6
  99. package/dist/cjs/components/selection/paste-options.d.ts +28 -0
  100. package/dist/cjs/components/selection/paste-options.d.ts.map +1 -0
  101. package/dist/cjs/components/selection/paste-options.js +70 -0
  102. package/dist/cjs/components/selection/types.d.ts +12 -1
  103. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  104. package/dist/cjs/components/selection-drop-menu/index.d.ts +18 -0
  105. package/dist/cjs/components/selection-drop-menu/index.d.ts.map +1 -0
  106. package/dist/cjs/components/selection-drop-menu/index.js +62 -0
  107. package/dist/cjs/components/solver-dialog/index.d.ts +57 -0
  108. package/dist/cjs/components/solver-dialog/index.d.ts.map +1 -0
  109. package/dist/cjs/components/solver-dialog/index.js +204 -0
  110. package/dist/cjs/components/toolbar/sparkline-actions.d.ts +3 -2
  111. package/dist/cjs/components/toolbar/sparkline-actions.d.ts.map +1 -1
  112. package/dist/cjs/components/toolbar/sparkline-actions.js +6 -2
  113. package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
  114. package/dist/cjs/components/toolbar/table-style-selector.js +33 -2
  115. package/dist/cjs/config.d.ts +5 -4
  116. package/dist/cjs/config.d.ts.map +1 -1
  117. package/dist/cjs/config.js +13 -9
  118. package/dist/cjs/helpers.d.ts +5 -0
  119. package/dist/cjs/helpers.d.ts.map +1 -1
  120. package/dist/cjs/helpers.js +8 -4
  121. package/dist/cjs/hooks/use-cell-renderer.d.ts +12 -1
  122. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  123. package/dist/cjs/hooks/use-cell-renderer.js +6 -3
  124. package/dist/cjs/hooks/use-copy-paste-cut.d.ts +36 -2
  125. package/dist/cjs/hooks/use-copy-paste-cut.d.ts.map +1 -1
  126. package/dist/cjs/hooks/use-copy-paste-cut.js +131 -5
  127. package/dist/cjs/hooks/use-editable.d.ts +6 -0
  128. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  129. package/dist/cjs/hooks/use-editor-submit.d.ts +45 -3
  130. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  131. package/dist/cjs/hooks/use-editor-submit.js +91 -7
  132. package/dist/cjs/hooks/use-keyboard-handler.d.ts +5 -1
  133. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  134. package/dist/cjs/hooks/use-keyboard-handler.js +10 -1
  135. package/dist/cjs/hooks/use-selection-drag-copy.d.ts +55 -0
  136. package/dist/cjs/hooks/use-selection-drag-copy.d.ts.map +1 -0
  137. package/dist/cjs/hooks/use-selection-drag-copy.js +274 -0
  138. package/dist/cjs/hooks/use-selection-renderer.d.ts +8 -1
  139. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  140. package/dist/cjs/hooks/use-selection-renderer.js +7 -2
  141. package/dist/cjs/hooks/use-selection.d.ts +59 -1
  142. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  143. package/dist/cjs/hooks/use-selection.js +270 -61
  144. package/dist/cjs/index.d.ts +6 -1
  145. package/dist/cjs/index.d.ts.map +1 -1
  146. package/dist/cjs/index.js +5 -0
  147. package/dist/cjs/release-date.js +1 -1
  148. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  149. package/dist/cjs/types.d.ts +50 -1
  150. package/dist/cjs/types.d.ts.map +1 -1
  151. package/dist/esm/api/autocomplete.d.ts +42 -0
  152. package/dist/esm/api/autocomplete.d.ts.map +1 -0
  153. package/dist/esm/api/autocomplete.js +91 -0
  154. package/dist/esm/api/banded-ranges.d.ts.map +1 -1
  155. package/dist/esm/api/banded-ranges.js +52 -2
  156. package/dist/esm/api/error-checking.d.ts +82 -0
  157. package/dist/esm/api/error-checking.d.ts.map +1 -0
  158. package/dist/esm/api/error-checking.js +156 -0
  159. package/dist/esm/api/move-overwrite.d.ts +8 -2
  160. package/dist/esm/api/move-overwrite.d.ts.map +1 -1
  161. package/dist/esm/api/move-overwrite.js +17 -2
  162. package/dist/esm/api/selections.d.ts +2 -2
  163. package/dist/esm/api/validation.d.ts +39 -1
  164. package/dist/esm/api/validation.d.ts.map +1 -1
  165. package/dist/esm/api/validation.js +70 -0
  166. package/dist/esm/atoms/cell-input-context.atom.d.ts +4 -1
  167. package/dist/esm/atoms/cell-input-context.atom.d.ts.map +1 -1
  168. package/dist/esm/atoms/enter-key-direction.atom.d.ts +11 -0
  169. package/dist/esm/atoms/enter-key-direction.atom.d.ts.map +1 -0
  170. package/dist/esm/atoms/enter-key-direction.atom.js +8 -0
  171. package/dist/esm/atoms/index.d.ts +1 -0
  172. package/dist/esm/atoms/index.d.ts.map +1 -1
  173. package/dist/esm/atoms/index.js +1 -0
  174. package/dist/esm/atoms/paste-menu.atom.d.ts +22 -0
  175. package/dist/esm/atoms/paste-menu.atom.d.ts.map +1 -1
  176. package/dist/esm/atoms/paste-menu.atom.js +10 -1
  177. package/dist/esm/atoms/pick-list.atom.d.ts +15 -0
  178. package/dist/esm/atoms/pick-list.atom.d.ts.map +1 -0
  179. package/dist/esm/atoms/pick-list.atom.js +3 -0
  180. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  181. package/dist/esm/components/canvas-grid/index.js +239 -13
  182. package/dist/esm/components/canvas-grid/typings.d.ts +96 -11
  183. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  184. package/dist/esm/components/cell/alignment.d.ts +25 -0
  185. package/dist/esm/components/cell/alignment.d.ts.map +1 -1
  186. package/dist/esm/components/cell/alignment.js +33 -0
  187. package/dist/esm/components/cell/cell-background.d.ts +16 -0
  188. package/dist/esm/components/cell/cell-background.d.ts.map +1 -1
  189. package/dist/esm/components/cell/cell-background.js +106 -36
  190. package/dist/esm/components/cell/cell-text-runs.d.ts +12 -5
  191. package/dist/esm/components/cell/cell-text-runs.d.ts.map +1 -1
  192. package/dist/esm/components/cell/cell-text-runs.js +17 -22
  193. package/dist/esm/components/cell/index.d.ts.map +1 -1
  194. package/dist/esm/components/cell/index.js +25 -20
  195. package/dist/esm/components/cell/typings.d.ts +9 -0
  196. package/dist/esm/components/cell/typings.d.ts.map +1 -1
  197. package/dist/esm/components/cell-editor/helpers.d.ts +22 -2
  198. package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
  199. package/dist/esm/components/cell-editor/helpers.js +25 -7
  200. package/dist/esm/components/cell-editor/index.d.ts +7 -1
  201. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  202. package/dist/esm/components/cell-editor/index.js +80 -9
  203. package/dist/esm/components/cell-indicator/index.d.ts +41 -0
  204. package/dist/esm/components/cell-indicator/index.d.ts.map +1 -0
  205. package/dist/esm/components/cell-indicator/index.js +76 -0
  206. package/dist/esm/components/cell-input/cell-input.d.ts +10 -2
  207. package/dist/esm/components/cell-input/cell-input.d.ts.map +1 -1
  208. package/dist/esm/components/cell-input/cell-input.js +5 -3
  209. package/dist/esm/components/cell-input/formula-bar-cell-input.d.ts.map +1 -1
  210. package/dist/esm/components/cell-input/formula-bar-cell-input.js +9 -2
  211. package/dist/esm/components/cell-structured/sparkline-math.d.ts +27 -1
  212. package/dist/esm/components/cell-structured/sparkline-math.d.ts.map +1 -1
  213. package/dist/esm/components/cell-structured/sparkline-math.js +35 -0
  214. package/dist/esm/components/cell-structured/sparkline.d.ts +1 -1
  215. package/dist/esm/components/cell-structured/sparkline.d.ts.map +1 -1
  216. package/dist/esm/components/cell-structured/sparkline.js +34 -88
  217. package/dist/esm/components/cell-structured/types.d.ts +6 -0
  218. package/dist/esm/components/cell-structured/types.d.ts.map +1 -1
  219. package/dist/esm/components/data-table-dialog/index.d.ts +22 -0
  220. package/dist/esm/components/data-table-dialog/index.d.ts.map +1 -0
  221. package/dist/esm/components/data-table-dialog/index.js +75 -0
  222. package/dist/esm/components/error-check-smart-tag/index.d.ts +27 -0
  223. package/dist/esm/components/error-check-smart-tag/index.d.ts.map +1 -0
  224. package/dist/esm/components/error-check-smart-tag/index.js +33 -0
  225. package/dist/esm/components/forecast-sheet-dialog/index.d.ts +26 -0
  226. package/dist/esm/components/forecast-sheet-dialog/index.d.ts.map +1 -0
  227. package/dist/esm/components/forecast-sheet-dialog/index.js +83 -0
  228. package/dist/esm/components/paste-special-dialog/index.d.ts +3 -3
  229. package/dist/esm/components/paste-special-dialog/index.d.ts.map +1 -1
  230. package/dist/esm/components/paste-special-dialog/index.js +58 -23
  231. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts +57 -0
  232. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.d.ts.map +1 -0
  233. package/dist/esm/components/protect-sheet-dialog/allow-edit-ranges-dialog.js +177 -0
  234. package/dist/esm/components/protect-sheet-dialog/constants.d.ts +3 -0
  235. package/dist/esm/components/protect-sheet-dialog/constants.d.ts.map +1 -0
  236. package/dist/esm/components/protect-sheet-dialog/constants.js +2 -0
  237. package/dist/esm/components/protect-sheet-dialog/index.d.ts +2 -2
  238. package/dist/esm/components/protect-sheet-dialog/index.d.ts.map +1 -1
  239. package/dist/esm/components/protect-sheet-dialog/index.js +3 -2
  240. package/dist/esm/components/scenario-manager-dialog/index.d.ts +51 -0
  241. package/dist/esm/components/scenario-manager-dialog/index.d.ts.map +1 -0
  242. package/dist/esm/components/scenario-manager-dialog/index.js +213 -0
  243. package/dist/esm/components/selection/index.d.ts +1 -1
  244. package/dist/esm/components/selection/index.d.ts.map +1 -1
  245. package/dist/esm/components/selection/index.js +9 -4
  246. package/dist/esm/components/selection/paste-menu.d.ts +14 -1
  247. package/dist/esm/components/selection/paste-menu.d.ts.map +1 -1
  248. package/dist/esm/components/selection/paste-menu.js +76 -8
  249. package/dist/esm/components/selection/paste-options.d.ts +28 -0
  250. package/dist/esm/components/selection/paste-options.d.ts.map +1 -0
  251. package/dist/esm/components/selection/paste-options.js +62 -0
  252. package/dist/esm/components/selection/types.d.ts +12 -1
  253. package/dist/esm/components/selection/types.d.ts.map +1 -1
  254. package/dist/esm/components/selection-drop-menu/index.d.ts +18 -0
  255. package/dist/esm/components/selection-drop-menu/index.d.ts.map +1 -0
  256. package/dist/esm/components/selection-drop-menu/index.js +56 -0
  257. package/dist/esm/components/solver-dialog/index.d.ts +57 -0
  258. package/dist/esm/components/solver-dialog/index.d.ts.map +1 -0
  259. package/dist/esm/components/solver-dialog/index.js +176 -0
  260. package/dist/esm/components/toolbar/sparkline-actions.d.ts +3 -2
  261. package/dist/esm/components/toolbar/sparkline-actions.d.ts.map +1 -1
  262. package/dist/esm/components/toolbar/sparkline-actions.js +6 -2
  263. package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
  264. package/dist/esm/components/toolbar/table-style-selector.js +29 -3
  265. package/dist/esm/config.d.ts +5 -4
  266. package/dist/esm/config.d.ts.map +1 -1
  267. package/dist/esm/config.js +12 -8
  268. package/dist/esm/helpers.d.ts +5 -0
  269. package/dist/esm/helpers.d.ts.map +1 -1
  270. package/dist/esm/helpers.js +8 -4
  271. package/dist/esm/hooks/use-cell-renderer.d.ts +12 -1
  272. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  273. package/dist/esm/hooks/use-cell-renderer.js +5 -2
  274. package/dist/esm/hooks/use-copy-paste-cut.d.ts +36 -2
  275. package/dist/esm/hooks/use-copy-paste-cut.d.ts.map +1 -1
  276. package/dist/esm/hooks/use-copy-paste-cut.js +117 -6
  277. package/dist/esm/hooks/use-editable.d.ts +6 -0
  278. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  279. package/dist/esm/hooks/use-editor-submit.d.ts +45 -3
  280. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  281. package/dist/esm/hooks/use-editor-submit.js +81 -6
  282. package/dist/esm/hooks/use-keyboard-handler.d.ts +5 -1
  283. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  284. package/dist/esm/hooks/use-keyboard-handler.js +10 -1
  285. package/dist/esm/hooks/use-selection-drag-copy.d.ts +55 -0
  286. package/dist/esm/hooks/use-selection-drag-copy.d.ts.map +1 -0
  287. package/dist/esm/hooks/use-selection-drag-copy.js +245 -0
  288. package/dist/esm/hooks/use-selection-renderer.d.ts +8 -1
  289. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  290. package/dist/esm/hooks/use-selection-renderer.js +7 -2
  291. package/dist/esm/hooks/use-selection.d.ts +59 -1
  292. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  293. package/dist/esm/hooks/use-selection.js +245 -52
  294. package/dist/esm/index.d.ts +6 -1
  295. package/dist/esm/index.d.ts.map +1 -1
  296. package/dist/esm/index.js +5 -0
  297. package/dist/esm/release-date.js +1 -1
  298. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  299. package/dist/esm/types.d.ts +50 -1
  300. package/dist/esm/types.d.ts.map +1 -1
  301. package/dist/spreadsheet.min.css +1 -1
  302. package/package.json +6 -5
  303. package/dist/cjs/components/cell-error/index.d.ts +0 -14
  304. package/dist/cjs/components/cell-error/index.d.ts.map +0 -1
  305. package/dist/cjs/components/cell-error/index.js +0 -24
  306. package/dist/esm/components/cell-error/index.d.ts +0 -14
  307. package/dist/esm/components/cell-error/index.d.ts.map +0 -1
  308. package/dist/esm/components/cell-error/index.js +0 -18
@@ -0,0 +1,213 @@
1
+ import { Cross1Icon } from "@rowsncolumns/icons";
2
+ import { Button, Dialog, DialogBody, DialogCloseButton, DialogContent, DialogDescription, DialogTitle, Input, Separator, } from "@rowsncolumns/ui";
3
+ import { addressToCell, cellToAddress } from "@rowsncolumns/utils";
4
+ import React, { memo, useCallback, useEffect, useState } from "react";
5
+ /** Excel's cap on changing cells per scenario. */
6
+ export const MAX_SCENARIO_CHANGING_CELLS = 32;
7
+ /**
8
+ * `B1:B3, D5` → its cells in order (deduplicated), or `null` when a part is not a
9
+ * cell or range reference.
10
+ */
11
+ export const parseCellList = (text) => {
12
+ const cells = [];
13
+ const parts = text
14
+ .split(/[,;]/)
15
+ .map((p) => p.trim().replace(/\$/g, ""))
16
+ .filter((p) => p !== "");
17
+ if (parts.length === 0)
18
+ return null;
19
+ for (const part of parts) {
20
+ const [a, b = a] = part.split(":");
21
+ if (!/^[A-Za-z]{1,3}\d+$/.test(a) || !/^[A-Za-z]{1,3}\d+$/.test(b))
22
+ return null;
23
+ const start = addressToCell(a);
24
+ const end = addressToCell(b);
25
+ if (!start || !end)
26
+ return null;
27
+ for (let r = Math.min(start.rowIndex, end.rowIndex); r <= Math.max(start.rowIndex, end.rowIndex); r++) {
28
+ for (let c = Math.min(start.columnIndex, end.columnIndex); c <= Math.max(start.columnIndex, end.columnIndex); c++) {
29
+ if (!cells.some((x) => x.rowIndex === r && x.columnIndex === c)) {
30
+ cells.push({ rowIndex: r, columnIndex: c });
31
+ }
32
+ if (cells.length > MAX_SCENARIO_CHANGING_CELLS)
33
+ return cells;
34
+ }
35
+ }
36
+ }
37
+ return cells;
38
+ };
39
+ const cellsText = (cells) => cells.map((c) => cellToAddress(c) ?? "").join(",");
40
+ /**
41
+ * Excel's Scenario Manager: the sheet's scenarios with Show / Add / Delete /
42
+ * Edit / Summary. Add and Edit ask for the name, changing cells and comment,
43
+ * then a value for each changing cell (Scenario Values). Merge is not offered.
44
+ */
45
+ export const ScenarioManagerDialog = memo(({ open, onOpenChange, scenarios, defaultChangingCells, getCellValue, onAdd, onUpdate, onDelete, onShow, onSummary, }) => {
46
+ const [view, setView] = useState({ kind: "list" });
47
+ const [selected, setSelected] = useState(0);
48
+ const [name, setName] = useState("");
49
+ const [changing, setChanging] = useState("");
50
+ const [comment, setComment] = useState("");
51
+ const [locked, setLocked] = useState(true);
52
+ const [hidden, setHidden] = useState(false);
53
+ const [resultCells, setResultCells] = useState("");
54
+ const [error, setError] = useState(undefined);
55
+ useEffect(() => {
56
+ if (open) {
57
+ setView({ kind: "list" });
58
+ setSelected(0);
59
+ setError(undefined);
60
+ }
61
+ }, [open]);
62
+ const current = scenarios[Math.min(selected, scenarios.length - 1)];
63
+ const run = useCallback(async (action, after) => {
64
+ const refusal = await action();
65
+ if (refusal) {
66
+ setError(refusal);
67
+ return;
68
+ }
69
+ setError(undefined);
70
+ after?.();
71
+ }, []);
72
+ const startEdit = (scenario) => {
73
+ setName(scenario?.name ?? "");
74
+ setChanging(scenario ? cellsText(scenario.cells) : defaultChangingCells);
75
+ setComment(scenario?.comment ?? "");
76
+ setLocked(scenario?.locked ?? true);
77
+ setHidden(scenario?.hidden ?? false);
78
+ setError(undefined);
79
+ setView({ kind: "edit", editing: scenario?.name });
80
+ };
81
+ const toValues = (event) => {
82
+ event.preventDefault();
83
+ if (view.kind !== "edit")
84
+ return;
85
+ if (name.trim() === "") {
86
+ setError("Type a scenario name.");
87
+ return;
88
+ }
89
+ const cells = parseCellList(changing);
90
+ if (!cells) {
91
+ setError("Changing cell reference is not valid.");
92
+ return;
93
+ }
94
+ if (cells.length > MAX_SCENARIO_CHANGING_CELLS) {
95
+ setError("Too many changing cells. A scenario can have up to 32.");
96
+ return;
97
+ }
98
+ const previous = scenarios.find((s) => s.name === view.editing);
99
+ setError(undefined);
100
+ setView({
101
+ kind: "values",
102
+ editing: view.editing,
103
+ draft: {
104
+ name: name.trim(),
105
+ comment: comment.trim() === "" ? undefined : comment,
106
+ locked,
107
+ hidden,
108
+ cells: cells.map((c) => ({
109
+ ...c,
110
+ value: previous?.cells.find((p) => p.rowIndex === c.rowIndex && p.columnIndex === c.columnIndex)?.value ?? getCellValue(c.rowIndex, c.columnIndex),
111
+ })),
112
+ },
113
+ });
114
+ };
115
+ const saveValues = (event) => {
116
+ event.preventDefault();
117
+ if (view.kind !== "values")
118
+ return;
119
+ const { draft, editing } = view;
120
+ void run(() => (editing === undefined ? onAdd(draft) : onUpdate(editing, draft)), () => setView({ kind: "list" }));
121
+ };
122
+ const summary = (event) => {
123
+ event.preventDefault();
124
+ const cells = resultCells.trim() === "" ? [] : parseCellList(resultCells);
125
+ if (!cells) {
126
+ setError("Result cell reference is not valid.");
127
+ return;
128
+ }
129
+ void run(() => onSummary(cells), () => onOpenChange(false));
130
+ };
131
+ const footer = (primary, back = true) => (React.createElement(React.Fragment, null,
132
+ error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
133
+ React.createElement(Separator, null),
134
+ React.createElement("div", { className: "flex justify-end gap-2" },
135
+ back ? (React.createElement(Button, { type: "button", variant: "outline", size: "sm", onClick: () => {
136
+ setError(undefined);
137
+ setView({ kind: "list" });
138
+ } }, "Cancel")) : null,
139
+ React.createElement(Button, { type: "submit", size: "sm" }, primary))));
140
+ const title = view.kind === "list"
141
+ ? "Scenario Manager"
142
+ : view.kind === "values"
143
+ ? "Scenario Values"
144
+ : view.kind === "summary"
145
+ ? "Scenario Summary"
146
+ : view.editing === undefined
147
+ ? "Add Scenario"
148
+ : "Edit Scenario";
149
+ return (React.createElement(Dialog, { open: open, onOpenChange: onOpenChange },
150
+ React.createElement(DialogContent, { className: "w-[400px] max-w-[92vw] pointer-events-auto" },
151
+ React.createElement(DialogTitle, null, title),
152
+ React.createElement(DialogDescription, null, "Save and switch between sets of input values."),
153
+ React.createElement(DialogCloseButton, { onClick: () => onOpenChange(false) },
154
+ React.createElement(Cross1Icon, null)),
155
+ React.createElement(DialogBody, { className: "flex flex-col gap-3 font-system text-sm" },
156
+ view.kind === "list" ? (React.createElement("div", { className: "flex flex-col gap-3" },
157
+ scenarios.length === 0 ? (React.createElement("p", { className: "text-xs" }, "No Scenarios defined. Choose Add to add scenarios.")) : (React.createElement("ul", { "aria-label": "Scenarios", className: "max-h-40 overflow-auto rounded border border-rnc-border" }, scenarios.map((s, i) => (React.createElement("li", { key: s.name },
158
+ React.createElement("button", { type: "button", "aria-pressed": i === selected, className: `w-full px-2 py-1 text-left text-xs ${i === selected ? "bg-rnc-accent" : ""}`, onClick: () => setSelected(i) }, s.name)))))),
159
+ current ? (React.createElement("div", { className: "text-xs" },
160
+ React.createElement("div", null,
161
+ "Changing cells: ",
162
+ cellsText(current.cells)),
163
+ current.comment ? React.createElement("div", null,
164
+ "Comment: ",
165
+ current.comment) : null)) : null,
166
+ error ? (React.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
167
+ React.createElement(Separator, null),
168
+ React.createElement("div", { className: "flex flex-wrap justify-end gap-2" },
169
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", onClick: () => startEdit(undefined) }, "Add\u2026"),
170
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: () => current && void run(() => onDelete(current.name)) }, "Delete"),
171
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: () => startEdit(current) }, "Edit\u2026"),
172
+ React.createElement(Button, { type: "button", size: "sm", variant: "outline", disabled: !current, onClick: () => {
173
+ setResultCells("");
174
+ setError(undefined);
175
+ setView({ kind: "summary" });
176
+ } }, "Summary\u2026"),
177
+ React.createElement(Button, { type: "button", size: "sm", disabled: !current, onClick: () => current && void run(() => onShow(current.name)) }, "Show")))) : null,
178
+ view.kind === "edit" ? (React.createElement("form", { className: "flex flex-col gap-3", onSubmit: toValues },
179
+ React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
180
+ "Scenario name:",
181
+ React.createElement(Input, { autoFocus: true, "aria-label": "Scenario name", value: name, onChange: (e) => setName(e.target.value) })),
182
+ React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
183
+ "Changing cells:",
184
+ React.createElement(Input, { "aria-label": "Changing cells", value: changing, onChange: (e) => setChanging(e.target.value) })),
185
+ React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
186
+ "Comment:",
187
+ React.createElement(Input, { "aria-label": "Comment", value: comment, onChange: (e) => setComment(e.target.value) })),
188
+ React.createElement("label", { className: "flex items-center gap-2 text-xs" },
189
+ React.createElement("input", { type: "checkbox", checked: locked, onChange: (e) => setLocked(e.target.checked) }),
190
+ "Prevent changes"),
191
+ React.createElement("label", { className: "flex items-center gap-2 text-xs" },
192
+ React.createElement("input", { type: "checkbox", checked: hidden, onChange: (e) => setHidden(e.target.checked) }),
193
+ "Hide"),
194
+ footer("OK"))) : null,
195
+ view.kind === "values" ? (React.createElement("form", { className: "flex flex-col gap-2", onSubmit: saveValues },
196
+ React.createElement("p", { className: "text-xs" }, "Enter values for each of the changing cells."),
197
+ view.draft.cells.map((cell, i) => {
198
+ const address = cellToAddress(cell) ?? "";
199
+ return (React.createElement("label", { key: address, className: "flex items-center gap-2 text-xs" },
200
+ React.createElement("span", { className: "w-16" }, address),
201
+ React.createElement(Input, { "aria-label": address, value: cell.value, onChange: (e) => {
202
+ const cells = view.draft.cells.map((c, k) => k === i ? { ...c, value: e.target.value } : c);
203
+ setView({ ...view, draft: { ...view.draft, cells } });
204
+ } })));
205
+ }),
206
+ footer("OK"))) : null,
207
+ view.kind === "summary" ? (React.createElement("form", { className: "flex flex-col gap-3", onSubmit: summary },
208
+ React.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
209
+ "Result cells:",
210
+ React.createElement(Input, { autoFocus: true, "aria-label": "Result cells", value: resultCells, onChange: (e) => setResultCells(e.target.value) })),
211
+ footer("OK"))) : null))));
212
+ });
213
+ 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"}
@@ -1,7 +1,8 @@
1
1
  import React, { memo } from "react";
2
+ import { CalculatedColumnSmartTag } from "../calculated-column-smart-tag";
3
+ import { ErrorCheckSmartTag } from "../error-check-smart-tag";
2
4
  import { InsertOptionsSmartTag as DefaultInsertOptionsSmartTag } from "../insert-options-smart-tag";
3
5
  import { TableAutoExpansionSmartTag } from "../table-auto-expansion-smart-tag";
4
- import { CalculatedColumnSmartTag } from "../calculated-column-smart-tag";
5
6
  import { FillOptionsMenu as DefaultFillOptionsMenu } from "./fill-options-menu";
6
7
  import { MagicFill } from "./magic-fill";
7
8
  import { PasteMenu as DefaultPasteMenu } from "./paste-menu";
@@ -14,7 +15,7 @@ import { SelectionTitle } from "./title";
14
15
  * @param param0
15
16
  * @returns
16
17
  */
17
- export const Selection = memo(({ x = 0, y = 0, width = 0, height = 0, fillHandleSize = 8, showFillHandle, offset = 0, stroke, strokeLeftColor = stroke, strokeTopColor = stroke, strokeRightColor = stroke, strokeBottomColor = stroke, strokeWidth = 0, strokeTopWidth = strokeWidth, strokeRightWidth = strokeWidth, strokeBottomWidth = strokeWidth, strokeLeftWidth = strokeWidth, strokeStyle = "solid", fillOpacity = 1, draggable, isDragging, borderCoverWidth = 5, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent = SelectionTitle, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize = 6, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent = MagicFill, metadata, readonly, showPasteMenu, onSplitTextToColumns, agentSuggestion, isHovered, MagicFillContent, QuickEdit = DefaultQuickEdit, PasteMenu = DefaultPasteMenu, FillOptionsMenu = DefaultFillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag = DefaultInsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, SuggestionAction = DefaultSuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }) => {
18
+ export const Selection = memo(({ x = 0, y = 0, width = 0, height = 0, fillHandleSize = 8, showFillHandle, offset = 0, stroke, strokeLeftColor = stroke, strokeTopColor = stroke, strokeRightColor = stroke, strokeBottomColor = stroke, strokeWidth = 0, strokeTopWidth = strokeWidth, strokeRightWidth = strokeWidth, strokeBottomWidth = strokeWidth, strokeLeftWidth = strokeWidth, strokeStyle = "solid", fillOpacity = 1, draggable, isDragging, borderCoverWidth = 5, type, range, title, keepTitleWithinBounds, keepTitleWithinVerticalBounds, flipTitleToBottom, table, pivotTable, onMouseDownTitle, onMouseDownResizeHandle, onMouseDownMoveHandle, TitleComponent = SelectionTitle, onMouseDown, onRequestEditTable, onRequestEditPivotTable, onFlashEnd, zIndex, index, id, showResizeHandles, resizeHandleBorderColor, resizeHandleSize = 6, fill, duration, selectionCount, enableMagicFill, sheetId, activeCell, selection, MagicFillComponent = MagicFill, metadata, readonly, showPasteMenu, onSplitTextToColumns, onChoosePasteOption, agentSuggestion, isHovered, MagicFillContent, QuickEdit = DefaultQuickEdit, PasteMenu = DefaultPasteMenu, FillOptionsMenu = DefaultFillOptionsMenu, fillOptions, onChooseFillType, onOpenFillSeriesDialog, onCloseFillOptions, InsertOptionsSmartTag = DefaultInsertOptionsSmartTag, insertOptions, onChooseInsertOption, tableAutoExpansion, onChooseTableAutoExpansionOption, calculatedColumnFill, onChooseCalculatedColumnOption, errorCheck, errorCheckMenuOpen = false, onErrorCheckMenuOpenChange, onChooseErrorCheckOption, SuggestionAction = DefaultSuggestionAction, onRemoveQuickEdit, onAddQuickEdit, }) => {
18
19
  // Show paste menu
19
20
  const finalShowPasteMenu = !showPasteMenu
20
21
  ? false
@@ -191,10 +192,14 @@ export const Selection = memo(({ x = 0, y = 0, width = 0, height = 0, fillHandle
191
192
  (type === "selection" ||
192
193
  (type === "activeCell" && selectionCount === 0)) ? (React.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,
193
194
  type === "quickedit" ? (React.createElement(QuickEdit, { x: x, y: y, width: width, height: height, range: range, sheetId: sheetId, onRemoveQuickEdit: onRemoveQuickEdit })) : null,
194
- finalShowPasteMenu && (React.createElement(PasteMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, onSplitTextToColumns: onSplitTextToColumns })),
195
+ finalShowPasteMenu && (React.createElement(PasteMenu, { x: x + fillHandleSize / 2, y: y + fillHandleSize / 2, width: width, height: height, onSplitTextToColumns: onSplitTextToColumns, onChoosePasteOption: onChoosePasteOption })),
195
196
  fillOptions && type === "selection" && onChooseFillType ? (React.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,
196
197
  insertOptions && onChooseInsertOption ? (React.createElement(InsertOptionsSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, axis: insertOptions.axis, option: insertOptions.option, onChooseOption: onChooseInsertOption })) : null,
197
198
  tableAutoExpansion && onChooseTableAutoExpansionOption ? (React.createElement(TableAutoExpansionSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, canStop: tableAutoExpansion.canStop, onChooseOption: onChooseTableAutoExpansionOption })) : null,
198
- calculatedColumnFill && onChooseCalculatedColumnOption ? (React.createElement(CalculatedColumnSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, kind: calculatedColumnFill.kind, canStop: calculatedColumnFill.canStop, onChooseOption: onChooseCalculatedColumnOption })) : null));
199
+ calculatedColumnFill && onChooseCalculatedColumnOption ? (React.createElement(CalculatedColumnSmartTag, { x: x, y: y + fillHandleSize / 2, width: width, height: height, kind: calculatedColumnFill.kind, canStop: calculatedColumnFill.canStop, onChooseOption: onChooseCalculatedColumnOption })) : null,
200
+ errorCheck &&
201
+ type === "activeCell" &&
202
+ onChooseErrorCheckOption &&
203
+ onErrorCheckMenuOpenChange ? (React.createElement(ErrorCheckSmartTag, { x: x, y: y, width: width, height: height, kind: errorCheck.kind, errorName: errorCheck.errorName, open: errorCheckMenuOpen, onOpenChange: onErrorCheckMenuOpenChange, onChooseOption: onChooseErrorCheckOption })) : null));
199
204
  });
200
205
  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"}
@@ -1,20 +1,88 @@
1
- import { ChevronRightIcon, MdOutlineArrowDropDown, MdPaste, } from "@rowsncolumns/icons";
2
- import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, DropdownRightSlot, IconButton, } from "@rowsncolumns/ui";
3
- import React from "react";
4
- export const PasteMenu = ({ x, y, width, height, onSplitTextToColumns, }) => {
1
+ import { CheckIcon, ChevronRightIcon, ExpandIcon, MdBorderClear, MdBrush, MdOutlineArrowDropDown, MdPaste, PaintBrush, } from "@rowsncolumns/icons";
2
+ import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemIndicator, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, DropdownRightSlot, IconButton, } from "@rowsncolumns/ui";
3
+ import React, { useCallback } from "react";
4
+ import { usePasteMenuState } from "../../atoms/paste-menu.atom";
5
+ import { PASTE_OPTION_GROUPS, PASTE_OPTIONS, } from "./paste-options";
6
+ /** A small text glyph for the entries the icon set has no picture for. */
7
+ const Glyph = ({ text }) => (React.createElement("span", { "aria-hidden": true, className: "inline-flex min-w-[1.5em] justify-center font-mono text-[10px] leading-none" }, text));
8
+ const ICONS = {
9
+ paste: React.createElement(MdPaste, { "aria-hidden": true }),
10
+ formulas: React.createElement(Glyph, { text: "fx" }),
11
+ formulasAndNumberFormats: React.createElement(Glyph, { text: "%fx" }),
12
+ keepSourceFormatting: React.createElement(MdBrush, { "aria-hidden": true }),
13
+ noBorders: React.createElement(MdBorderClear, { "aria-hidden": true }),
14
+ keepSourceColumnWidths: React.createElement(ExpandIcon, { "aria-hidden": true }),
15
+ transpose: React.createElement(Glyph, { text: "\u2921" }),
16
+ values: React.createElement(Glyph, { text: "123" }),
17
+ valuesAndNumberFormats: React.createElement(Glyph, { text: "%123" }),
18
+ valuesAndSourceFormatting: React.createElement(Glyph, { text: "123\u270E" }),
19
+ formatting: React.createElement(PaintBrush, { "aria-hidden": true }),
20
+ pasteLink: React.createElement(Glyph, { text: "=A1" }),
21
+ };
22
+ /** The label with its accelerator letter underlined, as Excel draws it. */
23
+ const AcceleratorLabel = ({ option }) => {
24
+ const index = option.label.toLowerCase().indexOf(option.key);
25
+ if (index < 0)
26
+ return React.createElement(React.Fragment, null, option.label);
27
+ return (React.createElement(React.Fragment, null,
28
+ option.label.slice(0, index),
29
+ React.createElement("span", { className: "underline" }, option.label.slice(index, index + 1)),
30
+ option.label.slice(index + 1)));
31
+ };
32
+ /**
33
+ * Excel's Paste Options button, shown at the bottom-right of a pasted range.
34
+ * Its gallery re-applies the last paste as Paste, Formulas, Values, Transpose
35
+ * and the other entries (replacing the previous result, one undo step), opens
36
+ * on a click or on Ctrl pressed alone after the paste, and picks an entry with
37
+ * its letter. "Split text to columns" stays as Excel's Text Import option.
38
+ */
39
+ export const PasteMenu = ({ x, y, width, height, onSplitTextToColumns, onChoosePasteOption, }) => {
40
+ const [state, setState] = usePasteMenuState();
41
+ const showGallery = Boolean(onChoosePasteOption) && state.canReapply;
42
+ const isEnabled = useCallback((option) => option.id !== "pasteLink" || state.canLink, [state.canLink]);
43
+ const choose = useCallback((option) => {
44
+ setState((prev) => ({ ...prev, open: false }));
45
+ onChoosePasteOption?.(option.id);
46
+ }, [onChoosePasteOption, setState]);
47
+ const handleKeyDown = useCallback((e) => {
48
+ if (!showGallery || e.ctrlKey || e.metaKey || e.altKey)
49
+ return;
50
+ if (e.key.length !== 1)
51
+ return;
52
+ const option = PASTE_OPTIONS.find((entry) => entry.key === e.key.toLowerCase());
53
+ if (!option || !isEnabled(option))
54
+ return;
55
+ e.preventDefault();
56
+ e.stopPropagation();
57
+ choose(option);
58
+ }, [showGallery, isEnabled, choose]);
5
59
  return (React.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: {
6
60
  left: x + width,
7
61
  top: y + height,
8
- }, onMouseDown: (e) => e.stopPropagation() },
9
- React.createElement(DropdownMenu, null,
62
+ }, onMouseDown: (e) => e.stopPropagation(), "data-testid": "paste-options" },
63
+ React.createElement(DropdownMenu, { modal: false, open: state.open, onOpenChange: (open) => setState((prev) => ({ ...prev, open })) },
10
64
  React.createElement(DropdownMenuTrigger, { asChild: true },
11
- React.createElement(IconButton, { tooltip: "Paste formatting" },
65
+ React.createElement(IconButton, { tooltip: "Paste Options (Ctrl)", "aria-label": "Paste Options" },
12
66
  React.createElement(MdPaste, null),
13
67
  React.createElement(MdOutlineArrowDropDown, null))),
14
68
  React.createElement(DropdownMenuPortal, null,
15
- React.createElement(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => {
69
+ React.createElement(DropdownMenuContent, { align: "start", "aria-label": "Paste Options", onKeyDown: handleKeyDown, onCloseAutoFocus: (event) => {
16
70
  event.preventDefault();
17
71
  } },
72
+ showGallery
73
+ ? PASTE_OPTION_GROUPS.map((group) => (React.createElement(React.Fragment, { key: group },
74
+ React.createElement(DropdownMenuLabel, null, group),
75
+ PASTE_OPTIONS.filter((option) => option.group === group).map((option) => (React.createElement(DropdownMenuCheckboxItem, { key: option.id, checked: state.active === option.id, disabled: !isEnabled(option), "aria-keyshortcuts": option.key.toUpperCase(), "data-paste-option": option.id, onSelect: () => choose(option) },
76
+ React.createElement(DropdownMenuItemIndicator, null,
77
+ React.createElement(CheckIcon, null)),
78
+ React.createElement("span", { className: "mr-2 inline-flex w-5 justify-center" }, ICONS[option.id]),
79
+ React.createElement(AcceleratorLabel, { option: option }),
80
+ React.createElement(DropdownRightSlot, null,
81
+ "(",
82
+ option.key.toUpperCase(),
83
+ ")")))))))
84
+ : null,
85
+ showGallery ? React.createElement(DropdownMenuSeparator, null) : null,
18
86
  React.createElement(DropdownMenuSub, null,
19
87
  React.createElement(DropdownMenuSubTrigger, null,
20
88
  "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,62 @@
1
+ export const PASTE_OPTIONS = [
2
+ { id: "paste", label: "Paste", key: "p", group: "Paste", request: { paste: "all" } },
3
+ { id: "formulas", label: "Formulas", key: "f", group: "Paste", request: { paste: "formulas" } },
4
+ {
5
+ id: "formulasAndNumberFormats",
6
+ label: "Formulas & Number Formatting",
7
+ key: "o",
8
+ group: "Paste",
9
+ request: { paste: "formulasAndNumberFormats" },
10
+ },
11
+ {
12
+ id: "keepSourceFormatting",
13
+ label: "Keep Source Formatting",
14
+ key: "k",
15
+ group: "Paste",
16
+ request: { paste: "allUsingSourceTheme" },
17
+ },
18
+ { id: "noBorders", label: "No Borders", key: "b", group: "Paste", request: { paste: "allExceptBorders" } },
19
+ {
20
+ id: "keepSourceColumnWidths",
21
+ label: "Keep Source Column Widths",
22
+ key: "w",
23
+ group: "Paste",
24
+ request: { paste: "all", keepSourceColumnWidths: true },
25
+ },
26
+ { id: "transpose", label: "Transpose", key: "t", group: "Paste", request: { paste: "all", transpose: true } },
27
+ { id: "values", label: "Values", key: "v", group: "Paste Values", request: { paste: "values" } },
28
+ {
29
+ id: "valuesAndNumberFormats",
30
+ label: "Values & Number Formatting",
31
+ key: "a",
32
+ group: "Paste Values",
33
+ request: { paste: "valuesAndNumberFormats" },
34
+ },
35
+ {
36
+ id: "valuesAndSourceFormatting",
37
+ label: "Values & Source Formatting",
38
+ key: "e",
39
+ group: "Paste Values",
40
+ request: { paste: "valuesAndSourceFormatting" },
41
+ },
42
+ { id: "formatting", label: "Formatting", key: "r", group: "Other Paste Options", request: { paste: "formats" } },
43
+ { id: "pasteLink", label: "Paste Link", key: "n", group: "Other Paste Options", request: { link: true } },
44
+ ];
45
+ export const PASTE_OPTION_GROUPS = ["Paste", "Paste Values", "Other Paste Options"];
46
+ /**
47
+ * The gallery entry a paste request corresponds to, so the button shows which
48
+ * option is applied (a plain Ctrl+V is "Paste"). `undefined` for a Paste
49
+ * Special combination the gallery has no entry for (Operation, Skip blanks…).
50
+ */
51
+ export const pasteOptionForRequest = (request) => {
52
+ if (!request)
53
+ return "paste";
54
+ const extra = request.operation || request.skipBlanks;
55
+ if (extra)
56
+ return undefined;
57
+ const paste = request.paste ?? "all";
58
+ return PASTE_OPTIONS.find((option) => (option.request.paste ?? "all") === paste &&
59
+ Boolean(option.request.transpose) === Boolean(request.transpose) &&
60
+ Boolean(option.request.keepSourceColumnWidths) === Boolean(request.keepSourceColumnWidths) &&
61
+ Boolean(option.request.link) === Boolean(request.link))?.id;
62
+ };
@@ -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":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../components/selection/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import type { SelectionDropAction } from "../../hooks/use-selection-drag-copy";
3
+ export declare const SELECTION_DROP_ACTION_LABELS: Record<SelectionDropAction, string>;
4
+ export type SelectionDropMenuProps = {
5
+ /** Release point, relative to the grid container. */
6
+ x: number;
7
+ y: number;
8
+ actions: SelectionDropAction[];
9
+ onSelectAction(action: SelectionDropAction): void;
10
+ /** Cancel, Esc or a click away — nothing changes. */
11
+ onCancel(): void;
12
+ };
13
+ /**
14
+ * The menu a right-button drag of the selection border opens at the release point
15
+ * (Excel: Move Here, Copy Here, … Cancel). Opens immediately; any dismissal cancels.
16
+ */
17
+ export declare const SelectionDropMenu: ({ x, y, actions, onSelectAction, onCancel, }: SelectionDropMenuProps) => React.JSX.Element;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/selection-drop-menu/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAU5E,CAAC;AAUF,MAAM,MAAM,sBAAsB,GAAG;IACnC,qDAAqD;IACrD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClD,qDAAqD;IACrD,QAAQ,IAAI,IAAI,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,8CAM/B,sBAAsB,sBA2DxB,CAAC"}