@rowsncolumns/spreadsheet-state 28.0.75 → 29.0.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 (259) hide show
  1. package/dist/cjs/api/anchored-objects.d.ts +66 -0
  2. package/dist/cjs/api/anchored-objects.d.ts.map +1 -0
  3. package/dist/cjs/api/anchored-objects.js +259 -0
  4. package/dist/cjs/api/copy-paste.d.ts +8 -1
  5. package/dist/cjs/api/copy-paste.d.ts.map +1 -1
  6. package/dist/cjs/api/copy-paste.js +4 -2
  7. package/dist/cjs/api/dependency.d.ts +13 -2
  8. package/dist/cjs/api/dependency.d.ts.map +1 -1
  9. package/dist/cjs/api/dependency.js +11 -5
  10. package/dist/cjs/api/formula.d.ts +61 -4
  11. package/dist/cjs/api/formula.d.ts.map +1 -1
  12. package/dist/cjs/api/formula.js +250 -61
  13. package/dist/cjs/api/immer-utils.d.ts +11 -1
  14. package/dist/cjs/api/immer-utils.d.ts.map +1 -1
  15. package/dist/cjs/api/immer-utils.js +17 -1
  16. package/dist/cjs/api/insert-cut-cells.d.ts +35 -0
  17. package/dist/cjs/api/insert-cut-cells.d.ts.map +1 -0
  18. package/dist/cjs/api/insert-cut-cells.js +60 -0
  19. package/dist/cjs/api/merges.d.ts +16 -0
  20. package/dist/cjs/api/merges.d.ts.map +1 -1
  21. package/dist/cjs/api/merges.js +75 -1
  22. package/dist/cjs/api/named-range-structural.d.ts +62 -0
  23. package/dist/cjs/api/named-range-structural.d.ts.map +1 -0
  24. package/dist/cjs/api/named-range-structural.js +197 -0
  25. package/dist/cjs/api/range-rule-helpers.d.ts +45 -1
  26. package/dist/cjs/api/range-rule-helpers.d.ts.map +1 -1
  27. package/dist/cjs/api/range-rule-helpers.js +159 -6
  28. package/dist/cjs/api/structural-formula-update.d.ts.map +1 -1
  29. package/dist/cjs/api/structural-formula-update.js +24 -6
  30. package/dist/cjs/api/structural-guards.d.ts +78 -0
  31. package/dist/cjs/api/structural-guards.d.ts.map +1 -0
  32. package/dist/cjs/api/structural-guards.js +202 -0
  33. package/dist/cjs/api/structural-table-refs.d.ts +94 -0
  34. package/dist/cjs/api/structural-table-refs.d.ts.map +1 -0
  35. package/dist/cjs/api/structural-table-refs.js +313 -0
  36. package/dist/cjs/api/subtotal.d.ts +20 -13
  37. package/dist/cjs/api/subtotal.d.ts.map +1 -1
  38. package/dist/cjs/api/subtotal.js +26 -19
  39. package/dist/cjs/commands.d.ts +9 -0
  40. package/dist/cjs/commands.d.ts.map +1 -1
  41. package/dist/cjs/constants.d.ts +25 -0
  42. package/dist/cjs/constants.d.ts.map +1 -0
  43. package/dist/cjs/constants.js +26 -0
  44. package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
  45. package/dist/cjs/hooks/use-calculation-worker.js +64 -6
  46. package/dist/cjs/hooks/use-calculation.d.ts +7 -0
  47. package/dist/cjs/hooks/use-calculation.d.ts.map +1 -1
  48. package/dist/cjs/hooks/use-calculation.js +15 -0
  49. package/dist/cjs/hooks/use-on-calculation-success.d.ts +7 -0
  50. package/dist/cjs/hooks/use-on-calculation-success.d.ts.map +1 -1
  51. package/dist/cjs/hooks/use-on-calculation-success.js +7 -1
  52. package/dist/cjs/hooks/use-on-copy.d.ts +1 -1
  53. package/dist/cjs/hooks/use-on-copy.d.ts.map +1 -1
  54. package/dist/cjs/hooks/use-on-copy.js +2 -3
  55. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  56. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  57. package/dist/cjs/hooks/use-on-delete-cells-shift-left.js +27 -2
  58. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  59. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  60. package/dist/cjs/hooks/use-on-delete-cells-shift-up.js +27 -2
  61. package/dist/cjs/hooks/use-on-delete-column.d.ts +13 -4
  62. package/dist/cjs/hooks/use-on-delete-column.d.ts.map +1 -1
  63. package/dist/cjs/hooks/use-on-delete-column.js +14 -2
  64. package/dist/cjs/hooks/use-on-delete-row.d.ts +13 -4
  65. package/dist/cjs/hooks/use-on-delete-row.d.ts.map +1 -1
  66. package/dist/cjs/hooks/use-on-delete-row.js +14 -2
  67. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  68. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  69. package/dist/cjs/hooks/use-on-insert-cells-shift-down.js +27 -2
  70. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  71. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  72. package/dist/cjs/hooks/use-on-insert-cells-shift-right.js +27 -2
  73. package/dist/cjs/hooks/use-on-insert-column.d.ts +10 -3
  74. package/dist/cjs/hooks/use-on-insert-column.d.ts.map +1 -1
  75. package/dist/cjs/hooks/use-on-insert-column.js +33 -7
  76. package/dist/cjs/hooks/use-on-insert-row.d.ts +10 -3
  77. package/dist/cjs/hooks/use-on-insert-row.d.ts.map +1 -1
  78. package/dist/cjs/hooks/use-on-insert-row.js +32 -7
  79. package/dist/cjs/hooks/use-on-move-columns.d.ts +2 -1
  80. package/dist/cjs/hooks/use-on-move-columns.d.ts.map +1 -1
  81. package/dist/cjs/hooks/use-on-move-columns.js +14 -5
  82. package/dist/cjs/hooks/use-on-move-rows.d.ts +16 -1
  83. package/dist/cjs/hooks/use-on-move-rows.d.ts.map +1 -1
  84. package/dist/cjs/hooks/use-on-move-rows.js +30 -5
  85. package/dist/cjs/hooks/use-on-move-selection.d.ts +7 -2
  86. package/dist/cjs/hooks/use-on-move-selection.d.ts.map +1 -1
  87. package/dist/cjs/hooks/use-on-move-selection.js +14 -1
  88. package/dist/cjs/hooks/use-on-paste.d.ts +12 -2
  89. package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
  90. package/dist/cjs/hooks/use-on-paste.js +56 -8
  91. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +16 -5
  92. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  93. package/dist/cjs/hooks/use-spreadsheet-state.js +141 -18
  94. package/dist/cjs/hooks/use-structured-reference.d.ts.map +1 -1
  95. package/dist/cjs/hooks/use-structured-reference.js +10 -6
  96. package/dist/cjs/index.d.ts +4 -0
  97. package/dist/cjs/index.d.ts.map +1 -1
  98. package/dist/cjs/index.js +4 -0
  99. package/dist/cjs/interface/calculation-interface.d.ts +9 -0
  100. package/dist/cjs/interface/calculation-interface.d.ts.map +1 -1
  101. package/dist/cjs/interface/calculation-interface.js +31 -2
  102. package/dist/cjs/interface/delete-cells-shift-left.d.ts +8 -1
  103. package/dist/cjs/interface/delete-cells-shift-left.d.ts.map +1 -1
  104. package/dist/cjs/interface/delete-cells-shift-left.js +158 -80
  105. package/dist/cjs/interface/delete-cells-shift-up.d.ts +9 -1
  106. package/dist/cjs/interface/delete-cells-shift-up.d.ts.map +1 -1
  107. package/dist/cjs/interface/delete-cells-shift-up.js +155 -73
  108. package/dist/cjs/interface/delete-column.d.ts +1 -1
  109. package/dist/cjs/interface/delete-column.d.ts.map +1 -1
  110. package/dist/cjs/interface/delete-column.js +109 -50
  111. package/dist/cjs/interface/delete-row.d.ts +1 -1
  112. package/dist/cjs/interface/delete-row.d.ts.map +1 -1
  113. package/dist/cjs/interface/delete-row.js +105 -46
  114. package/dist/cjs/interface/insert-cells-shift-down.d.ts +10 -1
  115. package/dist/cjs/interface/insert-cells-shift-down.d.ts.map +1 -1
  116. package/dist/cjs/interface/insert-cells-shift-down.js +147 -52
  117. package/dist/cjs/interface/insert-cells-shift-right.d.ts +10 -1
  118. package/dist/cjs/interface/insert-cells-shift-right.d.ts.map +1 -1
  119. package/dist/cjs/interface/insert-cells-shift-right.js +154 -58
  120. package/dist/cjs/interface/insert-column.d.ts +1 -1
  121. package/dist/cjs/interface/insert-column.d.ts.map +1 -1
  122. package/dist/cjs/interface/insert-column.js +80 -26
  123. package/dist/cjs/interface/insert-row.d.ts +1 -1
  124. package/dist/cjs/interface/insert-row.d.ts.map +1 -1
  125. package/dist/cjs/interface/insert-row.js +63 -15
  126. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  127. package/dist/cjs/interface/spreadsheet-interface.js +33 -0
  128. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  129. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  130. package/dist/esm/api/anchored-objects.d.ts +66 -0
  131. package/dist/esm/api/anchored-objects.d.ts.map +1 -0
  132. package/dist/esm/api/anchored-objects.js +212 -0
  133. package/dist/esm/api/copy-paste.d.ts +8 -1
  134. package/dist/esm/api/copy-paste.d.ts.map +1 -1
  135. package/dist/esm/api/copy-paste.js +4 -2
  136. package/dist/esm/api/dependency.d.ts +13 -2
  137. package/dist/esm/api/dependency.d.ts.map +1 -1
  138. package/dist/esm/api/dependency.js +10 -4
  139. package/dist/esm/api/formula.d.ts +61 -4
  140. package/dist/esm/api/formula.d.ts.map +1 -1
  141. package/dist/esm/api/formula.js +238 -60
  142. package/dist/esm/api/immer-utils.d.ts +11 -1
  143. package/dist/esm/api/immer-utils.d.ts.map +1 -1
  144. package/dist/esm/api/immer-utils.js +16 -0
  145. package/dist/esm/api/insert-cut-cells.d.ts +35 -0
  146. package/dist/esm/api/insert-cut-cells.d.ts.map +1 -0
  147. package/dist/esm/api/insert-cut-cells.js +67 -0
  148. package/dist/esm/api/merges.d.ts +16 -0
  149. package/dist/esm/api/merges.d.ts.map +1 -1
  150. package/dist/esm/api/merges.js +60 -0
  151. package/dist/esm/api/named-range-structural.d.ts +62 -0
  152. package/dist/esm/api/named-range-structural.d.ts.map +1 -0
  153. package/dist/esm/api/named-range-structural.js +176 -0
  154. package/dist/esm/api/range-rule-helpers.d.ts +45 -1
  155. package/dist/esm/api/range-rule-helpers.d.ts.map +1 -1
  156. package/dist/esm/api/range-rule-helpers.js +153 -1
  157. package/dist/esm/api/structural-formula-update.d.ts.map +1 -1
  158. package/dist/esm/api/structural-formula-update.js +24 -6
  159. package/dist/esm/api/structural-guards.d.ts +78 -0
  160. package/dist/esm/api/structural-guards.d.ts.map +1 -0
  161. package/dist/esm/api/structural-guards.js +186 -0
  162. package/dist/esm/api/structural-table-refs.d.ts +94 -0
  163. package/dist/esm/api/structural-table-refs.d.ts.map +1 -0
  164. package/dist/esm/api/structural-table-refs.js +219 -0
  165. package/dist/esm/api/subtotal.d.ts +20 -13
  166. package/dist/esm/api/subtotal.d.ts.map +1 -1
  167. package/dist/esm/api/subtotal.js +15 -8
  168. package/dist/esm/commands.d.ts +9 -0
  169. package/dist/esm/commands.d.ts.map +1 -1
  170. package/dist/esm/constants.d.ts +25 -0
  171. package/dist/esm/constants.d.ts.map +1 -0
  172. package/dist/esm/constants.js +26 -0
  173. package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
  174. package/dist/esm/hooks/use-calculation-worker.js +45 -0
  175. package/dist/esm/hooks/use-calculation.d.ts +7 -0
  176. package/dist/esm/hooks/use-calculation.d.ts.map +1 -1
  177. package/dist/esm/hooks/use-calculation.js +15 -0
  178. package/dist/esm/hooks/use-on-calculation-success.d.ts +7 -0
  179. package/dist/esm/hooks/use-on-calculation-success.d.ts.map +1 -1
  180. package/dist/esm/hooks/use-on-calculation-success.js +7 -1
  181. package/dist/esm/hooks/use-on-copy.d.ts +1 -1
  182. package/dist/esm/hooks/use-on-copy.d.ts.map +1 -1
  183. package/dist/esm/hooks/use-on-copy.js +2 -3
  184. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  185. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  186. package/dist/esm/hooks/use-on-delete-cells-shift-left.js +26 -2
  187. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  188. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  189. package/dist/esm/hooks/use-on-delete-cells-shift-up.js +26 -2
  190. package/dist/esm/hooks/use-on-delete-column.d.ts +13 -4
  191. package/dist/esm/hooks/use-on-delete-column.d.ts.map +1 -1
  192. package/dist/esm/hooks/use-on-delete-column.js +14 -2
  193. package/dist/esm/hooks/use-on-delete-row.d.ts +13 -4
  194. package/dist/esm/hooks/use-on-delete-row.d.ts.map +1 -1
  195. package/dist/esm/hooks/use-on-delete-row.js +14 -2
  196. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  197. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  198. package/dist/esm/hooks/use-on-insert-cells-shift-down.js +26 -2
  199. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  200. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  201. package/dist/esm/hooks/use-on-insert-cells-shift-right.js +26 -2
  202. package/dist/esm/hooks/use-on-insert-column.d.ts +10 -3
  203. package/dist/esm/hooks/use-on-insert-column.d.ts.map +1 -1
  204. package/dist/esm/hooks/use-on-insert-column.js +33 -7
  205. package/dist/esm/hooks/use-on-insert-row.d.ts +10 -3
  206. package/dist/esm/hooks/use-on-insert-row.d.ts.map +1 -1
  207. package/dist/esm/hooks/use-on-insert-row.js +32 -7
  208. package/dist/esm/hooks/use-on-move-columns.d.ts +2 -1
  209. package/dist/esm/hooks/use-on-move-columns.d.ts.map +1 -1
  210. package/dist/esm/hooks/use-on-move-columns.js +14 -5
  211. package/dist/esm/hooks/use-on-move-rows.d.ts +16 -1
  212. package/dist/esm/hooks/use-on-move-rows.d.ts.map +1 -1
  213. package/dist/esm/hooks/use-on-move-rows.js +30 -5
  214. package/dist/esm/hooks/use-on-move-selection.d.ts +7 -2
  215. package/dist/esm/hooks/use-on-move-selection.d.ts.map +1 -1
  216. package/dist/esm/hooks/use-on-move-selection.js +14 -1
  217. package/dist/esm/hooks/use-on-paste.d.ts +12 -2
  218. package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
  219. package/dist/esm/hooks/use-on-paste.js +41 -2
  220. package/dist/esm/hooks/use-spreadsheet-state.d.ts +16 -5
  221. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  222. package/dist/esm/hooks/use-spreadsheet-state.js +141 -17
  223. package/dist/esm/hooks/use-structured-reference.d.ts.map +1 -1
  224. package/dist/esm/hooks/use-structured-reference.js +10 -6
  225. package/dist/esm/index.d.ts +4 -0
  226. package/dist/esm/index.d.ts.map +1 -1
  227. package/dist/esm/index.js +4 -0
  228. package/dist/esm/interface/calculation-interface.d.ts +9 -0
  229. package/dist/esm/interface/calculation-interface.d.ts.map +1 -1
  230. package/dist/esm/interface/calculation-interface.js +33 -2
  231. package/dist/esm/interface/delete-cells-shift-left.d.ts +8 -1
  232. package/dist/esm/interface/delete-cells-shift-left.d.ts.map +1 -1
  233. package/dist/esm/interface/delete-cells-shift-left.js +135 -59
  234. package/dist/esm/interface/delete-cells-shift-up.d.ts +9 -1
  235. package/dist/esm/interface/delete-cells-shift-up.d.ts.map +1 -1
  236. package/dist/esm/interface/delete-cells-shift-up.js +133 -53
  237. package/dist/esm/interface/delete-column.d.ts +1 -1
  238. package/dist/esm/interface/delete-column.d.ts.map +1 -1
  239. package/dist/esm/interface/delete-column.js +96 -38
  240. package/dist/esm/interface/delete-row.d.ts +1 -1
  241. package/dist/esm/interface/delete-row.d.ts.map +1 -1
  242. package/dist/esm/interface/delete-row.js +98 -39
  243. package/dist/esm/interface/insert-cells-shift-down.d.ts +10 -1
  244. package/dist/esm/interface/insert-cells-shift-down.d.ts.map +1 -1
  245. package/dist/esm/interface/insert-cells-shift-down.js +116 -47
  246. package/dist/esm/interface/insert-cells-shift-right.d.ts +10 -1
  247. package/dist/esm/interface/insert-cells-shift-right.d.ts.map +1 -1
  248. package/dist/esm/interface/insert-cells-shift-right.js +120 -51
  249. package/dist/esm/interface/insert-column.d.ts +1 -1
  250. package/dist/esm/interface/insert-column.d.ts.map +1 -1
  251. package/dist/esm/interface/insert-column.js +68 -18
  252. package/dist/esm/interface/insert-row.d.ts +1 -1
  253. package/dist/esm/interface/insert-row.d.ts.map +1 -1
  254. package/dist/esm/interface/insert-row.js +60 -14
  255. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  256. package/dist/esm/interface/spreadsheet-interface.js +29 -0
  257. package/dist/esm/sheet-cell.d.ts.map +1 -1
  258. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  259. package/package.json +18 -18
