@rowsncolumns/spreadsheet-state 29.1.4 → 29.1.6

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 (221) hide show
  1. package/dist/cjs/api/circular-reference.d.ts +31 -0
  2. package/dist/cjs/api/circular-reference.d.ts.map +1 -0
  3. package/dist/cjs/api/circular-reference.js +85 -0
  4. package/dist/cjs/api/copy-paste.d.ts +6 -0
  5. package/dist/cjs/api/copy-paste.d.ts.map +1 -1
  6. package/dist/cjs/api/copy-paste.js +24 -15
  7. package/dist/cjs/api/datatype.d.ts +2 -0
  8. package/dist/cjs/api/datatype.d.ts.map +1 -1
  9. package/dist/cjs/api/datatype.js +50 -27
  10. package/dist/cjs/api/decimals.d.ts +10 -0
  11. package/dist/cjs/api/decimals.d.ts.map +1 -1
  12. package/dist/cjs/api/decimals.js +34 -11
  13. package/dist/cjs/api/dependency.d.ts +19 -1
  14. package/dist/cjs/api/dependency.d.ts.map +1 -1
  15. package/dist/cjs/api/dependency.js +30 -14
  16. package/dist/cjs/api/filter-condition.d.ts +58 -0
  17. package/dist/cjs/api/filter-condition.d.ts.map +1 -0
  18. package/dist/cjs/api/filter-condition.js +157 -0
  19. package/dist/cjs/api/formula.d.ts.map +1 -1
  20. package/dist/cjs/api/formula.js +9 -7
  21. package/dist/cjs/api/image-embed.d.ts +41 -0
  22. package/dist/cjs/api/image-embed.d.ts.map +1 -0
  23. package/dist/cjs/api/image-embed.js +55 -0
  24. package/dist/cjs/api/immer-utils.d.ts.map +1 -1
  25. package/dist/cjs/api/immer-utils.js +43 -15
  26. package/dist/cjs/api/named-range-structural.d.ts +29 -3
  27. package/dist/cjs/api/named-range-structural.d.ts.map +1 -1
  28. package/dist/cjs/api/named-range-structural.js +36 -11
  29. package/dist/cjs/api/parse-html.d.ts.map +1 -1
  30. package/dist/cjs/api/parse-html.js +11 -5
  31. package/dist/cjs/api/structural-formula-update.d.ts +20 -1
  32. package/dist/cjs/api/structural-formula-update.d.ts.map +1 -1
  33. package/dist/cjs/api/structural-formula-update.js +264 -90
  34. package/dist/cjs/api/structural-guards.d.ts +11 -0
  35. package/dist/cjs/api/structural-guards.d.ts.map +1 -1
  36. package/dist/cjs/api/structural-guards.js +45 -1
  37. package/dist/cjs/api/structural-table-refs.d.ts +15 -2
  38. package/dist/cjs/api/structural-table-refs.d.ts.map +1 -1
  39. package/dist/cjs/api/structural-table-refs.js +79 -35
  40. package/dist/cjs/commands.d.ts +17 -3
  41. package/dist/cjs/commands.d.ts.map +1 -1
  42. package/dist/cjs/components/editors/conditional-format-rule-editor.d.ts.map +1 -1
  43. package/dist/cjs/components/editors/conditional-format-rule-editor.js +19 -7
  44. package/dist/cjs/constants.d.ts +4 -1
  45. package/dist/cjs/constants.d.ts.map +1 -1
  46. package/dist/cjs/constants.js +4 -0
  47. package/dist/cjs/helpers/sheet-title.d.ts +2 -1
  48. package/dist/cjs/helpers/sheet-title.d.ts.map +1 -1
  49. package/dist/cjs/helpers/sheet-title.js +3 -1
  50. package/dist/cjs/hooks/use-can-edit-cellrange.d.ts +1 -1
  51. package/dist/cjs/hooks/use-can-edit-cellrange.d.ts.map +1 -1
  52. package/dist/cjs/hooks/use-can-edit-cellrange.js +1 -1
  53. package/dist/cjs/hooks/use-on-calculation-success.d.ts +5 -1
  54. package/dist/cjs/hooks/use-on-calculation-success.d.ts.map +1 -1
  55. package/dist/cjs/hooks/use-on-calculation-success.js +20 -3
  56. package/dist/cjs/hooks/use-on-copy.d.ts.map +1 -1
  57. package/dist/cjs/hooks/use-on-copy.js +23 -25
  58. package/dist/cjs/hooks/use-on-create-sheet.d.ts.map +1 -1
  59. package/dist/cjs/hooks/use-on-create-sheet.js +11 -1
  60. package/dist/cjs/hooks/use-on-delete.d.ts.map +1 -1
  61. package/dist/cjs/hooks/use-on-delete.js +15 -3
  62. package/dist/cjs/hooks/use-on-drag-n-drop.d.ts +5 -0
  63. package/dist/cjs/hooks/use-on-drag-n-drop.d.ts.map +1 -1
  64. package/dist/cjs/hooks/use-on-drag-n-drop.js +6 -5
  65. package/dist/cjs/hooks/use-on-filter-table.d.ts.map +1 -1
  66. package/dist/cjs/hooks/use-on-filter-table.js +6 -1
  67. package/dist/cjs/hooks/use-on-find-replace.d.ts.map +1 -1
  68. package/dist/cjs/hooks/use-on-find-replace.js +111 -23
  69. package/dist/cjs/hooks/use-on-insert-image.d.ts.map +1 -1
  70. package/dist/cjs/hooks/use-on-insert-image.js +20 -33
  71. package/dist/cjs/hooks/use-on-paste.d.ts +2 -1
  72. package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
  73. package/dist/cjs/hooks/use-on-paste.js +53 -24
  74. package/dist/cjs/hooks/use-on-rename-sheet.d.ts +3 -1
  75. package/dist/cjs/hooks/use-on-rename-sheet.d.ts.map +1 -1
  76. package/dist/cjs/hooks/use-on-rename-sheet.js +19 -9
  77. package/dist/cjs/hooks/use-on-sort-column.d.ts +7 -1
  78. package/dist/cjs/hooks/use-on-sort-column.d.ts.map +1 -1
  79. package/dist/cjs/hooks/use-on-sort-column.js +25 -8
  80. package/dist/cjs/hooks/use-on-sort-range.d.ts +16 -2
  81. package/dist/cjs/hooks/use-on-sort-range.d.ts.map +1 -1
  82. package/dist/cjs/hooks/use-on-sort-range.js +72 -40
  83. package/dist/cjs/hooks/use-on-sort-table.d.ts +7 -2
  84. package/dist/cjs/hooks/use-on-sort-table.d.ts.map +1 -1
  85. package/dist/cjs/hooks/use-on-sort-table.js +25 -4
  86. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +5 -3
  87. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  88. package/dist/cjs/hooks/use-spreadsheet-state.js +7 -0
  89. package/dist/cjs/hooks/utils/sort-rows.d.ts +15 -0
  90. package/dist/cjs/hooks/utils/sort-rows.d.ts.map +1 -1
  91. package/dist/cjs/hooks/utils/sort-rows.js +16 -0
  92. package/dist/cjs/index.d.ts +3 -0
  93. package/dist/cjs/index.d.ts.map +1 -1
  94. package/dist/cjs/index.js +3 -0
  95. package/dist/cjs/interface/delete-column.d.ts.map +1 -1
  96. package/dist/cjs/interface/delete-column.js +254 -101
  97. package/dist/cjs/interface/delete-row.d.ts.map +1 -1
  98. package/dist/cjs/interface/delete-row.js +233 -81
  99. package/dist/cjs/interface/duplicate-sheet.d.ts.map +1 -1
  100. package/dist/cjs/interface/duplicate-sheet.js +4 -9
  101. package/dist/cjs/interface/insert-column.d.ts.map +1 -1
  102. package/dist/cjs/interface/insert-column.js +1 -1
  103. package/dist/cjs/interface/insert-row.d.ts.map +1 -1
  104. package/dist/cjs/interface/insert-row.js +1 -1
  105. package/dist/cjs/interface/new-sheet.d.ts.map +1 -1
  106. package/dist/cjs/interface/new-sheet.js +6 -13
  107. package/dist/cjs/sheet-cell.d.ts +9 -0
  108. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  109. package/dist/cjs/sheet-cell.js +46 -9
  110. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  111. package/dist/esm/api/circular-reference.d.ts +31 -0
  112. package/dist/esm/api/circular-reference.d.ts.map +1 -0
  113. package/dist/esm/api/circular-reference.js +55 -0
  114. package/dist/esm/api/copy-paste.d.ts +6 -0
  115. package/dist/esm/api/copy-paste.d.ts.map +1 -1
  116. package/dist/esm/api/copy-paste.js +26 -14
  117. package/dist/esm/api/datatype.d.ts +2 -0
  118. package/dist/esm/api/datatype.d.ts.map +1 -1
  119. package/dist/esm/api/datatype.js +50 -27
  120. package/dist/esm/api/decimals.d.ts +10 -0
  121. package/dist/esm/api/decimals.d.ts.map +1 -1
  122. package/dist/esm/api/decimals.js +31 -10
  123. package/dist/esm/api/dependency.d.ts +19 -1
  124. package/dist/esm/api/dependency.d.ts.map +1 -1
  125. package/dist/esm/api/dependency.js +15 -10
  126. package/dist/esm/api/filter-condition.d.ts +58 -0
  127. package/dist/esm/api/filter-condition.d.ts.map +1 -0
  128. package/dist/esm/api/filter-condition.js +146 -0
  129. package/dist/esm/api/formula.d.ts.map +1 -1
  130. package/dist/esm/api/formula.js +9 -7
  131. package/dist/esm/api/image-embed.d.ts +41 -0
  132. package/dist/esm/api/image-embed.d.ts.map +1 -0
  133. package/dist/esm/api/image-embed.js +52 -0
  134. package/dist/esm/api/immer-utils.d.ts.map +1 -1
  135. package/dist/esm/api/immer-utils.js +43 -14
  136. package/dist/esm/api/named-range-structural.d.ts +29 -3
  137. package/dist/esm/api/named-range-structural.d.ts.map +1 -1
  138. package/dist/esm/api/named-range-structural.js +35 -11
  139. package/dist/esm/api/parse-html.d.ts.map +1 -1
  140. package/dist/esm/api/parse-html.js +14 -5
  141. package/dist/esm/api/structural-formula-update.d.ts +20 -1
  142. package/dist/esm/api/structural-formula-update.d.ts.map +1 -1
  143. package/dist/esm/api/structural-formula-update.js +151 -55
  144. package/dist/esm/api/structural-guards.d.ts +11 -0
  145. package/dist/esm/api/structural-guards.d.ts.map +1 -1
  146. package/dist/esm/api/structural-guards.js +31 -0
  147. package/dist/esm/api/structural-table-refs.d.ts +15 -2
  148. package/dist/esm/api/structural-table-refs.d.ts.map +1 -1
  149. package/dist/esm/api/structural-table-refs.js +49 -18
  150. package/dist/esm/commands.d.ts +17 -3
  151. package/dist/esm/commands.d.ts.map +1 -1
  152. package/dist/esm/components/editors/conditional-format-rule-editor.d.ts.map +1 -1
  153. package/dist/esm/components/editors/conditional-format-rule-editor.js +18 -7
  154. package/dist/esm/constants.d.ts +4 -1
  155. package/dist/esm/constants.d.ts.map +1 -1
  156. package/dist/esm/constants.js +4 -0
  157. package/dist/esm/helpers/sheet-title.d.ts +2 -1
  158. package/dist/esm/helpers/sheet-title.d.ts.map +1 -1
  159. package/dist/esm/helpers/sheet-title.js +3 -1
  160. package/dist/esm/hooks/use-can-edit-cellrange.d.ts +1 -1
  161. package/dist/esm/hooks/use-can-edit-cellrange.d.ts.map +1 -1
  162. package/dist/esm/hooks/use-can-edit-cellrange.js +1 -1
  163. package/dist/esm/hooks/use-on-calculation-success.d.ts +5 -1
  164. package/dist/esm/hooks/use-on-calculation-success.d.ts.map +1 -1
  165. package/dist/esm/hooks/use-on-calculation-success.js +19 -3
  166. package/dist/esm/hooks/use-on-copy.d.ts.map +1 -1
  167. package/dist/esm/hooks/use-on-copy.js +17 -17
  168. package/dist/esm/hooks/use-on-create-sheet.d.ts.map +1 -1
  169. package/dist/esm/hooks/use-on-create-sheet.js +11 -1
  170. package/dist/esm/hooks/use-on-delete.d.ts.map +1 -1
  171. package/dist/esm/hooks/use-on-delete.js +15 -3
  172. package/dist/esm/hooks/use-on-drag-n-drop.d.ts +5 -0
  173. package/dist/esm/hooks/use-on-drag-n-drop.d.ts.map +1 -1
  174. package/dist/esm/hooks/use-on-drag-n-drop.js +7 -4
  175. package/dist/esm/hooks/use-on-filter-table.d.ts.map +1 -1
  176. package/dist/esm/hooks/use-on-filter-table.js +13 -2
  177. package/dist/esm/hooks/use-on-find-replace.d.ts.map +1 -1
  178. package/dist/esm/hooks/use-on-find-replace.js +111 -23
  179. package/dist/esm/hooks/use-on-insert-image.d.ts.map +1 -1
  180. package/dist/esm/hooks/use-on-insert-image.js +15 -25
  181. package/dist/esm/hooks/use-on-paste.d.ts +2 -1
  182. package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
  183. package/dist/esm/hooks/use-on-paste.js +46 -15
  184. package/dist/esm/hooks/use-on-rename-sheet.d.ts +3 -1
  185. package/dist/esm/hooks/use-on-rename-sheet.d.ts.map +1 -1
  186. package/dist/esm/hooks/use-on-rename-sheet.js +19 -9
  187. package/dist/esm/hooks/use-on-sort-column.d.ts +7 -1
  188. package/dist/esm/hooks/use-on-sort-column.d.ts.map +1 -1
  189. package/dist/esm/hooks/use-on-sort-column.js +18 -1
  190. package/dist/esm/hooks/use-on-sort-range.d.ts +16 -2
  191. package/dist/esm/hooks/use-on-sort-range.d.ts.map +1 -1
  192. package/dist/esm/hooks/use-on-sort-range.js +30 -3
  193. package/dist/esm/hooks/use-on-sort-table.d.ts +7 -2
  194. package/dist/esm/hooks/use-on-sort-table.d.ts.map +1 -1
  195. package/dist/esm/hooks/use-on-sort-table.js +25 -4
  196. package/dist/esm/hooks/use-spreadsheet-state.d.ts +5 -3
  197. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  198. package/dist/esm/hooks/use-spreadsheet-state.js +7 -0
  199. package/dist/esm/hooks/utils/sort-rows.d.ts +15 -0
  200. package/dist/esm/hooks/utils/sort-rows.d.ts.map +1 -1
  201. package/dist/esm/hooks/utils/sort-rows.js +15 -0
  202. package/dist/esm/index.d.ts +3 -0
  203. package/dist/esm/index.d.ts.map +1 -1
  204. package/dist/esm/index.js +3 -0
  205. package/dist/esm/interface/delete-column.d.ts.map +1 -1
  206. package/dist/esm/interface/delete-column.js +111 -80
  207. package/dist/esm/interface/delete-row.d.ts.map +1 -1
  208. package/dist/esm/interface/delete-row.js +91 -59
  209. package/dist/esm/interface/duplicate-sheet.d.ts.map +1 -1
  210. package/dist/esm/interface/duplicate-sheet.js +4 -9
  211. package/dist/esm/interface/insert-column.d.ts.map +1 -1
  212. package/dist/esm/interface/insert-column.js +1 -1
  213. package/dist/esm/interface/insert-row.d.ts.map +1 -1
  214. package/dist/esm/interface/insert-row.js +1 -1
  215. package/dist/esm/interface/new-sheet.d.ts.map +1 -1
  216. package/dist/esm/interface/new-sheet.js +6 -13
  217. package/dist/esm/sheet-cell.d.ts +9 -0
  218. package/dist/esm/sheet-cell.d.ts.map +1 -1
  219. package/dist/esm/sheet-cell.js +46 -7
  220. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  221. package/package.json +9 -9
