@rowsncolumns/spreadsheet-state 28.0.75 → 28.0.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) 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/dependency.d.ts +13 -2
  5. package/dist/cjs/api/dependency.d.ts.map +1 -1
  6. package/dist/cjs/api/dependency.js +11 -5
  7. package/dist/cjs/api/formula.d.ts +61 -4
  8. package/dist/cjs/api/formula.d.ts.map +1 -1
  9. package/dist/cjs/api/formula.js +250 -61
  10. package/dist/cjs/api/merges.d.ts +8 -0
  11. package/dist/cjs/api/merges.d.ts.map +1 -1
  12. package/dist/cjs/api/merges.js +64 -1
  13. package/dist/cjs/api/named-range-structural.d.ts +62 -0
  14. package/dist/cjs/api/named-range-structural.d.ts.map +1 -0
  15. package/dist/cjs/api/named-range-structural.js +197 -0
  16. package/dist/cjs/api/range-rule-helpers.d.ts +45 -1
  17. package/dist/cjs/api/range-rule-helpers.d.ts.map +1 -1
  18. package/dist/cjs/api/range-rule-helpers.js +159 -6
  19. package/dist/cjs/api/structural-formula-update.d.ts.map +1 -1
  20. package/dist/cjs/api/structural-formula-update.js +24 -6
  21. package/dist/cjs/api/structural-guards.d.ts +78 -0
  22. package/dist/cjs/api/structural-guards.d.ts.map +1 -0
  23. package/dist/cjs/api/structural-guards.js +202 -0
  24. package/dist/cjs/api/structural-table-refs.d.ts +94 -0
  25. package/dist/cjs/api/structural-table-refs.d.ts.map +1 -0
  26. package/dist/cjs/api/structural-table-refs.js +313 -0
  27. package/dist/cjs/constants.d.ts +25 -0
  28. package/dist/cjs/constants.d.ts.map +1 -0
  29. package/dist/cjs/constants.js +26 -0
  30. package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
  31. package/dist/cjs/hooks/use-calculation-worker.js +64 -6
  32. package/dist/cjs/hooks/use-calculation.d.ts +7 -0
  33. package/dist/cjs/hooks/use-calculation.d.ts.map +1 -1
  34. package/dist/cjs/hooks/use-calculation.js +15 -0
  35. package/dist/cjs/hooks/use-on-calculation-success.d.ts +7 -0
  36. package/dist/cjs/hooks/use-on-calculation-success.d.ts.map +1 -1
  37. package/dist/cjs/hooks/use-on-calculation-success.js +7 -1
  38. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  39. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  40. package/dist/cjs/hooks/use-on-delete-cells-shift-left.js +27 -2
  41. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  42. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  43. package/dist/cjs/hooks/use-on-delete-cells-shift-up.js +27 -2
  44. package/dist/cjs/hooks/use-on-delete-column.d.ts +13 -4
  45. package/dist/cjs/hooks/use-on-delete-column.d.ts.map +1 -1
  46. package/dist/cjs/hooks/use-on-delete-column.js +14 -2
  47. package/dist/cjs/hooks/use-on-delete-row.d.ts +13 -4
  48. package/dist/cjs/hooks/use-on-delete-row.d.ts.map +1 -1
  49. package/dist/cjs/hooks/use-on-delete-row.js +14 -2
  50. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  51. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  52. package/dist/cjs/hooks/use-on-insert-cells-shift-down.js +27 -2
  53. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  54. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  55. package/dist/cjs/hooks/use-on-insert-cells-shift-right.js +27 -2
  56. package/dist/cjs/hooks/use-on-insert-column.d.ts +10 -3
  57. package/dist/cjs/hooks/use-on-insert-column.d.ts.map +1 -1
  58. package/dist/cjs/hooks/use-on-insert-column.js +33 -7
  59. package/dist/cjs/hooks/use-on-insert-row.d.ts +10 -3
  60. package/dist/cjs/hooks/use-on-insert-row.d.ts.map +1 -1
  61. package/dist/cjs/hooks/use-on-insert-row.js +32 -7
  62. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +2 -2
  63. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  64. package/dist/cjs/hooks/use-spreadsheet-state.js +61 -15
  65. package/dist/cjs/hooks/use-structured-reference.d.ts.map +1 -1
  66. package/dist/cjs/hooks/use-structured-reference.js +10 -6
  67. package/dist/cjs/index.d.ts +3 -0
  68. package/dist/cjs/index.d.ts.map +1 -1
  69. package/dist/cjs/index.js +3 -0
  70. package/dist/cjs/interface/calculation-interface.d.ts +9 -0
  71. package/dist/cjs/interface/calculation-interface.d.ts.map +1 -1
  72. package/dist/cjs/interface/calculation-interface.js +31 -2
  73. package/dist/cjs/interface/delete-cells-shift-left.d.ts +8 -1
  74. package/dist/cjs/interface/delete-cells-shift-left.d.ts.map +1 -1
  75. package/dist/cjs/interface/delete-cells-shift-left.js +158 -80
  76. package/dist/cjs/interface/delete-cells-shift-up.d.ts +9 -1
  77. package/dist/cjs/interface/delete-cells-shift-up.d.ts.map +1 -1
  78. package/dist/cjs/interface/delete-cells-shift-up.js +155 -73
  79. package/dist/cjs/interface/delete-column.d.ts +1 -1
  80. package/dist/cjs/interface/delete-column.d.ts.map +1 -1
  81. package/dist/cjs/interface/delete-column.js +90 -31
  82. package/dist/cjs/interface/delete-row.d.ts +1 -1
  83. package/dist/cjs/interface/delete-row.d.ts.map +1 -1
  84. package/dist/cjs/interface/delete-row.js +85 -26
  85. package/dist/cjs/interface/insert-cells-shift-down.d.ts +10 -1
  86. package/dist/cjs/interface/insert-cells-shift-down.d.ts.map +1 -1
  87. package/dist/cjs/interface/insert-cells-shift-down.js +147 -52
  88. package/dist/cjs/interface/insert-cells-shift-right.d.ts +10 -1
  89. package/dist/cjs/interface/insert-cells-shift-right.d.ts.map +1 -1
  90. package/dist/cjs/interface/insert-cells-shift-right.js +154 -58
  91. package/dist/cjs/interface/insert-column.d.ts +1 -1
  92. package/dist/cjs/interface/insert-column.d.ts.map +1 -1
  93. package/dist/cjs/interface/insert-column.js +46 -8
  94. package/dist/cjs/interface/insert-row.d.ts +1 -1
  95. package/dist/cjs/interface/insert-row.d.ts.map +1 -1
  96. package/dist/cjs/interface/insert-row.js +47 -10
  97. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  98. package/dist/cjs/interface/spreadsheet-interface.js +33 -0
  99. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  100. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  101. package/dist/esm/api/anchored-objects.d.ts +66 -0
  102. package/dist/esm/api/anchored-objects.d.ts.map +1 -0
  103. package/dist/esm/api/anchored-objects.js +212 -0
  104. package/dist/esm/api/dependency.d.ts +13 -2
  105. package/dist/esm/api/dependency.d.ts.map +1 -1
  106. package/dist/esm/api/dependency.js +10 -4
  107. package/dist/esm/api/formula.d.ts +61 -4
  108. package/dist/esm/api/formula.d.ts.map +1 -1
  109. package/dist/esm/api/formula.js +238 -60
  110. package/dist/esm/api/merges.d.ts +8 -0
  111. package/dist/esm/api/merges.d.ts.map +1 -1
  112. package/dist/esm/api/merges.js +51 -0
  113. package/dist/esm/api/named-range-structural.d.ts +62 -0
  114. package/dist/esm/api/named-range-structural.d.ts.map +1 -0
  115. package/dist/esm/api/named-range-structural.js +176 -0
  116. package/dist/esm/api/range-rule-helpers.d.ts +45 -1
  117. package/dist/esm/api/range-rule-helpers.d.ts.map +1 -1
  118. package/dist/esm/api/range-rule-helpers.js +153 -1
  119. package/dist/esm/api/structural-formula-update.d.ts.map +1 -1
  120. package/dist/esm/api/structural-formula-update.js +24 -6
  121. package/dist/esm/api/structural-guards.d.ts +78 -0
  122. package/dist/esm/api/structural-guards.d.ts.map +1 -0
  123. package/dist/esm/api/structural-guards.js +186 -0
  124. package/dist/esm/api/structural-table-refs.d.ts +94 -0
  125. package/dist/esm/api/structural-table-refs.d.ts.map +1 -0
  126. package/dist/esm/api/structural-table-refs.js +219 -0
  127. package/dist/esm/constants.d.ts +25 -0
  128. package/dist/esm/constants.d.ts.map +1 -0
  129. package/dist/esm/constants.js +26 -0
  130. package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
  131. package/dist/esm/hooks/use-calculation-worker.js +45 -0
  132. package/dist/esm/hooks/use-calculation.d.ts +7 -0
  133. package/dist/esm/hooks/use-calculation.d.ts.map +1 -1
  134. package/dist/esm/hooks/use-calculation.js +15 -0
  135. package/dist/esm/hooks/use-on-calculation-success.d.ts +7 -0
  136. package/dist/esm/hooks/use-on-calculation-success.d.ts.map +1 -1
  137. package/dist/esm/hooks/use-on-calculation-success.js +7 -1
  138. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  139. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  140. package/dist/esm/hooks/use-on-delete-cells-shift-left.js +26 -2
  141. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  142. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  143. package/dist/esm/hooks/use-on-delete-cells-shift-up.js +26 -2
  144. package/dist/esm/hooks/use-on-delete-column.d.ts +13 -4
  145. package/dist/esm/hooks/use-on-delete-column.d.ts.map +1 -1
  146. package/dist/esm/hooks/use-on-delete-column.js +14 -2
  147. package/dist/esm/hooks/use-on-delete-row.d.ts +13 -4
  148. package/dist/esm/hooks/use-on-delete-row.d.ts.map +1 -1
  149. package/dist/esm/hooks/use-on-delete-row.js +14 -2
  150. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  151. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  152. package/dist/esm/hooks/use-on-insert-cells-shift-down.js +26 -2
  153. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  154. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  155. package/dist/esm/hooks/use-on-insert-cells-shift-right.js +26 -2
  156. package/dist/esm/hooks/use-on-insert-column.d.ts +10 -3
  157. package/dist/esm/hooks/use-on-insert-column.d.ts.map +1 -1
  158. package/dist/esm/hooks/use-on-insert-column.js +33 -7
  159. package/dist/esm/hooks/use-on-insert-row.d.ts +10 -3
  160. package/dist/esm/hooks/use-on-insert-row.d.ts.map +1 -1
  161. package/dist/esm/hooks/use-on-insert-row.js +32 -7
  162. package/dist/esm/hooks/use-spreadsheet-state.d.ts +2 -2
  163. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  164. package/dist/esm/hooks/use-spreadsheet-state.js +61 -15
  165. package/dist/esm/hooks/use-structured-reference.d.ts.map +1 -1
  166. package/dist/esm/hooks/use-structured-reference.js +10 -6
  167. package/dist/esm/index.d.ts +3 -0
  168. package/dist/esm/index.d.ts.map +1 -1
  169. package/dist/esm/index.js +3 -0
  170. package/dist/esm/interface/calculation-interface.d.ts +9 -0
  171. package/dist/esm/interface/calculation-interface.d.ts.map +1 -1
  172. package/dist/esm/interface/calculation-interface.js +33 -2
  173. package/dist/esm/interface/delete-cells-shift-left.d.ts +8 -1
  174. package/dist/esm/interface/delete-cells-shift-left.d.ts.map +1 -1
  175. package/dist/esm/interface/delete-cells-shift-left.js +135 -59
  176. package/dist/esm/interface/delete-cells-shift-up.d.ts +9 -1
  177. package/dist/esm/interface/delete-cells-shift-up.d.ts.map +1 -1
  178. package/dist/esm/interface/delete-cells-shift-up.js +133 -53
  179. package/dist/esm/interface/delete-column.d.ts +1 -1
  180. package/dist/esm/interface/delete-column.d.ts.map +1 -1
  181. package/dist/esm/interface/delete-column.js +80 -11
  182. package/dist/esm/interface/delete-row.d.ts +1 -1
  183. package/dist/esm/interface/delete-row.d.ts.map +1 -1
  184. package/dist/esm/interface/delete-row.js +81 -11
  185. package/dist/esm/interface/insert-cells-shift-down.d.ts +10 -1
  186. package/dist/esm/interface/insert-cells-shift-down.d.ts.map +1 -1
  187. package/dist/esm/interface/insert-cells-shift-down.js +116 -47
  188. package/dist/esm/interface/insert-cells-shift-right.d.ts +10 -1
  189. package/dist/esm/interface/insert-cells-shift-right.d.ts.map +1 -1
  190. package/dist/esm/interface/insert-cells-shift-right.js +120 -51
  191. package/dist/esm/interface/insert-column.d.ts +1 -1
  192. package/dist/esm/interface/insert-column.d.ts.map +1 -1
  193. package/dist/esm/interface/insert-column.js +46 -8
  194. package/dist/esm/interface/insert-row.d.ts +1 -1
  195. package/dist/esm/interface/insert-row.d.ts.map +1 -1
  196. package/dist/esm/interface/insert-row.js +47 -10
  197. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  198. package/dist/esm/interface/spreadsheet-interface.js +29 -0
  199. package/dist/esm/sheet-cell.d.ts.map +1 -1
  200. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  201. package/package.json +16 -16
