@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,8 +1,9 @@
1
1
  import { useCallback } from "react";
2
- import { insertCellsShiftDown } from "../interface/insert-cells-shift-down";
2
+ import { getShiftCellsRefusal, resolveShiftSelection } from "../api/structural-guards";
3
3
  import { useShowError } from "../atoms/error-state.atom";
4
+ import { insertCellsShiftDown } from "../interface/insert-cells-shift-down";
4
5
  import { SHEET_PROTECTION_ERROR_TITLE, useCanEditCellRange, useCanPerformSheetAction, } from "./use-can-edit-cellrange";
5
- export const useOnInsertCellsShiftDown = ({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, onCommand, }) => {
6
+ export const useOnInsertCellsShiftDown = ({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, onChangeTables, onCommand, sheetData, sheets, tables, getArrayRanges, getSheetName, }) => {
6
7
  const canEditCellRange = useCanEditCellRange();
7
8
  const canPerformSheetAction = useCanPerformSheetAction();
8
9
  const showError = useShowError();
@@ -18,6 +19,21 @@ export const useOnInsertCellsShiftDown = ({ rowCount, columnCount, locale, cellX
18
19
  console.debug("This range is protected, users cannot edit this cell range.");
19
20
  return;
20
21
  }
22
+ const selection = resolveShiftSelection(activeCell, selections);
23
+ const refusal = getShiftCellsRefusal({
24
+ direction: "down",
25
+ range: selection.range,
26
+ sheetId,
27
+ rows: sheetData?.[sheetId],
28
+ rowCount,
29
+ merges: sheets?.find((sheet) => sheet.sheetId === sheetId)?.merges,
30
+ tables,
31
+ arrayRanges: getArrayRanges?.(sheetId),
32
+ });
33
+ if (refusal) {
34
+ showError({ title: refusal.title, message: refusal.message });
35
+ return;
36
+ }
21
37
  insertCellsShiftDown({
22
38
  rowCount,
23
39
  columnCount,
@@ -34,6 +50,8 @@ export const useOnInsertCellsShiftDown = ({ rowCount, columnCount, locale, cellX
34
50
  onChangeSheetData,
35
51
  onChangeSheets,
36
52
  onChangeCitations,
53
+ onChangeTables,
54
+ getSheetName,
37
55
  })(sheetId, activeCell, selections);
38
56
  onCommand?.({
39
57
  command: "insert-cells-shift-down",
@@ -61,5 +79,11 @@ export const useOnInsertCellsShiftDown = ({ rowCount, columnCount, locale, cellX
61
79
  canPerformSheetAction,
62
80
  showError,
63
81
  onCommand,
82
+ onChangeTables,
83
+ sheetData,
84
+ sheets,
85
+ tables,
86
+ getArrayRanges,
87
+ getSheetName,
64
88
  ]);
65
89
  };
@@ -1,10 +1,12 @@
1
+ import type { GridRange } from "@rowsncolumns/common-types";
1
2
  import { type CellInterface, type SelectionArea } from "@rowsncolumns/grid";
2
3
  import type { CellData, SelectionAttributes, Sheet } from "@rowsncolumns/spreadsheet";
4
+ import type { TableView } from "@rowsncolumns/spreadsheet";
3
5
  import type { OnCommand } from "../commands";
6
+ import type { useCalculation } from "./use-calculation";
4
7
  import type { CellXfsRegistry } from "./use-cellxfs-registry";
8
+ import type { SheetData, UseSpreadsheetProps } from "./use-spreadsheet-state";
5
9
  import type { SharedStringRegistry } from "./use-ss-registry";
6
- import type { useCalculation } from "./use-calculation";
7
- import type { UseSpreadsheetProps } from "./use-spreadsheet-state";
8
10
  import type { SpreadsheetPatch } from "./use-undo-redo";
9
11
  export type UseOnInsertCellsShiftRight<T extends CellData, S extends Sheet> = {
10
12
  rowCount: number;
@@ -22,7 +24,15 @@ export type UseOnInsertCellsShiftRight<T extends CellData, S extends Sheet> = {
22
24
  onChangeSheetData: UseSpreadsheetProps<T, S>["onChangeSheetData"];
23
25
  onChangeSheets: UseSpreadsheetProps<T, S>["onChangeSheets"];
24
26
  onChangeCitations?: UseSpreadsheetProps<T, S>["onChangeCitations"];
27
+ onChangeTables?: UseSpreadsheetProps<T, S>["onChangeTables"];
25
28
  onCommand?: OnCommand;
29
+ /** Current document facets, read by the Excel refusal guards (`getShiftCellsRefusal`). */
30
+ sheetData?: SheetData<T>;
31
+ sheets?: S[];
32
+ tables?: TableView[];
33
+ /** CSE / dynamic-array ranges on a sheet — a partially covered one refuses the shift. */
34
+ getArrayRanges?: (sheetId: number) => GridRange[] | undefined;
35
+ getSheetName?: (sheetId: number) => string;
26
36
  };
27
- export declare const useOnInsertCellsShiftRight: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, onCommand, }: UseOnInsertCellsShiftRight<T, S>) => (sheetId: number, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[]) => void;
37
+ export declare const useOnInsertCellsShiftRight: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, onChangeTables, onCommand, sheetData, sheets, tables, getArrayRanges, getSheetName, }: UseOnInsertCellsShiftRight<T, S>) => (sheetId: number, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[]) => void;
28
38
  //# sourceMappingURL=use-on-insert-cells-shift-right.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-insert-cells-shift-right.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-insert-cells-shift-right.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,aAAa,IAAI,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACtD,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACnE,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS,QAAQ,EAClB,CAAC,SAAS,KAAK,EACf,2QAiBC,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,eAMpB,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE,SA8DrD,CAAC"}
1
+ {"version":3,"file":"use-on-insert-cells-shift-right.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-insert-cells-shift-right.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAK3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,aAAa,IAAI,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACtD,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,yFAAyF;IACzF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,GAAG,SAAS,CAAC;IAC9D,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,CAAC,SAAS,QAAQ,EAClB,CAAC,SAAS,KAAK,EACf,oVAuBC,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,eAMpB,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE,SAsFrD,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { useCallback } from "react";
2
- import { insertCellsShiftRight } from "../interface/insert-cells-shift-right";
2
+ import { getShiftCellsRefusal, resolveShiftSelection } from "../api/structural-guards";
3
3
  import { useShowError } from "../atoms/error-state.atom";
4
+ import { insertCellsShiftRight } from "../interface/insert-cells-shift-right";
4
5
  import { SHEET_PROTECTION_ERROR_TITLE, useCanEditCellRange, useCanPerformSheetAction, } from "./use-can-edit-cellrange";
5
- export const useOnInsertCellsShiftRight = ({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, onCommand, }) => {
6
+ export const useOnInsertCellsShiftRight = ({ rowCount, columnCount, locale, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeCitations, onChangeTables, onCommand, sheetData, sheets, tables, getArrayRanges, getSheetName, }) => {
6
7
  const canEditCellRange = useCanEditCellRange();
7
8
  const canPerformSheetAction = useCanPerformSheetAction();
8
9
  const showError = useShowError();
@@ -18,6 +19,21 @@ export const useOnInsertCellsShiftRight = ({ rowCount, columnCount, locale, cell
18
19
  console.debug("This range is protected, users cannot edit this cell range.");
19
20
  return;
20
21
  }
22
+ const selection = resolveShiftSelection(activeCell, selections);
23
+ const refusal = getShiftCellsRefusal({
24
+ direction: "right",
25
+ range: selection.range,
26
+ sheetId,
27
+ rows: sheetData?.[sheetId],
28
+ columnCount,
29
+ merges: sheets?.find((sheet) => sheet.sheetId === sheetId)?.merges,
30
+ tables,
31
+ arrayRanges: getArrayRanges?.(sheetId),
32
+ });
33
+ if (refusal) {
34
+ showError({ title: refusal.title, message: refusal.message });
35
+ return;
36
+ }
21
37
  insertCellsShiftRight({
22
38
  rowCount,
23
39
  columnCount,
@@ -34,6 +50,8 @@ export const useOnInsertCellsShiftRight = ({ rowCount, columnCount, locale, cell
34
50
  onChangeSheetData,
35
51
  onChangeSheets,
36
52
  onChangeCitations,
53
+ onChangeTables,
54
+ getSheetName,
37
55
  })(sheetId, activeCell, selections);
38
56
  onCommand?.({
39
57
  command: "insert-cells-shift-right",
@@ -61,5 +79,11 @@ export const useOnInsertCellsShiftRight = ({ rowCount, columnCount, locale, cell
61
79
  canPerformSheetAction,
62
80
  showError,
63
81
  onCommand,
82
+ onChangeTables,
83
+ sheetData,
84
+ sheets,
85
+ tables,
86
+ getArrayRanges,
87
+ getSheetName,
64
88
  ]);
65
89
  };
@@ -3,10 +3,10 @@ import type { SelectionAttributes, TableView } from "@rowsncolumns/spreadsheet";
3
3
  import { type CellData, type Sheet } from "@rowsncolumns/spreadsheet";
4
4
  import type { OnCommand } from "../commands";
5
5
  import type { GeneratedNames } from "../generated-names";
6
+ import type { useCalculation } from "./use-calculation";
6
7
  import type { CellXfsRegistry } from "./use-cellxfs-registry";
8
+ import type { SheetData, UseSpreadsheetProps } from "./use-spreadsheet-state";
7
9
  import type { SharedStringRegistry } from "./use-ss-registry";
8
- import type { useCalculation } from "./use-calculation";
9
- import type { UseSpreadsheetProps } from "./use-spreadsheet-state";
10
10
  import type { SpreadsheetPatch } from "./use-undo-redo";
11
11
  export type UseOnInsertColumnProps<T extends CellData, S extends Sheet> = {
12
12
  rowCount: number;
@@ -14,6 +14,9 @@ export type UseOnInsertColumnProps<T extends CellData, S extends Sheet> = {
14
14
  locale?: string;
15
15
  tables?: TableView[];
16
16
  maxColumnCount?: number;
17
+ /** Current sheet data — lets the grid-cap check refuse only when a NON-BLANK cell would be pushed
18
+ * off the sheet (INS-09); blank trailing columns fall off silently, as in Excel. */
19
+ sheetData?: SheetData<T>;
17
20
  cellXfsRegistry?: CellXfsRegistry;
18
21
  sharedStringRegistry?: SharedStringRegistry;
19
22
  getActiveCell: () => CellInterface;
@@ -32,9 +35,13 @@ export type UseOnInsertColumnProps<T extends CellData, S extends Sheet> = {
32
35
  onChangeConditionalFormats?: UseSpreadsheetProps<T, S>["onChangeConditionalFormats"];
33
36
  onChangeCitations?: UseSpreadsheetProps<T, S>["onChangeCitations"];
34
37
  onChangePivotTables?: UseSpreadsheetProps<T, S>["onChangePivotTables"];
38
+ onChangeNamedRanges?: UseSpreadsheetProps<T, S>["onChangeNamedRanges"];
39
+ onChangeEmbeds?: UseSpreadsheetProps<T, S>["onChangeEmbeds"];
40
+ onChangeCharts?: UseSpreadsheetProps<T, S>["onChangeCharts"];
41
+ onChangeProtectedRanges?: UseSpreadsheetProps<T, S>["onChangeProtectedRanges"];
35
42
  getSheetName(sheetId: number): string;
36
43
  onCommand?: OnCommand;
37
44
  generatedNames?: GeneratedNames;
38
45
  };
39
- export declare const useOnInsertColumn: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, tables, maxColumnCount, cellXfsRegistry, sharedStringRegistry, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, getActiveCell, getSelections, getSheetName, onCommand, generatedNames, }: UseOnInsertColumnProps<T, S>) => (sheetId: number, referenceColumnIndex: number, numColumns?: number) => void;
46
+ export declare const useOnInsertColumn: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, tables, maxColumnCount, cellXfsRegistry, sharedStringRegistry, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, onChangeNamedRanges, onChangeEmbeds, onChangeCharts, onChangeProtectedRanges, getActiveCell, getSelections, getSheetName, onCommand, generatedNames, sheetData, }: UseOnInsertColumnProps<T, S>) => (sheetId: number, referenceColumnIndex: number, numColumns?: number) => void;
40
47
  //# sourceMappingURL=use-on-insert-column.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-insert-column.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-insert-column.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-on-insert-column.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-insert-column.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { isNil } from "@rowsncolumns/utils";
2
2
  import { useCallback } from "react";
3
+ import { getInsertLinesRefusal } from "../api/structural-guards";
3
4
  import { useShowError } from "../atoms/error-state.atom";
4
5
  import { insertColumn } from "../interface/insert-column";
5
6
  import { SHEET_PROTECTION_ERROR_TITLE, useCanEditSheet, useCanPerformSheetAction, } from "./use-can-edit-cellrange";
6
- export const useOnInsertColumn = ({ rowCount, columnCount, locale, tables, maxColumnCount, cellXfsRegistry, sharedStringRegistry, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, getActiveCell, getSelections, getSheetName, onCommand, generatedNames, }) => {
7
+ export const useOnInsertColumn = ({ rowCount, columnCount, locale, tables, maxColumnCount, cellXfsRegistry, sharedStringRegistry, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, onChangeNamedRanges, onChangeEmbeds, onChangeCharts, onChangeProtectedRanges, getActiveCell, getSelections, getSheetName, onCommand, generatedNames, sheetData, }) => {
7
8
  const canEditSheet = useCanEditSheet();
8
9
  const canPerformSheetAction = useCanPerformSheetAction();
9
10
  const showError = useShowError();
@@ -19,17 +20,33 @@ export const useOnInsertColumn = ({ rowCount, columnCount, locale, tables, maxCo
19
20
  });
20
21
  return;
21
22
  }
22
- if (!isNil(maxColumnCount) && columnCount >= maxColumnCount) {
23
- showError({
24
- title: "New columns cannot be added",
25
- message: "You have reached the maximum number of columns.",
26
- });
27
- return;
23
+ if (!isNil(maxColumnCount) && columnCount + numColumns > maxColumnCount) {
24
+ // INS-09: at the grid cap, Excel refuses only when a non-blank (or formatted) cell would
25
+ // be pushed off the end; blank trailing columns are simply discarded.
26
+ const refusal = sheetData
27
+ ? getInsertLinesRefusal({
28
+ axis: "column",
29
+ referenceIndex: referenceColumnIndex,
30
+ count: numColumns,
31
+ rows: sheetData[sheetId],
32
+ limit: maxColumnCount,
33
+ })
34
+ : columnCount >= maxColumnCount
35
+ ? {
36
+ title: "New columns cannot be added",
37
+ message: "You have reached the maximum number of columns.",
38
+ }
39
+ : undefined;
40
+ if (refusal) {
41
+ showError({ title: refusal.title, message: refusal.message });
42
+ return;
43
+ }
28
44
  }
29
45
  insertColumn({
30
46
  rowCount,
31
47
  columnCount,
32
48
  locale,
49
+ maxColumnCount,
33
50
  tables,
34
51
  cellXfsRegistry,
35
52
  sharedStringRegistry,
@@ -47,6 +64,10 @@ export const useOnInsertColumn = ({ rowCount, columnCount, locale, tables, maxCo
47
64
  onChangeDataValidations,
48
65
  onChangeCitations,
49
66
  onChangePivotTables,
67
+ onChangeNamedRanges,
68
+ onChangeEmbeds,
69
+ onChangeCharts,
70
+ onChangeProtectedRanges,
50
71
  getActiveCell,
51
72
  getSelections,
52
73
  getSheetName,
@@ -82,10 +103,15 @@ export const useOnInsertColumn = ({ rowCount, columnCount, locale, tables, maxCo
82
103
  onChangeConditionalFormats,
83
104
  onChangeDataValidations,
84
105
  onChangePivotTables,
106
+ onChangeNamedRanges,
107
+ onChangeEmbeds,
108
+ onChangeCharts,
109
+ onChangeProtectedRanges,
85
110
  canEditSheet,
86
111
  canPerformSheetAction,
87
112
  getSheetName,
88
113
  onCommand,
89
114
  generatedNames,
115
+ sheetData,
90
116
  ]);
91
117
  };
@@ -2,10 +2,10 @@ import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
2
2
  import type { SelectionAttributes } from "@rowsncolumns/spreadsheet";
3
3
  import { type CellData, type Sheet } from "@rowsncolumns/spreadsheet";
4
4
  import type { OnCommand } from "../commands";
5
+ import type { useCalculation } from "./use-calculation";
5
6
  import type { CellXfsRegistry } from "./use-cellxfs-registry";
7
+ import type { SheetData, UseSpreadsheetProps } from "./use-spreadsheet-state";
6
8
  import type { SharedStringRegistry } from "./use-ss-registry";
7
- import type { useCalculation } from "./use-calculation";
8
- import type { UseSpreadsheetProps } from "./use-spreadsheet-state";
9
9
  import type { SpreadsheetPatch } from "./use-undo-redo";
10
10
  export type UseOnInsertRowProps<T extends CellData, S extends Sheet> = {
11
11
  rowCount: number;
@@ -25,6 +25,9 @@ export type UseOnInsertRowProps<T extends CellData, S extends Sheet> = {
25
25
  getSelections(): SelectionArea<SelectionAttributes>[];
26
26
  getSheetName(sheetId: number): string;
27
27
  enableInsertRowTimingLogs?: boolean;
28
+ /** Current sheet data — lets the grid-cap check refuse only when a NON-BLANK cell would be pushed
29
+ * off the sheet (INS-06); blank trailing rows fall off silently, as in Excel. */
30
+ sheetData?: SheetData<T>;
28
31
  onChangeSheetData?: UseSpreadsheetProps<T, S>["onChangeSheetData"];
29
32
  onChangeSheets?: UseSpreadsheetProps<T, S>["onChangeSheets"];
30
33
  onChangeTables?: UseSpreadsheetProps<T, S>["onChangeTables"];
@@ -32,7 +35,11 @@ export type UseOnInsertRowProps<T extends CellData, S extends Sheet> = {
32
35
  onChangeConditionalFormats?: UseSpreadsheetProps<T, S>["onChangeConditionalFormats"];
33
36
  onChangeCitations?: UseSpreadsheetProps<T, S>["onChangeCitations"];
34
37
  onChangePivotTables?: UseSpreadsheetProps<T, S>["onChangePivotTables"];
38
+ onChangeNamedRanges?: UseSpreadsheetProps<T, S>["onChangeNamedRanges"];
39
+ onChangeEmbeds?: UseSpreadsheetProps<T, S>["onChangeEmbeds"];
40
+ onChangeCharts?: UseSpreadsheetProps<T, S>["onChangeCharts"];
41
+ onChangeProtectedRanges?: UseSpreadsheetProps<T, S>["onChangeProtectedRanges"];
35
42
  onCommand?: OnCommand;
36
43
  };
37
- export declare const useOnInsertRow: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, maxRowCount, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, getSheetName, enableInsertRowTimingLogs, onCommand, }: UseOnInsertRowProps<T, S>) => (sheetId: number, referenceRowIndex: number, numRows?: number) => void;
44
+ export declare const useOnInsertRow: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, maxRowCount, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, onChangeNamedRanges, onChangeEmbeds, onChangeCharts, onChangeProtectedRanges, getSheetName, enableInsertRowTimingLogs, sheetData, onCommand, }: UseOnInsertRowProps<T, S>) => (sheetId: number, referenceRowIndex: number, numRows?: number) => void;
38
45
  //# sourceMappingURL=use-on-insert-row.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-insert-row.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-insert-row.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-on-insert-row.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-insert-row.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { isNil } from "@rowsncolumns/utils";
2
2
  import { useCallback } from "react";
3
+ import { getInsertLinesRefusal } from "../api/structural-guards";
3
4
  import { useShowError } from "../atoms/error-state.atom";
4
5
  import { insertRow } from "../interface/insert-row";
5
6
  import { SHEET_PROTECTION_ERROR_TITLE, useCanEditSheet, useCanPerformSheetAction, } from "./use-can-edit-cellrange";
6
- export const useOnInsertRow = ({ rowCount, columnCount, locale, maxRowCount, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, getSheetName, enableInsertRowTimingLogs, onCommand, }) => {
7
+ export const useOnInsertRow = ({ rowCount, columnCount, locale, maxRowCount, cellXfsRegistry, sharedStringRegistry, getActiveCell, getSelections, getDependents, getGraphNodes, getGraphNodesInSheet, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, onChangeCitations, onChangePivotTables, onChangeNamedRanges, onChangeEmbeds, onChangeCharts, onChangeProtectedRanges, getSheetName, enableInsertRowTimingLogs, sheetData, onCommand, }) => {
7
8
  const canEditSheet = useCanEditSheet();
8
9
  const canPerformSheetAction = useCanPerformSheetAction();
9
10
  const showError = useShowError();
@@ -23,12 +24,27 @@ export const useOnInsertRow = ({ rowCount, columnCount, locale, maxRowCount, cel
23
24
  });
24
25
  return;
25
26
  }
26
- if (!isNil(maxRowCount) && rowCount >= maxRowCount) {
27
- showError({
28
- title: "New rows cannot be added",
29
- message: "You have reached the maximum number of rows.",
30
- });
31
- return;
27
+ if (!isNil(maxRowCount) && rowCount + numRows > maxRowCount) {
28
+ // INS-06: at the grid cap, Excel refuses only when a non-blank (or formatted) cell would
29
+ // be pushed off the end; blank trailing rows are simply discarded.
30
+ const refusal = sheetData
31
+ ? getInsertLinesRefusal({
32
+ axis: "row",
33
+ referenceIndex: referenceRowIndex,
34
+ count: numRows,
35
+ rows: sheetData[sheetId],
36
+ limit: maxRowCount,
37
+ })
38
+ : rowCount >= maxRowCount
39
+ ? {
40
+ title: "New rows cannot be added",
41
+ message: "You have reached the maximum number of rows.",
42
+ }
43
+ : undefined;
44
+ if (refusal) {
45
+ showError({ title: refusal.title, message: refusal.message });
46
+ return;
47
+ }
32
48
  }
33
49
  // Inserts row
34
50
  const startMs = now();
@@ -55,6 +71,10 @@ export const useOnInsertRow = ({ rowCount, columnCount, locale, maxRowCount, cel
55
71
  onChangeDataValidations,
56
72
  onChangeCitations,
57
73
  onChangePivotTables,
74
+ onChangeNamedRanges,
75
+ onChangeEmbeds,
76
+ onChangeCharts,
77
+ onChangeProtectedRanges,
58
78
  getSheetName,
59
79
  })(sheetId, referenceRowIndex, numRows);
60
80
  const elapsedMs = now() - startMs;
@@ -92,6 +112,10 @@ export const useOnInsertRow = ({ rowCount, columnCount, locale, maxRowCount, cel
92
112
  onChangeConditionalFormats,
93
113
  onChangeDataValidations,
94
114
  onChangePivotTables,
115
+ onChangeNamedRanges,
116
+ onChangeEmbeds,
117
+ onChangeCharts,
118
+ onChangeProtectedRanges,
95
119
  enqueueGraphOperation,
96
120
  enqueueCalculation,
97
121
  enqueueStructureChange,
@@ -99,6 +123,7 @@ export const useOnInsertRow = ({ rowCount, columnCount, locale, maxRowCount, cel
99
123
  canPerformSheetAction,
100
124
  getSheetName,
101
125
  enableInsertRowTimingLogs,
126
+ sheetData,
102
127
  onCommand,
103
128
  ]);
104
129
  };
@@ -2,6 +2,7 @@ import type { CellInterface } from "@rowsncolumns/common-types";
2
2
  import { type CellData, type Sheet } from "@rowsncolumns/spreadsheet";
3
3
  import type { OnCommand } from "../commands";
4
4
  import type { useCalculation } from "./use-calculation";
5
+ import { type MoveDimensionOptions } from "./use-on-move-rows";
5
6
  import type { useSheetProperties } from "./use-sheet-properties";
6
7
  import type { UseSpreadsheetProps } from "./use-spreadsheet-state";
7
8
  import type { SpreadsheetPatch } from "./use-undo-redo";
@@ -23,6 +24,6 @@ type UseOnMoveColumnsProps<T extends CellData, S extends Sheet> = {
23
24
  getActiveCell: () => CellInterface;
24
25
  onCommand?: OnCommand;
25
26
  };
26
- export declare const useOnMoveColumns: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getDataRowCount, getActiveCell, onCommand, }: UseOnMoveColumnsProps<T, S>) => (sheetId: number, columns: number[], referenceColumnIndex: number) => void;
27
+ export declare const useOnMoveColumns: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getDataRowCount, getActiveCell, onCommand, }: UseOnMoveColumnsProps<T, S>) => (sheetId: number, columns: number[], rawReferenceColumnIndex: number, options?: MoveDimensionOptions) => void;
27
28
  export {};
28
29
  //# sourceMappingURL=use-on-move-columns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-move-columns.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAWtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,qBAAqB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,0BAA0B,CAAC,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,4BAA4B,CAAC,CAAC;IAChC,uBAAuB,CAAC,EAAE,mBAAmB,CAC3C,CAAC,EACD,CAAC,CACF,CAAC,yBAAyB,CAAC,CAAC;IAC7B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,wRAiBnE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,eAGhB,MAAM,WAAW,MAAM,EAAE,wBAAwB,MAAM,SAsYpE,CAAC"}
1
+ {"version":3,"file":"use-on-move-columns.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAWtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,qBAAqB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,0BAA0B,CAAC,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,4BAA4B,CAAC,CAAC;IAChC,uBAAuB,CAAC,EAAE,mBAAmB,CAC3C,CAAC,EACD,CAAC,CACF,CAAC,yBAAyB,CAAC,CAAC;IAC7B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,wRAiBnE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,eAIf,MAAM,WACN,MAAM,EAAE,2BACQ,MAAM,YACrB,oBAAoB,SAkZnC,CAAC"}
@@ -8,9 +8,10 @@ import { moveMergedCells } from "../api/merges";
8
8
  import { updateRangedRulesOnReorder } from "../api/range-rule-helpers";
9
9
  import { shiftTableMovingColumns } from "../api/table";
10
10
  import { useCanEditSheet } from "./use-can-edit-cellrange";
11
+ import { resolveMoveReferenceIndex, } from "./use-on-move-rows";
11
12
  export const useOnMoveColumns = ({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getDataRowCount, getActiveCell, onCommand, }) => {
12
13
  const canEditSheet = useCanEditSheet();
13
- return useCallback((sheetId, columns, referenceColumnIndex) => {
14
+ return useCallback((sheetId, columns, rawReferenceColumnIndex, options) => {
14
15
  if (!canEditSheet(sheetId)) {
15
16
  console.debug("This range is protected, users cannot edit this cell range.");
16
17
  return;
@@ -18,6 +19,10 @@ export const useOnMoveColumns = ({ rowCount, columnCount, locale, createHistory,
18
19
  if (!columns.length) {
19
20
  return;
20
21
  }
22
+ const referenceColumnIndex = resolveMoveReferenceIndex(columns, rawReferenceColumnIndex, options);
23
+ if (referenceColumnIndex === undefined) {
24
+ return;
25
+ }
21
26
  const saveHistory = createHistory();
22
27
  const { 0: firstColumn, [columns.length - 1]: lastColumn } = columns;
23
28
  // We need to track this for history. Precedent cells
@@ -43,11 +48,15 @@ export const useOnMoveColumns = ({ rowCount, columnCount, locale, createHistory,
43
48
  startRowIndex: 1,
44
49
  endRowIndex: dataRowCount,
45
50
  };
46
- // When you move columns, the resident columns
47
- // gets shifted
51
+ // The columns the move displaces (Excel: refs into them shift by ±count). Moving LEFT,
52
+ // columns `referenceColumnIndex..firstColumn-1` slide right; moving RIGHT, columns
53
+ // `lastColumn+1..referenceColumnIndex+count-1` slide left (the block lands at
54
+ // `referenceColumnIndex` in the post-removal frame).
48
55
  const shiftedRange = {
49
- startColumnIndex: Math.min(referenceColumnIndex + count, firstColumn + count),
50
- endColumnIndex: Math.max(referenceColumnIndex + count - 1, firstColumn),
56
+ startColumnIndex: direction === Direction.Left ? referenceColumnIndex : lastColumn + 1,
57
+ endColumnIndex: direction === Direction.Left
58
+ ? firstColumn - 1
59
+ : referenceColumnIndex + count - 1,
51
60
  startRowIndex: 1,
52
61
  endRowIndex: dataRowCount,
53
62
  };
@@ -25,6 +25,21 @@ type UseOnMoveRowsProps<T extends CellData, S extends Sheet> = {
25
25
  getActiveCell: () => CellInterface;
26
26
  onCommand?: OnCommand;
27
27
  };
28
- export declare const useOnMoveRows: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getNonEmptyColumnCount, getActiveCell, onCommand, }: UseOnMoveRowsProps<T, S>) => (sheetId: number, rows: number[], referenceRowIndex: number) => void;
28
+ /**
29
+ * Landing semantics for a row/column move. By default `referenceIndex` is the block's FINAL
30
+ * position in the post-removal frame (what the header-drag hook computes). `insertBefore`
31
+ * selects Excel's "Insert Cut Cells" semantics instead: `referenceIndex` is the row/column the
32
+ * block is inserted BEFORE in the PRE-removal numbering, so a downward move lands `count` earlier
33
+ * (cut row 2 → Insert Cut Cells at row 6 lands the row at 5: r1 r3 r4 r5 r2 r6).
34
+ */
35
+ export type MoveDimensionOptions = {
36
+ insertBefore?: boolean;
37
+ };
38
+ /**
39
+ * Translate an Insert-Cut-Cells reference (pre-removal numbering) into the hook's post-removal
40
+ * landing index. Returns `undefined` when the reference falls inside the moved block (a no-op).
41
+ */
42
+ export declare const resolveMoveReferenceIndex: (dims: number[], referenceIndex: number, options?: MoveDimensionOptions) => number | undefined;
43
+ export declare const useOnMoveRows: <T extends CellData, S extends Sheet>({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getNonEmptyColumnCount, getActiveCell, onCommand, }: UseOnMoveRowsProps<T, S>) => (sheetId: number, rows: number[], rawReferenceRowIndex: number, options?: MoveDimensionOptions) => void;
29
44
  export {};
30
45
  //# sourceMappingURL=use-on-move-rows.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-move-rows.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAUtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACtE,0BAA0B,CAAC,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,4BAA4B,CAAC,CAAC;IAChC,uBAAuB,CAAC,EAAE,mBAAmB,CAC3C,CAAC,EACD,CAAC,CACF,CAAC,yBAAyB,CAAC,CAAC;IAC7B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,kBAAkB,CAC1B,CAAC,wBAAwB,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,+RAiBhE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,eAGb,MAAM,QAAQ,MAAM,EAAE,qBAAqB,MAAM,SA2U9D,CAAC"}
1
+ {"version":3,"file":"use-on-move-rows.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-move-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,4BAA4B,CAAC;AAE3E,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAUtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,KAAK,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,cAAc,CACtB,CAAC,wBAAwB,CAAC,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAC/B,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACtE,0BAA0B,CAAC,EAAE,mBAAmB,CAC9C,CAAC,EACD,CAAC,CACF,CAAC,4BAA4B,CAAC,CAAC;IAChC,uBAAuB,CAAC,EAAE,mBAAmB,CAC3C,CAAC,EACD,CAAC,CACF,CAAC,yBAAyB,CAAC,CAAC;IAC7B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,eAAe,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,sBAAsB,CAAC,EAAE,UAAU,CACjC,OAAO,kBAAkB,CAC1B,CAAC,wBAAwB,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACpC,MAAM,MAAM,EAAE,EACd,gBAAgB,MAAM,EACtB,UAAU,oBAAoB,KAC7B,MAAM,GAAG,SAYX,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,+RAiBhE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,eAIZ,MAAM,QACT,MAAM,EAAE,wBACQ,MAAM,YAClB,oBAAoB,SA0VnC,CAAC"}
@@ -8,9 +8,26 @@ import { moveMergedCells } from "../api/merges";
8
8
  import { updateRangedRulesOnReorder } from "../api/range-rule-helpers";
9
9
  import { shiftTableMovingRows } from "../api/table";
10
10
  import { useCanEditSheet } from "./use-can-edit-cellrange";
11
+ /**
12
+ * Translate an Insert-Cut-Cells reference (pre-removal numbering) into the hook's post-removal
13
+ * landing index. Returns `undefined` when the reference falls inside the moved block (a no-op).
14
+ */
15
+ export const resolveMoveReferenceIndex = (dims, referenceIndex, options) => {
16
+ if (!options?.insertBefore) {
17
+ return referenceIndex;
18
+ }
19
+ const { 0: first, [dims.length - 1]: last } = dims;
20
+ if (referenceIndex > last) {
21
+ return referenceIndex - dims.length;
22
+ }
23
+ if (referenceIndex > first) {
24
+ return undefined;
25
+ }
26
+ return referenceIndex;
27
+ };
11
28
  export const useOnMoveRows = ({ rowCount, columnCount, locale, createHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeConditionalFormats, onChangeDataValidations, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, getDependents, getNonEmptyColumnCount, getActiveCell, onCommand, }) => {
12
29
  const canEditSheet = useCanEditSheet();
13
- return useCallback((sheetId, rows, referenceRowIndex) => {
30
+ return useCallback((sheetId, rows, rawReferenceRowIndex, options) => {
14
31
  if (!canEditSheet(sheetId)) {
15
32
  console.debug("This range is protected, users cannot edit this cell range.");
16
33
  return;
@@ -18,6 +35,10 @@ export const useOnMoveRows = ({ rowCount, columnCount, locale, createHistory, on
18
35
  if (!rows.length) {
19
36
  return;
20
37
  }
38
+ const referenceRowIndex = resolveMoveReferenceIndex(rows, rawReferenceRowIndex, options);
39
+ if (referenceRowIndex === undefined) {
40
+ return;
41
+ }
21
42
  const saveHistory = createHistory();
22
43
  const { 0: firstRow, [rows.length - 1]: lastRow } = rows;
23
44
  // We need to track this for history. Precedent cells
@@ -118,13 +139,17 @@ export const useOnMoveRows = ({ rowCount, columnCount, locale, createHistory, on
118
139
  columnCount,
119
140
  });
120
141
  }
121
- // When you move columns, the resident columns
122
- // gets shifted
142
+ // The rows the move displaces (Excel: refs into them shift by ±count). Moving UP,
143
+ // rows `referenceRowIndex..firstRow-1` slide down; moving DOWN, rows
144
+ // `lastRow+1..referenceRowIndex+count-1` slide up (the block lands at
145
+ // `referenceRowIndex` in the post-removal frame).
123
146
  const shiftedRange = {
124
147
  startColumnIndex: 1,
125
148
  endColumnIndex: columnCount,
126
- startRowIndex: Math.min(referenceRowIndex + count, firstRow),
127
- endRowIndex: Math.max(referenceRowIndex - count, firstRow),
149
+ startRowIndex: direction === Direction.Left ? referenceRowIndex : lastRow + 1,
150
+ endRowIndex: direction === Direction.Left
151
+ ? firstRow - 1
152
+ : referenceRowIndex + count - 1,
128
153
  };
129
154
  // Update formulas
130
155
  for (const [rowIndex, columnIndex] of iterateCellsInRange({
@@ -1,4 +1,4 @@
1
- import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
1
+ import type { CellInterface, GridRange, SelectionArea } from "@rowsncolumns/common-types";
2
2
  import type { CellData, SelectionAttributes, Sheet, TableView } from "@rowsncolumns/spreadsheet";
3
3
  import type { OnCommand } from "../commands";
4
4
  import type { CalculationOperation, useCalculation } from "./use-calculation";
@@ -29,7 +29,12 @@ export type UseOnMoveSelectionProps<T extends CellData, S extends Sheet> = {
29
29
  onChangePivotTables?: UseSpreadsheetProps<T, S>["onChangePivotTables"];
30
30
  getDependents: ReturnType<typeof useCalculation>["getDependents"];
31
31
  getActiveCell: () => CellInterface;
32
+ /**
33
+ * Merged ranges of a sheet — a drag-move whose destination (or source) covers a merge only
34
+ * partially is refused, like Excel ("We can't do that to a merged cell.").
35
+ */
36
+ getSheetMerges?: (sheetId: number) => GridRange[] | undefined | null;
32
37
  onCommand?: OnCommand;
33
38
  };
34
- export declare const useOnMoveSelection: <T extends CellData, S extends Sheet>({ rowCount, columnCount, tables, locale, cellXfsRegistry, sharedStringRegistry, getDependents, getActiveCell, onChangeTables, onChangeSheets, onChangeNamedRanges, onChangeDataValidations, onChangeConditionalFormats, onChangePivotTables, onChangeSheetData, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, isArrayFormula, getDataValidationById, onCommand, }: UseOnMoveSelectionProps<T, S>) => (sheetId: number, from: SelectionArea<SelectionAttributes>, to: SelectionArea<SelectionAttributes>) => void;
39
+ export declare const useOnMoveSelection: <T extends CellData, S extends Sheet>({ rowCount, columnCount, tables, locale, cellXfsRegistry, sharedStringRegistry, getDependents, getActiveCell, onChangeTables, onChangeSheets, onChangeNamedRanges, onChangeDataValidations, onChangeConditionalFormats, onChangePivotTables, onChangeSheetData, createHistory, enqueueGraphOperation, enqueueCalculation, enqueueStructureChange, isArrayFormula, getDataValidationById, getSheetMerges, onCommand, }: UseOnMoveSelectionProps<T, S>) => (sheetId: number, from: SelectionArea<SelectionAttributes>, to: SelectionArea<SelectionAttributes>) => void;
35
40
  //# sourceMappingURL=use-on-move-selection.d.ts.map