@@ -1,4 +1,4 @@
1
- import { __assign, __values } from "tslib";
1
+ import { __assign, __read, __spreadArray, __values } from "tslib";
2
2
  import { isCellNode } from "@rowsncolumns/dag";
3
3
  import { getCellUserEnteredValue, getExtendedValueFormula, } from "@rowsncolumns/utils";
4
4
  import { SheetCell } from "../sheet-cell";
@@ -33,14 +33,105 @@ import { createSheetDraft } from "./immer-utils";
33
33
  * and 3 don't double-process a cell.
34
34
  */
35
35
  export var updateFormulasForStructuralChange = function (params) {
36
- var e_1, _a, e_2, _b, e_3, _c, e_4, _d;
37
- var _e, _f, _g, _h, _j, _k;
38
- var draft = params.draft, axis = params.axis, op = params.op, sheetId = params.sheetId, referenceIndex = params.referenceIndex, count = params.count, rowCount = params.rowCount, columnCount = params.columnCount, getDependents = params.getDependents, getGraphNodes = params.getGraphNodes, getGraphNodesInSheet = params.getGraphNodesInSheet, getSheetName = params.getSheetName, enqueueCalculation = params.enqueueCalculation, enqueueGraphOperation = params.enqueueGraphOperation, recalcCells = params.recalcCells, locale = params.locale, cellXfsRegistry = params.cellXfsRegistry, sharedStringRegistry = params.sharedStringRegistry;
36
+ var e_1, _a, e_2, _b, e_3, _c, e_4, _d, e_5, _e, e_6, _f, e_7, _g, e_8, _h;
37
+ var _j, _k, _l, _m, _o, _p;
38
+ var draft = params.draft, axis = params.axis, op = params.op, sheetId = params.sheetId, referenceIndex = params.referenceIndex, count = params.count, indexes = params.indexes, rowCount = params.rowCount, columnCount = params.columnCount, getDependents = params.getDependents, getGraphNodes = params.getGraphNodes, getGraphNodesInSheet = params.getGraphNodesInSheet, getSheetName = params.getSheetName, enqueueCalculation = params.enqueueCalculation, enqueueGraphOperation = params.enqueueGraphOperation, recalcCells = params.recalcCells, locale = params.locale, cellXfsRegistry = params.cellXfsRegistry, sharedStringRegistry = params.sharedStringRegistry;
39
39
  if (count <= 0)
40
40
  return;
41
41
  var isRow = axis === "row";
42
42
  var isInsert = op === "insert";
43
43
  var delta = isInsert ? count : -count;
44
+ // The deleted bands, as contiguous runs. A contiguous delete (or an insert)
45
+ // is the single run at `referenceIndex`; a Ctrl-selected delete has one run
46
+ // per island. Rewrites apply the runs from the LAST to the first: a run's
47
+ // references then sit in their original coordinates when its turn comes
48
+ // (only lines beyond it have moved, and they stay beyond it).
49
+ var runs = !isInsert && (indexes === null || indexes === void 0 ? void 0 : indexes.length)
50
+ ? contiguousRuns(indexes)
51
+ : [{ start: referenceIndex, count: count }];
52
+ var runsDescending = __spreadArray([], __read(runs), false).sort(function (a, b) { return b.start - a.start; });
53
+ var deletedIndexes = new Set();
54
+ try {
55
+ for (var runs_1 = __values(runs), runs_1_1 = runs_1.next(); !runs_1_1.done; runs_1_1 = runs_1.next()) {
56
+ var run = runs_1_1.value;
57
+ for (var i = 0; i < run.count; i++)
58
+ deletedIndexes.add(run.start + i);
59
+ }
60
+ }
61
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
62
+ finally {
63
+ try {
64
+ if (runs_1_1 && !runs_1_1.done && (_a = runs_1.return)) _a.call(runs_1);
65
+ }
66
+ finally { if (e_1) throw e_1.error; }
67
+ }
68
+ var sortedDeleted = __spreadArray([], __read(deletedIndexes), false).sort(function (a, b) { return a - b; });
69
+ /** Where a line at `index` on the edited sheet ends up after the splice. */
70
+ var finalIndex = function (index) {
71
+ var e_9, _a;
72
+ if (isInsert)
73
+ return index >= referenceIndex ? index + count : index;
74
+ var before = 0;
75
+ try {
76
+ for (var sortedDeleted_1 = __values(sortedDeleted), sortedDeleted_1_1 = sortedDeleted_1.next(); !sortedDeleted_1_1.done; sortedDeleted_1_1 = sortedDeleted_1.next()) {
77
+ var deleted = sortedDeleted_1_1.value;
78
+ if (deleted >= index)
79
+ break;
80
+ before++;
81
+ }
82
+ }
83
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
84
+ finally {
85
+ try {
86
+ if (sortedDeleted_1_1 && !sortedDeleted_1_1.done && (_a = sortedDeleted_1.return)) _a.call(sortedDeleted_1);
87
+ }
88
+ finally { if (e_9) throw e_9.error; }
89
+ }
90
+ return index - before;
91
+ };
92
+ var finalPosition = function (pos) {
93
+ return pos.sheetId !== sheetId
94
+ ? pos
95
+ : isRow
96
+ ? __assign(__assign({}, pos), { rowIndex: finalIndex(pos.rowIndex) }) : __assign(__assign({}, pos), { columnIndex: finalIndex(pos.columnIndex) });
97
+ };
98
+ var bandRange = function (start, size) {
99
+ return isRow
100
+ ? {
101
+ startRowIndex: start,
102
+ endRowIndex: start + size - 1,
103
+ startColumnIndex: 1,
104
+ endColumnIndex: columnCount,
105
+ }
106
+ : {
107
+ startRowIndex: 1,
108
+ endRowIndex: rowCount,
109
+ startColumnIndex: start,
110
+ endColumnIndex: start + size - 1,
111
+ };
112
+ };
113
+ var tailRange = function (from) {
114
+ return isRow
115
+ ? {
116
+ startRowIndex: from,
117
+ endRowIndex: rowCount,
118
+ startColumnIndex: 1,
119
+ endColumnIndex: columnCount,
120
+ }
121
+ : {
122
+ startRowIndex: 1,
123
+ endRowIndex: rowCount,
124
+ startColumnIndex: from,
125
+ endColumnIndex: columnCount,
126
+ };
127
+ };
128
+ // One reference shift per run, last run first (see `runs`).
129
+ var steps = runsDescending.map(function (run) { return ({
130
+ rowDelta: isRow ? (isInsert ? run.count : -run.count) : 0,
131
+ columnDelta: isRow ? 0 : isInsert ? run.count : -run.count,
132
+ sourceRange: tailRange(isInsert ? run.start : run.start + run.count),
133
+ deletedRange: isInsert ? undefined : bandRange(run.start, run.count),
134
+ }); });
44
135
  // The set of cells that ARE moving (Pass 3 target region). For both
45
136
  // insert and delete, this is everything from the reference index along
46
137
  // the affected axis; the splice happens after the formula updates.
@@ -75,39 +166,56 @@ export var updateFormulasForStructuralChange = function (params) {
75
166
  };
76
167
  // Pass 2's source range — the cells that will move under the splice.
77
168
  // For insert this is everything at-or-after the insertion point; for
78
- // delete this is everything strictly after the deleted block.
79
- var pass2SourceRange = isRow
80
- ? {
81
- startRowIndex: isInsert ? referenceIndex : referenceIndex + count,
82
- endRowIndex: rowCount,
83
- startColumnIndex: 1,
84
- endColumnIndex: columnCount,
85
- }
86
- : {
87
- startRowIndex: 1,
88
- endRowIndex: rowCount,
89
- startColumnIndex: isInsert ? referenceIndex : referenceIndex + count,
90
- endColumnIndex: columnCount,
91
- };
169
+ // delete this is everything strictly after the FIRST deleted band (a line
170
+ // between two bands of a Ctrl-selected delete moves too — by the bands
171
+ // before it — so its dependents must be collected).
172
+ var pass2SourceRange = tailRange(isInsert ? referenceIndex : runs[0].start + runs[0].count);
92
173
  // The cells a delete removes: any reference into them (that Pass 1 did not
93
174
  // already contract) is broken to `#REF!` instead of sliding onto the cell
94
175
  // that moves into its place.
95
176
  var deletedRange = isInsert ? undefined : pass1Range;
96
177
  var editedSheetName = getSheetName(sheetId);
97
178
  // ---- PASS 1 ----
98
- var pass1Formulas = collectUniqueDependentsForRange({
99
- draft: draft,
100
- sheetId: sheetId,
101
- sourceRange: pass1Range,
102
- getDependents: getDependents,
103
- });
179
+ // Dependents of every deleted band (the single band for an insert).
180
+ var pass1Formulas = new Map();
181
+ try {
182
+ for (var runs_2 = __values(runs), runs_2_1 = runs_2.next(); !runs_2_1.done; runs_2_1 = runs_2.next()) {
183
+ var run = runs_2_1.value;
184
+ try {
185
+ for (var _q = (e_3 = void 0, __values(collectUniqueDependentsForRange({
186
+ draft: draft,
187
+ sheetId: sheetId,
188
+ sourceRange: isInsert ? pass1Range : bandRange(run.start, run.count),
189
+ getDependents: getDependents,
190
+ }))), _r = _q.next(); !_r.done; _r = _q.next()) {
191
+ var _s = __read(_r.value, 2), key = _s[0], pos = _s[1];
192
+ if (!pass1Formulas.has(key))
193
+ pass1Formulas.set(key, pos);
194
+ }
195
+ }
196
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
197
+ finally {
198
+ try {
199
+ if (_r && !_r.done && (_c = _q.return)) _c.call(_q);
200
+ }
201
+ finally { if (e_3) throw e_3.error; }
202
+ }
203
+ }
204
+ }
205
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
206
+ finally {
207
+ try {
208
+ if (runs_2_1 && !runs_2_1.done && (_b = runs_2.return)) _b.call(runs_2);
209
+ }
210
+ finally { if (e_2) throw e_2.error; }
211
+ }
104
212
  if (pass1Formulas.size > 0) {
105
213
  var sheetCell = new SheetCell();
106
214
  try {
107
- for (var _l = __values(pass1Formulas.values()), _m = _l.next(); !_m.done; _m = _l.next()) {
108
- var pos = _m.value;
215
+ for (var _t = __values(pass1Formulas.values()), _u = _t.next(); !_u.done; _u = _t.next()) {
216
+ var pos = _u.value;
109
217
  var currentSheet = createSheetDraft(draft, pos.sheetId, pos.rowIndex);
110
- var cellData = (_f = (_e = currentSheet[pos.rowIndex]) === null || _e === void 0 ? void 0 : _e.values) === null || _f === void 0 ? void 0 : _f[pos.columnIndex];
218
+ var cellData = (_k = (_j = currentSheet[pos.rowIndex]) === null || _j === void 0 ? void 0 : _j.values) === null || _k === void 0 ? void 0 : _k[pos.columnIndex];
111
219
  if (!cellData)
112
220
  continue;
113
221
  sheetCell.assign(pos.sheetId, { rowIndex: pos.rowIndex, columnIndex: pos.columnIndex }, cellData, { locale: locale, cellXfsRegistry: cellXfsRegistry, sharedStringRegistry: sharedStringRegistry });
@@ -120,34 +228,38 @@ export var updateFormulasForStructuralChange = function (params) {
120
228
  var rangeOptions = {
121
229
  includeUnqualifiedReferences: pos.sheetId === sheetId,
122
230
  };
123
- var updatedFormula = isInsert
124
- ? expandRangesInFormula(formulaValue, referenceIndex, count, axis, editedSheetName, rangeOptions)
125
- : contractRangesInFormula(formulaValue, referenceIndex, count, axis, editedSheetName, rangeOptions);
231
+ var updatedFormula = formulaValue;
232
+ if (isInsert) {
233
+ updatedFormula = expandRangesInFormula(formulaValue, referenceIndex, count, axis, editedSheetName, rangeOptions);
234
+ }
235
+ else {
236
+ try {
237
+ // Contract for each deleted band, last band first: a range spanning
238
+ // rows 2 and 4 loses row 4 (`A1:A5` → `A1:A4`), then row 2 (→ `A1:A3`).
239
+ for (var runsDescending_1 = (e_5 = void 0, __values(runsDescending)), runsDescending_1_1 = runsDescending_1.next(); !runsDescending_1_1.done; runsDescending_1_1 = runsDescending_1.next()) {
240
+ var run = runsDescending_1_1.value;
241
+ if (!updatedFormula)
242
+ break;
243
+ updatedFormula = contractRangesInFormula(updatedFormula, run.start, run.count, axis, editedSheetName, rangeOptions);
244
+ }
245
+ }
246
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
247
+ finally {
248
+ try {
249
+ if (runsDescending_1_1 && !runsDescending_1_1.done && (_e = runsDescending_1.return)) _e.call(runsDescending_1);
250
+ }
251
+ finally { if (e_5) throw e_5.error; }
252
+ }
253
+ }
126
254
  if (!updatedFormula || updatedFormula === formulaValue)
127
255
  continue;
128
256
  sheetCell.setFormulaValue(updatedFormula, false);
129
257
  currentSheet[pos.rowIndex].values[pos.columnIndex] =
130
258
  sheetCell.getCellData();
131
259
  // Adjust the recalc position for cells that themselves shift in
132
- // the splice that follows. For insert: cells AT or after the
133
- // reference shift by +count along the axis. For delete: cells
134
- // STRICTLY after the deleted block shift by -count.
135
- var adjustedRowIndex = isRow
136
- ? pos.sheetId === sheetId &&
137
- (isInsert
138
- ? pos.rowIndex >= referenceIndex
139
- : pos.rowIndex >= referenceIndex + count)
140
- ? pos.rowIndex + delta
141
- : pos.rowIndex
142
- : pos.rowIndex;
143
- var adjustedColumnIndex = !isRow
144
- ? pos.sheetId === sheetId &&
145
- (isInsert
146
- ? pos.columnIndex >= referenceIndex
147
- : pos.columnIndex >= referenceIndex + count)
148
- ? pos.columnIndex + delta
149
- : pos.columnIndex
150
- : pos.columnIndex;
260
+ // the splice that follows: a cell on the edited sheet loses the deleted
261
+ // lines before it (or gains the inserted ones at or before it).
262
+ var _v = finalPosition(pos), adjustedRowIndex = _v.rowIndex, adjustedColumnIndex = _v.columnIndex;
151
263
  enqueueCalculation === null || enqueueCalculation === void 0 ? void 0 : enqueueCalculation({
152
264
  type: "add",
153
265
  position: {
@@ -165,12 +277,12 @@ export var updateFormulasForStructuralChange = function (params) {
165
277
  });
166
278
  }
167
279
  }
168
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
280
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
169
281
  finally {
170
282
  try {
171
- if (_m && !_m.done && (_a = _l.return)) _a.call(_l);
283
+ if (_u && !_u.done && (_d = _t.return)) _d.call(_t);
172
284
  }
173
- finally { if (e_1) throw e_1.error; }
285
+ finally { if (e_4) throw e_4.error; }
174
286
  }
175
287
  }
176
288
  // ---- PASS 2 ----
@@ -184,8 +296,8 @@ export var updateFormulasForStructuralChange = function (params) {
184
296
  getDependents: getDependents,
185
297
  });
186
298
  try {
187
- for (var _o = __values(pass2Dependents.values()), _p = _o.next(); !_p.done; _p = _o.next()) {
188
- var pos = _p.value;
299
+ for (var _w = __values(pass2Dependents.values()), _x = _w.next(); !_x.done; _x = _w.next()) {
300
+ var pos = _x.value;
189
301
  if (pos.sheetId !== sheetId) {
190
302
  shiftExternalDependentFormulaReferences({
191
303
  draft: draft,
@@ -199,6 +311,7 @@ export var updateFormulasForStructuralChange = function (params) {
199
311
  columnDelta: columnDelta,
200
312
  sourceRange: pass2SourceRange,
201
313
  deletedRange: deletedRange,
314
+ steps: steps,
202
315
  locale: locale,
203
316
  rowCount: rowCount,
204
317
  columnCount: columnCount,
@@ -219,6 +332,8 @@ export var updateFormulasForStructuralChange = function (params) {
219
332
  columnDelta: columnDelta,
220
333
  sourceRange: pass2SourceRange,
221
334
  deletedRange: deletedRange,
335
+ steps: steps,
336
+ destinationPosition: finalPosition(pos),
222
337
  locale: locale,
223
338
  rowCount: rowCount,
224
339
  columnCount: columnCount,
@@ -227,19 +342,19 @@ export var updateFormulasForStructuralChange = function (params) {
227
342
  });
228
343
  }
229
344
  }
230
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
345
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
231
346
  finally {
232
347
  try {
233
- if (_p && !_p.done && (_b = _o.return)) _b.call(_o);
348
+ if (_x && !_x.done && (_f = _w.return)) _f.call(_w);
234
349
  }
235
- finally { if (e_2) throw e_2.error; }
350
+ finally { if (e_6) throw e_6.error; }
236
351
  }
237
352
  try {
238
353
  // Some graph adapters do not return every direct cross-sheet formula from
239
354
  // getDependents during a structural edit. Sweep the formula-node map as a
240
355
  // fallback; movedKeys keeps dependents already handled above O(1) no-ops.
241
- for (var _q = __values(collectExternalFormulaPositions(getGraphNodes, sheetId)), _r = _q.next(); !_r.done; _r = _q.next()) {
242
- var position = _r.value;
356
+ for (var _y = __values(collectExternalFormulaPositions(getGraphNodes, sheetId)), _z = _y.next(); !_z.done; _z = _y.next()) {
357
+ var position = _z.value;
243
358
  shiftExternalDependentFormulaReferences({
244
359
  draft: draft,
245
360
  position: position,
@@ -252,6 +367,7 @@ export var updateFormulasForStructuralChange = function (params) {
252
367
  columnDelta: columnDelta,
253
368
  sourceRange: pass2SourceRange,
254
369
  deletedRange: deletedRange,
370
+ steps: steps,
255
371
  locale: locale,
256
372
  rowCount: rowCount,
257
373
  columnCount: columnCount,
@@ -260,12 +376,12 @@ export var updateFormulasForStructuralChange = function (params) {
260
376
  });
261
377
  }
262
378
  }
263
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
379
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
264
380
  finally {
265
381
  try {
266
- if (_r && !_r.done && (_c = _q.return)) _c.call(_q);
382
+ if (_z && !_z.done && (_g = _y.return)) _g.call(_y);
267
383
  }
268
- finally { if (e_3) throw e_3.error; }
384
+ finally { if (e_7) throw e_7.error; }
269
385
  }
270
386
  // ---- PASS 3 ----
271
387
  // Fast path: ask the calculator's dependency graph for the formula cells
@@ -285,7 +401,7 @@ export var updateFormulasForStructuralChange = function (params) {
285
401
  if (movedKeys.has(SheetCell.generateCellKey(sheetId, pos.rowIndex, pos.columnIndex))) {
286
402
  continue;
287
403
  }
288
- var rowValues = (_h = (_g = draft[sheetId]) === null || _g === void 0 ? void 0 : _g[pos.rowIndex]) === null || _h === void 0 ? void 0 : _h.values;
404
+ var rowValues = (_m = (_l = draft[sheetId]) === null || _l === void 0 ? void 0 : _l[pos.rowIndex]) === null || _m === void 0 ? void 0 : _m.values;
289
405
  var cellData = rowValues === null || rowValues === void 0 ? void 0 : rowValues[pos.columnIndex];
290
406
  var hasFormula = !!getExtendedValueFormula(getCellUserEnteredValue(cellData));
291
407
  if (!hasFormula)
@@ -306,6 +422,12 @@ export var updateFormulasForStructuralChange = function (params) {
306
422
  columnDelta: columnDelta,
307
423
  sourceRange: pass2SourceRange,
308
424
  deletedRange: deletedRange,
425
+ steps: steps,
426
+ destinationPosition: finalPosition({
427
+ sheetId: sheetId,
428
+ rowIndex: pos.rowIndex,
429
+ columnIndex: pos.columnIndex,
430
+ }),
309
431
  locale: locale,
310
432
  rowCount: rowCount,
311
433
  columnCount: columnCount,
@@ -314,12 +436,12 @@ export var updateFormulasForStructuralChange = function (params) {
314
436
  });
315
437
  }
316
438
  }
317
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
439
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
318
440
  finally {
319
441
  try {
320
- if (graphFormulaPositions_1_1 && !graphFormulaPositions_1_1.done && (_d = graphFormulaPositions_1.return)) _d.call(graphFormulaPositions_1);
442
+ if (graphFormulaPositions_1_1 && !graphFormulaPositions_1_1.done && (_h = graphFormulaPositions_1.return)) _h.call(graphFormulaPositions_1);
321
443
  }
322
- finally { if (e_4) throw e_4.error; }
444
+ finally { if (e_8) throw e_8.error; }
323
445
  }
324
446
  }
325
447
  else {
@@ -329,8 +451,8 @@ export var updateFormulasForStructuralChange = function (params) {
329
451
  var startRow = movedRegion.startRowIndex;
330
452
  var endRow = Math.min(movedRegion.endRowIndex, sheetRows.length - 1);
331
453
  for (var rowIndex = startRow; rowIndex <= endRow; rowIndex++) {
332
- var rowValues = (_j = sheetRows[rowIndex]) === null || _j === void 0 ? void 0 : _j.values;
333
- var dataColumnCount = (_k = rowValues === null || rowValues === void 0 ? void 0 : rowValues.length) !== null && _k !== void 0 ? _k : 0;
454
+ var rowValues = (_o = sheetRows[rowIndex]) === null || _o === void 0 ? void 0 : _o.values;
455
+ var dataColumnCount = (_p = rowValues === null || rowValues === void 0 ? void 0 : rowValues.length) !== null && _p !== void 0 ? _p : 0;
334
456
  if (!dataColumnCount)
335
457
  continue;
336
458
  var startCol = Math.min(Math.max(movedRegion.startColumnIndex, 1), dataColumnCount);
@@ -352,6 +474,8 @@ export var updateFormulasForStructuralChange = function (params) {
352
474
  columnDelta: columnDelta,
353
475
  sourceRange: pass2SourceRange,
354
476
  deletedRange: deletedRange,
477
+ steps: steps,
478
+ destinationPosition: finalPosition({ sheetId: sheetId, rowIndex: rowIndex, columnIndex: columnIndex }),
355
479
  locale: locale,
356
480
  rowCount: rowCount,
357
481
  columnCount: columnCount,
@@ -362,29 +486,79 @@ export var updateFormulasForStructuralChange = function (params) {
362
486
  }
363
487
  }
364
488
  };
489
+ /**
490
+ * The maximal contiguous runs of `indexes` (any order, duplicates ignored),
491
+ * ascending — the bands of a Ctrl-selected delete (rows 2 and 4 → two runs).
492
+ * Shared by `deleteRow` / `deleteColumn`, which apply every band-shaped update
493
+ * once per run.
494
+ */
495
+ export var contiguousRuns = function (indexes) {
496
+ var e_10, _a;
497
+ var sorted = __spreadArray([], __read(new Set(indexes)), false).sort(function (a, b) { return a - b; });
498
+ var runs = [];
499
+ try {
500
+ for (var sorted_1 = __values(sorted), sorted_1_1 = sorted_1.next(); !sorted_1_1.done; sorted_1_1 = sorted_1.next()) {
501
+ var index = sorted_1_1.value;
502
+ var last = runs[runs.length - 1];
503
+ if (last && last.start + last.count === index) {
504
+ last.count++;
505
+ }
506
+ else {
507
+ runs.push({ start: index, count: 1 });
508
+ }
509
+ }
510
+ }
511
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
512
+ finally {
513
+ try {
514
+ if (sorted_1_1 && !sorted_1_1.done && (_a = sorted_1.return)) _a.call(sorted_1);
515
+ }
516
+ finally { if (e_10) throw e_10.error; }
517
+ }
518
+ return runs;
519
+ };
365
520
  var shiftExternalDependentFormulaReferences = function (_a) {
366
- var _b, _c;
367
- var draft = _a.draft, position = _a.position, editedSheetName = _a.editedSheetName, enqueueCalculation = _a.enqueueCalculation, enqueueGraphOperation = _a.enqueueGraphOperation, recalcCells = _a.recalcCells, movedKeys = _a.movedKeys, rowDelta = _a.rowDelta, columnDelta = _a.columnDelta, sourceRange = _a.sourceRange, deletedRange = _a.deletedRange, locale = _a.locale, rowCount = _a.rowCount, columnCount = _a.columnCount, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry;
521
+ var e_11, _b;
522
+ var _c, _d;
523
+ var draft = _a.draft, position = _a.position, editedSheetName = _a.editedSheetName, enqueueCalculation = _a.enqueueCalculation, enqueueGraphOperation = _a.enqueueGraphOperation, recalcCells = _a.recalcCells, movedKeys = _a.movedKeys, rowDelta = _a.rowDelta, columnDelta = _a.columnDelta, sourceRange = _a.sourceRange, deletedRange = _a.deletedRange, steps = _a.steps, locale = _a.locale, rowCount = _a.rowCount, columnCount = _a.columnCount, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry;
368
524
  var sheetCell = new SheetCell();
369
525
  var currentSheet = createSheetDraft(draft, position.sheetId, position.rowIndex);
370
- var cellData = (_c = (_b = currentSheet[position.rowIndex]) === null || _b === void 0 ? void 0 : _b.values) === null || _c === void 0 ? void 0 : _c[position.columnIndex];
526
+ var cellData = (_d = (_c = currentSheet[position.rowIndex]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[position.columnIndex];
371
527
  sheetCell.assign(position.sheetId, { rowIndex: position.rowIndex, columnIndex: position.columnIndex }, cellData, { locale: locale, cellXfsRegistry: cellXfsRegistry, sharedStringRegistry: sharedStringRegistry });
372
528
  if (movedKeys.has(sheetCell.key) || !sheetCell.isFormula()) {
373
529
  return;
374
530
  }
375
531
  movedKeys.add(sheetCell.key);
376
532
  var previousFormula = sheetCell.formula;
377
- var updatedFormula = formulaToRelativeReference(previousFormula, { rowIndex: position.rowIndex, columnIndex: position.columnIndex }, {
378
- rowIndex: position.rowIndex + rowDelta,
379
- columnIndex: position.columnIndex + columnDelta,
380
- }, editedSheetName, {
381
- exclusionRange: sourceRange,
382
- deletedRange: deletedRange,
383
- rowCount: rowCount,
384
- columnCount: columnCount,
385
- referenceSheetName: editedSheetName,
386
- includeUnqualifiedReferences: false,
387
- });
533
+ var moves = steps !== null && steps !== void 0 ? steps : [
534
+ { rowDelta: rowDelta, columnDelta: columnDelta, sourceRange: sourceRange, deletedRange: deletedRange },
535
+ ];
536
+ var updatedFormula = previousFormula;
537
+ try {
538
+ for (var moves_1 = __values(moves), moves_1_1 = moves_1.next(); !moves_1_1.done; moves_1_1 = moves_1.next()) {
539
+ var move = moves_1_1.value;
540
+ if (!updatedFormula)
541
+ break;
542
+ updatedFormula = formulaToRelativeReference(updatedFormula, { rowIndex: position.rowIndex, columnIndex: position.columnIndex }, {
543
+ rowIndex: position.rowIndex + move.rowDelta,
544
+ columnIndex: position.columnIndex + move.columnDelta,
545
+ }, editedSheetName, {
546
+ exclusionRange: move.sourceRange,
547
+ deletedRange: move.deletedRange,
548
+ rowCount: rowCount,
549
+ columnCount: columnCount,
550
+ referenceSheetName: editedSheetName,
551
+ includeUnqualifiedReferences: false,
552
+ });
553
+ }
554
+ }
555
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
556
+ finally {
557
+ try {
558
+ if (moves_1_1 && !moves_1_1.done && (_b = moves_1.return)) _b.call(moves_1);
559
+ }
560
+ finally { if (e_11) throw e_11.error; }
561
+ }
388
562
  if (!updatedFormula || updatedFormula === previousFormula) {
389
563
  return;
390
564
  }
@@ -399,7 +573,7 @@ var shiftExternalDependentFormulaReferences = function (_a) {
399
573
  recalcCells.set(createSheetCellIdentifier(position.sheetId, position.rowIndex, position.columnIndex), __assign(__assign({}, position), { force: true }));
400
574
  };
401
575
  var collectExternalFormulaPositions = function (getGraphNodes, editedSheetId) {
402
- var e_5, _a;
576
+ var e_12, _a;
403
577
  if (!getGraphNodes)
404
578
  return [];
405
579
  var graphNodes;
@@ -421,12 +595,12 @@ var collectExternalFormulaPositions = function (getGraphNodes, editedSheetId) {
421
595
  positions.push(node.position);
422
596
  }
423
597
  }
424
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
598
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
425
599
  finally {
426
600
  try {
427
601
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
428
602
  }
429
- finally { if (e_5) throw e_5.error; }
603
+ finally { if (e_12) throw e_12.error; }
430
604
  }
431
605
  return positions;
432
606
  };
@@ -440,7 +614,7 @@ var collectExternalFormulaPositions = function (getGraphNodes, editedSheetId) {
440
614
  * workbook-wide map only when the per-sheet API isn't available.
441
615
  */
442
616
  var collectGraphFormulaPositions = function (getGraphNodesInSheet, getGraphNodes, sheetId, movedRegion) {
443
- var e_6, _a, e_7, _b;
617
+ var e_13, _a, e_14, _b;
444
618
  // Fast path: per-sheet bucket.
445
619
  if (getGraphNodesInSheet) {
446
620
  var sheetBucket = void 0;
@@ -471,12 +645,12 @@ var collectGraphFormulaPositions = function (getGraphNodesInSheet, getGraphNodes
471
645
  });
472
646
  }
473
647
  }
474
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
648
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
475
649
  finally {
476
650
  try {
477
651
  if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
478
652
  }
479
- finally { if (e_6) throw e_6.error; }
653
+ finally { if (e_13) throw e_13.error; }
480
654
  }
481
655
  return positions_1;
482
656
  }
@@ -515,12 +689,12 @@ var collectGraphFormulaPositions = function (getGraphNodesInSheet, getGraphNodes
515
689
  positions.push({ rowIndex: pos.rowIndex, columnIndex: pos.columnIndex });
516
690
  }
517
691
  }
518
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
692
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
519
693
  finally {
520
694
  try {
521
695
  if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
522
696
  }
523
- finally { if (e_7) throw e_7.error; }
697
+ finally { if (e_14) throw e_14.error; }
524
698
  }
525
699
  return sawSheetNode ? positions : null;
526
700
  };
@@ -132,4 +132,15 @@ export declare const getInsertLinesRefusal: <T extends CellData>({ axis, referen
132
132
  rows: SheetData<T>[number] | undefined;
133
133
  limit: number | undefined;
134
134
  }) => StructuralRefusal | undefined;
135
+ /**
136
+ * Excel's sort rule for merged cells: a sort may only reorder rows whose merge layout is identical —
137
+ * every merge touching the sorted range must lie wholly inside it, span a single row, and every row of
138
+ * the range must carry the same column spans. Otherwise the anchor values would move with their rows
139
+ * while the merge outlines stayed behind (stale merge geometry), so the sort is refused with Excel's
140
+ * "To do this, all the merged cells need to be the same size." Merges outside the range are untouched.
141
+ */
142
+ export declare const getSortMergeRefusal: ({ range, merges, }: {
143
+ range: GridRange;
144
+ merges: readonly GridRange[] | null | undefined;
145
+ }) => StructuralRefusal | undefined;
135
146
  //# sourceMappingURL=structural-guards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"structural-guards.d.ts","sourceRoot":"","sources":["../../../api/structural-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGhF,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC;AAEvC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAE9D;0FAC0F;AAC1F,eAAO,MAAM,qBAAqB,GAChC,YAAY,aAAa,EACzB,YAAY,aAAa,CAAC,mBAAmB,CAAC,EAAE,KAC/C,aAAa,CAAC,mBAAmB,CAKnC,CAAC;AAcF,yGAAyG;AACzG,eAAO,MAAM,SAAS,GACpB,WAAW,cAAc,EACzB,OAAO,SAAS,KACf,cAmBF,CAAC;AAYF,eAAO,MAAM,cAAc,GACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,SAAS,KAChC,OAMF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EAAE,qCAMlD;IACD,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACvC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,cAAc,CAAC;CACtB,KAAG,aAAa,GAAG,SA+BnB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC/C,MAAM,cAAc,EACpB,eAAe,SAAS,KACvB,SAAS,GAAG,SAed,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC/C,MAAM,cAAc,EACpB,eAAe,SAAS,0BACoB,CAAC;AAE/C,qGAAqG;AACrG,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC/C,SAAS,MAAM,EACf,MAAM,cAAc,EACpB,eAAe,SAAS,KACvB,SAAS,GAAG,SAOd,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,aAAa,GACxB,aAAa,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EACpD,MAAM,cAAc,EACpB,eAAe,SAAS,0BACyB,CAAC;AAEpD;+BAC+B;AAC/B,eAAO,MAAM,iBAAiB,GAAI,OAAO,SAAS,EAAE,MAAM,cAAc,YAC5C,CAAC;AAE7B,eAAO,MAAM,kBAAkB,UAjKD,SAAS,SAAS,SAAS,YAiKV,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,mEAOlC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD,KAAG,iBAAiB,GAAG,SAuBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,QAAQ,EAAE,0FAUtD;IACD,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACvC,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;CAC3C,KAAG,iBAAiB,GAAG,SA8BvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,2CAMjC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;CACtC,KAAG,iBAAiB,GAAG,SAyBvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAI,sCAKrC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;CACtC,KAAG,iBAAiB,GAAG,SAgBT,CAAC;AAEhB;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,mCAKjC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;CACtC,KAAG,iBAAiB,GAAG,SAYvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EAAE,+CAMvD;IACD,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,KAAG,iBAAiB,GAAG,SAkBvB,CAAC"}
1
+ {"version":3,"file":"structural-guards.d.ts","sourceRoot":"","sources":["../../../api/structural-guards.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { __assign, __read } from "tslib";
1
+ import { __assign, __read, __values } from "tslib";
2
2
  import { selectionFromActiveCell } from "@rowsncolumns/utils";
3
3
  import { structuralRefusal, } from "../constants";
4
4
  /** The selection a cell shift operates on — the LAST selection, or the active cell as a 1×1. The
@@ -292,3 +292,47 @@ export var getInsertLinesRefusal = function (_a) {
292
292
  ? structuralRefusal("off-sheet-push")
293
293
  : undefined;
294
294
  };
295
+ /**
296
+ * Excel's sort rule for merged cells: a sort may only reorder rows whose merge layout is identical —
297
+ * every merge touching the sorted range must lie wholly inside it, span a single row, and every row of
298
+ * the range must carry the same column spans. Otherwise the anchor values would move with their rows
299
+ * while the merge outlines stayed behind (stale merge geometry), so the sort is refused with Excel's
300
+ * "To do this, all the merged cells need to be the same size." Merges outside the range are untouched.
301
+ */
302
+ export var getSortMergeRefusal = function (_a) {
303
+ var e_1, _b;
304
+ var _c;
305
+ var range = _a.range, merges = _a.merges;
306
+ if (!(merges === null || merges === void 0 ? void 0 : merges.length))
307
+ return undefined;
308
+ var touching = merges.filter(function (merge) { return rangesIntersect(merge, range); });
309
+ if (!touching.length)
310
+ return undefined;
311
+ var spansByRow = new Map();
312
+ try {
313
+ for (var touching_1 = __values(touching), touching_1_1 = touching_1.next(); !touching_1_1.done; touching_1_1 = touching_1.next()) {
314
+ var merge = touching_1_1.value;
315
+ if (!rangeContains(range, merge) ||
316
+ merge.startRowIndex !== merge.endRowIndex) {
317
+ return structuralRefusal("sort-merged-cells");
318
+ }
319
+ var spans = (_c = spansByRow.get(merge.startRowIndex)) !== null && _c !== void 0 ? _c : [];
320
+ spans.push("".concat(merge.startColumnIndex, ":").concat(merge.endColumnIndex));
321
+ spansByRow.set(merge.startRowIndex, spans);
322
+ }
323
+ }
324
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
325
+ finally {
326
+ try {
327
+ if (touching_1_1 && !touching_1_1.done && (_b = touching_1.return)) _b.call(touching_1);
328
+ }
329
+ finally { if (e_1) throw e_1.error; }
330
+ }
331
+ var layoutOf = function (rowIndex) { var _a; return ((_a = spansByRow.get(rowIndex)) !== null && _a !== void 0 ? _a : []).slice().sort().join(","); };
332
+ var first = layoutOf(range.startRowIndex);
333
+ for (var r = range.startRowIndex + 1; r <= range.endRowIndex; r++) {
334
+ if (layoutOf(r) !== first)
335
+ return structuralRefusal("sort-merged-cells");
336
+ }
337
+ return undefined;
338
+ };