@@ -0,0 +1,197 @@
1
+ import { __assign, __read, __values } from "tslib";
2
+ /**
3
+ * The `value` a defined name carries once every cell of its range has been
4
+ * deleted. Excel keeps the name in the Name Manager as `=Sheet1!#REF!` and
5
+ * every formula that uses it evaluates to `#REF!` (not `#NAME?`), so the
6
+ * name survives with no range and this error marker as its value; the
7
+ * calculation worker's name resolver turns it into `FormulaError.REF`.
8
+ */
9
+ export var NAMED_RANGE_REF_ERROR = "#REF!";
10
+ export var isRefErrorNamedRange = function (namedRange) { return !namedRange.range && namedRange.value === NAMED_RANGE_REF_ERROR; };
11
+ /**
12
+ * Shift the inclusive `[start, end]` band of a defined name / print band for
13
+ * an insert or delete of `count` rows or columns at `index` (1-based).
14
+ * Excel's rule for a name's RefersTo, identical to the Rust engine's
15
+ * `shift_named_ranges`:
16
+ *
17
+ * - insert at or above the first index → the whole band shifts;
18
+ * - insert strictly inside → the band grows;
19
+ * - insert at the boundary directly below → unchanged;
20
+ * - delete wholly above → shifts back; delete overlapping → shrinks by the
21
+ * deleted indices inside the band; delete covering the band → `null`.
22
+ */
23
+ export var shiftNamedBand = function (start, end, op, index, count) {
24
+ if (count <= 0)
25
+ return [start, end];
26
+ var s = Math.max(1, start);
27
+ var e = Math.max(s, end);
28
+ if (op === "insert") {
29
+ if (index <= s)
30
+ return [s + count, e + count];
31
+ if (index <= e)
32
+ return [s, e + count];
33
+ return [s, e];
34
+ }
35
+ var deleteEnd = index + count - 1;
36
+ if (deleteEnd < s)
37
+ return [s - count, e - count];
38
+ if (index > e)
39
+ return [s, e];
40
+ if (index <= s && deleteEnd >= e)
41
+ return null;
42
+ var before = Math.max(s - index, 0);
43
+ var inside = Math.min(deleteEnd, e) - Math.max(index, s) + 1;
44
+ return [s - before, e - before - inside];
45
+ };
46
+ var shiftGridRange = function (range, axis, op, index, count) {
47
+ var _a;
48
+ var _b = __read(axis === "row"
49
+ ? ["startRowIndex", "endRowIndex"]
50
+ : ["startColumnIndex", "endColumnIndex"], 2), startKey = _b[0], endKey = _b[1];
51
+ var next = shiftNamedBand(range[startKey], range[endKey], op, index, count);
52
+ if (!next)
53
+ return null;
54
+ if (next[0] === range[startKey] && next[1] === range[endKey])
55
+ return range;
56
+ return __assign(__assign({}, range), (_a = {}, _a[startKey] = next[0], _a[endKey] = next[1], _a));
57
+ };
58
+ /**
59
+ * Adjust defined names for a sheet-level insert/delete on `sheetId`,
60
+ * mutating the immer `draft` in place. Only names whose `range.sheetId` is
61
+ * the edited sheet move — a name's scope (`scopeSheetId`) governs how it is
62
+ * resolved, not which sheet's edits shift it (a Sheet2-scoped name pointing
63
+ * at Sheet2!$B$4 shifts on Sheet2 edits, never on Sheet1 edits). Value
64
+ * names (`=SUM(...)*2`, `0.1`) have no grid range and pass through.
65
+ *
66
+ * A name whose entire range is deleted is NOT dropped: it keeps its entry
67
+ * with `range` cleared and `value: "#REF!"`, so `=SUM(Data)` evaluates to
68
+ * `#REF!` like Excel rather than `#NAME?`.
69
+ */
70
+ export var updateNamedRangesOnStructuralChange = function (draft, axis, op, index, count, sheetId) {
71
+ var e_1, _a;
72
+ var changed = [];
73
+ var refErrored = [];
74
+ if (count <= 0)
75
+ return { changed: changed, refErrored: refErrored };
76
+ try {
77
+ for (var draft_1 = __values(draft), draft_1_1 = draft_1.next(); !draft_1_1.done; draft_1_1 = draft_1.next()) {
78
+ var namedRange = draft_1_1.value;
79
+ var range = namedRange.range;
80
+ if (!range || range.sheetId !== sheetId)
81
+ continue;
82
+ var next = shiftGridRange(range, axis, op, index, count);
83
+ if (next === range)
84
+ continue;
85
+ if (next === null) {
86
+ namedRange.range = undefined;
87
+ namedRange.value = NAMED_RANGE_REF_ERROR;
88
+ refErrored.push(namedRange);
89
+ continue;
90
+ }
91
+ namedRange.range = next;
92
+ changed.push(namedRange);
93
+ }
94
+ }
95
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
96
+ finally {
97
+ try {
98
+ if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
99
+ }
100
+ finally { if (e_1) throw e_1.error; }
101
+ }
102
+ return { changed: changed, refErrored: refErrored };
103
+ };
104
+ /**
105
+ * Pure variant of {@link updateNamedRangesOnStructuralChange}: returns the
106
+ * adjusted list (sharing untouched entries) plus the names that changed.
107
+ */
108
+ export var shiftNamedRangesOnStructuralChange = function (namedRanges, axis, op, index, count, sheetId) {
109
+ var changed = [];
110
+ var refErrored = [];
111
+ var next = namedRanges.map(function (namedRange) {
112
+ var range = namedRange.range;
113
+ if (!range || range.sheetId !== sheetId || count <= 0)
114
+ return namedRange;
115
+ var shifted = shiftGridRange(range, axis, op, index, count);
116
+ if (shifted === range)
117
+ return namedRange;
118
+ if (shifted === null) {
119
+ var broken = __assign(__assign({}, namedRange), { range: undefined, value: NAMED_RANGE_REF_ERROR });
120
+ refErrored.push(broken);
121
+ return broken;
122
+ }
123
+ var moved = __assign(__assign({}, namedRange), { range: shifted });
124
+ changed.push(moved);
125
+ return moved;
126
+ });
127
+ return { next: next, changed: changed, refErrored: refErrored };
128
+ };
129
+ /**
130
+ * `_xlnm.Print_Area` / `_xlnm.Print_Titles` are sheet-scoped defined names
131
+ * in Excel and follow the same RefersTo rule as any other name. Mutates the
132
+ * sheet's `printSettings` draft: each print-area rectangle shifts / grows /
133
+ * shrinks (a rectangle wholly deleted is removed; an emptied print area is
134
+ * cleared), and the repeated title rows / columns shift as a band along the
135
+ * edited axis (cleared when every title row / column is deleted).
136
+ */
137
+ export var updatePrintSettingsOnStructuralChange = function (printSettings, axis, op, index, count) {
138
+ var e_2, _a;
139
+ var _b;
140
+ if (count <= 0)
141
+ return false;
142
+ var changed = false;
143
+ if ((_b = printSettings.printArea) === null || _b === void 0 ? void 0 : _b.length) {
144
+ var nextAreas = [];
145
+ try {
146
+ for (var _c = __values(printSettings.printArea), _d = _c.next(); !_d.done; _d = _c.next()) {
147
+ var area = _d.value;
148
+ var next = shiftGridRange(area, axis, op, index, count);
149
+ if (next !== area)
150
+ changed = true;
151
+ if (next)
152
+ nextAreas.push(next);
153
+ }
154
+ }
155
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
156
+ finally {
157
+ try {
158
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
159
+ }
160
+ finally { if (e_2) throw e_2.error; }
161
+ }
162
+ if (changed) {
163
+ if (nextAreas.length) {
164
+ printSettings.printArea = nextAreas;
165
+ }
166
+ else {
167
+ delete printSettings.printArea;
168
+ }
169
+ }
170
+ }
171
+ var titles = printSettings.printTitles;
172
+ if (titles) {
173
+ var _e = __read(axis === "row" ? ["rowStart", "rowEnd"] : ["columnStart", "columnEnd"], 2), startKey = _e[0], endKey = _e[1];
174
+ var start = titles[startKey];
175
+ var end = titles[endKey];
176
+ if (start != null && end != null) {
177
+ var next = shiftNamedBand(start, end, op, index, count);
178
+ if (!next) {
179
+ delete titles[startKey];
180
+ delete titles[endKey];
181
+ changed = true;
182
+ if (titles.rowStart == null &&
183
+ titles.rowEnd == null &&
184
+ titles.columnStart == null &&
185
+ titles.columnEnd == null) {
186
+ delete printSettings.printTitles;
187
+ }
188
+ }
189
+ else if (next[0] !== start || next[1] !== end) {
190
+ titles[startKey] = next[0];
191
+ titles[endKey] = next[1];
192
+ changed = true;
193
+ }
194
+ }
195
+ }
196
+ return changed;
197
+ };
@@ -1,17 +1,61 @@
1
1
  import type { GridRange, SheetRange } from "@rowsncolumns/common-types";
