@rowsncolumns/spreadsheet-state 28.0.75 → 29.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/cjs/api/anchored-objects.d.ts +66 -0
  2. package/dist/cjs/api/anchored-objects.d.ts.map +1 -0
  3. package/dist/cjs/api/anchored-objects.js +259 -0
  4. package/dist/cjs/api/copy-paste.d.ts +8 -1
  5. package/dist/cjs/api/copy-paste.d.ts.map +1 -1
  6. package/dist/cjs/api/copy-paste.js +4 -2
  7. package/dist/cjs/api/dependency.d.ts +13 -2
  8. package/dist/cjs/api/dependency.d.ts.map +1 -1
  9. package/dist/cjs/api/dependency.js +11 -5
  10. package/dist/cjs/api/formula.d.ts +61 -4
  11. package/dist/cjs/api/formula.d.ts.map +1 -1
  12. package/dist/cjs/api/formula.js +250 -61
  13. package/dist/cjs/api/immer-utils.d.ts +11 -1
  14. package/dist/cjs/api/immer-utils.d.ts.map +1 -1
  15. package/dist/cjs/api/immer-utils.js +17 -1
  16. package/dist/cjs/api/insert-cut-cells.d.ts +35 -0
  17. package/dist/cjs/api/insert-cut-cells.d.ts.map +1 -0
  18. package/dist/cjs/api/insert-cut-cells.js +60 -0
  19. package/dist/cjs/api/merges.d.ts +16 -0
  20. package/dist/cjs/api/merges.d.ts.map +1 -1
  21. package/dist/cjs/api/merges.js +75 -1
  22. package/dist/cjs/api/named-range-structural.d.ts +62 -0
  23. package/dist/cjs/api/named-range-structural.d.ts.map +1 -0
  24. package/dist/cjs/api/named-range-structural.js +197 -0
  25. package/dist/cjs/api/range-rule-helpers.d.ts +45 -1
  26. package/dist/cjs/api/range-rule-helpers.d.ts.map +1 -1
  27. package/dist/cjs/api/range-rule-helpers.js +159 -6
  28. package/dist/cjs/api/structural-formula-update.d.ts.map +1 -1
  29. package/dist/cjs/api/structural-formula-update.js +24 -6
  30. package/dist/cjs/api/structural-guards.d.ts +78 -0
  31. package/dist/cjs/api/structural-guards.d.ts.map +1 -0
  32. package/dist/cjs/api/structural-guards.js +202 -0
  33. package/dist/cjs/api/structural-table-refs.d.ts +94 -0
  34. package/dist/cjs/api/structural-table-refs.d.ts.map +1 -0
  35. package/dist/cjs/api/structural-table-refs.js +313 -0
  36. package/dist/cjs/api/subtotal.d.ts +20 -13
  37. package/dist/cjs/api/subtotal.d.ts.map +1 -1
  38. package/dist/cjs/api/subtotal.js +26 -19
  39. package/dist/cjs/commands.d.ts +9 -0
  40. package/dist/cjs/commands.d.ts.map +1 -1
  41. package/dist/cjs/constants.d.ts +25 -0
  42. package/dist/cjs/constants.d.ts.map +1 -0
  43. package/dist/cjs/constants.js +26 -0
  44. package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
  45. package/dist/cjs/hooks/use-calculation-worker.js +64 -6
  46. package/dist/cjs/hooks/use-calculation.d.ts +7 -0
  47. package/dist/cjs/hooks/use-calculation.d.ts.map +1 -1
  48. package/dist/cjs/hooks/use-calculation.js +15 -0
  49. package/dist/cjs/hooks/use-on-calculation-success.d.ts +7 -0
  50. package/dist/cjs/hooks/use-on-calculation-success.d.ts.map +1 -1
  51. package/dist/cjs/hooks/use-on-calculation-success.js +7 -1
  52. package/dist/cjs/hooks/use-on-copy.d.ts +1 -1
  53. package/dist/cjs/hooks/use-on-copy.d.ts.map +1 -1
  54. package/dist/cjs/hooks/use-on-copy.js +2 -3
  55. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  56. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  57. package/dist/cjs/hooks/use-on-delete-cells-shift-left.js +27 -2
  58. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  59. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  60. package/dist/cjs/hooks/use-on-delete-cells-shift-up.js +27 -2
  61. package/dist/cjs/hooks/use-on-delete-column.d.ts +13 -4
  62. package/dist/cjs/hooks/use-on-delete-column.d.ts.map +1 -1
  63. package/dist/cjs/hooks/use-on-delete-column.js +14 -2
  64. package/dist/cjs/hooks/use-on-delete-row.d.ts +13 -4
  65. package/dist/cjs/hooks/use-on-delete-row.d.ts.map +1 -1
  66. package/dist/cjs/hooks/use-on-delete-row.js +14 -2
  67. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  68. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  69. package/dist/cjs/hooks/use-on-insert-cells-shift-down.js +27 -2
  70. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  71. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  72. package/dist/cjs/hooks/use-on-insert-cells-shift-right.js +27 -2
  73. package/dist/cjs/hooks/use-on-insert-column.d.ts +10 -3
  74. package/dist/cjs/hooks/use-on-insert-column.d.ts.map +1 -1
  75. package/dist/cjs/hooks/use-on-insert-column.js +33 -7
  76. package/dist/cjs/hooks/use-on-insert-row.d.ts +10 -3
  77. package/dist/cjs/hooks/use-on-insert-row.d.ts.map +1 -1
  78. package/dist/cjs/hooks/use-on-insert-row.js +32 -7
  79. package/dist/cjs/hooks/use-on-move-columns.d.ts +2 -1
  80. package/dist/cjs/hooks/use-on-move-columns.d.ts.map +1 -1
  81. package/dist/cjs/hooks/use-on-move-columns.js +14 -5
  82. package/dist/cjs/hooks/use-on-move-rows.d.ts +16 -1
  83. package/dist/cjs/hooks/use-on-move-rows.d.ts.map +1 -1
  84. package/dist/cjs/hooks/use-on-move-rows.js +30 -5
  85. package/dist/cjs/hooks/use-on-move-selection.d.ts +7 -2
  86. package/dist/cjs/hooks/use-on-move-selection.d.ts.map +1 -1
  87. package/dist/cjs/hooks/use-on-move-selection.js +14 -1
  88. package/dist/cjs/hooks/use-on-paste.d.ts +12 -2
  89. package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
  90. package/dist/cjs/hooks/use-on-paste.js +56 -8
  91. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +16 -5
  92. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  93. package/dist/cjs/hooks/use-spreadsheet-state.js +141 -18
  94. package/dist/cjs/hooks/use-structured-reference.d.ts.map +1 -1
  95. package/dist/cjs/hooks/use-structured-reference.js +10 -6
  96. package/dist/cjs/index.d.ts +4 -0
  97. package/dist/cjs/index.d.ts.map +1 -1
  98. package/dist/cjs/index.js +4 -0
  99. package/dist/cjs/interface/calculation-interface.d.ts +9 -0
  100. package/dist/cjs/interface/calculation-interface.d.ts.map +1 -1
  101. package/dist/cjs/interface/calculation-interface.js +31 -2
  102. package/dist/cjs/interface/delete-cells-shift-left.d.ts +8 -1
  103. package/dist/cjs/interface/delete-cells-shift-left.d.ts.map +1 -1
  104. package/dist/cjs/interface/delete-cells-shift-left.js +158 -80
  105. package/dist/cjs/interface/delete-cells-shift-up.d.ts +9 -1
  106. package/dist/cjs/interface/delete-cells-shift-up.d.ts.map +1 -1
  107. package/dist/cjs/interface/delete-cells-shift-up.js +155 -73
  108. package/dist/cjs/interface/delete-column.d.ts +1 -1
  109. package/dist/cjs/interface/delete-column.d.ts.map +1 -1
  110. package/dist/cjs/interface/delete-column.js +109 -50
  111. package/dist/cjs/interface/delete-row.d.ts +1 -1
  112. package/dist/cjs/interface/delete-row.d.ts.map +1 -1
  113. package/dist/cjs/interface/delete-row.js +105 -46
  114. package/dist/cjs/interface/insert-cells-shift-down.d.ts +10 -1
  115. package/dist/cjs/interface/insert-cells-shift-down.d.ts.map +1 -1
  116. package/dist/cjs/interface/insert-cells-shift-down.js +147 -52
  117. package/dist/cjs/interface/insert-cells-shift-right.d.ts +10 -1
  118. package/dist/cjs/interface/insert-cells-shift-right.d.ts.map +1 -1
  119. package/dist/cjs/interface/insert-cells-shift-right.js +154 -58
  120. package/dist/cjs/interface/insert-column.d.ts +1 -1
  121. package/dist/cjs/interface/insert-column.d.ts.map +1 -1
  122. package/dist/cjs/interface/insert-column.js +80 -26
  123. package/dist/cjs/interface/insert-row.d.ts +1 -1
  124. package/dist/cjs/interface/insert-row.d.ts.map +1 -1
  125. package/dist/cjs/interface/insert-row.js +63 -15
  126. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  127. package/dist/cjs/interface/spreadsheet-interface.js +33 -0
  128. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  129. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  130. package/dist/esm/api/anchored-objects.d.ts +66 -0
  131. package/dist/esm/api/anchored-objects.d.ts.map +1 -0
  132. package/dist/esm/api/anchored-objects.js +212 -0
  133. package/dist/esm/api/copy-paste.d.ts +8 -1
  134. package/dist/esm/api/copy-paste.d.ts.map +1 -1
  135. package/dist/esm/api/copy-paste.js +4 -2
  136. package/dist/esm/api/dependency.d.ts +13 -2
  137. package/dist/esm/api/dependency.d.ts.map +1 -1
  138. package/dist/esm/api/dependency.js +10 -4
  139. package/dist/esm/api/formula.d.ts +61 -4
  140. package/dist/esm/api/formula.d.ts.map +1 -1
  141. package/dist/esm/api/formula.js +238 -60
  142. package/dist/esm/api/immer-utils.d.ts +11 -1
  143. package/dist/esm/api/immer-utils.d.ts.map +1 -1
  144. package/dist/esm/api/immer-utils.js +16 -0
  145. package/dist/esm/api/insert-cut-cells.d.ts +35 -0
  146. package/dist/esm/api/insert-cut-cells.d.ts.map +1 -0
  147. package/dist/esm/api/insert-cut-cells.js +67 -0
  148. package/dist/esm/api/merges.d.ts +16 -0
  149. package/dist/esm/api/merges.d.ts.map +1 -1
  150. package/dist/esm/api/merges.js +60 -0
  151. package/dist/esm/api/named-range-structural.d.ts +62 -0
  152. package/dist/esm/api/named-range-structural.d.ts.map +1 -0
  153. package/dist/esm/api/named-range-structural.js +176 -0
  154. package/dist/esm/api/range-rule-helpers.d.ts +45 -1
  155. package/dist/esm/api/range-rule-helpers.d.ts.map +1 -1
  156. package/dist/esm/api/range-rule-helpers.js +153 -1
  157. package/dist/esm/api/structural-formula-update.d.ts.map +1 -1
  158. package/dist/esm/api/structural-formula-update.js +24 -6
  159. package/dist/esm/api/structural-guards.d.ts +78 -0
  160. package/dist/esm/api/structural-guards.d.ts.map +1 -0
  161. package/dist/esm/api/structural-guards.js +186 -0
  162. package/dist/esm/api/structural-table-refs.d.ts +94 -0
  163. package/dist/esm/api/structural-table-refs.d.ts.map +1 -0
  164. package/dist/esm/api/structural-table-refs.js +219 -0
  165. package/dist/esm/api/subtotal.d.ts +20 -13
  166. package/dist/esm/api/subtotal.d.ts.map +1 -1
  167. package/dist/esm/api/subtotal.js +15 -8
  168. package/dist/esm/commands.d.ts +9 -0
  169. package/dist/esm/commands.d.ts.map +1 -1
  170. package/dist/esm/constants.d.ts +25 -0
  171. package/dist/esm/constants.d.ts.map +1 -0
  172. package/dist/esm/constants.js +26 -0
  173. package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
  174. package/dist/esm/hooks/use-calculation-worker.js +45 -0
  175. package/dist/esm/hooks/use-calculation.d.ts +7 -0
  176. package/dist/esm/hooks/use-calculation.d.ts.map +1 -1
  177. package/dist/esm/hooks/use-calculation.js +15 -0
  178. package/dist/esm/hooks/use-on-calculation-success.d.ts +7 -0
  179. package/dist/esm/hooks/use-on-calculation-success.d.ts.map +1 -1
  180. package/dist/esm/hooks/use-on-calculation-success.js +7 -1
  181. package/dist/esm/hooks/use-on-copy.d.ts +1 -1
  182. package/dist/esm/hooks/use-on-copy.d.ts.map +1 -1
  183. package/dist/esm/hooks/use-on-copy.js +2 -3
  184. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts +13 -3
  185. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  186. package/dist/esm/hooks/use-on-delete-cells-shift-left.js +26 -2
  187. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts +13 -3
  188. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  189. package/dist/esm/hooks/use-on-delete-cells-shift-up.js +26 -2
  190. package/dist/esm/hooks/use-on-delete-column.d.ts +13 -4
  191. package/dist/esm/hooks/use-on-delete-column.d.ts.map +1 -1
  192. package/dist/esm/hooks/use-on-delete-column.js +14 -2
  193. package/dist/esm/hooks/use-on-delete-row.d.ts +13 -4
  194. package/dist/esm/hooks/use-on-delete-row.d.ts.map +1 -1
  195. package/dist/esm/hooks/use-on-delete-row.js +14 -2
  196. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts +13 -3
  197. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  198. package/dist/esm/hooks/use-on-insert-cells-shift-down.js +26 -2
  199. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts +13 -3
  200. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  201. package/dist/esm/hooks/use-on-insert-cells-shift-right.js +26 -2
  202. package/dist/esm/hooks/use-on-insert-column.d.ts +10 -3
  203. package/dist/esm/hooks/use-on-insert-column.d.ts.map +1 -1
  204. package/dist/esm/hooks/use-on-insert-column.js +33 -7
  205. package/dist/esm/hooks/use-on-insert-row.d.ts +10 -3
  206. package/dist/esm/hooks/use-on-insert-row.d.ts.map +1 -1
  207. package/dist/esm/hooks/use-on-insert-row.js +32 -7
  208. package/dist/esm/hooks/use-on-move-columns.d.ts +2 -1
  209. package/dist/esm/hooks/use-on-move-columns.d.ts.map +1 -1
  210. package/dist/esm/hooks/use-on-move-columns.js +14 -5
  211. package/dist/esm/hooks/use-on-move-rows.d.ts +16 -1
  212. package/dist/esm/hooks/use-on-move-rows.d.ts.map +1 -1
  213. package/dist/esm/hooks/use-on-move-rows.js +30 -5
  214. package/dist/esm/hooks/use-on-move-selection.d.ts +7 -2
  215. package/dist/esm/hooks/use-on-move-selection.d.ts.map +1 -1
  216. package/dist/esm/hooks/use-on-move-selection.js +14 -1
  217. package/dist/esm/hooks/use-on-paste.d.ts +12 -2
  218. package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
  219. package/dist/esm/hooks/use-on-paste.js +41 -2
  220. package/dist/esm/hooks/use-spreadsheet-state.d.ts +16 -5
  221. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  222. package/dist/esm/hooks/use-spreadsheet-state.js +141 -17
  223. package/dist/esm/hooks/use-structured-reference.d.ts.map +1 -1
  224. package/dist/esm/hooks/use-structured-reference.js +10 -6
  225. package/dist/esm/index.d.ts +4 -0
  226. package/dist/esm/index.d.ts.map +1 -1
  227. package/dist/esm/index.js +4 -0
  228. package/dist/esm/interface/calculation-interface.d.ts +9 -0
  229. package/dist/esm/interface/calculation-interface.d.ts.map +1 -1
  230. package/dist/esm/interface/calculation-interface.js +33 -2
  231. package/dist/esm/interface/delete-cells-shift-left.d.ts +8 -1
  232. package/dist/esm/interface/delete-cells-shift-left.d.ts.map +1 -1
  233. package/dist/esm/interface/delete-cells-shift-left.js +135 -59
  234. package/dist/esm/interface/delete-cells-shift-up.d.ts +9 -1
  235. package/dist/esm/interface/delete-cells-shift-up.d.ts.map +1 -1
  236. package/dist/esm/interface/delete-cells-shift-up.js +133 -53
  237. package/dist/esm/interface/delete-column.d.ts +1 -1
  238. package/dist/esm/interface/delete-column.d.ts.map +1 -1
  239. package/dist/esm/interface/delete-column.js +96 -38
  240. package/dist/esm/interface/delete-row.d.ts +1 -1
  241. package/dist/esm/interface/delete-row.d.ts.map +1 -1
  242. package/dist/esm/interface/delete-row.js +98 -39
  243. package/dist/esm/interface/insert-cells-shift-down.d.ts +10 -1
  244. package/dist/esm/interface/insert-cells-shift-down.d.ts.map +1 -1
  245. package/dist/esm/interface/insert-cells-shift-down.js +116 -47
  246. package/dist/esm/interface/insert-cells-shift-right.d.ts +10 -1
  247. package/dist/esm/interface/insert-cells-shift-right.d.ts.map +1 -1
  248. package/dist/esm/interface/insert-cells-shift-right.js +120 -51
  249. package/dist/esm/interface/insert-column.d.ts +1 -1
  250. package/dist/esm/interface/insert-column.d.ts.map +1 -1
  251. package/dist/esm/interface/insert-column.js +68 -18
  252. package/dist/esm/interface/insert-row.d.ts +1 -1
  253. package/dist/esm/interface/insert-row.d.ts.map +1 -1
  254. package/dist/esm/interface/insert-row.js +60 -14
  255. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  256. package/dist/esm/interface/spreadsheet-interface.js +29 -0
  257. package/dist/esm/sheet-cell.d.ts.map +1 -1
  258. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  259. package/package.json +18 -18