@@ -1,39 +1,47 @@
1
- import { __assign, __read, __spreadArray, __values } from "tslib";
2
- import { selectionFromActiveCell } from "@rowsncolumns/utils";
1
+ import { __read, __spreadArray, __values } from "tslib";
3
2
  import { produceWithPatches } from "immer";
4
- import { processSideEffectDependentCells } from "../api/dependency";
3
+ import { collectUniqueDependentsForRange, processSideEffectDependentCells, } from "../api/dependency";
4
+ import { createSheetCellIdentifier, expandRangesInFormula } from "../api/formula";
5
5
  import { cloneCellWithFormatting, createSheetDraft } from "../api/immer-utils";
6
- import { moveMergedCells } from "../api/merges";
6
+ import { shiftMergesInBand } from "../api/merges";
7
+ import { isRangeInsideBand, resolveShiftSelection, shiftBand, } from "../api/structural-guards";
8
+ import { SheetCell } from "../sheet-cell";
9
+ /**
10
+ * Insert cells ▸ Shift cells down (SHF-01, SHF-06, SHF-07, SHF-08, FMT-03). Only the selection's
11
+ * columns move: every cell at or below the selection's first row slides down by the selection's
12
+ * height. References that target a shifted cell follow it; a range that lies entirely inside the
13
+ * shifted columns and straddles the insertion row grows by the inserted height (SHF-08); a wider
14
+ * range keeps its address (SHF-07). The vacated cells take the formatting of the cell above the
15
+ * insertion (FMT-03). Refusals (torn merge/table/array, off-sheet push) are decided by the hook via
16
+ * `getShiftCellsRefusal` before this runs.
17
+ */
7
18
  export var insertCellsShiftDown = function (_a) {
8
- var rowCount = _a.rowCount, columnCount = _a.columnCount, locale = _a.locale, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry, getActiveCell = _a.getActiveCell, getSelections = _a.getSelections, getDependents = _a.getDependents, createHistory = _a.createHistory, enqueueGraphOperation = _a.enqueueGraphOperation, enqueueCalculation = _a.enqueueCalculation, enqueueStructureChange = _a.enqueueStructureChange, onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeCitations = _a.onChangeCitations;
19
+ var rowCount = _a.rowCount, columnCount = _a.columnCount, locale = _a.locale, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry, getActiveCell = _a.getActiveCell, getSelections = _a.getSelections, getDependents = _a.getDependents, getSheetName = _a.getSheetName, createHistory = _a.createHistory, enqueueGraphOperation = _a.enqueueGraphOperation, enqueueCalculation = _a.enqueueCalculation, enqueueStructureChange = _a.enqueueStructureChange, onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeTables = _a.onChangeTables, onChangeCitations = _a.onChangeCitations;
9
20
  return function (sheetId, activeCell, selections) {
21
+ var _a;
10
22
  var saveHistory = createHistory();
11
23
  // We need to track this for history. Precedent cells
12
24
  var recalcCells = new Map();
13
- // Count
14
- var finalSelections = selections.length
15
- ? selections
16
- : selectionFromActiveCell(activeCell);
17
- // Last selection
18
- var selection = finalSelections[finalSelections.length - 1];
19
- var count = selection.range.endRowIndex - selection.range.startRowIndex + 1;
25
+ var selection = resolveShiftSelection(activeCell, selections);
26
+ var _b = selection.range, r1 = _b.startRowIndex, r2 = _b.endRowIndex, c1 = _b.startColumnIndex, c2 = _b.endColumnIndex;
27
+ var count = r2 - r1 + 1;
28
+ var band = shiftBand("down", selection.range);
29
+ var sheetName = (_a = getSheetName === null || getSheetName === void 0 ? void 0 : getSheetName(sheetId)) !== null && _a !== void 0 ? _a : "";
20
30
  enqueueStructureChange === null || enqueueStructureChange === void 0 ? void 0 : enqueueStructureChange({
21
31
  kind: "insert-cells-shift-down",
22
32
  sheetId: sheetId,
23
- startRowIndex: selection.range.startRowIndex,
24
- endRowIndex: selection.range.endRowIndex,
25
- startColumnIndex: selection.range.startColumnIndex,
26
- endColumnIndex: selection.range.endColumnIndex,
33
+ startRowIndex: r1,
34
+ endRowIndex: r2,
35
+ startColumnIndex: c1,
36
+ endColumnIndex: c2,
27
37
  rowCount: rowCount,
28
38
  });
29
- // Update sheets
39
+ // Update sheets — merges wholly inside the shifted columns ride down with their cells.
30
40
  onChangeSheets === null || onChangeSheets === void 0 ? void 0 : onChangeSheets(function (prevSheets) {
31
41
  var _a = __read(produceWithPatches(prevSheets, function (draft) {
32
42
  var sheet = draft.find(function (sheet) { return sheet.sheetId === sheetId; });
33
- if (sheet) {
34
- for (var rowIndex = selection.range.startRowIndex; rowIndex <= selection.range.endRowIndex; rowIndex++) {
35
- sheet.merges = moveMergedCells(sheet.merges, "row-insert", rowIndex);
36
- }
43
+ if (sheet === null || sheet === void 0 ? void 0 : sheet.merges) {
44
+ sheet.merges = shiftMergesInBand(sheet.merges, "row", r1, count, true, c1, c2);
37
45
  }
38
46
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
39
47
  // Save history
@@ -42,40 +50,61 @@ export var insertCellsShiftDown = function (_a) {
42
50
  });
43
51
  return nextState;
44
52
  });
53
+ // Tables whose columns the band covers entirely move with it (a partial cover was refused).
54
+ onChangeTables === null || onChangeTables === void 0 ? void 0 : onChangeTables(function (prevTables) {
55
+ var _a = __read(produceWithPatches(prevTables, function (draft) {
56
+ var e_1, _a;
57
+ try {
58
+ for (var draft_1 = __values(draft), draft_1_1 = draft_1.next(); !draft_1_1.done; draft_1_1 = draft_1.next()) {
59
+ var table = draft_1_1.value;
60
+ if (table.sheetId !== sheetId ||
61
+ !isRangeInsideBand(table.range, band)) {
62
+ continue;
63
+ }
64
+ table.range.startRowIndex += count;
65
+ table.range.endRowIndex += count;
66
+ }
67
+ }
68
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
69
+ finally {
70
+ try {
71
+ if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
72
+ }
73
+ finally { if (e_1) throw e_1.error; }
74
+ }
75
+ }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
76
+ saveHistory({ tables: { patches: patches, inversePatches: inversePatches } });
77
+ return nextState;
78
+ });
45
79
  // Update citations - shift if in affected columns and after insertion row
46
80
  onChangeCitations === null || onChangeCitations === void 0 ? void 0 : onChangeCitations(function (prevCitations) {
47
81
  var _a = __read(produceWithPatches(prevCitations, function (draft) {
48
- var e_1, _a;
49
- var affectedColStart = selection.range.startColumnIndex;
50
- var affectedColEnd = selection.range.endColumnIndex;
51
- var insertRowStart = selection.range.startRowIndex;
52
- var shiftAmount = selection.range.endRowIndex - selection.range.startRowIndex + 1;
82
+ var e_2, _a;
53
83
  try {
54
- for (var draft_1 = __values(draft), draft_1_1 = draft_1.next(); !draft_1_1.done; draft_1_1 = draft_1.next()) {
55
- var citation = draft_1_1.value;
84
+ for (var draft_2 = __values(draft), draft_2_1 = draft_2.next(); !draft_2_1.done; draft_2_1 = draft_2.next()) {
85
+ var citation = draft_2_1.value;
56
86
  // Skip citations on other sheets
57
87
  if (citation.range.sheetId !== sheetId) {
58
88
  continue;
59
89
  }
60
90
  // Check if citation overlaps with affected columns
61
- var citationColStart = citation.range.startColumnIndex;
62
- var citationColEnd = citation.range.endColumnIndex;
63
- var colsOverlap = !(citationColEnd < affectedColStart || citationColStart > affectedColEnd);
91
+ var colsOverlap = !(citation.range.endColumnIndex < c1 ||
92
+ citation.range.startColumnIndex > c2);
64
93
  if (colsOverlap) {
65
94
  // If citation starts at or after the insertion row, shift it down
66
- if (citation.range.startRowIndex >= insertRowStart) {
67
- citation.range.startRowIndex += shiftAmount;
68
- citation.range.endRowIndex += shiftAmount;
95
+ if (citation.range.startRowIndex >= r1) {
96
+ citation.range.startRowIndex += count;
97
+ citation.range.endRowIndex += count;
69
98
  }
70
99
  }
71
100
  }
72
101
  }
73
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
102
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
74
103
  finally {
75
104
  try {
76
- if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
105
+ if (draft_2_1 && !draft_2_1.done && (_a = draft_2.return)) _a.call(draft_2);
77
106
  }
78
- finally { if (e_1) throw e_1.error; }
107
+ finally { if (e_2) throw e_2.error; }
79
108
  }
80
109
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
81
110
  saveHistory({
@@ -86,15 +115,34 @@ export var insertCellsShiftDown = function (_a) {
86
115
  // Sheet data
87
116
  onChangeSheetData === null || onChangeSheetData === void 0 ? void 0 : onChangeSheetData(function (prevSheetData) {
88
117
  var _a = __read(produceWithPatches(prevSheetData, function (draft) {
89
- var _a, _b, _c, _d;
118
+ var e_3, _a;
119
+ var _b, _c, _d, _e, _f, _g, _h, _j;
90
120
  var movedKeys = new Set();
91
- var totalRows = (_b = (_a = draft[sheetId]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : rowCount;
92
- for (var rowIndex = totalRows; rowIndex > 0; rowIndex--) {
121
+ var totalRows = Math.max((_c = (_b = draft[sheetId]) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0, r2 + 1);
122
+ // Everything at or below the insertion row in the band's columns moves down by `count`.
123
+ var sourceRange = {
124
+ startRowIndex: r1,
125
+ endRowIndex: totalRows + count,
126
+ startColumnIndex: c1,
127
+ endColumnIndex: c2,
128
+ };
129
+ // Formulas that read a moving cell — captured before the graph goes stale.
130
+ var dependents = collectUniqueDependentsForRange({
131
+ draft: draft,
132
+ sheetId: sheetId,
133
+ sourceRange: {
134
+ startRowIndex: r1,
135
+ endRowIndex: totalRows,
136
+ startColumnIndex: c1,
137
+ endColumnIndex: c2,
138
+ },
139
+ getDependents: getDependents,
140
+ });
141
+ for (var rowIndex = totalRows; rowIndex >= r1; rowIndex--) {
93
142
  // We have a for loop
94
143
  // to cater for table expansion
95
144
  // which will push multiple columns down
96
- for (var columnIndex = selection.range.startColumnIndex; columnIndex <= selection.range.endColumnIndex; columnIndex++) {
97
- var sourceRange = __assign(__assign({}, selection.range), { endRowIndex: selection.range.endRowIndex + count });
145
+ for (var columnIndex = c1; columnIndex <= c2; columnIndex++) {
98
146
  // Process dependents
99
147
  processSideEffectDependentCells({
100
148
  draft: draft,
@@ -105,6 +153,7 @@ export var insertCellsShiftDown = function (_a) {
105
153
  enqueueGraphOperation: enqueueGraphOperation,
106
154
  enqueueCalculation: enqueueCalculation,
107
155
  getDependents: getDependents,
156
+ getSheetName: getSheetName,
108
157
  recalcCells: recalcCells,
109
158
  rowDelta: count,
110
159
  sourceRange: sourceRange,
@@ -115,26 +164,72 @@ export var insertCellsShiftDown = function (_a) {
115
164
  cellXfsRegistry: cellXfsRegistry,
116
165
  sharedStringRegistry: sharedStringRegistry,
117
166
  });
118
- // Skip unaffected cells
119
- if (rowIndex < selection.range.startRowIndex) {
167
+ }
168
+ }
169
+ // SHF-08: a range living entirely inside the band's columns that straddles the insertion
170
+ // row grows by the inserted height (Excel's "insert inside a range expands it"). Runs on
171
+ // the pre-shift positions; the value shift below carries in-band dependents down.
172
+ var sheetCell = new SheetCell();
173
+ try {
174
+ for (var _k = __values(dependents.values()), _l = _k.next(); !_l.done; _l = _k.next()) {
175
+ var pos = _l.value;
176
+ if (pos.sheetId !== sheetId)
120
177
  continue;
121
- }
178
+ var currentSheet = createSheetDraft(draft, sheetId, pos.rowIndex);
179
+ var cellData = (_e = (_d = currentSheet[pos.rowIndex]) === null || _d === void 0 ? void 0 : _d.values) === null || _e === void 0 ? void 0 : _e[pos.columnIndex];
180
+ sheetCell.assign(sheetId, { rowIndex: pos.rowIndex, columnIndex: pos.columnIndex }, cellData, { locale: locale, cellXfsRegistry: cellXfsRegistry, sharedStringRegistry: sharedStringRegistry });
181
+ var formulaValue = sheetCell.formula;
182
+ if (!formulaValue)
183
+ continue;
184
+ var expanded = expandRangesInFormula(formulaValue, r1, count, "row", sheetName, { bandSpan: { startIndex: c1, endIndex: c2 } });
185
+ if (!expanded || expanded === formulaValue)
186
+ continue;
187
+ sheetCell.setFormulaValue(expanded, false);
188
+ currentSheet[pos.rowIndex].values[pos.columnIndex] =
189
+ sheetCell.getCellData();
190
+ var movesWithBand = pos.rowIndex >= r1 && pos.columnIndex >= c1 && pos.columnIndex <= c2;
191
+ var finalPosition = {
192
+ sheetId: sheetId,
193
+ rowIndex: movesWithBand ? pos.rowIndex + count : pos.rowIndex,
194
+ columnIndex: pos.columnIndex,
195
+ };
196
+ var enqueueOperation = sheetCell.ephemeral()
197
+ ? enqueueCalculation
198
+ : enqueueGraphOperation;
199
+ enqueueOperation === null || enqueueOperation === void 0 ? void 0 : enqueueOperation({ type: "add", position: finalPosition });
200
+ enqueueCalculation === null || enqueueCalculation === void 0 ? void 0 : enqueueCalculation({
201
+ type: "dirty",
202
+ position: finalPosition,
203
+ force: true,
204
+ });
205
+ recalcCells.set(createSheetCellIdentifier(sheetId, finalPosition.rowIndex, finalPosition.columnIndex), finalPosition);
206
+ }
207
+ }
208
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
209
+ finally {
210
+ try {
211
+ if (_l && !_l.done && (_a = _k.return)) _a.call(_k);
122
212
  }
213
+ finally { if (e_3) throw e_3.error; }
123
214
  }
124
215
  // Update values
125
- for (var rowIndex = totalRows + count; rowIndex > selection.range.startRowIndex; rowIndex--) {
216
+ for (var rowIndex = totalRows + count; rowIndex > r1; rowIndex--) {
126
217
  var currentSheet = createSheetDraft(draft, sheetId, rowIndex);
127
- for (var columnIndex = selection.range.endColumnIndex; columnIndex >= selection.range.startColumnIndex; columnIndex--) {
128
- var previousValue = (_d = (_c = currentSheet[rowIndex - count]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[columnIndex];
218
+ for (var columnIndex = c2; columnIndex >= c1; columnIndex--) {
219
+ var previousValue = (_g = (_f = currentSheet[rowIndex - count]) === null || _f === void 0 ? void 0 : _f.values) === null || _g === void 0 ? void 0 : _g[columnIndex];
129
220
  currentSheet[rowIndex].values[columnIndex] = previousValue;
130
221
  }
131
222
  }
132
- // Update inserts cells
133
- for (var rowIndex = selection.range.startRowIndex; rowIndex <= selection.range.endRowIndex; rowIndex++) {
223
+ // FMT-03: the inserted cells take the formatting of the cell directly ABOVE the
224
+ // insertion; at row 1 there is none, so they keep the displaced cell's formatting.
225
+ for (var rowIndex = r1; rowIndex <= r2; rowIndex++) {
134
226
  var currentSheet = createSheetDraft(draft, sheetId, rowIndex);
135
- for (var columnIndex = selection.range.endColumnIndex; columnIndex >= selection.range.startColumnIndex; columnIndex--) {
227
+ for (var columnIndex = c2; columnIndex >= c1; columnIndex--) {
228
+ var formatSource = r1 > 1
229
+ ? (_j = (_h = currentSheet[r1 - 1]) === null || _h === void 0 ? void 0 : _h.values) === null || _j === void 0 ? void 0 : _j[columnIndex]
230
+ : currentSheet[rowIndex].values[columnIndex];
136
231
  currentSheet[rowIndex].values[columnIndex] =
137
- cloneCellWithFormatting(currentSheet[rowIndex].values[columnIndex]);
232
+ cloneCellWithFormatting(formatSource);
138
233
  }
139
234
  }
140
235
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
@@ -1,5 +1,14 @@
1
1
  import type { CellData, CellInterface, SelectionArea } from "@rowsncolumns/common-types";
2
2
  import type { SelectionAttributes, Sheet } from "@rowsncolumns/spreadsheet";
3
3
  import type { UseOnInsertCellsShiftRight } from "../hooks/use-on-insert-cells-shift-right";
4
- export declare const insertCellsShiftRight: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, }: UseOnInsertCellsShiftRight<T, S>) => (sheetId: number, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[]) => void;
4
+ /**
5
+ * Insert cells ▸ Shift cells right (SHF-02, FMT-04) — the horizontal twin of
6
+ * `insertCellsShiftDown`: only the selection's rows move, every cell at or right of the selection's
7
+ * first column slides right by the selection's width. References follow shifted cells; a range
8
+ * entirely inside the shifted rows that straddles the insertion column widens (SHF-08 analog);
9
+ * the vacated cells take the formatting of the cell to the LEFT of the insertion (FMT-04). Refusals
10
+ * (torn merge/table/array, a non-blank cell pushed past `columnCount` — SHF-10) are decided by the
11
+ * hook before this runs.
12
+ */
13
+ export declare const insertCellsShiftRight: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, getSheetName, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeCitations, }: UseOnInsertCellsShiftRight<T, S>) => (sheetId: number, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[]) => void;
5
14
  //# sourceMappingURL=insert-cells-shift-right.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"insert-cells-shift-right.d.ts","sourceRoot":"","sources":["../../../interface/insert-cells-shift-right.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EAEb,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAM5E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAG3F,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,gQAgBxE,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,MAE/B,SAAS,MAAM,EACf,YAAY,aAAa,EACzB,YAAY,aAAa,CAAC,mBAAmB,CAAC,EAAE,SA2LnD,CAAC"}
1
+ {"version":3,"file":"insert-cells-shift-right.d.ts","sourceRoot":"","sources":["../../../interface/insert-cells-shift-right.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EAEb,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAgB5E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAI3F;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,8RAkBxE,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,MAE/B,SAAS,MAAM,EACf,YAAY,aAAa,EACzB,YAAY,aAAa,CAAC,mBAAmB,CAAC,EAAE,SAqQnD,CAAC"}
@@ -1,41 +1,48 @@
1
- import { __assign, __read, __spreadArray, __values } from "tslib";
2
- import { createArrayRange, selectionFromActiveCell } from "@rowsncolumns/utils";
1
+ import { __read, __spreadArray, __values } from "tslib";
2
+ import { createArrayRange } from "@rowsncolumns/utils";
3
3
  import { produceWithPatches } from "immer";
4
- import { processSideEffectDependentCells } from "../api/dependency";
5
- import { cloneCellWithFormatting } from "../api/immer-utils";
6
- import { moveMergedCells } from "../api/merges";
4
+ import { collectUniqueDependentsForRange, processSideEffectDependentCells, } from "../api/dependency";
5
+ import { createSheetCellIdentifier, expandRangesInFormula } from "../api/formula";
6
+ import { cloneCellWithFormatting, createSheetDraft } from "../api/immer-utils";
7
+ import { shiftMergesInBand } from "../api/merges";
8
+ import { isRangeInsideBand, resolveShiftSelection, shiftBand, } from "../api/structural-guards";
9
+ import { SheetCell } from "../sheet-cell";
10
+ /**
11
+ * Insert cells ▸ Shift cells right (SHF-02, FMT-04) — the horizontal twin of
12
+ * `insertCellsShiftDown`: only the selection's rows move, every cell at or right of the selection's
13
+ * first column slides right by the selection's width. References follow shifted cells; a range
14
+ * entirely inside the shifted rows that straddles the insertion column widens (SHF-08 analog);
15
+ * the vacated cells take the formatting of the cell to the LEFT of the insertion (FMT-04). Refusals
16
+ * (torn merge/table/array, a non-blank cell pushed past `columnCount` — SHF-10) are decided by the
17
+ * hook before this runs.
18
+ */
7
19
  export var insertCellsShiftRight = function (_a) {
8
- var rowCount = _a.rowCount, columnCount = _a.columnCount, locale = _a.locale, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry, getActiveCell = _a.getActiveCell, getSelections = _a.getSelections, getDependents = _a.getDependents, createHistory = _a.createHistory, enqueueGraphOperation = _a.enqueueGraphOperation, enqueueCalculation = _a.enqueueCalculation, enqueueStructureChange = _a.enqueueStructureChange, onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeCitations = _a.onChangeCitations;
20
+ var rowCount = _a.rowCount, columnCount = _a.columnCount, locale = _a.locale, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry, getActiveCell = _a.getActiveCell, getSelections = _a.getSelections, getDependents = _a.getDependents, getSheetName = _a.getSheetName, createHistory = _a.createHistory, enqueueGraphOperation = _a.enqueueGraphOperation, enqueueCalculation = _a.enqueueCalculation, enqueueStructureChange = _a.enqueueStructureChange, onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeTables = _a.onChangeTables, onChangeCitations = _a.onChangeCitations;
9
21
  return function (sheetId, activeCell, selections) {
22
+ var _a;
10
23
  var saveHistory = createHistory();
11
24
  // We need to track this for history. Precedent cells
12
25
  var recalcCells = new Map();
13
- // Count
14
- var finalSelections = selections.length
15
- ? selections
16
- : selectionFromActiveCell(activeCell);
17
- // Last selection
18
- var selection = finalSelections[finalSelections.length - 1];
19
- var count = selection.range.endRowIndex - selection.range.startRowIndex + 1;
26
+ var selection = resolveShiftSelection(activeCell, selections);
27
+ var _b = selection.range, r1 = _b.startRowIndex, r2 = _b.endRowIndex, c1 = _b.startColumnIndex, c2 = _b.endColumnIndex;
28
+ var count = c2 - c1 + 1;
29
+ var band = shiftBand("right", selection.range);
30
+ var sheetName = (_a = getSheetName === null || getSheetName === void 0 ? void 0 : getSheetName(sheetId)) !== null && _a !== void 0 ? _a : "";
20
31
  enqueueStructureChange === null || enqueueStructureChange === void 0 ? void 0 : enqueueStructureChange({
21
32
  kind: "insert-cells-shift-right",
22
33
  sheetId: sheetId,
23
- startRowIndex: selection.range.startRowIndex,
24
- endRowIndex: selection.range.endRowIndex,
25
- startColumnIndex: selection.range.startColumnIndex,
26
- endColumnIndex: selection.range.endColumnIndex,
34
+ startRowIndex: r1,
35
+ endRowIndex: r2,
36
+ startColumnIndex: c1,
37
+ endColumnIndex: c2,
27
38
  columnCount: columnCount,
28
39
  });
29
- // Update sheets
40
+ // Update sheets — merges wholly inside the shifted rows ride right with their cells.
30
41
  onChangeSheets === null || onChangeSheets === void 0 ? void 0 : onChangeSheets(function (prevSheets) {
31
42
  var _a = __read(produceWithPatches(prevSheets, function (draft) {
32
43
  var sheet = draft.find(function (sheet) { return sheet.sheetId === sheetId; });
33
- if (sheet) {
34
- for (var columnIndex = selection.range.startColumnIndex; columnIndex <= selection.range.endColumnIndex; columnIndex++) {
35
- if (sheet.merges) {
36
- sheet.merges = moveMergedCells(sheet.merges, "column-insert", columnIndex);
37
- }
38
- }
44
+ if (sheet === null || sheet === void 0 ? void 0 : sheet.merges) {
45
+ sheet.merges = shiftMergesInBand(sheet.merges, "column", c1, count, true, r1, r2);
39
46
  }
40
47
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
41
48
  // Save history
@@ -44,43 +51,61 @@ export var insertCellsShiftRight = function (_a) {
44
51
  });
45
52
  return nextState;
46
53
  });
54
+ // Tables whose rows the band covers entirely move with it (a partial cover was refused).
55
+ onChangeTables === null || onChangeTables === void 0 ? void 0 : onChangeTables(function (prevTables) {
56
+ var _a = __read(produceWithPatches(prevTables, function (draft) {
57
+ var e_1, _a;
58
+ try {
59
+ for (var draft_1 = __values(draft), draft_1_1 = draft_1.next(); !draft_1_1.done; draft_1_1 = draft_1.next()) {
60
+ var table = draft_1_1.value;
61
+ if (table.sheetId !== sheetId ||
62
+ !isRangeInsideBand(table.range, band)) {
63
+ continue;
64
+ }
65
+ table.range.startColumnIndex += count;
66
+ table.range.endColumnIndex += count;
67
+ }
68
+ }
69
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
70
+ finally {
71
+ try {
72
+ if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
73
+ }
74
+ finally { if (e_1) throw e_1.error; }
75
+ }
76
+ }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
77
+ saveHistory({ tables: { patches: patches, inversePatches: inversePatches } });
78
+ return nextState;
79
+ });
47
80
  // Update citations - shift if in affected rows and after insertion column
48
81
  onChangeCitations === null || onChangeCitations === void 0 ? void 0 : onChangeCitations(function (prevCitations) {
49
82
  var _a = __read(produceWithPatches(prevCitations, function (draft) {
50
- var e_1, _a;
51
- var affectedRowStart = selection.range.startRowIndex;
52
- var affectedRowEnd = selection.range.endRowIndex;
53
- var insertColumnStart = selection.range.startColumnIndex;
54
- var shiftAmount = selection.range.endColumnIndex -
55
- selection.range.startColumnIndex +
56
- 1;
83
+ var e_2, _a;
57
84
  try {
58
- for (var draft_1 = __values(draft), draft_1_1 = draft_1.next(); !draft_1_1.done; draft_1_1 = draft_1.next()) {
59
- var citation = draft_1_1.value;
85
+ for (var draft_2 = __values(draft), draft_2_1 = draft_2.next(); !draft_2_1.done; draft_2_1 = draft_2.next()) {
86
+ var citation = draft_2_1.value;
60
87
  // Skip citations on other sheets
61
88
  if (citation.range.sheetId !== sheetId) {
62
89
  continue;
63
90
  }
64
91
  // Check if citation overlaps with affected rows
65
- var citationRowStart = citation.range.startRowIndex;
66
- var citationRowEnd = citation.range.endRowIndex;
67
- var rowsOverlap = !(citationRowEnd < affectedRowStart ||
68
- citationRowStart > affectedRowEnd);
92
+ var rowsOverlap = !(citation.range.endRowIndex < r1 ||
93
+ citation.range.startRowIndex > r2);
69
94
  if (rowsOverlap) {
70
95
  // If citation starts at or after the insertion column, shift it right
71
- if (citation.range.startColumnIndex >= insertColumnStart) {
72
- citation.range.startColumnIndex += shiftAmount;
73
- citation.range.endColumnIndex += shiftAmount;
96
+ if (citation.range.startColumnIndex >= c1) {
97
+ citation.range.startColumnIndex += count;
98
+ citation.range.endColumnIndex += count;
74
99
  }
75
100
  }
76
101
  }
77
102
  }
78
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
103
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
79
104
  finally {
80
105
  try {
81
- if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
106
+ if (draft_2_1 && !draft_2_1.done && (_a = draft_2.return)) _a.call(draft_2);
82
107
  }
83
- finally { if (e_1) throw e_1.error; }
108
+ finally { if (e_2) throw e_2.error; }
84
109
  }
85
110
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
86
111
  saveHistory({
@@ -91,12 +116,34 @@ export var insertCellsShiftRight = function (_a) {
91
116
  // Sheet data
92
117
  onChangeSheetData === null || onChangeSheetData === void 0 ? void 0 : onChangeSheetData(function (prevSheetData) {
93
118
  var _a = __read(produceWithPatches(prevSheetData, function (draft) {
94
- var _a, _b, _c, _d, _e, _f, _g, _h;
119
+ var e_3, _a;
120
+ var _b, _c, _d, _e, _f, _g, _h, _j;
95
121
  var movedKeys = new Set();
96
- for (var rowIndex = selection.range.startRowIndex; rowIndex <= selection.range.endRowIndex; rowIndex++) {
97
- var totalColumns = (_d = (_c = (_b = (_a = draft[sheetId]) === null || _a === void 0 ? void 0 : _a[rowIndex]) === null || _b === void 0 ? void 0 : _b.values) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : columnCount;
98
- for (var columnIndex = 1; columnIndex < totalColumns; columnIndex++) {
99
- var sourceRange = __assign(__assign({}, selection.range), { endColumnIndex: totalColumns });
122
+ var totalColumns = Math.max(columnCount, c2 + 1);
123
+ for (var rowIndex = r1; rowIndex <= r2; rowIndex++) {
124
+ totalColumns = Math.max(totalColumns, (_e = (_d = (_c = (_b = draft[sheetId]) === null || _b === void 0 ? void 0 : _b[rowIndex]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d.length) !== null && _e !== void 0 ? _e : 0);
125
+ }
126
+ // Everything at or right of the insertion column in the band's rows moves by `count`.
127
+ var sourceRange = {
128
+ startRowIndex: r1,
129
+ endRowIndex: r2,
130
+ startColumnIndex: c1,
131
+ endColumnIndex: totalColumns + count,
132
+ };
133
+ // Formulas that read a moving cell — captured before the graph goes stale.
134
+ var dependents = collectUniqueDependentsForRange({
135
+ draft: draft,
136
+ sheetId: sheetId,
137
+ sourceRange: {
138
+ startRowIndex: r1,
139
+ endRowIndex: r2,
140
+ startColumnIndex: c1,
141
+ endColumnIndex: totalColumns,
142
+ },
143
+ getDependents: getDependents,
144
+ });
145
+ for (var rowIndex = r1; rowIndex <= r2; rowIndex++) {
146
+ for (var columnIndex = totalColumns; columnIndex >= c1; columnIndex--) {
100
147
  // Process dependents
101
148
  processSideEffectDependentCells({
102
149
  draft: draft,
@@ -107,6 +154,7 @@ export var insertCellsShiftRight = function (_a) {
107
154
  enqueueGraphOperation: enqueueGraphOperation,
108
155
  enqueueCalculation: enqueueCalculation,
109
156
  getDependents: getDependents,
157
+ getSheetName: getSheetName,
110
158
  recalcCells: recalcCells,
111
159
  rowDelta: 0,
112
160
  sourceRange: sourceRange,
@@ -119,18 +167,66 @@ export var insertCellsShiftRight = function (_a) {
119
167
  });
120
168
  }
121
169
  }
122
- var _loop_1 = function (rowIndex) {
123
- // Delete column
124
- if ((_f = (_e = draft[sheetId]) === null || _e === void 0 ? void 0 : _e[rowIndex]) === null || _f === void 0 ? void 0 : _f.values) {
125
- (_h = (_g = draft[sheetId][rowIndex]) === null || _g === void 0 ? void 0 : _g.values) === null || _h === void 0 ? void 0 : _h.splice.apply(_h, __spreadArray([selection.range.startColumnIndex,
126
- 0], __read(createArrayRange(selection.range.startColumnIndex, selection.range.endColumnIndex).map(function (columnIndex) {
127
- var _a, _b;
128
- return cloneCellWithFormatting((_b = (_a = draft[sheetId][rowIndex]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b[columnIndex]);
129
- })), false));
170
+ // SHF-08 analog: a range living entirely inside the band's rows that straddles the
171
+ // insertion column widens by the inserted width. Runs on the pre-shift positions; the
172
+ // splice below carries in-band dependents right.
173
+ var sheetCell = new SheetCell();
174
+ try {
175
+ for (var _k = __values(dependents.values()), _l = _k.next(); !_l.done; _l = _k.next()) {
176
+ var pos = _l.value;
177
+ if (pos.sheetId !== sheetId)
178
+ continue;
179
+ var currentSheet = createSheetDraft(draft, sheetId, pos.rowIndex);
180
+ var cellData = (_g = (_f = currentSheet[pos.rowIndex]) === null || _f === void 0 ? void 0 : _f.values) === null || _g === void 0 ? void 0 : _g[pos.columnIndex];
181
+ sheetCell.assign(sheetId, { rowIndex: pos.rowIndex, columnIndex: pos.columnIndex }, cellData, { locale: locale, cellXfsRegistry: cellXfsRegistry, sharedStringRegistry: sharedStringRegistry });
182
+ var formulaValue = sheetCell.formula;
183
+ if (!formulaValue)
184
+ continue;
185
+ var expanded = expandRangesInFormula(formulaValue, c1, count, "column", sheetName, { bandSpan: { startIndex: r1, endIndex: r2 } });
186
+ if (!expanded || expanded === formulaValue)
187
+ continue;
188
+ sheetCell.setFormulaValue(expanded, false);
189
+ currentSheet[pos.rowIndex].values[pos.columnIndex] =
190
+ sheetCell.getCellData();
191
+ var movesWithBand = pos.columnIndex >= c1 && pos.rowIndex >= r1 && pos.rowIndex <= r2;
192
+ var finalPosition = {
193
+ sheetId: sheetId,
194
+ rowIndex: pos.rowIndex,
195
+ columnIndex: movesWithBand
196
+ ? pos.columnIndex + count
197
+ : pos.columnIndex,
198
+ };
199
+ var enqueueOperation = sheetCell.ephemeral()
200
+ ? enqueueCalculation
201
+ : enqueueGraphOperation;
202
+ enqueueOperation === null || enqueueOperation === void 0 ? void 0 : enqueueOperation({ type: "add", position: finalPosition });
203
+ enqueueCalculation === null || enqueueCalculation === void 0 ? void 0 : enqueueCalculation({
204
+ type: "dirty",
205
+ position: finalPosition,
206
+ force: true,
207
+ });
208
+ recalcCells.set(createSheetCellIdentifier(sheetId, finalPosition.rowIndex, finalPosition.columnIndex), finalPosition);
130
209
  }
210
+ }
211
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
212
+ finally {
213
+ try {
214
+ if (_l && !_l.done && (_a = _k.return)) _a.call(_k);
215
+ }
216
+ finally { if (e_3) throw e_3.error; }
217
+ }
218
+ var _loop_1 = function (rowIndex) {
219
+ var values = (_j = (_h = draft[sheetId]) === null || _h === void 0 ? void 0 : _h[rowIndex]) === null || _j === void 0 ? void 0 : _j.values;
220
+ if (!values)
221
+ return "continue";
222
+ values.splice.apply(values, __spreadArray([c1,
223
+ 0], __read(createArrayRange(c1, c2).map(function (columnIndex) {
224
+ return cloneCellWithFormatting(c1 > 1 ? values[c1 - 1] : values[columnIndex]);
225
+ })), false));
131
226
  };
132
- // Delete column
133
- for (var rowIndex = selection.range.startRowIndex; rowIndex <= selection.range.endRowIndex; rowIndex++) {
227
+ // Splice the inserted cells in. FMT-04: they take the formatting of the cell directly
228
+ // LEFT of the insertion; at column 1 there is none, so they keep the displaced cell's.
229
+ for (var rowIndex = r1; rowIndex <= r2; rowIndex++) {
134
230
  _loop_1(rowIndex);
135
231
  }
136
232
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
@@ -2,6 +2,6 @@ import { Direction } from "@rowsncolumns/common-types";
2
2
  import type { CellData, Sheet, TableView } from "@rowsncolumns/spreadsheet";
3
3
  import type { UseOnInsertColumnProps } from "../hooks/use-on-insert-column";
4
4
  import type { UseOnTableProps } from "../hooks/use-on-table";
5
- export declare const insertColumn: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, tables, cellXfsRegistry, sharedStringRegistry, getSheetName, getDependents, getGraphNodes, getGraphNodesInSheet, getActiveCell, getSelections, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeDataValidations, onChangeConditionalFormats, onChangeCitations, onChangePivotTables, generatedNames, }: UseOnInsertColumnProps<T, S>) => (sheetId: number, referenceColumnIndex: number, numColumns?: number) => void;
5
+ export declare const insertColumn: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, maxColumnCount, tables, cellXfsRegistry, sharedStringRegistry, getSheetName, getDependents, getGraphNodes, getGraphNodesInSheet, getActiveCell, getSelections, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeDataValidations, onChangeConditionalFormats, onChangeCitations, onChangePivotTables, onChangeNamedRanges, onChangeEmbeds, onChangeCharts, onChangeProtectedRanges, generatedNames, }: UseOnInsertColumnProps<T, S>) => (sheetId: number, referenceColumnIndex: number, numColumns?: number) => void;
6
6
  export declare const insertTableColumn: <T extends CellData, S extends Sheet>({ tables, columnCount, rowCount, locale, cellXfsRegistry, sharedStringRegistry, getSheetName, createHistory, onChangeTables, onChangeSheets, onChangeSheetData, enqueueCalculation, enqueueStructureChange, enqueueGraphOperation, getDependents, generatedNames, }: Pick<UseOnTableProps<T, S>, "tables" | "columnCount" | "rowCount" | "locale" | "cellXfsRegistry" | "sharedStringRegistry" | "createHistory" | "onChangeTables" | "onChangeSheets" | "onChangeSheetData" | "enqueueCalculation" | "enqueueStructureChange" | "enqueueGraphOperation" | "getDependents" | "getSheetName" | "generatedNames">) => (tableView: TableView, dimensionIndex: number, direction: Direction.Left | Direction.Right) => void;
7
7
  //# sourceMappingURL=insert-column.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"insert-column.d.ts","sourceRoot":"","sources":["../../../interface/insert-column.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAoB5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,qaAyB/D,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,MACrB,SAAS,MAAM,EAAE,sBAAsB,MAAM,EAAE,mBAAc,SA0TtE,CAAC;AAMF,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,qQAiBpE,IAAI,CACL,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EACnB,QAAQ,GACR,aAAa,GACb,UAAU,GACV,QAAQ,GACR,iBAAiB,GACjB,sBAAsB,GACtB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,GACnB,oBAAoB,GACpB,wBAAwB,GACxB,uBAAuB,GACvB,eAAe,GACf,cAAc,GACd,gBAAgB,CACnB,MAEG,WAAW,SAAS,EACpB,gBAAgB,MAAM,EACtB,WAAW,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,SA2V9C,CAAC"}
1
+ {"version":3,"file":"insert-column.d.ts","sourceRoot":"","sources":["../../../interface/insert-column.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAkC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,mgBA8B/D,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,MACrB,SAAS,MAAM,EAAE,sBAAsB,MAAM,EAAE,mBAAc,SAoatE,CAAC;AAMF,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,qQAiBpE,IAAI,CACL,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EACnB,QAAQ,GACR,aAAa,GACb,UAAU,GACV,QAAQ,GACR,iBAAiB,GACjB,sBAAsB,GACtB,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,GACnB,oBAAoB,GACpB,wBAAwB,GACxB,uBAAuB,GACvB,eAAe,GACf,cAAc,GACd,gBAAgB,CACnB,MAEG,WAAW,SAAS,EACpB,gBAAgB,MAAM,EACtB,WAAW,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,SA2V9C,CAAC"}