2
2
  import type { WritableDraft } from "immer";
3
3
  type RangedRuleAxis = "row" | "column";
4
+ /**
5
+ * Sheet-name lookup the rule-formula rewrite needs to scope references:
6
+ * unqualified references in a CF/DV formula resolve on the sheet the rule's
7
+ * applies-to range lives on, so only when that is the edited sheet do they
8
+ * move; `EditedSheet!`-qualified references move from any sheet.
9
+ */
10
+ export type RuleFormulaScope = {
11
+ getSheetName(sheetId: number): string;
12
+ };
13
+ export type RuleFormulaStructuralParams = {
14
+ op: "insert" | "delete";
15
+ axis: RangedRuleAxis;
16
+ /** 1-based index the rows/columns are inserted at / deleted from. */
17
+ index: number;
18
+ count: number;
19
+ /** Name of the sheet being edited. */
20
+ editedSheetName: string;
21
+ /** Name of the sheet the rule's applies-to range lives on. */
22
+ ruleSheetName: string;
23
+ /**
24
+ * How many rows/columns (along `axis`) the rule's top-left cell moved
25
+ * WITHIN the pre-edit grid because the previous top-left was deleted —
26
+ * the surviving top-left's instance formula becomes the rule text, so
27
+ * relative references are re-anchored by this delta first. 0 otherwise.
28
+ */
29
+ anchorRebase?: number;
30
+ };
31
+ /**
32
+ * Rewrite one CF / DV formula (`=…`) for a sheet-level insert or delete,
33
+ * exactly as Excel rewrites the rule text: the formula is read as if it
34
+ * were entered in the rule's top-left cell, so relative and absolute
35
+ * references alike are grid positions that shift when they sit at/after
36
+ * the edit (`=$A1>$C$10` + insert row 5 → `=$A1>$C$11`), ranges spanning
37
+ * the edit grow / shrink, and a reference inside a deleted band becomes
38
+ * `#REF!`. Returns the input unchanged when it is not a formula or when
39
+ * no reference moved.
40
+ */
41
+ export declare const shiftRuleFormulaForStructuralChange: (formula: string, { op, axis, index, count, editedSheetName, ruleSheetName, anchorRebase, }: RuleFormulaStructuralParams) => string;
4
42
  /**
5
43
  * Apply an insert or delete range adjustment to a list of rules whose
6
44
  * `ranges: SheetRange[]` field references cells. Used for tables, conditional
7
45
  * formats, data validations, etc. Mutates the immer draft in place; rules
8
46
  * whose ranges all collapse to nothing are spliced out.
9
47
  *
48
+ * When `formulaScope` is given, each rule's condition formulas
49
+ * (`booleanRule.condition.values[].userEnteredValue` for CF,
50
+ * `condition.values[].userEnteredValue` for DV — those starting with `=`)
51
+ * are rewritten as if entered in the rule's applies-to top-left cell, see
52
+ * {@link shiftRuleFormulaForStructuralChange}.
53
+ *
10
54
  * Walks `draft` from the end so splice indices don't shift mid-iteration.
11
55
  */