@@ -1,4 +1,4 @@
1
- import { isRangeToken, lexify, stripPropertyFromCellRef, tokenVocabulary, } from "@rowsncolumns/calculator";
1
+ import { cleanupColumnName, cleanupTableName, isRangeToken, lexify, stripPropertyFromCellRef, tokenVocabulary, } from "@rowsncolumns/calculator";
2
2
  import { addressToCell, alpha2number, cellToAddress, desanitizeSheetName, number2Alpha, sanitizeSheetName, } from "@rowsncolumns/utils";
3
3
  export { ERROR_CIRCULAR_DEPENDENCY, ERROR_REFERENCE, formulaToRelativeReference, } from "@rowsncolumns/calculator";
4
4
  /**
@@ -65,6 +65,138 @@ export const updateColumnName = (formulaValue, newName, oldName) => {
65
65
  }
66
66
  return detokenize(newTokens);
67
67
  };
68
+ /** The column specifier Excel writes for a deleted table column (`Table1[@#REF!]`). */
69
+ export const REF_ERROR_COLUMN = "#REF!";
70
+ const REF_ERROR_TOKEN = "#REF!";
71
+ /**
72
+ * One `#REF!` token standing in for the run `start … end` (a range's start,
73
+ * colon and end): it keeps `start`'s position and stretches to `end` so
74
+ * `detokenize` (which re-inserts a space wherever adjacent tokens' offsets
75
+ * disagree) prints `SUM(#REF!)`, not `SUM(#REF! )`.
76
+ */
77
+ const collapseToRefError = (start, end) => ({
78
+ ...start,
79
+ image: REF_ERROR_TOKEN,
80
+ tokenType: tokenVocabulary.RefError,
81
+ endOffset: end?.endOffset ?? start.endOffset,
82
+ endColumn: end?.endColumn ?? start.endColumn,
83
+ });
84
+ const isTableNameToken = (token) => token?.tokenType.name === tokenVocabulary.TableName.name;
85
+ const isTableColumnToken = (token) => token?.tokenType.name === tokenVocabulary.TableColumnName.name;
86
+ /** Bracket depth change contributed by one token's image (`Table1[` opens, `Qty]` closes). */
87
+ const bracketDelta = (image) => {
88
+ let depth = 0;
89
+ for (const ch of image) {
90
+ if (ch === "[")
91
+ depth++;
92
+ else if (ch === "]")
93
+ depth--;
94
+ }
95
+ return depth;
96
+ };
97
+ /**
98
+ * Index just past the last token of the structured reference that starts at
99
+ * `start` (a TableName token): consume tokens until the bracket the table name
100
+ * opened is closed again.
101
+ */
102
+ const structuredReferenceEnd = (tokens, start) => {
103
+ let depth = 0;
104
+ let i = start;
105
+ while (i < tokens.length) {
106
+ depth += bracketDelta(tokens[i].image);
107
+ i++;
108
+ if (depth <= 0)
109
+ break;
110
+ }
111
+ return i;
112
+ };
113
+ /**
114
+ * Rewrite every structured reference into `tableName` to the `#REF!` token —
115
+ * Excel's text for a formula whose table was deleted (`=SUM(Table1[Price])`
116
+ * → `=SUM(#REF!)`), so the cell evaluates to `#REF!` rather than `#NAME?`.
117
+ * Returns the input unchanged when the formula never names the table.
118
+ */
119
+ export const breakTableReferencesInFormula = (formulaValue, tableName) => {
120
+ if (!formulaValue.includes("["))
121
+ return formulaValue;
122
+ const tokens = cloneTokens(lexify(formulaValue).tokens);
123
+ const newTokens = [];
124
+ const target = tableName.toLowerCase();
125
+ let hasChanges = false;
126
+ for (let i = 0; i < tokens.length; i++) {
127
+ const token = tokens[i];
128
+ if (isTableNameToken(token) &&
129
+ cleanupTableName(token.image).trim().toLowerCase() === target) {
130
+ const end = structuredReferenceEnd(tokens, i);
131
+ const last = tokens[end - 1] ?? token;
132
+ newTokens.push({
133
+ ...token,
134
+ image: REF_ERROR_TOKEN,
135
+ endOffset: last.endOffset,
136
+ endColumn: last.endColumn,
137
+ tokenType: tokenVocabulary.RefError,
138
+ });
139
+ i = end - 1;
140
+ hasChanges = true;
141
+ continue;
142
+ }
143
+ newTokens.push(token);
144
+ }
145
+ return hasChanges ? detokenize(newTokens) : formulaValue;
146
+ };
147
+ /**
148
+ * Rewrite the column specifiers of `columnNames` inside structured references
149
+ * to `tableName` (or, when `tableName` is undefined, the bare this-row form
150
+ * `[@Col]` whose table is implied by the formula's own cell) to `#REF!` —
151
+ * Excel's text for a deleted table column (`=Table1[@Qty]*2` →
152
+ * `=Table1[@#REF!]*2`). Keeps every other character of the reference as typed.
153
+ */
154
+ export const breakTableColumnsInFormula = (formulaValue, tableName, columnNames) => {
155
+ if (!formulaValue.includes("[") || columnNames.length === 0) {
156
+ return formulaValue;
157
+ }
158
+ const targets = new Set(columnNames.map((name) => name.toLowerCase()));
159
+ const target = tableName?.toLowerCase();
160
+ const tokens = cloneTokens(lexify(formulaValue).tokens);
161
+ let hasChanges = false;
162
+ let i = 0;
163
+ while (i < tokens.length) {
164
+ const token = tokens[i];
165
+ if (isTableNameToken(token)) {
166
+ const end = structuredReferenceEnd(tokens, i);
167
+ const matches = target !== undefined &&
168
+ cleanupTableName(token.image).trim().toLowerCase() === target;
169
+ if (matches) {
170
+ for (let j = i + 1; j < end; j++) {
171
+ if (breakColumnToken(tokens[j], targets))
172
+ hasChanges = true;
173
+ }
174
+ }
175
+ i = end;
176
+ continue;
177
+ }
178
+ // A bare `[@Col]` / `[Col]` names the table the formula cell sits in.
179
+ if (target === undefined && isTableColumnToken(token)) {
180
+ if (breakColumnToken(token, targets))
181
+ hasChanges = true;
182
+ }
183
+ i++;
184
+ }
185
+ return hasChanges ? detokenize(tokens) : formulaValue;
186
+ };
187
+ const breakColumnToken = (token, targets) => {
188
+ if (!token || !isTableColumnToken(token))
189
+ return false;
190
+ const name = cleanupColumnName(token.image);
191
+ if (!name || !targets.has(name.toLowerCase()))
192
+ return false;
193
+ const at = token.image.indexOf(name);
194
+ if (at === -1)
195
+ return false;
196
+ token.image =
197
+ token.image.slice(0, at) + REF_ERROR_COLUMN + token.image.slice(at + name.length);
198
+ return true;
199
+ };
68
200
  /**
69
201
  * Converts tokens to string
70
202
  * @param tokens
@@ -122,19 +254,33 @@ export const isAbsoluteRowReference = (formula) => {
122
254
  return false;
123
255
  return /\$\d+/gi.test(formula);
124
256
  };
257
+ const isRangeWithinBandSpan = (startCell, endCell, dimension, bandSpan) => {
258
+ if (!bandSpan)
259
+ return true;
260
+ const [start, end] = dimension === "row"
261
+ ? [startCell.columnIndex, endCell.columnIndex]
262
+ : [startCell.rowIndex, endCell.rowIndex];
263
+ return (Math.min(start, end) >= bandSpan.startIndex &&
264
+ Math.max(start, end) <= bandSpan.endIndex);
265
+ };
125
266
  /**
126
267
  * Expands ranges in a formula when rows or columns are inserted within the range
127
268
  * @param formula The formula to process
128
269
  * @param insertionIndex The row or column index where insertion happens
129
270
  * @param count Number of rows or columns being inserted
130
271
  * @param dimension Whether inserting 'row' or 'column'
131
- * @param activeSheetName Active sheet name to scope range updates
272
+ * @param activeSheetName Name of the EDITED sheet: only references that resolve
273
+ * to it are touched
274
+ * @param options `includeUnqualifiedReferences` — whether references without a
275
+ * sheet qualifier resolve to the edited sheet (true when the formula lives on
276
+ * it; false for a formula on another sheet, whose bare `A1:A3` is its own)
132
277
  * @returns The formula with expanded ranges, or undefined if no changes
133
278
  */
