@rowsncolumns/spreadsheet 10.2.74 → 10.2.76

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 (280) hide show
  1. package/dist/cjs/api/excel-validation-kinds.d.ts +71 -0
  2. package/dist/cjs/api/excel-validation-kinds.d.ts.map +1 -0
  3. package/dist/cjs/api/excel-validation-kinds.js +304 -0
  4. package/dist/cjs/api/fill-series.d.ts +38 -0
  5. package/dist/cjs/api/fill-series.d.ts.map +1 -0
  6. package/dist/cjs/api/fill-series.js +89 -0
  7. package/dist/cjs/api/go-to-special.d.ts +32 -0
  8. package/dist/cjs/api/go-to-special.d.ts.map +1 -0
  9. package/dist/cjs/api/go-to-special.js +111 -0
  10. package/dist/cjs/api/spreadsheet-api.d.ts +6 -2
  11. package/dist/cjs/api/spreadsheet-api.d.ts.map +1 -1
  12. package/dist/cjs/api/spreadsheet-api.js +9 -3
  13. package/dist/cjs/api/validation-tooltip.d.ts +17 -0
  14. package/dist/cjs/api/validation-tooltip.d.ts.map +1 -0
  15. package/dist/cjs/api/validation-tooltip.js +42 -0
  16. package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts +28 -0
  17. package/dist/cjs/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
  18. package/dist/cjs/atoms/advanced-filter-dialog.atom.js +32 -0
  19. package/dist/cjs/atoms/fill-options.atom.d.ts +36 -0
  20. package/dist/cjs/atoms/fill-options.atom.d.ts.map +1 -0
  21. package/dist/cjs/atoms/fill-options.atom.js +11 -0
  22. package/dist/cjs/atoms/fill-series-dialog.atom.d.ts +26 -0
  23. package/dist/cjs/atoms/fill-series-dialog.atom.d.ts.map +1 -0
  24. package/dist/cjs/atoms/fill-series-dialog.atom.js +14 -0
  25. package/dist/cjs/atoms/go-to-dialog.atom.d.ts +11 -1
  26. package/dist/cjs/atoms/go-to-dialog.atom.d.ts.map +1 -1
  27. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts +29 -0
  28. package/dist/cjs/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
  29. package/dist/cjs/atoms/goal-seek-dialog.atom.js +30 -0
  30. package/dist/cjs/atoms/index.d.ts +3 -0
  31. package/dist/cjs/atoms/index.d.ts.map +1 -1
  32. package/dist/cjs/atoms/index.js +3 -0
  33. package/dist/cjs/atoms/subtotal-dialog.atom.d.ts +39 -0
  34. package/dist/cjs/atoms/subtotal-dialog.atom.d.ts.map +1 -0
  35. package/dist/cjs/atoms/subtotal-dialog.atom.js +30 -0
  36. package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts +34 -0
  37. package/dist/cjs/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
  38. package/dist/cjs/atoms/text-to-columns-dialog.atom.js +36 -0
  39. package/dist/cjs/atoms/watch-window.atom.d.ts +37 -0
  40. package/dist/cjs/atoms/watch-window.atom.d.ts.map +1 -0
  41. package/dist/cjs/atoms/watch-window.atom.js +61 -0
  42. package/dist/cjs/components/advanced-filter-dialog/index.d.ts +28 -0
  43. package/dist/cjs/components/advanced-filter-dialog/index.d.ts.map +1 -0
  44. package/dist/cjs/components/advanced-filter-dialog/index.js +134 -0
  45. package/dist/cjs/components/calculation-options-dialog/index.d.ts +33 -0
  46. package/dist/cjs/components/calculation-options-dialog/index.d.ts.map +1 -0
  47. package/dist/cjs/components/calculation-options-dialog/index.js +69 -0
  48. package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
  49. package/dist/cjs/components/canvas-grid/index.js +328 -71
  50. package/dist/cjs/components/canvas-grid/typings.d.ts +31 -5
  51. package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
  52. package/dist/cjs/components/cell/alignment.d.ts +30 -0
  53. package/dist/cjs/components/cell/alignment.d.ts.map +1 -1
  54. package/dist/cjs/components/cell/alignment.js +56 -1
  55. package/dist/cjs/components/cell/index.d.ts.map +1 -1
  56. package/dist/cjs/components/cell/index.js +15 -7
  57. package/dist/cjs/components/cell-diff/index.d.ts +3 -2
  58. package/dist/cjs/components/cell-diff/index.d.ts.map +1 -1
  59. package/dist/cjs/components/cell-editor/helpers.d.ts +9 -0
  60. package/dist/cjs/components/cell-editor/helpers.d.ts.map +1 -1
  61. package/dist/cjs/components/cell-editor/helpers.js +8 -1
  62. package/dist/cjs/components/cell-editor/helpers.spec.js +14 -0
  63. package/dist/cjs/components/cell-editor/index.d.ts.map +1 -1
  64. package/dist/cjs/components/cell-editor/index.js +7 -3
  65. package/dist/cjs/components/context-menu/index.d.ts +6 -1
  66. package/dist/cjs/components/context-menu/index.d.ts.map +1 -1
  67. package/dist/cjs/components/context-menu/index.js +146 -3
  68. package/dist/cjs/components/embeds/embed-component.d.ts.map +1 -1
  69. package/dist/cjs/components/embeds/embed-component.js +16 -1
  70. package/dist/cjs/components/fill-series-dialog/index.d.ts +29 -0
  71. package/dist/cjs/components/fill-series-dialog/index.d.ts.map +1 -0
  72. package/dist/cjs/components/fill-series-dialog/index.js +156 -0
  73. package/dist/cjs/components/go-to-dialog/index.d.ts +11 -1
  74. package/dist/cjs/components/go-to-dialog/index.d.ts.map +1 -1
  75. package/dist/cjs/components/go-to-dialog/index.js +67 -24
  76. package/dist/cjs/components/goal-seek-dialog/index.d.ts +32 -0
  77. package/dist/cjs/components/goal-seek-dialog/index.d.ts.map +1 -0
  78. package/dist/cjs/components/goal-seek-dialog/index.js +149 -0
  79. package/dist/cjs/components/selection/fill-options-menu.d.ts +32 -0
  80. package/dist/cjs/components/selection/fill-options-menu.d.ts.map +1 -0
  81. package/dist/cjs/components/selection/fill-options-menu.js +65 -0
  82. package/dist/cjs/components/selection/index.d.ts +1 -1
  83. package/dist/cjs/components/selection/index.d.ts.map +1 -1
  84. package/dist/cjs/components/selection/index.js +4 -2
  85. package/dist/cjs/components/selection/types.d.ts +11 -1
  86. package/dist/cjs/components/selection/types.d.ts.map +1 -1
  87. package/dist/cjs/components/subtotal-dialog/index.d.ts +30 -0
  88. package/dist/cjs/components/subtotal-dialog/index.d.ts.map +1 -0
  89. package/dist/cjs/components/subtotal-dialog/index.js +126 -0
  90. package/dist/cjs/components/text-to-columns-dialog/index.d.ts +37 -0
  91. package/dist/cjs/components/text-to-columns-dialog/index.d.ts.map +1 -0
  92. package/dist/cjs/components/text-to-columns-dialog/index.js +166 -0
  93. package/dist/cjs/components/toolbar/background-color-selector.d.ts +13 -1
  94. package/dist/cjs/components/toolbar/background-color-selector.d.ts.map +1 -1
  95. package/dist/cjs/components/toolbar/background-color-selector.js +57 -11
  96. package/dist/cjs/components/toolbar/cell-style-selector.d.ts +15 -2
  97. package/dist/cjs/components/toolbar/cell-style-selector.d.ts.map +1 -1
  98. package/dist/cjs/components/toolbar/cell-style-selector.js +56 -3
  99. package/dist/cjs/components/toolbar/fill-selectors.d.ts +49 -0
  100. package/dist/cjs/components/toolbar/fill-selectors.d.ts.map +1 -0
  101. package/dist/cjs/components/toolbar/fill-selectors.js +196 -0
  102. package/dist/cjs/components/toolbar/index.d.ts +1 -0
  103. package/dist/cjs/components/toolbar/index.d.ts.map +1 -1
  104. package/dist/cjs/components/toolbar/index.js +1 -0
  105. package/dist/cjs/components/toolbar/text-format-selector.d.ts +9 -0
  106. package/dist/cjs/components/toolbar/text-format-selector.d.ts.map +1 -1
  107. package/dist/cjs/components/toolbar/text-format-selector.js +15 -3
  108. package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
  109. package/dist/cjs/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
  110. package/dist/cjs/components/toolbar/text-horizontal-align-selector.js +23 -4
  111. package/dist/cjs/components/watch-window/index.d.ts +25 -0
  112. package/dist/cjs/components/watch-window/index.d.ts.map +1 -0
  113. package/dist/cjs/components/watch-window/index.js +63 -0
  114. package/dist/cjs/hooks/use-cell-renderer.d.ts.map +1 -1
  115. package/dist/cjs/hooks/use-cell-renderer.js +17 -6
  116. package/dist/cjs/hooks/use-editable.d.ts +11 -2
  117. package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
  118. package/dist/cjs/hooks/use-editable.js +8 -0
  119. package/dist/cjs/hooks/use-editor-submit.d.ts +32 -3
  120. package/dist/cjs/hooks/use-editor-submit.d.ts.map +1 -1
  121. package/dist/cjs/hooks/use-editor-submit.js +111 -2
  122. package/dist/cjs/hooks/use-get-tooltip.d.ts.map +1 -1
  123. package/dist/cjs/hooks/use-get-tooltip.js +7 -2
  124. package/dist/cjs/hooks/use-keyboard-handler.d.ts.map +1 -1
  125. package/dist/cjs/hooks/use-keyboard-handler.js +27 -14
  126. package/dist/cjs/hooks/use-selection-renderer.d.ts +13 -2
  127. package/dist/cjs/hooks/use-selection-renderer.d.ts.map +1 -1
  128. package/dist/cjs/hooks/use-selection-renderer.js +21 -4
  129. package/dist/cjs/hooks/use-selection.d.ts +54 -4
  130. package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
  131. package/dist/cjs/hooks/use-selection.js +232 -37
  132. package/dist/cjs/index.d.ts +12 -0
  133. package/dist/cjs/index.d.ts.map +1 -1
  134. package/dist/cjs/index.js +11 -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 +156 -5
  138. package/dist/cjs/types.d.ts.map +1 -1
  139. package/dist/cjs/types.js +19 -1
  140. package/dist/esm/api/excel-validation-kinds.d.ts +71 -0
  141. package/dist/esm/api/excel-validation-kinds.d.ts.map +1 -0
  142. package/dist/esm/api/excel-validation-kinds.js +287 -0
  143. package/dist/esm/api/fill-series.d.ts +38 -0
  144. package/dist/esm/api/fill-series.d.ts.map +1 -0
  145. package/dist/esm/api/fill-series.js +78 -0
  146. package/dist/esm/api/go-to-special.d.ts +32 -0
  147. package/dist/esm/api/go-to-special.d.ts.map +1 -0
  148. package/dist/esm/api/go-to-special.js +96 -0
  149. package/dist/esm/api/spreadsheet-api.d.ts +6 -2
  150. package/dist/esm/api/spreadsheet-api.d.ts.map +1 -1
  151. package/dist/esm/api/spreadsheet-api.js +8 -3
  152. package/dist/esm/api/validation-tooltip.d.ts +17 -0
  153. package/dist/esm/api/validation-tooltip.d.ts.map +1 -0
  154. package/dist/esm/api/validation-tooltip.js +34 -0
  155. package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts +28 -0
  156. package/dist/esm/atoms/advanced-filter-dialog.atom.d.ts.map +1 -0
  157. package/dist/esm/atoms/advanced-filter-dialog.atom.js +21 -0
  158. package/dist/esm/atoms/fill-options.atom.d.ts +36 -0
  159. package/dist/esm/atoms/fill-options.atom.d.ts.map +1 -0
  160. package/dist/esm/atoms/fill-options.atom.js +5 -0
  161. package/dist/esm/atoms/fill-series-dialog.atom.d.ts +26 -0
  162. package/dist/esm/atoms/fill-series-dialog.atom.d.ts.map +1 -0
  163. package/dist/esm/atoms/fill-series-dialog.atom.js +9 -0
  164. package/dist/esm/atoms/go-to-dialog.atom.d.ts +11 -1
  165. package/dist/esm/atoms/go-to-dialog.atom.d.ts.map +1 -1
  166. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts +29 -0
  167. package/dist/esm/atoms/goal-seek-dialog.atom.d.ts.map +1 -0
  168. package/dist/esm/atoms/goal-seek-dialog.atom.js +21 -0
  169. package/dist/esm/atoms/index.d.ts +3 -0
  170. package/dist/esm/atoms/index.d.ts.map +1 -1
  171. package/dist/esm/atoms/index.js +3 -0
  172. package/dist/esm/atoms/subtotal-dialog.atom.d.ts +39 -0
  173. package/dist/esm/atoms/subtotal-dialog.atom.d.ts.map +1 -0
  174. package/dist/esm/atoms/subtotal-dialog.atom.js +21 -0
  175. package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts +34 -0
  176. package/dist/esm/atoms/text-to-columns-dialog.atom.d.ts.map +1 -0
  177. package/dist/esm/atoms/text-to-columns-dialog.atom.js +25 -0
  178. package/dist/esm/atoms/watch-window.atom.d.ts +37 -0
  179. package/dist/esm/atoms/watch-window.atom.d.ts.map +1 -0
  180. package/dist/esm/atoms/watch-window.atom.js +37 -0
  181. package/dist/esm/components/advanced-filter-dialog/index.d.ts +28 -0
  182. package/dist/esm/components/advanced-filter-dialog/index.d.ts.map +1 -0
  183. package/dist/esm/components/advanced-filter-dialog/index.js +125 -0
  184. package/dist/esm/components/calculation-options-dialog/index.d.ts +33 -0
  185. package/dist/esm/components/calculation-options-dialog/index.d.ts.map +1 -0
  186. package/dist/esm/components/calculation-options-dialog/index.js +61 -0
  187. package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
  188. package/dist/esm/components/canvas-grid/index.js +266 -26
  189. package/dist/esm/components/canvas-grid/typings.d.ts +31 -5
  190. package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
  191. package/dist/esm/components/cell/alignment.d.ts +30 -0
  192. package/dist/esm/components/cell/alignment.d.ts.map +1 -1
  193. package/dist/esm/components/cell/alignment.js +51 -0
  194. package/dist/esm/components/cell/index.d.ts.map +1 -1
  195. package/dist/esm/components/cell/index.js +16 -8
  196. package/dist/esm/components/cell-diff/index.d.ts +3 -2
  197. package/dist/esm/components/cell-diff/index.d.ts.map +1 -1
  198. package/dist/esm/components/cell-editor/helpers.d.ts +9 -0
  199. package/dist/esm/components/cell-editor/helpers.d.ts.map +1 -1
  200. package/dist/esm/components/cell-editor/helpers.js +6 -0
  201. package/dist/esm/components/cell-editor/helpers.spec.js +15 -1
  202. package/dist/esm/components/cell-editor/index.d.ts.map +1 -1
  203. package/dist/esm/components/cell-editor/index.js +8 -4
  204. package/dist/esm/components/context-menu/index.d.ts +6 -1
  205. package/dist/esm/components/context-menu/index.d.ts.map +1 -1
  206. package/dist/esm/components/context-menu/index.js +139 -4
  207. package/dist/esm/components/embeds/embed-component.d.ts.map +1 -1
  208. package/dist/esm/components/embeds/embed-component.js +17 -1
  209. package/dist/esm/components/fill-series-dialog/index.d.ts +29 -0
  210. package/dist/esm/components/fill-series-dialog/index.d.ts.map +1 -0
  211. package/dist/esm/components/fill-series-dialog/index.js +151 -0
  212. package/dist/esm/components/go-to-dialog/index.d.ts +11 -1
  213. package/dist/esm/components/go-to-dialog/index.d.ts.map +1 -1
  214. package/dist/esm/components/go-to-dialog/index.js +63 -23
  215. package/dist/esm/components/goal-seek-dialog/index.d.ts +32 -0
  216. package/dist/esm/components/goal-seek-dialog/index.d.ts.map +1 -0
  217. package/dist/esm/components/goal-seek-dialog/index.js +125 -0
  218. package/dist/esm/components/selection/fill-options-menu.d.ts +32 -0
  219. package/dist/esm/components/selection/fill-options-menu.d.ts.map +1 -0
  220. package/dist/esm/components/selection/fill-options-menu.js +63 -0
  221. package/dist/esm/components/selection/index.d.ts +1 -1
  222. package/dist/esm/components/selection/index.d.ts.map +1 -1
  223. package/dist/esm/components/selection/index.js +4 -2
  224. package/dist/esm/components/selection/types.d.ts +11 -1
  225. package/dist/esm/components/selection/types.d.ts.map +1 -1
  226. package/dist/esm/components/subtotal-dialog/index.d.ts +30 -0
  227. package/dist/esm/components/subtotal-dialog/index.d.ts.map +1 -0
  228. package/dist/esm/components/subtotal-dialog/index.js +115 -0
  229. package/dist/esm/components/text-to-columns-dialog/index.d.ts +37 -0
  230. package/dist/esm/components/text-to-columns-dialog/index.d.ts.map +1 -0
  231. package/dist/esm/components/text-to-columns-dialog/index.js +147 -0
  232. package/dist/esm/components/toolbar/background-color-selector.d.ts +13 -1
  233. package/dist/esm/components/toolbar/background-color-selector.d.ts.map +1 -1
  234. package/dist/esm/components/toolbar/background-color-selector.js +61 -11
  235. package/dist/esm/components/toolbar/cell-style-selector.d.ts +15 -2
  236. package/dist/esm/components/toolbar/cell-style-selector.d.ts.map +1 -1
  237. package/dist/esm/components/toolbar/cell-style-selector.js +46 -2
  238. package/dist/esm/components/toolbar/fill-selectors.d.ts +49 -0
  239. package/dist/esm/components/toolbar/fill-selectors.d.ts.map +1 -0
  240. package/dist/esm/components/toolbar/fill-selectors.js +162 -0
  241. package/dist/esm/components/toolbar/index.d.ts +1 -0
  242. package/dist/esm/components/toolbar/index.d.ts.map +1 -1
  243. package/dist/esm/components/toolbar/index.js +1 -0
  244. package/dist/esm/components/toolbar/text-format-selector.d.ts +9 -0
  245. package/dist/esm/components/toolbar/text-format-selector.d.ts.map +1 -1
  246. package/dist/esm/components/toolbar/text-format-selector.js +14 -2
  247. package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts +8 -0
  248. package/dist/esm/components/toolbar/text-horizontal-align-selector.d.ts.map +1 -1
  249. package/dist/esm/components/toolbar/text-horizontal-align-selector.js +21 -5
  250. package/dist/esm/components/watch-window/index.d.ts +25 -0
  251. package/dist/esm/components/watch-window/index.d.ts.map +1 -0
  252. package/dist/esm/components/watch-window/index.js +54 -0
  253. package/dist/esm/hooks/use-cell-renderer.d.ts.map +1 -1
  254. package/dist/esm/hooks/use-cell-renderer.js +17 -6
  255. package/dist/esm/hooks/use-editable.d.ts +11 -2
  256. package/dist/esm/hooks/use-editable.d.ts.map +1 -1
  257. package/dist/esm/hooks/use-editable.js +8 -0
  258. package/dist/esm/hooks/use-editor-submit.d.ts +32 -3
  259. package/dist/esm/hooks/use-editor-submit.d.ts.map +1 -1
  260. package/dist/esm/hooks/use-editor-submit.js +82 -3
  261. package/dist/esm/hooks/use-get-tooltip.d.ts.map +1 -1
  262. package/dist/esm/hooks/use-get-tooltip.js +7 -2
  263. package/dist/esm/hooks/use-keyboard-handler.d.ts.map +1 -1
  264. package/dist/esm/hooks/use-keyboard-handler.js +27 -14
  265. package/dist/esm/hooks/use-selection-renderer.d.ts +13 -2
  266. package/dist/esm/hooks/use-selection-renderer.d.ts.map +1 -1
  267. package/dist/esm/hooks/use-selection-renderer.js +22 -5
  268. package/dist/esm/hooks/use-selection.d.ts +54 -4
  269. package/dist/esm/hooks/use-selection.d.ts.map +1 -1
  270. package/dist/esm/hooks/use-selection.js +220 -36
  271. package/dist/esm/index.d.ts +12 -0
  272. package/dist/esm/index.d.ts.map +1 -1
  273. package/dist/esm/index.js +11 -0
  274. package/dist/esm/release-date.js +1 -1
  275. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  276. package/dist/esm/types.d.ts +156 -5
  277. package/dist/esm/types.d.ts.map +1 -1
  278. package/dist/esm/types.js +18 -0
  279. package/dist/spreadsheet.min.css +1 -1
  280. package/package.json +7 -7
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useOpenTextToColumnsDialog = exports.useRegisterTextToColumnsDialogHost = exports.useIsTextToColumnsDialogMounted = exports.textToColumnsDialogHostCountAtom = exports.useTextToColumnsDialogState = exports.textToColumnsDialogAtom = void 0;
4
+ var jotai_1 = require("jotai");
5
+ var react_1 = require("react");
6
+ exports.textToColumnsDialogAtom = (0, jotai_1.atom)(null);
7
+ var useTextToColumnsDialogState = function () {
8
+ return (0, jotai_1.useAtom)(exports.textToColumnsDialogAtom);
9
+ };
10
+ exports.useTextToColumnsDialogState = useTextToColumnsDialogState;
11
+ /**
12
+ * Number of mounted `TextToColumnsDialogHost`s. The context menu only offers
13
+ * "Fixed width…" while a host is mounted, so a host that has not adopted the
14
+ * dialog keeps its one-click delimiter items and no dead entry.
15
+ */
16
+ exports.textToColumnsDialogHostCountAtom = (0, jotai_1.atom)(0);
17
+ /** True when at least one `TextToColumnsDialogHost` is mounted. */
18
+ var useIsTextToColumnsDialogMounted = function () {
19
+ return (0, jotai_1.useAtomValue)(exports.textToColumnsDialogHostCountAtom) > 0;
20
+ };
21
+ exports.useIsTextToColumnsDialogMounted = useIsTextToColumnsDialogMounted;
22
+ /** Registers the calling component as a dialog host for its lifetime. */
23
+ var useRegisterTextToColumnsDialogHost = function () {
24
+ var setCount = (0, jotai_1.useSetAtom)(exports.textToColumnsDialogHostCountAtom);
25
+ (0, react_1.useEffect)(function () {
26
+ setCount(function (count) { return count + 1; });
27
+ return function () { return setCount(function (count) { return count - 1; }); };
28
+ }, [setCount]);
29
+ };
30
+ exports.useRegisterTextToColumnsDialogHost = useRegisterTextToColumnsDialogHost;
31
+ /** Returns a function that opens the host-mounted Text to Columns dialog. */
32
+ var useOpenTextToColumnsDialog = function () {
33
+ var setRequest = (0, jotai_1.useSetAtom)(exports.textToColumnsDialogAtom);
34
+ return (0, react_1.useCallback)(function (request) { return setRequest(request); }, [setRequest]);
35
+ };
36
+ exports.useOpenTextToColumnsDialog = useOpenTextToColumnsDialog;
@@ -0,0 +1,37 @@
1
+ import type { SheetCoordinate } from "../types";
2
+ /** A watched cell (Excel's Watch Window row). */
3
+ export type WatchWindowEntry = SheetCoordinate;
4
+ /**
5
+ * What the grid publishes so the host-mounted panel can show live values
6
+ * and jump to a cell. Republished on every grid render while a host is
7
+ * mounted, so values track recalculation.
8
+ */
9
+ export type WatchWindowContext = {
10
+ getSheetName?: (sheetId: number) => string | undefined;
11
+ getFormattedValue: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined;
12
+ getFormula: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined | null;
13
+ onNavigate: (cell: SheetCoordinate) => void;
14
+ };
15
+ export declare const watchWindowEntriesAtom: import("jotai").PrimitiveAtom<SheetCoordinate[]> & {
16
+ init: SheetCoordinate[];
17
+ };
18
+ export declare const watchWindowOpenAtom: import("jotai").PrimitiveAtom<boolean> & {
19
+ init: boolean;
20
+ };
21
+ export declare const watchWindowContextAtom: import("jotai").PrimitiveAtom<WatchWindowContext | null> & {
22
+ init: WatchWindowContext | null;
23
+ };
24
+ /** Number of mounted `WatchWindowHost`s — the grid offers "Add watch" only then. */
25
+ export declare const watchWindowHostCountAtom: import("jotai").PrimitiveAtom<number> & {
26
+ init: number;
27
+ };
28
+ export declare const useIsWatchWindowMounted: () => boolean;
29
+ export declare const useRegisterWatchWindowHost: () => void;
30
+ export declare const useWatchWindowEntries: () => [SheetCoordinate[], (args_0: SheetCoordinate[] | ((prev: SheetCoordinate[]) => SheetCoordinate[])) => void];
31
+ export declare const useWatchWindowOpen: () => [boolean, (args_0: boolean | ((prev: boolean) => boolean)) => void];
32
+ export declare const useWatchWindowContext: () => WatchWindowContext | null;
33
+ export declare const useSetWatchWindowContext: () => (args_0: WatchWindowContext | ((prev: WatchWindowContext | null) => WatchWindowContext | null) | null) => void;
34
+ /** Adds a cell (once) and opens the panel. */
35
+ export declare const useAddWatch: () => (cell: SheetCoordinate) => void;
36
+ export declare const useRemoveWatch: () => (cell: SheetCoordinate) => void;
37
+ //# sourceMappingURL=watch-window.atom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-window.atom.d.ts","sourceRoot":"","sources":["../../../atoms/watch-window.atom.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACvD,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,SAAS,CAAC;IACxB,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,sBAAsB;;CAA+B,CAAC;AACnE,eAAO,MAAM,mBAAmB;;CAAc,CAAC;AAC/C,eAAO,MAAM,sBAAsB;;CAAwC,CAAC;AAE5E,oFAAoF;AACpF,eAAO,MAAM,wBAAwB;;CAAU,CAAC;AAEhD,eAAO,MAAM,uBAAuB,eACQ,CAAC;AAE7C,eAAO,MAAM,0BAA0B,YAMtC,CAAC;AAEF,eAAO,MAAM,qBAAqB,mHAAwC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,2EAAqC,CAAC;AACrE,eAAO,MAAM,qBAAqB,iCAA6C,CAAC;AAChF,eAAO,MAAM,wBAAwB,sHACD,CAAC;AAOrC,8CAA8C;AAC9C,eAAO,MAAM,WAAW,eAIb,eAAe,SAUzB,CAAC;AAEF,eAAO,MAAM,cAAc,eAGhB,eAAe,SAMzB,CAAC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRemoveWatch = exports.useAddWatch = exports.useSetWatchWindowContext = exports.useWatchWindowContext = exports.useWatchWindowOpen = exports.useWatchWindowEntries = exports.useRegisterWatchWindowHost = exports.useIsWatchWindowMounted = exports.watchWindowHostCountAtom = exports.watchWindowContextAtom = exports.watchWindowOpenAtom = exports.watchWindowEntriesAtom = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var jotai_1 = require("jotai");
6
+ var react_1 = require("react");
7
+ exports.watchWindowEntriesAtom = (0, jotai_1.atom)([]);
8
+ exports.watchWindowOpenAtom = (0, jotai_1.atom)(false);
9
+ exports.watchWindowContextAtom = (0, jotai_1.atom)(null);
10
+ /** Number of mounted `WatchWindowHost`s — the grid offers "Add watch" only then. */
11
+ exports.watchWindowHostCountAtom = (0, jotai_1.atom)(0);
12
+ var useIsWatchWindowMounted = function () {
13
+ return (0, jotai_1.useAtomValue)(exports.watchWindowHostCountAtom) > 0;
14
+ };
15
+ exports.useIsWatchWindowMounted = useIsWatchWindowMounted;
16
+ var useRegisterWatchWindowHost = function () {
17
+ var setCount = (0, jotai_1.useSetAtom)(exports.watchWindowHostCountAtom);
18
+ (0, react_1.useEffect)(function () {
19
+ setCount(function (count) { return count + 1; });
20
+ return function () { return setCount(function (count) { return count - 1; }); };
21
+ }, [setCount]);
22
+ };
23
+ exports.useRegisterWatchWindowHost = useRegisterWatchWindowHost;
24
+ var useWatchWindowEntries = function () { return (0, jotai_1.useAtom)(exports.watchWindowEntriesAtom); };
25
+ exports.useWatchWindowEntries = useWatchWindowEntries;
26
+ var useWatchWindowOpen = function () { return (0, jotai_1.useAtom)(exports.watchWindowOpenAtom); };
27
+ exports.useWatchWindowOpen = useWatchWindowOpen;
28
+ var useWatchWindowContext = function () { return (0, jotai_1.useAtomValue)(exports.watchWindowContextAtom); };
29
+ exports.useWatchWindowContext = useWatchWindowContext;
30
+ var useSetWatchWindowContext = function () {
31
+ return (0, jotai_1.useSetAtom)(exports.watchWindowContextAtom);
32
+ };
33
+ exports.useSetWatchWindowContext = useSetWatchWindowContext;
34
+ var sameCell = function (a, b) {
35
+ return a.sheetId === b.sheetId &&
36
+ a.rowIndex === b.rowIndex &&
37
+ a.columnIndex === b.columnIndex;
38
+ };
39
+ /** Adds a cell (once) and opens the panel. */
40
+ var useAddWatch = function () {
41
+ var setEntries = (0, jotai_1.useSetAtom)(exports.watchWindowEntriesAtom);
42
+ var setOpen = (0, jotai_1.useSetAtom)(exports.watchWindowOpenAtom);
43
+ return (0, react_1.useCallback)(function (cell) {
44
+ setEntries(function (entries) {
45
+ return entries.some(function (entry) { return sameCell(entry, cell); })
46
+ ? entries
47
+ : tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(entries), false), [cell], false);
48
+ });
49
+ setOpen(true);
50
+ }, [setEntries, setOpen]);
51
+ };
52
+ exports.useAddWatch = useAddWatch;
53
+ var useRemoveWatch = function () {
54
+ var setEntries = (0, jotai_1.useSetAtom)(exports.watchWindowEntriesAtom);
55
+ return (0, react_1.useCallback)(function (cell) {
56
+ return setEntries(function (entries) {
57
+ return entries.filter(function (entry) { return !sameCell(entry, cell); });
58
+ });
59
+ }, [setEntries]);
60
+ };
61
+ exports.useRemoveWatch = useRemoveWatch;
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import type { AdvancedFilterOptions } from "../../types";
3
+ export type AdvancedFilterDialogProps = {
4
+ /** Controls visibility. */
5
+ open: boolean;
6
+ onOpenChange(open: boolean): void;
7
+ /** Default "List range" (A1 reference of the data block around the active cell). */
8
+ initialListRange: string;
9
+ /** Emits the resolved options; the host routes them to `onAdvancedFilter`. */
10
+ onApply(options: AdvancedFilterOptions): void;
11
+ };
12
+ /**
13
+ * Excel's Advanced Filter dialog: filter in place or copy to another
14
+ * location, a list range, a criteria range (header row + criteria rows),
15
+ * the copy destination and "Unique records only".
16
+ */
17
+ export declare const AdvancedFilterDialog: React.MemoExoticComponent<({ open, onOpenChange, initialListRange, onApply }: AdvancedFilterDialogProps) => React.JSX.Element>;
18
+ /**
19
+ * Host-mounted, atom-driven wrapper around {@link AdvancedFilterDialog}.
20
+ * Mount once in the host; the context menu opens it via
21
+ * `useOpenAdvancedFilterDialog` and only offers the item while a host is
22
+ * mounted.
23
+ */
24
+ export declare const AdvancedFilterDialogHost: {
25
+ (): React.JSX.Element;
26
+ displayName: string;
27
+ };
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/advanced-filter-dialog/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAMtE,OAAO,KAAK,EAAwB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,yBAAyB,GAAG;IACtC,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC/C,CAAC;AAQF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gFACqB,yBAAyB,uBAsK9E,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;CAcpC,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdvancedFilterDialogHost = exports.AdvancedFilterDialog = 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
+ var advanced_filter_dialog_atom_1 = require("../../atoms/advanced-filter-dialog.atom");
10
+ var parseRange = function (text) {
11
+ var _a;
12
+ var trimmed = text.trim().replace(/^[^!]*!/, "");
13
+ if (!/^\$?[A-Za-z]{1,3}\$?\d+(:\$?[A-Za-z]{1,3}\$?\d+)?$/.test(trimmed))
14
+ return undefined;
15
+ return (_a = (0, utils_1.addressToSelection)(trimmed)) === null || _a === void 0 ? void 0 : _a.range;
16
+ };
17
+ /**
18
+ * Excel's Advanced Filter dialog: filter in place or copy to another
19
+ * location, a list range, a criteria range (header row + criteria rows),
20
+ * the copy destination and "Unique records only".
21
+ */
22
+ exports.AdvancedFilterDialog = (0, react_1.memo)(function (_a) {
23
+ var open = _a.open, onOpenChange = _a.onOpenChange, initialListRange = _a.initialListRange, onApply = _a.onApply;
24
+ var _b = tslib_1.__read((0, react_1.useState)("filter"), 2), action = _b[0], setAction = _b[1];
25
+ var _c = tslib_1.__read((0, react_1.useState)(initialListRange), 2), listRange = _c[0], setListRange = _c[1];
26
+ var _d = tslib_1.__read((0, react_1.useState)(""), 2), criteriaRange = _d[0], setCriteriaRange = _d[1];
27
+ var _e = tslib_1.__read((0, react_1.useState)(""), 2), copyTo = _e[0], setCopyTo = _e[1];
28
+ var _f = tslib_1.__read((0, react_1.useState)(false), 2), uniqueOnly = _f[0], setUniqueOnly = _f[1];
29
+ var _g = tslib_1.__read((0, react_1.useState)(undefined), 2), error = _g[0], setError = _g[1];
30
+ (0, react_1.useEffect)(function () {
31
+ if (open) {
32
+ setAction("filter");
33
+ setListRange(initialListRange);
34
+ setCriteriaRange("");
35
+ setCopyTo("");
36
+ setUniqueOnly(false);
37
+ setError(undefined);
38
+ }
39
+ // Only reset on open transitions.
40
+ // eslint-disable-next-line react-hooks/exhaustive-deps
41
+ }, [open]);
42
+ var submit = (0, react_1.useCallback)(function (event) {
43
+ var _a;
44
+ event.preventDefault();
45
+ var list = parseRange(listRange);
46
+ if (!list) {
47
+ setError("List range must be a range reference, e.g. A1:C20.");
48
+ return;
49
+ }
50
+ var criteria = parseRange(criteriaRange);
51
+ if (!criteria) {
52
+ setError("Criteria range must be a range reference, e.g. E1:F3.");
53
+ return;
54
+ }
55
+ var destination;
56
+ if (action === "copy") {
57
+ var cell = (0, utils_1.addressToCell)((_a = copyTo.trim().replace(/^[^!]*!/, "").split(":")[0]) !== null && _a !== void 0 ? _a : "");
58
+ if (!copyTo.trim() || !cell) {
59
+ setError("Copy to must be a cell reference, e.g. H1.");
60
+ return;
61
+ }
62
+ destination = cell;
63
+ }
64
+ setError(undefined);
65
+ onApply({
66
+ listRange: list,
67
+ criteriaRange: criteria,
68
+ action: action,
69
+ copyTo: destination,
70
+ uniqueOnly: uniqueOnly,
71
+ });
72
+ onOpenChange(false);
73
+ }, [action, listRange, criteriaRange, copyTo, uniqueOnly, onApply, onOpenChange]);
74
+ return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange },
75
+ react_1.default.createElement(ui_1.DialogContent, { className: "w-[400px] max-w-[92vw] pointer-events-auto" },
76
+ react_1.default.createElement(ui_1.DialogTitle, null, "Advanced filter"),
77
+ react_1.default.createElement(ui_1.DialogDescription, null, "Filter a list with a criteria range: conditions in one row AND together, rows OR together."),
78
+ react_1.default.createElement(ui_1.DialogCloseButton, { onClick: function () { return onOpenChange(false); } },
79
+ react_1.default.createElement(icons_1.Cross1Icon, null)),
80
+ react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-3 font-system text-sm" },
81
+ react_1.default.createElement("form", { className: "flex flex-col gap-3", onSubmit: submit },
82
+ react_1.default.createElement("div", { className: "flex flex-col gap-1", role: "radiogroup", "aria-label": "Action" },
83
+ react_1.default.createElement("label", { className: "flex items-center gap-1" },
84
+ react_1.default.createElement("input", { type: "radio", name: "advanced-filter-action", value: "filter", checked: action === "filter", onChange: function () { return setAction("filter"); } }),
85
+ "Filter the list, in-place"),
86
+ react_1.default.createElement("label", { className: "flex items-center gap-1" },
87
+ react_1.default.createElement("input", { type: "radio", name: "advanced-filter-action", value: "copy", checked: action === "copy", onChange: function () { return setAction("copy"); } }),
88
+ "Copy to another location")),
89
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
90
+ "List range:",
91
+ react_1.default.createElement(ui_1.Input, { value: listRange, "aria-label": "List range", onChange: function (e) {
92
+ setListRange(e.target.value);
93
+ setError(undefined);
94
+ } })),
95
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
96
+ "Criteria range:",
97
+ react_1.default.createElement(ui_1.Input, { autoFocus: true, value: criteriaRange, "aria-label": "Criteria range", placeholder: "e.g. E1:F3", onChange: function (e) {
98
+ setCriteriaRange(e.target.value);
99
+ setError(undefined);
100
+ } })),
101
+ action === "copy" ? (react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
102
+ "Copy to:",
103
+ react_1.default.createElement(ui_1.Input, { value: copyTo, "aria-label": "Copy to", placeholder: "e.g. H1", onChange: function (e) {
104
+ setCopyTo(e.target.value);
105
+ setError(undefined);
106
+ } }))) : null,
107
+ react_1.default.createElement("label", { className: "flex items-center gap-1" },
108
+ react_1.default.createElement("input", { type: "checkbox", name: "uniqueOnly", checked: uniqueOnly, onChange: function (e) { return setUniqueOnly(e.target.checked); } }),
109
+ "Unique records only"),
110
+ error ? (react_1.default.createElement("div", { role: "alert", className: "text-xs text-rnc-destructive" }, error)) : null,
111
+ react_1.default.createElement(ui_1.Separator, null),
112
+ react_1.default.createElement("div", { className: "flex justify-end gap-2" },
113
+ react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "sm", onClick: function () { return onOpenChange(false); } }, "Cancel"),
114
+ react_1.default.createElement(ui_1.Button, { type: "submit", size: "sm" }, "OK")))))));
115
+ });
116
+ exports.AdvancedFilterDialog.displayName = "AdvancedFilterDialog";
117
+ /**
118
+ * Host-mounted, atom-driven wrapper around {@link AdvancedFilterDialog}.
119
+ * Mount once in the host; the context menu opens it via
120
+ * `useOpenAdvancedFilterDialog` and only offers the item while a host is
121
+ * mounted.
122
+ */
123
+ var AdvancedFilterDialogHost = function () {
124
+ var _a;
125
+ (0, advanced_filter_dialog_atom_1.useRegisterAdvancedFilterDialogHost)();
126
+ var _b = tslib_1.__read((0, advanced_filter_dialog_atom_1.useAdvancedFilterDialogState)(), 2), request = _b[0], setRequest = _b[1];
127
+ var close = (0, react_1.useCallback)(function () { return setRequest(null); }, [setRequest]);
128
+ return (react_1.default.createElement(exports.AdvancedFilterDialog, { open: request != null, onOpenChange: function (open) {
129
+ if (!open)
130
+ close();
131
+ }, initialListRange: (_a = request === null || request === void 0 ? void 0 : request.listRange) !== null && _a !== void 0 ? _a : "", onApply: function (options) { return request === null || request === void 0 ? void 0 : request.onApply(options); } }));
132
+ };
133
+ exports.AdvancedFilterDialogHost = AdvancedFilterDialogHost;
134
+ exports.AdvancedFilterDialogHost.displayName = "AdvancedFilterDialogHost";
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import type { IterativeCalculationOptions } from "../../types";
3
+ /** Excel's defaults (File → Options → Formulas → Calculation options). */
4
+ export declare const DEFAULT_ITERATIVE_CALCULATION: Required<IterativeCalculationOptions>;
5
+ /**
6
+ * Normalise a form draft the way Excel does: iterations are a whole number
7
+ * 1…32767, maximum change is a non-negative number; anything else falls
8
+ * back to the current value.
9
+ */
10
+ export declare const normalizeIterativeCalculation: (draft: {
11
+ enabled: boolean;
12
+ maxIterations: string;
13
+ maxChange: string;
14
+ }, current: IterativeCalculationOptions | undefined) => IterativeCalculationOptions;
15
+ export type CalculationOptionsDialogProps = {
16
+ open: boolean;
17
+ onOpenChange(open: boolean): void;
18
+ /** The workbook's current policy (host state / engine setting). */
19
+ value?: IterativeCalculationOptions | null;
20
+ /**
21
+ * Receives the new policy on OK. Legacy engine: feed it back into the
22
+ * `iterativeCalculation` prop of `useSpreadsheetState`; rnc engine: the
23
+ * `set-iterative-calculation` command.
24
+ */
25
+ onChange(next: IterativeCalculationOptions): void;
26
+ };
27
+ /**
28
+ * Excel's iterative-calculation options (enable / maximum iterations /
29
+ * maximum change) as a dialog. Purely presentational — the host owns the
30
+ * setting and applies it through `onChange`.
31
+ */
32
+ export declare const CalculationOptionsDialog: React.MemoExoticComponent<({ open, onOpenChange, value, onChange }: CalculationOptionsDialogProps) => React.JSX.Element>;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/calculation-options-dialog/index.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAyB,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE/D,0EAA0E;AAC1E,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,2BAA2B,CAK7E,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GACxC,OAAO;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACrE,SAAS,2BAA2B,GAAG,SAAS,KAC/C,2BAeF,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,mEAAmE;IACnE,KAAK,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,sEACO,6BAA6B,uBAgFxE,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CalculationOptionsDialog = exports.normalizeIterativeCalculation = exports.DEFAULT_ITERATIVE_CALCULATION = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ui_1 = require("@rowsncolumns/ui");
6
+ var react_1 = tslib_1.__importStar(require("react"));
7
+ /** Excel's defaults (File → Options → Formulas → Calculation options). */
8
+ exports.DEFAULT_ITERATIVE_CALCULATION = {
9
+ enabled: false,
10
+ maxIterations: 100,
11
+ maxChange: 0.001,
12
+ };
13
+ /**
14
+ * Normalise a form draft the way Excel does: iterations are a whole number
15
+ * 1…32767, maximum change is a non-negative number; anything else falls
16
+ * back to the current value.
17
+ */
18
+ var normalizeIterativeCalculation = function (draft, current) {
19
+ var _a, _b;
20
+ var parse = function (text) { return (text.trim() === "" ? NaN : Number(text)); };
21
+ var iterations = parse(draft.maxIterations);
22
+ var change = parse(draft.maxChange);
23
+ return {
24
+ enabled: draft.enabled,
25
+ maxIterations: Number.isFinite(iterations) && iterations >= 1
26
+ ? Math.min(32767, Math.floor(iterations))
27
+ : (_a = current === null || current === void 0 ? void 0 : current.maxIterations) !== null && _a !== void 0 ? _a : exports.DEFAULT_ITERATIVE_CALCULATION.maxIterations,
28
+ maxChange: Number.isFinite(change) && change >= 0
29
+ ? change
30
+ : (_b = current === null || current === void 0 ? void 0 : current.maxChange) !== null && _b !== void 0 ? _b : exports.DEFAULT_ITERATIVE_CALCULATION.maxChange,
31
+ };
32
+ };
33
+ exports.normalizeIterativeCalculation = normalizeIterativeCalculation;
34
+ /**
35
+ * Excel's iterative-calculation options (enable / maximum iterations /
36
+ * maximum change) as a dialog. Purely presentational — the host owns the
37
+ * setting and applies it through `onChange`.
38
+ */
39
+ exports.CalculationOptionsDialog = (0, react_1.memo)(function (_a) {
40
+ var _b, _c, _d;
41
+ var open = _a.open, onOpenChange = _a.onOpenChange, value = _a.value, onChange = _a.onChange;
42
+ var _e = tslib_1.__read((0, react_1.useState)((_b = value === null || value === void 0 ? void 0 : value.enabled) !== null && _b !== void 0 ? _b : false), 2), enabled = _e[0], setEnabled = _e[1];
43
+ var _f = tslib_1.__read((0, react_1.useState)(String((_c = value === null || value === void 0 ? void 0 : value.maxIterations) !== null && _c !== void 0 ? _c : exports.DEFAULT_ITERATIVE_CALCULATION.maxIterations)), 2), maxIterations = _f[0], setMaxIterations = _f[1];
44
+ var _g = tslib_1.__read((0, react_1.useState)(String((_d = value === null || value === void 0 ? void 0 : value.maxChange) !== null && _d !== void 0 ? _d : exports.DEFAULT_ITERATIVE_CALCULATION.maxChange)), 2), maxChange = _g[0], setMaxChange = _g[1];
45
+ return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange, modal: true },
46
+ react_1.default.createElement(ui_1.DialogContent, { className: "w-[360px] max-w-[92vw] pointer-events-auto" },
47
+ react_1.default.createElement(ui_1.DialogTitle, null, "Calculation options"),
48
+ react_1.default.createElement(ui_1.DialogCloseButton, null),
49
+ react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-3" },
50
+ react_1.default.createElement("form", { className: "flex flex-col gap-3", onSubmit: function (e) {
51
+ e.preventDefault();
52
+ onChange((0, exports.normalizeIterativeCalculation)({ enabled: enabled, maxIterations: maxIterations, maxChange: maxChange }, value !== null && value !== void 0 ? value : undefined));
53
+ onOpenChange(false);
54
+ } },
55
+ react_1.default.createElement("label", { className: "flex items-center gap-2 text-xs font-medium" },
56
+ react_1.default.createElement("input", { type: "checkbox", checked: enabled, onChange: function (e) { return setEnabled(e.target.checked); } }),
57
+ "Enable iterative calculation"),
58
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
59
+ "Maximum iterations:",
60
+ react_1.default.createElement(ui_1.Input, { type: "number", min: 1, max: 32767, step: 1, value: maxIterations, disabled: !enabled, onChange: function (e) { return setMaxIterations(e.target.value); } })),
61
+ react_1.default.createElement("label", { className: "flex flex-col gap-1 text-xs font-medium" },
62
+ "Maximum change:",
63
+ react_1.default.createElement(ui_1.Input, { type: "number", min: 0, step: "any", value: maxChange, disabled: !enabled, onChange: function (e) { return setMaxChange(e.target.value); } })),
64
+ react_1.default.createElement(ui_1.Separator, null),
65
+ react_1.default.createElement("div", { className: "flex justify-end gap-2" },
66
+ react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "sm", onClick: function () { return onOpenChange(false); } }, "Cancel"),
67
+ react_1.default.createElement(ui_1.Button, { type: "submit", size: "sm" }, "OK")))))));
68
+ });
69
+ exports.CalculationOptionsDialog.displayName = "CalculationOptionsDialog";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AA2CA,OAAO,KASN,MAAM,OAAO,CAAC;AA2Kf,OAAO,KAAK,EAEV,QAAQ,EAST,MAAM,aAAa,CAAC;AAarB,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EAEhB,MAAM,WAAW,CAAC;AA2wJnB,eAAO,MAAM,UAAU,EAA4C,CACjE,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EAEvB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACvB,wBAAwB,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/canvas-grid/index.tsx"],"names":[],"mappings":"AA2CA,OAAO,KASN,MAAM,OAAO,CAAC;AA4Lf,OAAO,KAAK,EAGV,QAAQ,EAUT,MAAM,aAAa,CAAC;AAcrB,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,eAAe,EAEhB,MAAM,WAAW,CAAC;AAmkKnB,eAAO,MAAM,UAAU,EAA4C,CACjE,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EAEvB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACvB,wBAAwB,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAAE,KAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC"}