12
56
  export declare const updateRangedRulesOnStructuralChange: <R extends {
13
57
  ranges?: SheetRange[] | null;
14
- }>(draft: WritableDraft<R>[], op: "insert" | "delete", axis: RangedRuleAxis, index: number, count: number, sheetId: number) => void;
58
+ }>(draft: WritableDraft<R>[], op: "insert" | "delete", axis: RangedRuleAxis, index: number, count: number, sheetId: number, formulaScope?: RuleFormulaScope) => void;
15
59
  /**
16
60
  * Returns true when a sheet range has any cells in the given grid bounds.
17
61
  * Cheap pre-check used by callers to skip patch generation for sheets that
@@ -1 +1 @@
1
- {"version":3,"file":"range-rule-helpers.d.ts","sourceRoot":"","sources":["../../../api/range-rule-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,KAAK,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,GAC9C,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,IAAI,QAAQ,GAAG,QAAQ,EACvB,MAAM,cAAc,EACpB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,SAAS,MAAM,SAkBhB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,UAAU,EACjB,SAAS,MAAM,EACf,QAAQ,SAAS,YASlB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACrB,MAiBF,CAAC;AAEF,KAAK,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,MAAM,WAAW,EACjB,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,SAAS,MAAM;AACf;;;;;;;;;GASG;AACH,qBAAqB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,SAkEpD,CAAC"}
1
+ {"version":3,"file":"range-rule-helpers.d.ts","sourceRoot":"","sources":["../../../api/range-rule-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,KAAK,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAMvC;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC,GAC9C,SAAS,MAAM,EACf,2EAQG,2BAA2B,KAC7B,MAoHF,CAAC;AAsBF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mCAAmC,GAC9C,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,IAAI,QAAQ,GAAG,QAAQ,EACvB,MAAM,cAAc,EACpB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,SAAS,MAAM,EACf,eAAe,gBAAgB,SA8ChC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,UAAU,EACjB,SAAS,MAAM,EACf,QAAQ,SAAS,YASlB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACrB,MAiBF,CAAC;AAEF,KAAK,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEpC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;CAAE,EAE1C,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,MAAM,WAAW,EACjB,YAAY,MAAM,EAClB,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,SAAS,MAAM;AACf;;;;;;;;;GASG;AACH,qBAAqB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,SAkEpD,CAAC"}
@@ -1,23 +1,176 @@
1
1
  import { __assign, __values } from "tslib";
2
+ import { contractRangesInFormula, expandRangesInFormula, formulaToRelativeReference, } from "./formula";
2
3
  import { updateSheetRangeOnDelete, updateSheetRangeOnInsert } from "./range";
4
+ /** Excel's grid bounds — the shift region for "every reference at/after the edit". */
5
+ var MAX_ROW_INDEX = 1048576;
6
+ var MAX_COLUMN_INDEX = 16384;
7
+ /**
8
+ * Rewrite one CF / DV formula (`=…`) for a sheet-level insert or delete,
9
+ * exactly as Excel rewrites the rule text: the formula is read as if it
10
+ * were entered in the rule's top-left cell, so relative and absolute
11
+ * references alike are grid positions that shift when they sit at/after
12
+ * the edit (`=$A1>$C$10` + insert row 5 → `=$A1>$C$11`), ranges spanning
13
+ * the edit grow / shrink, and a reference inside a deleted band becomes
14
+ * `#REF!`. Returns the input unchanged when it is not a formula or when
15
+ * no reference moved.
16
+ */
17
+ export var shiftRuleFormulaForStructuralChange = function (formula, _a) {
18
+ var _b, _c, _d, _e;
19
+ var op = _a.op, axis = _a.axis, index = _a.index, count = _a.count, editedSheetName = _a.editedSheetName, ruleSheetName = _a.ruleSheetName, _f = _a.anchorRebase, anchorRebase = _f === void 0 ? 0 : _f;
20
+ if (!formula.startsWith("=") || count <= 0)
21
+ return formula;
22
+ var sameSheet = ruleSheetName.toLowerCase() === editedSheetName.toLowerCase();
23
+ var isRow = axis === "row";
24
+ var gridBounds = { rowCount: MAX_ROW_INDEX, columnCount: MAX_COLUMN_INDEX };
25
+ var next = formula;
26
+ // 1. The rule's previous top-left cell was deleted: the rule text is now
27
+ // the instance formula of the first surviving cell — relative
28
+ // references move with the anchor, absolutes stay.
29
+ if (anchorRebase > 0 && sameSheet) {
30
+ var source = { rowIndex: 1, columnIndex: 1 };
31
+ var destination = {
32
+ rowIndex: 1 + (isRow ? anchorRebase : 0),
33
+ columnIndex: 1 + (isRow ? 0 : anchorRebase),
34
+ };
35
+ next =
36
+ (_b = formulaToRelativeReference(next, source, destination, ruleSheetName, __assign({ preserveAbsolutes: true, ignoreCircular: true, ignoreReferenceError: true }, gridBounds))) !== null && _b !== void 0 ? _b : next;
37
+ }
38
+ // 2. Delete: references wholly inside the deleted band are gone → `#REF!`.
39
+ // Shifting the band far off-grid lets `formulaToRelativeReference`'s
40
+ // reference-error path emit the token.
41
+ if (op === "delete") {
42
+ var band = isRow
43
+ ? {
44
+ startRowIndex: index,
45
+ endRowIndex: index + count - 1,
46
+ startColumnIndex: 1,
47
+ endColumnIndex: MAX_COLUMN_INDEX,
48
+ }
49
+ : {
50
+ startRowIndex: 1,
51
+ endRowIndex: MAX_ROW_INDEX,
52
+ startColumnIndex: index,
53
+ endColumnIndex: index + count - 1,
54
+ };
55
+ var offGrid = -(index + count);
56
+ next =
57
+ (_c = formulaToRelativeReference(next, { rowIndex: index, columnIndex: index }, {
58
+ rowIndex: isRow ? offGrid : index,
59
+ columnIndex: isRow ? index : offGrid,
60
+ }, editedSheetName, {
61
+ exclusionRange: band,
62
+ ignoreCircular: true,
63
+ ignoreReferenceError: true,
64
+ referenceSheetName: editedSheetName,
65
+ includeUnqualifiedReferences: sameSheet,
66
+ // Deliberately NOT the grid bounds: a whole-row / whole-column
67
+ // reference inside the band would otherwise be pushed to a
68
+ // negative index instead of `#REF!`; those stay put and are
69
+ // handled by the range contraction below.
70
+ rowCount: MAX_ROW_INDEX + 1,
71
+ columnCount: MAX_COLUMN_INDEX + 1,
72
+ })) !== null && _c !== void 0 ? _c : next;
73
+ }
74
+ // 3. Ranges that span the edit grow (insert) / shrink (delete).
75
+ next =
76
+ (_d = (op === "insert" ? expandRangesInFormula : contractRangesInFormula)(next, index, count, axis, editedSheetName, { includeUnqualifiedReferences: sameSheet })) !== null && _d !== void 0 ? _d : next;
77
+ // 4. Everything at/after the edit shifts by ±count along the axis.
78
+ var delta = op === "insert" ? count : -count;
79
+ var regionStart = op === "insert" ? index : index + count;
80
+ var region = isRow
81
+ ? {
82
+ startRowIndex: regionStart,
83
+ endRowIndex: MAX_ROW_INDEX,
84
+ startColumnIndex: 1,
85
+ endColumnIndex: MAX_COLUMN_INDEX,
86
+ }
87
+ : {
88
+ startRowIndex: 1,
89
+ endRowIndex: MAX_ROW_INDEX,
90
+ startColumnIndex: regionStart,
91
+ endColumnIndex: MAX_COLUMN_INDEX,
92
+ };
93
+ next =
94
+ (_e = formulaToRelativeReference(next, { rowIndex: regionStart, columnIndex: regionStart }, {
95
+ rowIndex: regionStart + (isRow ? delta : 0),
96
+ columnIndex: regionStart + (isRow ? 0 : delta),
97
+ }, editedSheetName, __assign({ exclusionRange: region, ignoreCircular: true, ignoreReferenceError: true, referenceSheetName: editedSheetName, includeUnqualifiedReferences: sameSheet }, gridBounds))) !== null && _e !== void 0 ? _e : next;
98
+ return next;
99
+ };
100
+ var rewriteConditionFormulas = function (condition, params) {
101
+ var e_1, _a;
102
+ if (!(condition === null || condition === void 0 ? void 0 : condition.values))
103
+ return;
104
+ try {
105
+ for (var _b = __values(condition.values), _c = _b.next(); !_c.done; _c = _b.next()) {
106
+ var value = _c.value;
107
+ var text = value.userEnteredValue;
108
+ if (typeof text !== "string" || !text.startsWith("="))
109
+ continue;
110
+ var next = shiftRuleFormulaForStructuralChange(text, params);
111
+ if (next !== text)
112
+ value.userEnteredValue = next;
113
+ }
114
+ }
115
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
116
+ finally {
117
+ try {
118
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
119
+ }
120
+ finally { if (e_1) throw e_1.error; }
121
+ }
122
+ };
3
123
  /**
4
124
  * Apply an insert or delete range adjustment to a list of rules whose
5
125
  * `ranges: SheetRange[]` field references cells. Used for tables, conditional
6
126
  * formats, data validations, etc. Mutates the immer draft in place; rules
7
127
  * whose ranges all collapse to nothing are spliced out.
8
128
  *
129
+ * When `formulaScope` is given, each rule's condition formulas
130
+ * (`booleanRule.condition.values[].userEnteredValue` for CF,
131
+ * `condition.values[].userEnteredValue` for DV — those starting with `=`)
132
+ * are rewritten as if entered in the rule's applies-to top-left cell, see
133
+ * {@link shiftRuleFormulaForStructuralChange}.
134
+ *
9
135
  * Walks `draft` from the end so splice indices don't shift mid-iteration.
10
136
  */