134
- export const expandRangesInFormula = (formula, insertionIndex, count, dimension, activeSheetName) => {
279
+ export const expandRangesInFormula = (formula, insertionIndex, count, dimension, activeSheetName, options = {}) => {
135
280
  if (!formula || count <= 0) {
136
281
  return formula;
137
282
  }
283
+ const { includeUnqualifiedReferences = true, bandSpan } = options;
138
284
  const normalizedActiveSheetName = activeSheetName.toLowerCase();
139
285
  const tokens = cloneTokens(lexify(formula).tokens);
140
286
  const newTokens = [];
@@ -142,7 +288,9 @@ export const expandRangesInFormula = (formula, insertionIndex, count, dimension,
142
288
  for (let i = 0; i < tokens.length; i++) {
143
289
  const token = tokens[i];
144
290
  const sheetName = getSheetNameFromToken(tokens[i - 1]);
145
- const skipSheet = sheetName && sheetName.toLowerCase() !== normalizedActiveSheetName;
291
+ const skipSheet = sheetName
292
+ ? sheetName.toLowerCase() !== normalizedActiveSheetName
293
+ : !includeUnqualifiedReferences;
146
294
  // Handle cell ranges (e.g., A1:A10)
147
295
  if (token.tokenType.name === tokenVocabulary.Cell.name) {
148
296
  const isRange = isRangeToken(tokens[i + 1]);
@@ -157,7 +305,9 @@ export const expandRangesInFormula = (formula, insertionIndex, count, dimension,
157
305
  if (isRange && tokens[i + 2]) {
158
306
  const startCell = addressToCell(stripPropertyFromCellRef(token.image));
159
307
  const endCell = addressToCell(stripPropertyFromCellRef(tokens[i + 2].image));
160
- if (startCell && endCell) {
308
+ if (startCell &&
309
+ endCell &&
310
+ isRangeWithinBandSpan(startCell, endCell, dimension, bandSpan)) {
161
311
  const isAbsoluteEndRow = isAbsoluteRowReference(tokens[i + 2].image);
162
312
  const isAbsoluteEndCol = isAbsoluteColumnReference(tokens[i + 2].image);
163
313
  if (dimension === "row") {
@@ -197,7 +347,7 @@ export const expandRangesInFormula = (formula, insertionIndex, count, dimension,
197
347
  if (dimension === "column" &&
198
348
  token.tokenType.name === tokenVocabulary.Column.name) {
199
349
  const isRange = isRangeToken(tokens[i + 1]);
200
- if (skipSheet) {
350
+ if (skipSheet || bandSpan) {
201
351
  if (isRange) {
202
352
  newTokens.push(token, tokens[i + 1], tokens[i + 2]);
203
353
  i += 2;
@@ -224,7 +374,7 @@ export const expandRangesInFormula = (formula, insertionIndex, count, dimension,
224
374
  if (dimension === "row" &&
225
375
  token.tokenType.name === tokenVocabulary.Number.name) {
226
376
  const isRange = isRangeToken(tokens[i + 1]);
227
- if (skipSheet) {
377
+ if (skipSheet || bandSpan) {
228
378
  if (isRange) {
229
379
  newTokens.push(token, tokens[i + 1], tokens[i + 2]);
230
380
  i += 2;
@@ -257,22 +407,45 @@ export const expandRangesInFormula = (formula, insertionIndex, count, dimension,
257
407
  * @param deletionIndex The row or column index where deletion starts
258
408
  * @param count Number of rows or columns being deleted
259
409
  * @param dimension Whether deleting 'row' or 'column'
260
- * @param activeSheetName Active sheet name to scope range updates
410
+ * @param activeSheetName Name of the EDITED sheet: only references that resolve
411
+ * to it are touched
412
+ * @param options `includeUnqualifiedReferences` — see `expandRangesInFormula`
261
413
  * @returns The formula with contracted ranges, or undefined if no changes
414
+ *
415
+ * Excel semantics for the deleted band: a range whose rows/columns are ALL
416
+ * deleted becomes the `#REF!` token (`=SUM(A2:A3)` → `=SUM(#REF!)`); a single
417
+ * cell reference into the band becomes `#REF!` (`=A3+1` → `=#REF!+1`, a spill
418
+ * reference `=C1#` → `=#REF!#`); a partially covered range shrinks.
262
419
  */
263
- export const contractRangesInFormula = (formula, deletionIndex, count, dimension, activeSheetName) => {
420
+ export const contractRangesInFormula = (formula, deletionIndex, count, dimension, activeSheetName, options = {}) => {
264
421
  if (!formula || count <= 0) {
265
422
  return formula;
266
423
  }
424
+ const { includeUnqualifiedReferences = true, bandSpan } = options;
267
425
  const normalizedActiveSheetName = activeSheetName.toLowerCase();
268
426
  const tokens = cloneTokens(lexify(formula).tokens);
269
427
  const newTokens = [];
270
428
  let hasChanges = false;
271
429
  const deletionEnd = deletionIndex + count - 1;
430
+ const inDeletedBand = (cell) => {
431
+ const index = dimension === "row" ? cell.rowIndex : cell.columnIndex;
432
+ return index >= deletionIndex && index <= deletionEnd;
433
+ };
434
+ const overlapsBand = (start, end) => deletionIndex <= end && deletionEnd >= start;
435
+ // The survivors of a span that overlaps (but is not swallowed by) the band:
436
+ // whatever lay before the band keeps its start, whatever lay inside starts at
437
+ // the deletion point; an end past the band moves up by the full count, an
438
+ // end inside the band stops just before it.
439
+ const contractSpan = (start, end) => ({
440
+ start: Math.min(start, deletionIndex),
441
+ end: end > deletionEnd ? end - count : deletionIndex - 1,
442
+ });
272
443
  for (let i = 0; i < tokens.length; i++) {
273
444
  const token = tokens[i];
274
445
  const sheetName = getSheetNameFromToken(tokens[i - 1]);
275
- const skipSheet = sheetName && sheetName.toLowerCase() !== normalizedActiveSheetName;
446
+ const skipSheet = sheetName
447
+ ? sheetName.toLowerCase() !== normalizedActiveSheetName
448
+ : !includeUnqualifiedReferences;
276
449
  // Handle cell ranges (e.g., A1:A10)
277
450
  if (token.tokenType.name === tokenVocabulary.Cell.name) {
278
451
  const isRange = isRangeToken(tokens[i + 1]);
@@ -284,10 +457,33 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
284
457
  }
285
458
  continue;
286
459
  }
460
+ if (!isRange) {
461
+ // Single cell: broken when it sits in the deleted band. The trailing
462
+ // spilled-range operator (`C1#`) stays on the token (`#REF!#`).
463
+ const spill = token.image.endsWith("#") ? "#" : "";
464
+ const cell = addressToCell(stripPropertyFromCellRef(spill ? token.image.slice(0, -1) : token.image));
465
+ if (cell &&
466
+ inDeletedBand(cell) &&
467
+ isRangeWithinBandSpan(cell, cell, dimension, bandSpan)) {
468
+ token.image = `${REF_ERROR_TOKEN}${spill}`;
469
+ hasChanges = true;
470
+ }
471
+ newTokens.push(token);
472
+ continue;
473
+ }
287
474
  if (isRange && tokens[i + 2]) {
288
475
  const startCell = addressToCell(stripPropertyFromCellRef(token.image));
289
476
  const endCell = addressToCell(stripPropertyFromCellRef(tokens[i + 2].image));
290
- if (startCell && endCell) {
477
+ if (startCell &&
478
+ endCell &&
479
+ isRangeWithinBandSpan(startCell, endCell, dimension, bandSpan)) {
480
+ // Every row/column of the range deleted → the whole range is #REF!.
481
+ if (inDeletedBand(startCell) && inDeletedBand(endCell)) {
482
+ newTokens.push(collapseToRefError(token, tokens[i + 2]));
483
+ i += 2;
484
+ hasChanges = true;
485
+ continue;
486
+ }
291
487
  const isAbsoluteStartRow = isAbsoluteRowReference(token.image);
292
488
  const isAbsoluteEndRow = isAbsoluteRowReference(tokens[i + 2].image);
293
489
  const isAbsoluteStartCol = isAbsoluteColumnReference(token.image);
@@ -295,18 +491,10 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
295
491
  if (dimension === "row") {
296
492
  const rangeStart = startCell.rowIndex;
297
493
  const rangeEnd = endCell.rowIndex;
298
- // Check if deletion overlaps with range
299
- if (deletionIndex <= rangeEnd && deletionEnd >= rangeStart) {
300
- // Calculate how many deleted rows are within the range
301
- const overlapStart = Math.max(deletionIndex, rangeStart);
302
- const overlapEnd = Math.min(deletionEnd, rangeEnd);
303
- const rowsDeletedInRange = overlapEnd - overlapStart + 1;
304
- // Contract the end of the range
305
- endCell.rowIndex -= rowsDeletedInRange;
306
- // If entire range is deleted, result in #REF! (but we'll just contract to minimum)
307
- if (endCell.rowIndex < startCell.rowIndex) {
308
- endCell.rowIndex = startCell.rowIndex;
309
- }
494
+ if (overlapsBand(rangeStart, rangeEnd)) {
495
+ const survivors = contractSpan(rangeStart, rangeEnd);
496
+ startCell.rowIndex = survivors.start;
497
+ endCell.rowIndex = survivors.end;
310
498
  const newStartAddress = cellToAddress(startCell, isAbsoluteStartCol, isAbsoluteStartRow);
311
499
  const newEndAddress = cellToAddress(endCell, isAbsoluteEndCol, isAbsoluteEndRow);
312
500
  if (newStartAddress && newEndAddress) {
@@ -320,18 +508,10 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
320
508
  // dimension === 'column'
321
509
  const rangeStart = startCell.columnIndex;
322
510
  const rangeEnd = endCell.columnIndex;
323
- // Check if deletion overlaps with range
324
- if (deletionIndex <= rangeEnd && deletionEnd >= rangeStart) {
325
- // Calculate how many deleted columns are within the range
326
- const overlapStart = Math.max(deletionIndex, rangeStart);
327
- const overlapEnd = Math.min(deletionEnd, rangeEnd);
328
- const colsDeletedInRange = overlapEnd - overlapStart + 1;
329
- // Contract the end of the range
330
- endCell.columnIndex -= colsDeletedInRange;
331
- // If entire range is deleted, result in #REF! (but we'll just contract to minimum)
332
- if (endCell.columnIndex < startCell.columnIndex) {
333
- endCell.columnIndex = startCell.columnIndex;
334
- }
511
+ if (overlapsBand(rangeStart, rangeEnd)) {
512
+ const survivors = contractSpan(rangeStart, rangeEnd);
513
+ startCell.columnIndex = survivors.start;
514
+ endCell.columnIndex = survivors.end;
335
515
  const newStartAddress = cellToAddress(startCell, isAbsoluteStartCol, isAbsoluteStartRow);
336
516
  const newEndAddress = cellToAddress(endCell, isAbsoluteEndCol, isAbsoluteEndRow);
337
517
  if (newStartAddress && newEndAddress) {
@@ -351,7 +531,7 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
351
531
  if (dimension === "column" &&
352
532
  token.tokenType.name === tokenVocabulary.Column.name) {
353
533
  const isRange = isRangeToken(tokens[i + 1]);
354
- if (skipSheet) {
534
+ if (skipSheet || bandSpan) {
355
535
  if (isRange) {
356
536
  newTokens.push(token, tokens[i + 1], tokens[i + 2]);
357
537
  i += 2;
@@ -361,20 +541,19 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
361
541
  if (isRange && tokens[i + 2]) {
362
542
  const startColumnIndex = alpha2number(token.image);
363
543
  const endColumnIndex = alpha2number(tokens[i + 2].image);
364
- // Check if deletion overlaps with range
365
- if (deletionIndex <= endColumnIndex &&
366
- deletionEnd >= startColumnIndex) {
367
- // Calculate how many deleted columns are within the range
368
- const overlapStart = Math.max(deletionIndex, startColumnIndex);
369
- const overlapEnd = Math.min(deletionEnd, endColumnIndex);
370
- const colsDeletedInRange = overlapEnd - overlapStart + 1;
371
- // Contract the end column
372
- const newEndColumnIndex = endColumnIndex - colsDeletedInRange;
373
- // If entire range is deleted, keep at minimum
374
- if (newEndColumnIndex >= startColumnIndex) {
375
- tokens[i + 2].image = number2Alpha(newEndColumnIndex - 1);
544
+ if (overlapsBand(startColumnIndex, endColumnIndex)) {
545
+ // Every column deleted → #REF!; otherwise the survivors close up.
546
+ if (startColumnIndex >= deletionIndex &&
547
+ endColumnIndex <= deletionEnd) {
548
+ newTokens.push(collapseToRefError(token, tokens[i + 2]));
549
+ i += 2;
376
550
  hasChanges = true;
551
+ continue;
377
552
  }
553
+ const survivors = contractSpan(startColumnIndex, endColumnIndex);
554
+ token.image = number2Alpha(survivors.start - 1);
555
+ tokens[i + 2].image = number2Alpha(survivors.end - 1);
556
+ hasChanges = true;
378
557
  }
379
558
  newTokens.push(token, tokens[i + 1], tokens[i + 2]);
380
559
  i += 2;
@@ -385,7 +564,7 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
385
564
  if (dimension === "row" &&
386
565
  token.tokenType.name === tokenVocabulary.Number.name) {
387
566
  const isRange = isRangeToken(tokens[i + 1]);
388
- if (skipSheet) {
567
+ if (skipSheet || bandSpan) {
389
568
  if (isRange) {
390
569
  newTokens.push(token, tokens[i + 1], tokens[i + 2]);
391
570
  i += 2;
@@ -397,19 +576,18 @@ export const contractRangesInFormula = (formula, deletionIndex, count, dimension
397
576
  tokens[i + 2].tokenType.name === tokenVocabulary.Number.name) {
398
577
  const startRowIndex = Number(token.image);
399
578
  const endRowIndex = Number(tokens[i + 2].image);
400
- // Check if deletion overlaps with range
401
- if (deletionIndex <= endRowIndex && deletionEnd >= startRowIndex) {
402
- // Calculate how many deleted rows are within the range
403
- const overlapStart = Math.max(deletionIndex, startRowIndex);
404
- const overlapEnd = Math.min(deletionEnd, endRowIndex);
405
- const rowsDeletedInRange = overlapEnd - overlapStart + 1;
406
- // Contract the end row
407
- const newEndRowIndex = endRowIndex - rowsDeletedInRange;
408
- // If entire range is deleted, keep at minimum
409
- if (newEndRowIndex >= startRowIndex) {
410
- tokens[i + 2].image = String(newEndRowIndex);
579
+ if (overlapsBand(startRowIndex, endRowIndex)) {
580
+ // Every row deleted → #REF!; otherwise the survivors close up.
581
+ if (startRowIndex >= deletionIndex && endRowIndex <= deletionEnd) {
582
+ newTokens.push(collapseToRefError(token, tokens[i + 2]));
583
+ i += 2;
411
584
  hasChanges = true;
585
+ continue;
412
586
  }
587
+ const survivors = contractSpan(startRowIndex, endRowIndex);
588
+ token.image = String(survivors.start);
589
+ tokens[i + 2].image = String(survivors.end);
590
+ hasChanges = true;
413
591
  }
414
592
  newTokens.push(token, tokens[i + 1], tokens[i + 2]);
415
593
  i += 2;
@@ -1,12 +1,22 @@
1
1
  import type { RowDataWithValue as SpreadsheetRowDataWithValue, SheetData as SpreadsheetSheetData } from "@rowsncolumns/common-types";
2
2
  import type { CellNode, CellRangeNode, StaticNode } from "@rowsncolumns/dag";
3
- import type { CellData, NumberFormat, NumberFormatType, ParsedToken } from "@rowsncolumns/spreadsheet";
3
+ import type { CellData, DimensionProperties, NumberFormat, NumberFormatType, ParsedToken } from "@rowsncolumns/spreadsheet";
4
4
  import { type Draft } from "immer";
5
5
  import type { CellXfsRegistry } from "../hooks/use-cellxfs-registry";
6
6
  import type { useSheetProperties } from "../hooks/use-sheet-properties";
7
7
  type SheetData<T extends CellData> = SpreadsheetSheetData<T>;
8
8
  type RowDataWithValue<T extends CellData | null | undefined> = SpreadsheetRowDataWithValue<T>;
9
9
  export declare const createSheetDraft: <T extends CellData>(draft: Draft<SheetData<T>>, sheetId: number, rowIndex?: number) => Draft<RowDataWithValue<T | null | undefined>>[];
10
+ /**
11
+ * Row/column metadata an inserted band inherits — Excel's "Format Same As
12
+ * Above / Left" (FMT-01 / FMT-02) carries the neighbour's height or width and
13
+ * hidden state along with its cell formats. The neighbour is the entry just
14
+ * before `referenceIndex`; an insert at index 1 has none and takes the entry
15
+ * being pushed away instead. The `collapsed` outline marker and filter-hiding
16
+ * stay with the original row / column. Returns `undefined` when there is
17
+ * nothing to inherit.
18
+ */
19
+ export declare const inheritedDimensionMetadata: (metadata: readonly (DimensionProperties | null | undefined)[], referenceIndex: number) => DimensionProperties | undefined;
10
20
  export declare const cloneRowWithFormatting: <T extends CellData>(rowData: Draft<RowDataWithValue<T | null | undefined>> | undefined) => Draft<RowDataWithValue<T | null | undefined>>;
11
21
  export declare const cloneCellWithFormatting: <T extends CellData>(celLData: Draft<T> | undefined | null) => Draft<T> | null;
12
22
  export declare const getFunctionNamesFromFormula: (formula: string) => string[];
@@ -1 +1 @@
1
- {"version":3,"file":"immer-utils.d.ts","sourceRoot":"","sources":["../../../api/immer-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,IAAI,2BAA2B,EAC/C,SAAS,IAAI,oBAAoB,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI7E,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACZ,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAQxE,KAAK,SAAS,CAAC,CAAC,SAAS,QAAQ,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAC7D,KAAK,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,SAAS,IACzD,2BAA2B,CAAC,CAAC,CAAC,CAAC;AAEjC,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EACjD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC1B,SAAS,MAAM,EACf,WAAW,MAAM,KAgBD,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,EAC9D,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,QAAQ,EACvD,SAAS,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,KACjE,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAa9C,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,QAAQ,EACxD,UAAU,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,oBAItC,CAAC;AAkUF,eAAO,MAAM,2BAA2B,GAAI,SAAS,MAAM,aAW1D,CAAC;AA0IF,eAAO,MAAM,yCAAyC,GAAI,CAAC,SAAS,QAAQ,EAC1E,SAAS,MAAM,GAAG,SAAc,EAChC,YAAY,CAAC,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAC,EAAE,EACrD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,WAAW,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,EACzC,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,aAAa,MAAM,EACnB,QAAQ,MAAM,GAAG,SAAS,EAC1B,YAAY,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EACzC,kBAAkB,eAAe,EACjC,wBAAwB,UAAU,CAChC,OAAO,kBAAkB,CAC1B,CAAC,uBAAuB,CAAC,EAC1B,kBAAkB,MAAM,GAAG,MAAM,GAAG,IAAI;AACxC;;;;;;;;GAQG;AACH,+BAA+B,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,YAAY,GAAG,SAAS,GAAG,IAAI,KACnC,YAAY,GAAG,SAAS,GAAG,IA2X7B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sCAAsC,GAAI,CAAC,SAAS,QAAQ,EACvE,SAAS,MAAM,GAAG,SAAS,EAC3B,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,aAAa,MAAM,EACnB,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,WAAW,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,EACzC,YAAY,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EACzC,SAAS,MAAM,EACf,kBAAkB,eAAe,EACjC,wBAAwB,UAAU,CAChC,OAAO,kBAAkB,CAC1B,CAAC,uBAAuB,CAAC,EAC1B,kBAAkB,MAAM,GAAG,MAAM,GAAG,IAAI,KACvC,YAAY,GAAG,SAAS,GAAG,IA0C7B,CAAC;AAipBF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GAAI,CAAC,SAAS,QAAQ,EAC/D,SAAS,MAAM,EACf,qBAAqB,YAAY,EACjC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,WAAW,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,EACzC,SAAS,MAAM,EACf,YAAY,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EACzC,kBAAkB,eAAe,EACjC,wBAAwB,UAAU,CAChC,OAAO,kBAAkB,CAC1B,CAAC,uBAAuB,CAAC,KACzB,gBAAgB,GAAG,SAarB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,QAAQ,EAC9D,SAAS,MAAM,EACf,qBAAqB,YAAY,EACjC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,WAAW,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,EACzC,SAAS,MAAM,EACf,YAAY,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EACzC,kBAAkB,eAAe,EACjC,wBAAwB,UAAU,CAChC,OAAO,kBAAkB,CAC1B,CAAC,uBAAuB,CAAC,EAC1B,SAAS,MAAM,KACd,YAAY,GAAG,SAoDjB,CAAC;AAGF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EACjD,OAAO,WAAW,GAAG,SAAS,EAC9B,SAAS,MAAM,EACf,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,kBAAkB,eAAe,EACjC,wBAAwB,UAAU,CAChC,OAAO,kBAAkB,CAC1B,CAAC,uBAAuB,CAAC,YAc3B,CAAC;AAGF,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,QAAQ,EAC3C,OAAO,WAAW,GAAG,SAAS,EAC9B,SAAS,MAAM,EACf,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,kBAAkB,eAAe,EACjC,wBAAwB,UAAU,CAChC,OAAO,kBAAkB,CAC1B,CAAC,uBAAuB,CAAC,YAc3B,CAAC;AAkFF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,UAAU,gBAAgB,CAAC,CAAC,CAAC;;;;;;;;;CAY5D,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,QAAQ,EACzD,SAAS,MAAM,GAAG,SAAc,EAChC,YAAY,CAAC,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAC,EAAE,EACrD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACzC,SAAS,MAAM,EACf,QAAQ,MAAM,GAAG,SAAS,EAC1B,kBAAkB,eAAe,gCA2ClC,CAAC"}
1
+ {"version":3,"file":"immer-utils.d.ts","sourceRoot":"","sources":["../../../api/immer-utils.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,22 @@ export const createSheetDraft = (draft, sheetId, rowIndex) => {
18
18
  }
19
19
  return sheet;
20
20
  };
21
+ /**
22
+ * Row/column metadata an inserted band inherits — Excel's "Format Same As
23
+ * Above / Left" (FMT-01 / FMT-02) carries the neighbour's height or width and
24
+ * hidden state along with its cell formats. The neighbour is the entry just
25
+ * before `referenceIndex`; an insert at index 1 has none and takes the entry
26
+ * being pushed away instead. The `collapsed` outline marker and filter-hiding
27
+ * stay with the original row / column. Returns `undefined` when there is
28
+ * nothing to inherit.
29
+ */
30
+ export const inheritedDimensionMetadata = (metadata, referenceIndex) => {
31
+ const source = metadata[referenceIndex > 1 ? referenceIndex - 1 : referenceIndex];
32
+ if (!source)
33
+ return undefined;
34
+ const { collapsed: _collapsed, hiddenByFilter: _hiddenByFilter, ...inherited } = source;
35
+ return Object.keys(inherited).length ? inherited : undefined;
36
+ };
21
37
  // Clone entire row
22
38
  export const cloneRowWithFormatting = (rowData) => {
23
39
  if (!rowData) {
@@ -0,0 +1,35 @@
1
+ import type { GridRange } from "@rowsncolumns/common-types";
2
+ /** How the destination band opens for an Insert Cut Cells block move. */
3
+ export type InsertCutCellsShift = "down" | "right";
4
+ export type InsertCutCellsPlan = {
5
+ /**
6
+ * `"down"` for a vertical move (the block changes rows), `"right"` when it slides along its
7
+ * own rows — the axis the destination band opens and the vacated source closes along.
8
+ */
9
+ shift: InsertCutCellsShift;
10
+ /**
11
+ * The source once the destination band has opened: it slides along by the block's size when
12
+ * it sits in that band (a block dragged UP within its own columns), else it is `from` as is.
13
+ */
14
+ shiftedSource: GridRange;
15
+ /**
16
+ * The bands the move shifts (each open-ended along `shift`): the destination band from `to`
17
+ * on, and the source band from the block on. A merge one of them covers only partially would
18
+ * be torn — Excel refuses the move ("We can't do that to a merged cell.").
19
+ */
20
+ bands: GridRange[];
21
+ };
22
+ /**
23
+ * Excel "Insert Cut Cells" / Shift+drag of a cell block, as the three structural steps the
24
+ * legacy hooks already own: open the destination band (`insertCells…` at `to`), move the block
25
+ * into the opening, then close the gap the block left (`deleteCells…` on the vacated source).
26
+ * The sheet keeps its cell count — Shift+drag A5 to A2 over r1..r6 gives r1 r5 r2 r3 r4 r6, never
27
+ * a blank — and a forward move within its own lanes lands `size` lines before `to`, Excel's
28
+ * pre-removal reference (cut A2, drop at row 6 → r1 r3 r4 r5 r2 r6), because the closing shift
29
+ * pulls the landed block up. `null` when the move is a no-op (the drop is inside the block or
30
+ * right after it) or cannot land the block whole (destination lanes overlapping the source
31
+ * lanes only partially — the closing shift would tear the block); the rnc engine's
32
+ * `move-range { insert }` applies the same rules.
33
+ */
34
+ export declare const planInsertCutCells: (from: GridRange, to: GridRange) => InsertCutCellsPlan | null;
35
+ //# sourceMappingURL=insert-cut-cells.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-cut-cells.d.ts","sourceRoot":"","sources":["../../../api/insert-cut-cells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,KAAK,EAAE,mBAAmB,CAAC;IAC3B;;;OAGG;IACH,aAAa,EAAE,SAAS,CAAC;IACzB;;;;OAIG;IACH,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,SAAS,EACf,IAAI,SAAS,KACZ,kBAAkB,GAAG,IAsDvB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { areaIntersects } from "@rowsncolumns/grid";
2
+ const LAST_INDEX = Number.MAX_SAFE_INTEGER;
3
+ /**
4
+ * Excel "Insert Cut Cells" / Shift+drag of a cell block, as the three structural steps the
5
+ * legacy hooks already own: open the destination band (`insertCells…` at `to`), move the block
6
+ * into the opening, then close the gap the block left (`deleteCells…` on the vacated source).
7
+ * The sheet keeps its cell count — Shift+drag A5 to A2 over r1..r6 gives r1 r5 r2 r3 r4 r6, never
8
+ * a blank — and a forward move within its own lanes lands `size` lines before `to`, Excel's
9
+ * pre-removal reference (cut A2, drop at row 6 → r1 r3 r4 r5 r2 r6), because the closing shift
10
+ * pulls the landed block up. `null` when the move is a no-op (the drop is inside the block or
11
+ * right after it) or cannot land the block whole (destination lanes overlapping the source
12
+ * lanes only partially — the closing shift would tear the block); the rnc engine's
13
+ * `move-range { insert }` applies the same rules.
14
+ */
15
+ export const planInsertCutCells = (from, to) => {
16
+ if (areaIntersects(from, to)) {
17
+ return null;
18
+ }
19
+ const shift = to.startRowIndex === from.startRowIndex ? "right" : "down";
20
+ const vertical = shift === "down";
21
+ // (line, lane): the axis the bands shift along, and the perpendicular index.
22
+ const [l1, l2, k1, k2, t, tk1] = vertical
23
+ ? [
24
+ from.startRowIndex,
25
+ from.endRowIndex,
26
+ from.startColumnIndex,
27
+ from.endColumnIndex,
28
+ to.startRowIndex,
29
+ to.startColumnIndex,
30
+ ]
31
+ : [
32
+ from.startColumnIndex,
33
+ from.endColumnIndex,
34
+ from.startRowIndex,
35
+ from.endRowIndex,
36
+ to.startColumnIndex,
37
+ to.startRowIndex,
38
+ ];
39
+ const size = l2 - l1 + 1;
40
+ const tk2 = tk1 + (k2 - k1);
41
+ const lanesMeet = tk1 <= k2 && tk2 >= k1;
42
+ if (lanesMeet && tk1 !== k1) {
43
+ return null;
44
+ }
45
+ if (lanesMeet && t > l1 && t <= l2 + 1) {
46
+ return null;
47
+ }
48
+ // Opening the destination band above the block slides the block along with it.
49
+ const slides = lanesMeet && t < l1;
50
+ const shiftedSource = !slides
51
+ ? from
52
+ : vertical
53
+ ? {
54
+ ...from,
55
+ startRowIndex: from.startRowIndex + size,
56
+ endRowIndex: from.endRowIndex + size,
57
+ }
58
+ : {
59
+ ...from,
60
+ startColumnIndex: from.startColumnIndex + size,
61
+ endColumnIndex: from.endColumnIndex + size,
62
+ };
63
+ const band = (range) => vertical
64
+ ? { ...range, endRowIndex: LAST_INDEX }
65
+ : { ...range, endColumnIndex: LAST_INDEX };
66
+ return { shift, shiftedSource, bands: [band(to), band(from)] };
67
+ };
@@ -1,7 +1,23 @@
1
1
  import type { GridRange } from "@rowsncolumns/common-types";
2
+ /** Excel's refusal when a move / cut-paste / shift would tear a merged cell. */
3
+ export declare const MERGED_CELL_MOVE_ERROR = "We can't do that to a merged cell.";
4
+ /**
5
+ * The first merge that `range` covers only PARTIALLY (it intersects the range without being
6
+ * wholly inside it). Excel refuses any move, cut + paste or cell shift whose source or destination
7
+ * does that ("We can't do that to a merged cell."); merges wholly inside the range travel intact.
8
+ */
9
+ export declare const findPartiallyCoveredMerge: (range: GridRange, merges: GridRange[] | undefined | null) => GridRange | undefined;
2
10
  export declare const moveMergedCells: (mergedCells: GridRange[] | undefined | null, op: "column-insert" | "row-insert" | "column-remove" | "row-remove", referenceIndex: number, count?: number, condition?: (area: GridRange) => boolean) => GridRange[] | null | undefined;
3
11
  export declare const shrinkMergesOnRowDelete: (merges: GridRange[], deleteStart: number, deleteCount: number) => GridRange[];
4
12
  export declare const shrinkMergesOnColumnDelete: (merges: GridRange[], deleteStart: number, deleteCount: number) => GridRange[];
5
13
  export declare const expandMergesOnRowInsert: (merges: GridRange[], insertIndex: number, count: number) => GridRange[];
6
14
  export declare const expandMergesOnColumnInsert: (merges: GridRange[], insertIndex: number, count: number) => GridRange[];
15
+ /**
16
+ * Merges that travel with an insert/delete-cells shift: a merge wholly inside the shifted band
17
+ * (rows `>= start` in the band's columns for a vertical shift; columns `>= start` in its rows for a
18
+ * horizontal one) moves by `count`; on a delete, a merge wholly inside the deleted block is dropped
19
+ * with it. Merges the band only partially covers are refused upstream (`findTornMerge`) — this
20
+ * helper never tears one, it leaves anything outside the band untouched.
21
+ */
22
+ export declare const shiftMergesInBand: (merges: GridRange[] | undefined | null, axis: "row" | "column", start: number, count: number, insert: boolean, spanStart: number, spanEnd: number) => GridRange[] | null | undefined;
7
23
  //# sourceMappingURL=merges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merges.d.ts","sourceRoot":"","sources":["../../../api/merges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAY5D,eAAO,MAAM,eAAe,GAC1B,aAAa,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC3C,IAAI,eAAe,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,EACnE,gBAAgB,MAAM,EACtB,cAAS,EACT,YAAY,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,mCA2DzC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC"}
1
+ {"version":3,"file":"merges.d.ts","sourceRoot":"","sources":["../../../api/merges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,SAAS,EAChB,QAAQ,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,KACrC,SAAS,GAAG,SAGZ,CAAC;AAYJ,eAAO,MAAM,eAAe,GAC1B,aAAa,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EAC3C,IAAI,eAAe,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,EACnE,gBAAgB,MAAM,EACtB,cAAS,EACT,YAAY,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,mCA2DzC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,aAAa,MAAM,gBA8CpB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,QAAQ,SAAS,EAAE,EACnB,aAAa,MAAM,EACnB,OAAO,MAAM,gBAyBd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,EACtC,MAAM,KAAK,GAAG,QAAQ,EACtB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,QAAQ,OAAO,EACf,WAAW,MAAM,EACjB,SAAS,MAAM,mCAkDhB,CAAC"}