11
- export var updateRangedRulesOnStructuralChange = function (draft, op, axis, index, count, sheetId) {
12
- var _a, _b;
137
+ export var updateRangedRulesOnStructuralChange = function (draft, op, axis, index, count, sheetId, formulaScope) {
138
+ var _a, _b, _c, _d;
13
139
  var updater = op === "insert" ? updateSheetRangeOnInsert : updateSheetRangeOnDelete;
140
+ var isRow = axis === "row";
14
141
  for (var i = draft.length - 1; i >= 0; i--) {
15
142
  var rule = draft[i];
16
- var ranges = (_b = (_a = rule.ranges) === null || _a === void 0 ? void 0 : _a.map(function (range) { return updater(range, axis, index, count, sheetId); }).filter(function (range) { return !!range; })) !== null && _b !== void 0 ? _b : [];
143
+ var anchorRange = (_a = rule.ranges) === null || _a === void 0 ? void 0 : _a[0];
144
+ var ranges = (_c = (_b = rule.ranges) === null || _b === void 0 ? void 0 : _b.map(function (range) { return updater(range, axis, index, count, sheetId); }).filter(function (range) { return !!range; })) !== null && _c !== void 0 ? _c : [];
17
145
  if (ranges.length) {
18
146
  // immer's typing for nested-mutation assignment is flaky here; cast
19
147
  // through `unknown` since the runtime shape matches the rule type.
20
148
  rule.ranges = ranges;
149
+ if (formulaScope && anchorRange) {
150
+ // Excel anchors a rule's formula at its applies-to top-left. When
151
+ // that cell is deleted, the first surviving cell (right after the
152
+ // deleted band) becomes the anchor and its instance formula the
153
+ // rule text.
154
+ var anchorPosition = isRow
155
+ ? anchorRange.startRowIndex
156
+ : anchorRange.startColumnIndex;
157
+ var anchorDeleted = op === "delete" &&
158
+ anchorRange.sheetId === sheetId &&
159
+ anchorPosition >= index &&
160
+ anchorPosition <= index + count - 1;
161
+ var params = {
162
+ op: op,
163
+ axis: axis,
164
+ index: index,
165
+ count: count,
166
+ editedSheetName: formulaScope.getSheetName(sheetId),
167
+ ruleSheetName: formulaScope.getSheetName(anchorRange.sheetId),
168
+ anchorRebase: anchorDeleted ? index + count - anchorPosition : 0,
169
+ };
170
+ var carrier = rule;
171
+ rewriteConditionFormulas((_d = carrier.booleanRule) === null || _d === void 0 ? void 0 : _d.condition, params);
172
+ rewriteConditionFormulas(carrier.condition, params);
173
+ }
21
174
  }
22
175
  else {
23
176
  draft.splice(i, 1);
@@ -92,7 +245,7 @@ export var updateRangedRulesOnReorder = function (draft, axis, firstIndex, lastI
92
245
  * bounds (no current caller, but kept symmetric).
93
246
  */
94
247
  orthogonalBoundary) {
95
- var e_1, _a;
248
+ var e_2, _a;
96
249
  var _b;
97
250
  if (firstIndex > lastIndex)
98
251
  return;
@@ -132,11 +285,11 @@ orthogonalBoundary) {
132
285
  rule.ranges = nextRanges;
133
286
  }
134
287
  }
135
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
288
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
136
289
  finally {
137
290
  try {
138
291
  if (draft_1_1 && !draft_1_1.done && (_a = draft_1.return)) _a.call(draft_1);
139
292
  }
140
- finally { if (e_1) throw e_1.error; }
293
+ finally { if (e_2) throw e_2.error; }
141
294
  }
142
295
  };
@@ -1 +1 @@
1
- {"version":3,"file":"structural-formula-update.d.ts","sourceRoot":"","sources":["../../../api/structural-formula-update.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAarD,KAAK,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AACvC,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExC,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,QAAQ,IAAI;IAC9D,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,YAAY,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE;;;;OAIG;IACH,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IACnE;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,sBAAsB,CAAC,CAAC;IAC1B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC7E,qBAAqB,CAAC,EAAE,UAAU,CAChC,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAE3B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,QAAQ,EAClE,QAAQ,6BAA6B,CAAC,CAAC,CAAC,SAuVzC,CAAC"}
1
+ {"version":3,"file":"structural-formula-update.d.ts","sourceRoot":"","sources":["../../../api/structural-formula-update.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAarD,KAAK,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AACvC,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExC,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,QAAQ,IAAI;IAC9D,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,YAAY,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE;;;;OAIG;IACH,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IACnE;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,sBAAsB,CAAC,CAAC;IAC1B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC7E,qBAAqB,CAAC,EAAE,UAAU,CAChC,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAE3B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,QAAQ,EAClE,QAAQ,6BAA6B,CAAC,CAAC,CAAC,SA2WzC,CAAC"}
@@ -89,6 +89,11 @@ export var updateFormulasForStructuralChange = function (params) {
89
89
  startColumnIndex: isInsert ? referenceIndex : referenceIndex + count,
90
90
  endColumnIndex: columnCount,
91
91
  };
92
+ // The cells a delete removes: any reference into them (that Pass 1 did not
93
+ // already contract) is broken to `#REF!` instead of sliding onto the cell
94
+ // that moves into its place.
95
+ var deletedRange = isInsert ? undefined : pass1Range;
96
+ var editedSheetName = getSheetName(sheetId);
92
97
  // ---- PASS 1 ----
93
98
  var pass1Formulas = collectUniqueDependentsForRange({
94
99
  draft: draft,
@@ -109,10 +114,15 @@ export var updateFormulasForStructuralChange = function (params) {
109
114
  var formulaValue = sheetCell.formula;
110
115
  if (!formulaValue)
111
116
  continue;
112
- var activeSheetName = getSheetName(pos.sheetId);
117
+ // Scope to the EDITED sheet: a qualified `Sheet1!A1:A3` on another
118
+ // sheet expands like a local range, while that other sheet's own bare
119
+ // `A1:A3` (which resolves to ITS sheet) is left alone.
120
+ var rangeOptions = {
121
+ includeUnqualifiedReferences: pos.sheetId === sheetId,
122
+ };
113
123
  var updatedFormula = isInsert
114
- ? expandRangesInFormula(formulaValue, referenceIndex, count, axis, activeSheetName)
115
- : contractRangesInFormula(formulaValue, referenceIndex, count, axis, activeSheetName);
124
+ ? expandRangesInFormula(formulaValue, referenceIndex, count, axis, editedSheetName, rangeOptions)
125
+ : contractRangesInFormula(formulaValue, referenceIndex, count, axis, editedSheetName, rangeOptions);
116
126
  if (!updatedFormula || updatedFormula === formulaValue)
117
127
  continue;
118
128
  sheetCell.setFormulaValue(updatedFormula, false);
@@ -180,7 +190,7 @@ export var updateFormulasForStructuralChange = function (params) {
180
190
  shiftExternalDependentFormulaReferences({
181
191
  draft: draft,
182
192
  position: pos,
183
- editedSheetName: getSheetName(sheetId),
193
+ editedSheetName: editedSheetName,
184
194
  enqueueCalculation: enqueueCalculation,
185
195
  enqueueGraphOperation: enqueueGraphOperation,
186
196
  recalcCells: recalcCells,
@@ -188,6 +198,7 @@ export var updateFormulasForStructuralChange = function (params) {
188
198
  rowDelta: rowDelta,
189
199
  columnDelta: columnDelta,
190
200
  sourceRange: pass2SourceRange,
201
+ deletedRange: deletedRange,
191
202
  locale: locale,
192
203
  rowCount: rowCount,
193
204
  columnCount: columnCount,
@@ -207,6 +218,7 @@ export var updateFormulasForStructuralChange = function (params) {
207
218
  rowDelta: rowDelta,
208
219
  columnDelta: columnDelta,
209
220
  sourceRange: pass2SourceRange,
221
+ deletedRange: deletedRange,
210
222
  locale: locale,
211
223
  rowCount: rowCount,
212
224
  columnCount: columnCount,
@@ -231,7 +243,7 @@ export var updateFormulasForStructuralChange = function (params) {
231
243
  shiftExternalDependentFormulaReferences({
232
244
  draft: draft,
233
245
  position: position,
234
- editedSheetName: getSheetName(sheetId),
246
+ editedSheetName: editedSheetName,
235
247
  enqueueCalculation: enqueueCalculation,
236
248
  enqueueGraphOperation: enqueueGraphOperation,
237
249
  recalcCells: recalcCells,
@@ -239,6 +251,7 @@ export var updateFormulasForStructuralChange = function (params) {
239
251
  rowDelta: rowDelta,
240
252
  columnDelta: columnDelta,
241
253
  sourceRange: pass2SourceRange,
254
+ deletedRange: deletedRange,
242
255
  locale: locale,
243
256
  rowCount: rowCount,
244
257
  columnCount: columnCount,
@@ -284,6 +297,7 @@ export var updateFormulasForStructuralChange = function (params) {
284
297
  rowIndex: pos.rowIndex,
285
298
  columnIndex: pos.columnIndex,
286
299
  },
300
+ activeSheetName: editedSheetName,
287
301
  enqueueCalculation: enqueueCalculation,
288
302
  enqueueGraphOperation: enqueueGraphOperation,
289
303
  recalcCells: recalcCells,
@@ -291,6 +305,7 @@ export var updateFormulasForStructuralChange = function (params) {
291
305
  rowDelta: rowDelta,
292
306
  columnDelta: columnDelta,
293
307
  sourceRange: pass2SourceRange,
308
+ deletedRange: deletedRange,
294
309
  locale: locale,
295
310
  rowCount: rowCount,
296
311
  columnCount: columnCount,
@@ -328,6 +343,7 @@ export var updateFormulasForStructuralChange = function (params) {
328
343
  moveFormulaAtPosition({
329
344
  draft: draft,
330
345
  position: { sheetId: sheetId, rowIndex: rowIndex, columnIndex: columnIndex },
346
+ activeSheetName: editedSheetName,
331
347
  enqueueCalculation: enqueueCalculation,
332
348
  enqueueGraphOperation: enqueueGraphOperation,
333
349
  recalcCells: recalcCells,
@@ -335,6 +351,7 @@ export var updateFormulasForStructuralChange = function (params) {
335
351
  rowDelta: rowDelta,
336
352
  columnDelta: columnDelta,
337
353
  sourceRange: pass2SourceRange,
354
+ deletedRange: deletedRange,
338
355
  locale: locale,
339
356
  rowCount: rowCount,
340
357
  columnCount: columnCount,
@@ -347,7 +364,7 @@ export var updateFormulasForStructuralChange = function (params) {
347
364
  };
348
365
  var shiftExternalDependentFormulaReferences = function (_a) {
349
366
  var _b, _c;
350
- 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, locale = _a.locale, rowCount = _a.rowCount, columnCount = _a.columnCount, cellXfsRegistry = _a.cellXfsRegistry, sharedStringRegistry = _a.sharedStringRegistry;
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;
351
368
  var sheetCell = new SheetCell();
352
369
  var currentSheet = createSheetDraft(draft, position.sheetId, position.rowIndex);
353
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];
@@ -362,6 +379,7 @@ var shiftExternalDependentFormulaReferences = function (_a) {
362
379
  columnIndex: position.columnIndex + columnDelta,
363
380
  }, editedSheetName, {
364
381
  exclusionRange: sourceRange,
382
+ deletedRange: deletedRange,
365
383
  rowCount: rowCount,
366
384
  columnCount: columnCount,
367
385
  referenceSheetName: editedSheetName,