@rowsncolumns/spreadsheet-state 29.0.0 → 29.1.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 (603) hide show
  1. package/dist/cjs/api/anchored-objects.d.ts +122 -6
  2. package/dist/cjs/api/anchored-objects.d.ts.map +1 -1
  3. package/dist/cjs/api/anchored-objects.js +464 -43
  4. package/dist/cjs/api/copy-paste.d.ts +1 -2
  5. package/dist/cjs/api/copy-paste.d.ts.map +1 -1
  6. package/dist/cjs/api/copy-paste.js +1 -3
  7. package/dist/cjs/api/filter.d.ts +15 -1
  8. package/dist/cjs/api/filter.d.ts.map +1 -1
  9. package/dist/cjs/api/filter.js +32 -2
  10. package/dist/cjs/api/formula.d.ts +63 -0
  11. package/dist/cjs/api/formula.d.ts.map +1 -1
  12. package/dist/cjs/api/formula.js +278 -8
  13. package/dist/cjs/api/paint-format.d.ts +22 -1
  14. package/dist/cjs/api/paint-format.d.ts.map +1 -1
  15. package/dist/cjs/api/paint-format.js +57 -1
  16. package/dist/cjs/api/sort.d.ts +23 -1
  17. package/dist/cjs/api/sort.d.ts.map +1 -1
  18. package/dist/cjs/api/sort.js +52 -6
  19. package/dist/cjs/api/structural-guards.d.ts +57 -0
  20. package/dist/cjs/api/structural-guards.d.ts.map +1 -1
  21. package/dist/cjs/api/structural-guards.js +93 -1
  22. package/dist/cjs/api/structural-table-refs.d.ts +58 -3
  23. package/dist/cjs/api/structural-table-refs.d.ts.map +1 -1
  24. package/dist/cjs/api/structural-table-refs.js +177 -16
  25. package/dist/cjs/api/table.d.ts +26 -2
  26. package/dist/cjs/api/table.d.ts.map +1 -1
  27. package/dist/cjs/api/table.js +93 -60
  28. package/dist/cjs/api/validation.d.ts.map +1 -1
  29. package/dist/cjs/api/validation.js +53 -8
  30. package/dist/cjs/atoms/creating-table.atom.d.ts +22 -0
  31. package/dist/cjs/atoms/creating-table.atom.d.ts.map +1 -0
  32. package/dist/cjs/atoms/creating-table.atom.js +4 -0
  33. package/dist/cjs/atoms/dialog-state.atom.d.ts +8 -0
  34. package/dist/cjs/atoms/dialog-state.atom.d.ts.map +1 -1
  35. package/dist/cjs/atoms/dialog-state.atom.js +28 -0
  36. package/dist/cjs/atoms/editing-slicer.atom.d.ts +9 -0
  37. package/dist/cjs/atoms/editing-slicer.atom.d.ts.map +1 -0
  38. package/dist/cjs/atoms/editing-slicer.atom.js +6 -0
  39. package/dist/cjs/atoms/index.d.ts +4 -0
  40. package/dist/cjs/atoms/index.d.ts.map +1 -1
  41. package/dist/cjs/atoms/index.js +4 -0
  42. package/dist/cjs/atoms/inserting-slicer.atom.d.ts +8 -0
  43. package/dist/cjs/atoms/inserting-slicer.atom.d.ts.map +1 -0
  44. package/dist/cjs/atoms/inserting-slicer.atom.js +5 -0
  45. package/dist/cjs/atoms/resizing-table.atom.d.ts +8 -0
  46. package/dist/cjs/atoms/resizing-table.atom.d.ts.map +1 -0
  47. package/dist/cjs/atoms/resizing-table.atom.js +5 -0
  48. package/dist/cjs/commands.d.ts +129 -2
  49. package/dist/cjs/commands.d.ts.map +1 -1
  50. package/dist/cjs/components/editors/embed-editor.d.ts +4 -2
  51. package/dist/cjs/components/editors/embed-editor.d.ts.map +1 -1
  52. package/dist/cjs/components/editors/embed-editor.js +38 -9
  53. package/dist/cjs/components/editors/slicer-editor.d.ts +15 -0
  54. package/dist/cjs/components/editors/slicer-editor.d.ts.map +1 -0
  55. package/dist/cjs/components/editors/slicer-editor.js +87 -0
  56. package/dist/cjs/components/editors/table-editor.d.ts +58 -2
  57. package/dist/cjs/components/editors/table-editor.d.ts.map +1 -1
  58. package/dist/cjs/components/editors/table-editor.js +261 -20
  59. package/dist/cjs/components/index.d.ts +1 -0
  60. package/dist/cjs/components/index.d.ts.map +1 -1
  61. package/dist/cjs/components/index.js +1 -0
  62. package/dist/cjs/constants.d.ts +9 -1
  63. package/dist/cjs/constants.d.ts.map +1 -1
  64. package/dist/cjs/constants.js +12 -0
  65. package/dist/cjs/generated-names.d.ts +13 -3
  66. package/dist/cjs/generated-names.d.ts.map +1 -1
  67. package/dist/cjs/generated-names.js +3 -1
  68. package/dist/cjs/helpers.d.ts +5 -0
  69. package/dist/cjs/helpers.d.ts.map +1 -1
  70. package/dist/cjs/helpers.js +10 -1
  71. package/dist/cjs/hooks/use-on-change-batch.d.ts +19 -2
  72. package/dist/cjs/hooks/use-on-change-batch.d.ts.map +1 -1
  73. package/dist/cjs/hooks/use-on-change-batch.js +43 -35
  74. package/dist/cjs/hooks/use-on-change-calculated-column.d.ts +10 -1
  75. package/dist/cjs/hooks/use-on-change-calculated-column.d.ts.map +1 -1
  76. package/dist/cjs/hooks/use-on-change-calculated-column.js +17 -5
  77. package/dist/cjs/hooks/use-on-change-table-column.d.ts +6 -1
  78. package/dist/cjs/hooks/use-on-change-table-column.d.ts.map +1 -1
  79. package/dist/cjs/hooks/use-on-change-table-column.js +17 -5
  80. package/dist/cjs/hooks/use-on-change.d.ts +36 -3
  81. package/dist/cjs/hooks/use-on-change.d.ts.map +1 -1
  82. package/dist/cjs/hooks/use-on-change.js +218 -136
  83. package/dist/cjs/hooks/use-on-create-custom-table-style.d.ts +17 -0
  84. package/dist/cjs/hooks/use-on-create-custom-table-style.d.ts.map +1 -0
  85. package/dist/cjs/hooks/use-on-create-custom-table-style.js +28 -0
  86. package/dist/cjs/hooks/use-on-create-named-range.d.ts +4 -2
  87. package/dist/cjs/hooks/use-on-create-named-range.d.ts.map +1 -1
  88. package/dist/cjs/hooks/use-on-create-named-range.js +11 -1
  89. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts +2 -1
  90. package/dist/cjs/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  91. package/dist/cjs/hooks/use-on-delete-cells-shift-left.js +3 -1
  92. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts +2 -1
  93. package/dist/cjs/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  94. package/dist/cjs/hooks/use-on-delete-cells-shift-up.js +3 -1
  95. package/dist/cjs/hooks/use-on-delete-column.d.ts +2 -1
  96. package/dist/cjs/hooks/use-on-delete-column.d.ts.map +1 -1
  97. package/dist/cjs/hooks/use-on-delete-column.js +3 -1
  98. package/dist/cjs/hooks/use-on-delete-row.d.ts +2 -1
  99. package/dist/cjs/hooks/use-on-delete-row.d.ts.map +1 -1
  100. package/dist/cjs/hooks/use-on-delete-row.js +3 -1
  101. package/dist/cjs/hooks/use-on-delete-sheet.d.ts +9 -1
  102. package/dist/cjs/hooks/use-on-delete-sheet.d.ts.map +1 -1
  103. package/dist/cjs/hooks/use-on-delete-sheet.js +17 -1
  104. package/dist/cjs/hooks/use-on-delete-table-row.d.ts +4 -1
  105. package/dist/cjs/hooks/use-on-delete-table-row.d.ts.map +1 -1
  106. package/dist/cjs/hooks/use-on-delete-table-row.js +19 -1
  107. package/dist/cjs/hooks/use-on-delete.d.ts +5 -2
  108. package/dist/cjs/hooks/use-on-delete.d.ts.map +1 -1
  109. package/dist/cjs/hooks/use-on-delete.js +5 -1
  110. package/dist/cjs/hooks/use-on-embeds.d.ts +7 -4
  111. package/dist/cjs/hooks/use-on-embeds.d.ts.map +1 -1
  112. package/dist/cjs/hooks/use-on-embeds.js +26 -24
  113. package/dist/cjs/hooks/use-on-fill.d.ts +17 -2
  114. package/dist/cjs/hooks/use-on-fill.d.ts.map +1 -1
  115. package/dist/cjs/hooks/use-on-fill.js +29 -15
  116. package/dist/cjs/hooks/use-on-filter-table.d.ts.map +1 -1
  117. package/dist/cjs/hooks/use-on-filter-table.js +209 -103
  118. package/dist/cjs/hooks/use-on-import-excel.d.ts +2 -1
  119. package/dist/cjs/hooks/use-on-import-excel.d.ts.map +1 -1
  120. package/dist/cjs/hooks/use-on-import-excel.js +22 -19
  121. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts +2 -1
  122. package/dist/cjs/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  123. package/dist/cjs/hooks/use-on-insert-cells-shift-down.js +3 -1
  124. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts +2 -1
  125. package/dist/cjs/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  126. package/dist/cjs/hooks/use-on-insert-cells-shift-right.js +3 -1
  127. package/dist/cjs/hooks/use-on-insert-column.d.ts +2 -1
  128. package/dist/cjs/hooks/use-on-insert-column.d.ts.map +1 -1
  129. package/dist/cjs/hooks/use-on-insert-column.js +3 -1
  130. package/dist/cjs/hooks/use-on-insert-row.d.ts +2 -1
  131. package/dist/cjs/hooks/use-on-insert-row.d.ts.map +1 -1
  132. package/dist/cjs/hooks/use-on-insert-row.js +3 -1
  133. package/dist/cjs/hooks/use-on-insert-table-row.d.ts +5 -2
  134. package/dist/cjs/hooks/use-on-insert-table-row.d.ts.map +1 -1
  135. package/dist/cjs/hooks/use-on-insert-table-row.js +19 -1
  136. package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts +3 -2
  137. package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
  138. package/dist/cjs/hooks/use-on-merge-unmerge-cells.js +14 -1
  139. package/dist/cjs/hooks/use-on-move-columns.d.ts +3 -1
  140. package/dist/cjs/hooks/use-on-move-columns.d.ts.map +1 -1
  141. package/dist/cjs/hooks/use-on-move-columns.js +14 -1
  142. package/dist/cjs/hooks/use-on-move-rows.d.ts +3 -1
  143. package/dist/cjs/hooks/use-on-move-rows.d.ts.map +1 -1
  144. package/dist/cjs/hooks/use-on-move-rows.js +14 -1
  145. package/dist/cjs/hooks/use-on-move-selection.d.ts +3 -1
  146. package/dist/cjs/hooks/use-on-move-selection.d.ts.map +1 -1
  147. package/dist/cjs/hooks/use-on-move-selection.js +88 -25
  148. package/dist/cjs/hooks/use-on-paste.d.ts +22 -1
  149. package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
  150. package/dist/cjs/hooks/use-on-paste.js +993 -776
  151. package/dist/cjs/hooks/use-on-remove-duplicates.d.ts +5 -2
  152. package/dist/cjs/hooks/use-on-remove-duplicates.d.ts.map +1 -1
  153. package/dist/cjs/hooks/use-on-remove-duplicates.js +5 -1
  154. package/dist/cjs/hooks/use-on-request-create-table.d.ts +13 -0
  155. package/dist/cjs/hooks/use-on-request-create-table.d.ts.map +1 -0
  156. package/dist/cjs/hooks/use-on-request-create-table.js +44 -0
  157. package/dist/cjs/hooks/use-on-request-insert-slicer.d.ts +7 -0
  158. package/dist/cjs/hooks/use-on-request-insert-slicer.d.ts.map +1 -0
  159. package/dist/cjs/hooks/use-on-request-insert-slicer.js +15 -0
  160. package/dist/cjs/hooks/use-on-request-resize-table.d.ts +7 -0
  161. package/dist/cjs/hooks/use-on-request-resize-table.d.ts.map +1 -0
  162. package/dist/cjs/hooks/use-on-request-resize-table.js +15 -0
  163. package/dist/cjs/hooks/use-on-resize-table.d.ts +5 -1
  164. package/dist/cjs/hooks/use-on-resize-table.d.ts.map +1 -1
  165. package/dist/cjs/hooks/use-on-resize-table.js +110 -33
  166. package/dist/cjs/hooks/use-on-sort-column.d.ts +28 -3
  167. package/dist/cjs/hooks/use-on-sort-column.d.ts.map +1 -1
  168. package/dist/cjs/hooks/use-on-sort-column.js +136 -90
  169. package/dist/cjs/hooks/use-on-sort-range.d.ts +26 -3
  170. package/dist/cjs/hooks/use-on-sort-range.d.ts.map +1 -1
  171. package/dist/cjs/hooks/use-on-sort-range.js +113 -67
  172. package/dist/cjs/hooks/use-on-sort-table.d.ts +18 -1
  173. package/dist/cjs/hooks/use-on-sort-table.d.ts.map +1 -1
  174. package/dist/cjs/hooks/use-on-sort-table.js +128 -98
  175. package/dist/cjs/hooks/use-on-subtotal.d.ts +10 -3
  176. package/dist/cjs/hooks/use-on-subtotal.d.ts.map +1 -1
  177. package/dist/cjs/hooks/use-on-subtotal.js +13 -9
  178. package/dist/cjs/hooks/use-on-table.d.ts +39 -7
  179. package/dist/cjs/hooks/use-on-table.d.ts.map +1 -1
  180. package/dist/cjs/hooks/use-on-table.js +257 -49
  181. package/dist/cjs/hooks/use-on-undo-calculated-column.d.ts +23 -0
  182. package/dist/cjs/hooks/use-on-undo-calculated-column.d.ts.map +1 -0
  183. package/dist/cjs/hooks/use-on-undo-calculated-column.js +70 -0
  184. package/dist/cjs/hooks/use-on-undo-table-auto-expansion.d.ts +28 -0
  185. package/dist/cjs/hooks/use-on-undo-table-auto-expansion.d.ts.map +1 -0
  186. package/dist/cjs/hooks/use-on-undo-table-auto-expansion.js +96 -0
  187. package/dist/cjs/hooks/use-on-update-named-range.d.ts +4 -2
  188. package/dist/cjs/hooks/use-on-update-named-range.d.ts.map +1 -1
  189. package/dist/cjs/hooks/use-on-update-named-range.js +13 -1
  190. package/dist/cjs/hooks/use-sheet-properties.d.ts +1 -0
  191. package/dist/cjs/hooks/use-sheet-properties.d.ts.map +1 -1
  192. package/dist/cjs/hooks/use-sheet-properties.js +54 -34
  193. package/dist/cjs/hooks/use-slicers.d.ts +2 -2
  194. package/dist/cjs/hooks/use-slicers.d.ts.map +1 -1
  195. package/dist/cjs/hooks/use-slicers.js +17 -26
  196. package/dist/cjs/hooks/use-sparkline-groups.d.ts +50 -0
  197. package/dist/cjs/hooks/use-sparkline-groups.d.ts.map +1 -0
  198. package/dist/cjs/hooks/use-sparkline-groups.js +192 -0
  199. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +56 -10
  200. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  201. package/dist/cjs/hooks/use-spreadsheet-state.js +322 -100
  202. package/dist/cjs/hooks/use-structured-reference.d.ts.map +1 -1
  203. package/dist/cjs/hooks/use-structured-reference.js +17 -0
  204. package/dist/cjs/hooks/use-undo-redo-actions.d.ts +2 -1
  205. package/dist/cjs/hooks/use-undo-redo-actions.d.ts.map +1 -1
  206. package/dist/cjs/hooks/use-undo-redo-actions.js +10 -2
  207. package/dist/cjs/hooks/use-undo-redo.d.ts +12 -0
  208. package/dist/cjs/hooks/use-undo-redo.d.ts.map +1 -1
  209. package/dist/cjs/hooks/use-undo-redo.js +169 -10
  210. package/dist/cjs/hooks/utils/sort-rows.d.ts.map +1 -1
  211. package/dist/cjs/hooks/utils/sort-rows.js +4 -3
  212. package/dist/cjs/index.d.ts +7 -0
  213. package/dist/cjs/index.d.ts.map +1 -1
  214. package/dist/cjs/index.js +8 -0
  215. package/dist/cjs/interface/apply-fill.d.ts +26 -3
  216. package/dist/cjs/interface/apply-fill.d.ts.map +1 -1
  217. package/dist/cjs/interface/apply-fill.js +207 -98
  218. package/dist/cjs/interface/change-batch.d.ts +1 -1
  219. package/dist/cjs/interface/change-batch.d.ts.map +1 -1
  220. package/dist/cjs/interface/change-batch.js +112 -15
  221. package/dist/cjs/interface/change-calculated-column.d.ts +6 -2
  222. package/dist/cjs/interface/change-calculated-column.d.ts.map +1 -1
  223. package/dist/cjs/interface/change-calculated-column.js +87 -17
  224. package/dist/cjs/interface/change-table-column.d.ts +81 -7
  225. package/dist/cjs/interface/change-table-column.d.ts.map +1 -1
  226. package/dist/cjs/interface/change-table-column.js +336 -76
  227. package/dist/cjs/interface/create-table.d.ts +15 -3
  228. package/dist/cjs/interface/create-table.d.ts.map +1 -1
  229. package/dist/cjs/interface/create-table.js +100 -25
  230. package/dist/cjs/interface/delete-cells-shift-left.d.ts +1 -1
  231. package/dist/cjs/interface/delete-cells-shift-left.d.ts.map +1 -1
  232. package/dist/cjs/interface/delete-cells-shift-left.js +10 -1
  233. package/dist/cjs/interface/delete-cells-shift-up.d.ts +1 -1
  234. package/dist/cjs/interface/delete-cells-shift-up.d.ts.map +1 -1
  235. package/dist/cjs/interface/delete-cells-shift-up.js +10 -1
  236. package/dist/cjs/interface/delete-cells.d.ts +1 -1
  237. package/dist/cjs/interface/delete-cells.d.ts.map +1 -1
  238. package/dist/cjs/interface/delete-cells.js +81 -25
  239. package/dist/cjs/interface/delete-column.d.ts +1 -1
  240. package/dist/cjs/interface/delete-column.d.ts.map +1 -1
  241. package/dist/cjs/interface/delete-column.js +9 -2
  242. package/dist/cjs/interface/delete-row.d.ts +1 -1
  243. package/dist/cjs/interface/delete-row.d.ts.map +1 -1
  244. package/dist/cjs/interface/delete-row.js +223 -18
  245. package/dist/cjs/interface/delete-sheet.d.ts +2 -2
  246. package/dist/cjs/interface/delete-sheet.d.ts.map +1 -1
  247. package/dist/cjs/interface/delete-sheet.js +118 -1
  248. package/dist/cjs/interface/delete-table-column.d.ts +1 -1
  249. package/dist/cjs/interface/delete-table-column.d.ts.map +1 -1
  250. package/dist/cjs/interface/delete-table-column.js +11 -1
  251. package/dist/cjs/interface/delete-table-row.d.ts +1 -1
  252. package/dist/cjs/interface/delete-table-row.d.ts.map +1 -1
  253. package/dist/cjs/interface/delete-table-row.js +361 -275
  254. package/dist/cjs/interface/duplicate-sheet.d.ts.map +1 -1
  255. package/dist/cjs/interface/duplicate-sheet.js +83 -31
  256. package/dist/cjs/interface/embeds.d.ts +10 -1
  257. package/dist/cjs/interface/embeds.d.ts.map +1 -1
  258. package/dist/cjs/interface/embeds.js +120 -6
  259. package/dist/cjs/interface/insert-cells-shift-down.d.ts +1 -1
  260. package/dist/cjs/interface/insert-cells-shift-down.d.ts.map +1 -1
  261. package/dist/cjs/interface/insert-cells-shift-down.js +10 -1
  262. package/dist/cjs/interface/insert-cells-shift-right.d.ts +1 -1
  263. package/dist/cjs/interface/insert-cells-shift-right.d.ts.map +1 -1
  264. package/dist/cjs/interface/insert-cells-shift-right.js +10 -1
  265. package/dist/cjs/interface/insert-column.d.ts +2 -2
  266. package/dist/cjs/interface/insert-column.d.ts.map +1 -1
  267. package/dist/cjs/interface/insert-column.js +67 -38
  268. package/dist/cjs/interface/insert-row.d.ts +1 -1
  269. package/dist/cjs/interface/insert-row.d.ts.map +1 -1
  270. package/dist/cjs/interface/insert-row.js +9 -2
  271. package/dist/cjs/interface/insert-table-row.d.ts +2 -1
  272. package/dist/cjs/interface/insert-table-row.d.ts.map +1 -1
  273. package/dist/cjs/interface/insert-table-row.js +70 -19
  274. package/dist/cjs/interface/remove-duplicates.d.ts +1 -1
  275. package/dist/cjs/interface/remove-duplicates.d.ts.map +1 -1
  276. package/dist/cjs/interface/remove-duplicates.js +46 -6
  277. package/dist/cjs/interface/remove-table.d.ts +1 -1
  278. package/dist/cjs/interface/remove-table.d.ts.map +1 -1
  279. package/dist/cjs/interface/remove-table.js +72 -16
  280. package/dist/cjs/interface/slicers.d.ts +12 -1
  281. package/dist/cjs/interface/slicers.d.ts.map +1 -1
  282. package/dist/cjs/interface/slicers.js +47 -2
  283. package/dist/cjs/interface/spreadsheet-interface.d.ts +1 -1
  284. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  285. package/dist/cjs/interface/spreadsheet-interface.js +64 -1
  286. package/dist/cjs/interface/table-totalrow.d.ts +13 -1
  287. package/dist/cjs/interface/table-totalrow.d.ts.map +1 -1
  288. package/dist/cjs/interface/table-totalrow.js +107 -73
  289. package/dist/cjs/interface/table-utils.d.ts +59 -6
  290. package/dist/cjs/interface/table-utils.d.ts.map +1 -1
  291. package/dist/cjs/interface/table-utils.js +211 -15
  292. package/dist/cjs/interface/update-table.d.ts +16 -1
  293. package/dist/cjs/interface/update-table.d.ts.map +1 -1
  294. package/dist/cjs/interface/update-table.js +190 -44
  295. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  296. package/dist/cjs/test-setup.d.ts.map +1 -1
  297. package/dist/cjs/test-setup.js +6 -0
  298. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  299. package/dist/cjs/validation-schema/table.schema.d.ts +11 -0
  300. package/dist/cjs/validation-schema/table.schema.d.ts.map +1 -1
  301. package/dist/cjs/validation-schema/table.schema.js +20 -3
  302. package/dist/esm/api/anchored-objects.d.ts +122 -6
  303. package/dist/esm/api/anchored-objects.d.ts.map +1 -1
  304. package/dist/esm/api/anchored-objects.js +375 -15
  305. package/dist/esm/api/copy-paste.d.ts +1 -2
  306. package/dist/esm/api/copy-paste.d.ts.map +1 -1
  307. package/dist/esm/api/copy-paste.js +1 -3
  308. package/dist/esm/api/filter.d.ts +15 -1
  309. package/dist/esm/api/filter.d.ts.map +1 -1
  310. package/dist/esm/api/filter.js +28 -0
  311. package/dist/esm/api/formula.d.ts +63 -0
  312. package/dist/esm/api/formula.d.ts.map +1 -1
  313. package/dist/esm/api/formula.js +235 -8
  314. package/dist/esm/api/paint-format.d.ts +22 -1
  315. package/dist/esm/api/paint-format.d.ts.map +1 -1
  316. package/dist/esm/api/paint-format.js +44 -1
  317. package/dist/esm/api/sort.d.ts +23 -1
  318. package/dist/esm/api/sort.d.ts.map +1 -1
  319. package/dist/esm/api/sort.js +45 -6
  320. package/dist/esm/api/structural-guards.d.ts +57 -0
  321. package/dist/esm/api/structural-guards.d.ts.map +1 -1
  322. package/dist/esm/api/structural-guards.js +85 -0
  323. package/dist/esm/api/structural-table-refs.d.ts +58 -3
  324. package/dist/esm/api/structural-table-refs.d.ts.map +1 -1
  325. package/dist/esm/api/structural-table-refs.js +126 -6
  326. package/dist/esm/api/table.d.ts +26 -2
  327. package/dist/esm/api/table.d.ts.map +1 -1
  328. package/dist/esm/api/table.js +70 -48
  329. package/dist/esm/api/validation.d.ts.map +1 -1
  330. package/dist/esm/api/validation.js +53 -8
  331. package/dist/esm/atoms/creating-table.atom.d.ts +22 -0
  332. package/dist/esm/atoms/creating-table.atom.d.ts.map +1 -0
  333. package/dist/esm/atoms/creating-table.atom.js +4 -0
  334. package/dist/esm/atoms/dialog-state.atom.d.ts +8 -0
  335. package/dist/esm/atoms/dialog-state.atom.d.ts.map +1 -1
  336. package/dist/esm/atoms/dialog-state.atom.js +12 -0
  337. package/dist/esm/atoms/editing-slicer.atom.d.ts +9 -0
  338. package/dist/esm/atoms/editing-slicer.atom.d.ts.map +1 -0
  339. package/dist/esm/atoms/editing-slicer.atom.js +6 -0
  340. package/dist/esm/atoms/index.d.ts +4 -0
  341. package/dist/esm/atoms/index.d.ts.map +1 -1
  342. package/dist/esm/atoms/index.js +4 -0
  343. package/dist/esm/atoms/inserting-slicer.atom.d.ts +8 -0
  344. package/dist/esm/atoms/inserting-slicer.atom.d.ts.map +1 -0
  345. package/dist/esm/atoms/inserting-slicer.atom.js +5 -0
  346. package/dist/esm/atoms/resizing-table.atom.d.ts +8 -0
  347. package/dist/esm/atoms/resizing-table.atom.d.ts.map +1 -0
  348. package/dist/esm/atoms/resizing-table.atom.js +5 -0
  349. package/dist/esm/commands.d.ts +129 -2
  350. package/dist/esm/commands.d.ts.map +1 -1
  351. package/dist/esm/components/editors/embed-editor.d.ts +4 -2
  352. package/dist/esm/components/editors/embed-editor.d.ts.map +1 -1
  353. package/dist/esm/components/editors/embed-editor.js +40 -6
  354. package/dist/esm/components/editors/slicer-editor.d.ts +15 -0
  355. package/dist/esm/components/editors/slicer-editor.d.ts.map +1 -0
  356. package/dist/esm/components/editors/slicer-editor.js +85 -0
  357. package/dist/esm/components/editors/table-editor.d.ts +58 -2
  358. package/dist/esm/components/editors/table-editor.d.ts.map +1 -1
  359. package/dist/esm/components/editors/table-editor.js +243 -19
  360. package/dist/esm/components/index.d.ts +1 -0
  361. package/dist/esm/components/index.d.ts.map +1 -1
  362. package/dist/esm/components/index.js +1 -0
  363. package/dist/esm/constants.d.ts +9 -1
  364. package/dist/esm/constants.d.ts.map +1 -1
  365. package/dist/esm/constants.js +12 -0
  366. package/dist/esm/generated-names.d.ts +13 -3
  367. package/dist/esm/generated-names.d.ts.map +1 -1
  368. package/dist/esm/generated-names.js +3 -1
  369. package/dist/esm/helpers.d.ts +5 -0
  370. package/dist/esm/helpers.d.ts.map +1 -1
  371. package/dist/esm/helpers.js +7 -1
  372. package/dist/esm/hooks/use-on-change-batch.d.ts +19 -2
  373. package/dist/esm/hooks/use-on-change-batch.d.ts.map +1 -1
  374. package/dist/esm/hooks/use-on-change-batch.js +19 -3
  375. package/dist/esm/hooks/use-on-change-calculated-column.d.ts +10 -1
  376. package/dist/esm/hooks/use-on-change-calculated-column.d.ts.map +1 -1
  377. package/dist/esm/hooks/use-on-change-calculated-column.js +17 -5
  378. package/dist/esm/hooks/use-on-change-table-column.d.ts +6 -1
  379. package/dist/esm/hooks/use-on-change-table-column.d.ts.map +1 -1
  380. package/dist/esm/hooks/use-on-change-table-column.js +17 -5
  381. package/dist/esm/hooks/use-on-change.d.ts +36 -3
  382. package/dist/esm/hooks/use-on-change.d.ts.map +1 -1
  383. package/dist/esm/hooks/use-on-change.js +214 -124
  384. package/dist/esm/hooks/use-on-create-custom-table-style.d.ts +17 -0
  385. package/dist/esm/hooks/use-on-create-custom-table-style.d.ts.map +1 -0
  386. package/dist/esm/hooks/use-on-create-custom-table-style.js +26 -0
  387. package/dist/esm/hooks/use-on-create-named-range.d.ts +4 -2
  388. package/dist/esm/hooks/use-on-create-named-range.d.ts.map +1 -1
  389. package/dist/esm/hooks/use-on-create-named-range.js +11 -1
  390. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts +2 -1
  391. package/dist/esm/hooks/use-on-delete-cells-shift-left.d.ts.map +1 -1
  392. package/dist/esm/hooks/use-on-delete-cells-shift-left.js +3 -1
  393. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts +2 -1
  394. package/dist/esm/hooks/use-on-delete-cells-shift-up.d.ts.map +1 -1
  395. package/dist/esm/hooks/use-on-delete-cells-shift-up.js +3 -1
  396. package/dist/esm/hooks/use-on-delete-column.d.ts +2 -1
  397. package/dist/esm/hooks/use-on-delete-column.d.ts.map +1 -1
  398. package/dist/esm/hooks/use-on-delete-column.js +3 -1
  399. package/dist/esm/hooks/use-on-delete-row.d.ts +2 -1
  400. package/dist/esm/hooks/use-on-delete-row.d.ts.map +1 -1
  401. package/dist/esm/hooks/use-on-delete-row.js +3 -1
  402. package/dist/esm/hooks/use-on-delete-sheet.d.ts +9 -1
  403. package/dist/esm/hooks/use-on-delete-sheet.d.ts.map +1 -1
  404. package/dist/esm/hooks/use-on-delete-sheet.js +17 -1
  405. package/dist/esm/hooks/use-on-delete-table-row.d.ts +4 -1
  406. package/dist/esm/hooks/use-on-delete-table-row.d.ts.map +1 -1
  407. package/dist/esm/hooks/use-on-delete-table-row.js +19 -1
  408. package/dist/esm/hooks/use-on-delete.d.ts +5 -2
  409. package/dist/esm/hooks/use-on-delete.d.ts.map +1 -1
  410. package/dist/esm/hooks/use-on-delete.js +5 -1
  411. package/dist/esm/hooks/use-on-embeds.d.ts +7 -4
  412. package/dist/esm/hooks/use-on-embeds.d.ts.map +1 -1
  413. package/dist/esm/hooks/use-on-embeds.js +23 -6
  414. package/dist/esm/hooks/use-on-fill.d.ts +17 -2
  415. package/dist/esm/hooks/use-on-fill.d.ts.map +1 -1
  416. package/dist/esm/hooks/use-on-fill.js +27 -1
  417. package/dist/esm/hooks/use-on-filter-table.d.ts.map +1 -1
  418. package/dist/esm/hooks/use-on-filter-table.js +97 -26
  419. package/dist/esm/hooks/use-on-import-excel.d.ts +2 -1
  420. package/dist/esm/hooks/use-on-import-excel.d.ts.map +1 -1
  421. package/dist/esm/hooks/use-on-import-excel.js +4 -1
  422. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts +2 -1
  423. package/dist/esm/hooks/use-on-insert-cells-shift-down.d.ts.map +1 -1
  424. package/dist/esm/hooks/use-on-insert-cells-shift-down.js +3 -1
  425. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts +2 -1
  426. package/dist/esm/hooks/use-on-insert-cells-shift-right.d.ts.map +1 -1
  427. package/dist/esm/hooks/use-on-insert-cells-shift-right.js +3 -1
  428. package/dist/esm/hooks/use-on-insert-column.d.ts +2 -1
  429. package/dist/esm/hooks/use-on-insert-column.d.ts.map +1 -1
  430. package/dist/esm/hooks/use-on-insert-column.js +3 -1
  431. package/dist/esm/hooks/use-on-insert-row.d.ts +2 -1
  432. package/dist/esm/hooks/use-on-insert-row.d.ts.map +1 -1
  433. package/dist/esm/hooks/use-on-insert-row.js +3 -1
  434. package/dist/esm/hooks/use-on-insert-table-row.d.ts +5 -2
  435. package/dist/esm/hooks/use-on-insert-table-row.d.ts.map +1 -1
  436. package/dist/esm/hooks/use-on-insert-table-row.js +19 -1
  437. package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts +3 -2
  438. package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
  439. package/dist/esm/hooks/use-on-merge-unmerge-cells.js +12 -1
  440. package/dist/esm/hooks/use-on-move-columns.d.ts +3 -1
  441. package/dist/esm/hooks/use-on-move-columns.d.ts.map +1 -1
  442. package/dist/esm/hooks/use-on-move-columns.js +14 -1
  443. package/dist/esm/hooks/use-on-move-rows.d.ts +3 -1
  444. package/dist/esm/hooks/use-on-move-rows.d.ts.map +1 -1
  445. package/dist/esm/hooks/use-on-move-rows.js +14 -1
  446. package/dist/esm/hooks/use-on-move-selection.d.ts +3 -1
  447. package/dist/esm/hooks/use-on-move-selection.d.ts.map +1 -1
  448. package/dist/esm/hooks/use-on-move-selection.js +44 -1
  449. package/dist/esm/hooks/use-on-paste.d.ts +22 -1
  450. package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
  451. package/dist/esm/hooks/use-on-paste.js +815 -672
  452. package/dist/esm/hooks/use-on-remove-duplicates.d.ts +5 -2
  453. package/dist/esm/hooks/use-on-remove-duplicates.d.ts.map +1 -1
  454. package/dist/esm/hooks/use-on-remove-duplicates.js +5 -1
  455. package/dist/esm/hooks/use-on-request-create-table.d.ts +13 -0
  456. package/dist/esm/hooks/use-on-request-create-table.d.ts.map +1 -0
  457. package/dist/esm/hooks/use-on-request-create-table.js +43 -0
  458. package/dist/esm/hooks/use-on-request-insert-slicer.d.ts +7 -0
  459. package/dist/esm/hooks/use-on-request-insert-slicer.d.ts.map +1 -0
  460. package/dist/esm/hooks/use-on-request-insert-slicer.js +15 -0
  461. package/dist/esm/hooks/use-on-request-resize-table.d.ts +7 -0
  462. package/dist/esm/hooks/use-on-request-resize-table.d.ts.map +1 -0
  463. package/dist/esm/hooks/use-on-request-resize-table.js +15 -0
  464. package/dist/esm/hooks/use-on-resize-table.d.ts +5 -1
  465. package/dist/esm/hooks/use-on-resize-table.d.ts.map +1 -1
  466. package/dist/esm/hooks/use-on-resize-table.js +107 -27
  467. package/dist/esm/hooks/use-on-sort-column.d.ts +28 -3
  468. package/dist/esm/hooks/use-on-sort-column.d.ts.map +1 -1
  469. package/dist/esm/hooks/use-on-sort-column.js +105 -68
  470. package/dist/esm/hooks/use-on-sort-range.d.ts +26 -3
  471. package/dist/esm/hooks/use-on-sort-range.d.ts.map +1 -1
  472. package/dist/esm/hooks/use-on-sort-range.js +100 -64
  473. package/dist/esm/hooks/use-on-sort-table.d.ts +18 -1
  474. package/dist/esm/hooks/use-on-sort-table.d.ts.map +1 -1
  475. package/dist/esm/hooks/use-on-sort-table.js +107 -86
  476. package/dist/esm/hooks/use-on-subtotal.d.ts +10 -3
  477. package/dist/esm/hooks/use-on-subtotal.d.ts.map +1 -1
  478. package/dist/esm/hooks/use-on-subtotal.js +7 -5
  479. package/dist/esm/hooks/use-on-table.d.ts +39 -7
  480. package/dist/esm/hooks/use-on-table.d.ts.map +1 -1
  481. package/dist/esm/hooks/use-on-table.js +234 -26
  482. package/dist/esm/hooks/use-on-undo-calculated-column.d.ts +23 -0
  483. package/dist/esm/hooks/use-on-undo-calculated-column.d.ts.map +1 -0
  484. package/dist/esm/hooks/use-on-undo-calculated-column.js +62 -0
  485. package/dist/esm/hooks/use-on-undo-table-auto-expansion.d.ts +28 -0
  486. package/dist/esm/hooks/use-on-undo-table-auto-expansion.d.ts.map +1 -0
  487. package/dist/esm/hooks/use-on-undo-table-auto-expansion.js +75 -0
  488. package/dist/esm/hooks/use-on-update-named-range.d.ts +4 -2
  489. package/dist/esm/hooks/use-on-update-named-range.d.ts.map +1 -1
  490. package/dist/esm/hooks/use-on-update-named-range.js +13 -1
  491. package/dist/esm/hooks/use-sheet-properties.d.ts +1 -0
  492. package/dist/esm/hooks/use-sheet-properties.d.ts.map +1 -1
  493. package/dist/esm/hooks/use-sheet-properties.js +38 -19
  494. package/dist/esm/hooks/use-slicers.d.ts +2 -2
  495. package/dist/esm/hooks/use-slicers.d.ts.map +1 -1
  496. package/dist/esm/hooks/use-slicers.js +16 -8
  497. package/dist/esm/hooks/use-sparkline-groups.d.ts +50 -0
  498. package/dist/esm/hooks/use-sparkline-groups.d.ts.map +1 -0
  499. package/dist/esm/hooks/use-sparkline-groups.js +146 -0
  500. package/dist/esm/hooks/use-spreadsheet-state.d.ts +56 -10
  501. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  502. package/dist/esm/hooks/use-spreadsheet-state.js +259 -30
  503. package/dist/esm/hooks/use-structured-reference.d.ts.map +1 -1
  504. package/dist/esm/hooks/use-structured-reference.js +17 -0
  505. package/dist/esm/hooks/use-undo-redo-actions.d.ts +2 -1
  506. package/dist/esm/hooks/use-undo-redo-actions.d.ts.map +1 -1
  507. package/dist/esm/hooks/use-undo-redo-actions.js +8 -2
  508. package/dist/esm/hooks/use-undo-redo.d.ts +12 -0
  509. package/dist/esm/hooks/use-undo-redo.d.ts.map +1 -1
  510. package/dist/esm/hooks/use-undo-redo.js +158 -7
  511. package/dist/esm/hooks/utils/sort-rows.d.ts.map +1 -1
  512. package/dist/esm/hooks/utils/sort-rows.js +4 -3
  513. package/dist/esm/index.d.ts +7 -0
  514. package/dist/esm/index.d.ts.map +1 -1
  515. package/dist/esm/index.js +8 -0
  516. package/dist/esm/interface/apply-fill.d.ts +26 -3
  517. package/dist/esm/interface/apply-fill.d.ts.map +1 -1
  518. package/dist/esm/interface/apply-fill.js +188 -88
  519. package/dist/esm/interface/change-batch.d.ts +1 -1
  520. package/dist/esm/interface/change-batch.d.ts.map +1 -1
  521. package/dist/esm/interface/change-batch.js +89 -8
  522. package/dist/esm/interface/change-calculated-column.d.ts +6 -2
  523. package/dist/esm/interface/change-calculated-column.d.ts.map +1 -1
  524. package/dist/esm/interface/change-calculated-column.js +81 -16
  525. package/dist/esm/interface/change-table-column.d.ts +81 -7
  526. package/dist/esm/interface/change-table-column.d.ts.map +1 -1
  527. package/dist/esm/interface/change-table-column.js +295 -67
  528. package/dist/esm/interface/create-table.d.ts +15 -3
  529. package/dist/esm/interface/create-table.d.ts.map +1 -1
  530. package/dist/esm/interface/create-table.js +103 -27
  531. package/dist/esm/interface/delete-cells-shift-left.d.ts +1 -1
  532. package/dist/esm/interface/delete-cells-shift-left.d.ts.map +1 -1
  533. package/dist/esm/interface/delete-cells-shift-left.js +10 -1
  534. package/dist/esm/interface/delete-cells-shift-up.d.ts +1 -1
  535. package/dist/esm/interface/delete-cells-shift-up.d.ts.map +1 -1
  536. package/dist/esm/interface/delete-cells-shift-up.js +10 -1
  537. package/dist/esm/interface/delete-cells.d.ts +1 -1
  538. package/dist/esm/interface/delete-cells.d.ts.map +1 -1
  539. package/dist/esm/interface/delete-cells.js +47 -14
  540. package/dist/esm/interface/delete-column.d.ts +1 -1
  541. package/dist/esm/interface/delete-column.d.ts.map +1 -1
  542. package/dist/esm/interface/delete-column.js +9 -2
  543. package/dist/esm/interface/delete-row.d.ts +1 -1
  544. package/dist/esm/interface/delete-row.d.ts.map +1 -1
  545. package/dist/esm/interface/delete-row.js +173 -15
  546. package/dist/esm/interface/delete-sheet.d.ts +2 -2
  547. package/dist/esm/interface/delete-sheet.d.ts.map +1 -1
  548. package/dist/esm/interface/delete-sheet.js +113 -1
  549. package/dist/esm/interface/delete-table-column.d.ts +1 -1
  550. package/dist/esm/interface/delete-table-column.d.ts.map +1 -1
  551. package/dist/esm/interface/delete-table-column.js +11 -1
  552. package/dist/esm/interface/delete-table-row.d.ts +1 -1
  553. package/dist/esm/interface/delete-table-row.d.ts.map +1 -1
  554. package/dist/esm/interface/delete-table-row.js +312 -232
  555. package/dist/esm/interface/duplicate-sheet.d.ts.map +1 -1
  556. package/dist/esm/interface/duplicate-sheet.js +73 -26
  557. package/dist/esm/interface/embeds.d.ts +10 -1
  558. package/dist/esm/interface/embeds.d.ts.map +1 -1
  559. package/dist/esm/interface/embeds.js +84 -5
  560. package/dist/esm/interface/insert-cells-shift-down.d.ts +1 -1
  561. package/dist/esm/interface/insert-cells-shift-down.d.ts.map +1 -1
  562. package/dist/esm/interface/insert-cells-shift-down.js +10 -1
  563. package/dist/esm/interface/insert-cells-shift-right.d.ts +1 -1
  564. package/dist/esm/interface/insert-cells-shift-right.d.ts.map +1 -1
  565. package/dist/esm/interface/insert-cells-shift-right.js +10 -1
  566. package/dist/esm/interface/insert-column.d.ts +2 -2
  567. package/dist/esm/interface/insert-column.d.ts.map +1 -1
  568. package/dist/esm/interface/insert-column.js +48 -23
  569. package/dist/esm/interface/insert-row.d.ts +1 -1
  570. package/dist/esm/interface/insert-row.d.ts.map +1 -1
  571. package/dist/esm/interface/insert-row.js +9 -2
  572. package/dist/esm/interface/insert-table-row.d.ts +2 -1
  573. package/dist/esm/interface/insert-table-row.d.ts.map +1 -1
  574. package/dist/esm/interface/insert-table-row.js +67 -12
  575. package/dist/esm/interface/remove-duplicates.d.ts +1 -1
  576. package/dist/esm/interface/remove-duplicates.d.ts.map +1 -1
  577. package/dist/esm/interface/remove-duplicates.js +41 -6
  578. package/dist/esm/interface/remove-table.d.ts +1 -1
  579. package/dist/esm/interface/remove-table.d.ts.map +1 -1
  580. package/dist/esm/interface/remove-table.js +58 -10
  581. package/dist/esm/interface/slicers.d.ts +12 -1
  582. package/dist/esm/interface/slicers.d.ts.map +1 -1
  583. package/dist/esm/interface/slicers.js +44 -2
  584. package/dist/esm/interface/spreadsheet-interface.d.ts +1 -1
  585. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  586. package/dist/esm/interface/spreadsheet-interface.js +73 -1
  587. package/dist/esm/interface/table-totalrow.d.ts +13 -1
  588. package/dist/esm/interface/table-totalrow.d.ts.map +1 -1
  589. package/dist/esm/interface/table-totalrow.js +98 -68
  590. package/dist/esm/interface/table-utils.d.ts +59 -6
  591. package/dist/esm/interface/table-utils.d.ts.map +1 -1
  592. package/dist/esm/interface/table-utils.js +155 -14
  593. package/dist/esm/interface/update-table.d.ts +16 -1
  594. package/dist/esm/interface/update-table.d.ts.map +1 -1
  595. package/dist/esm/interface/update-table.js +203 -42
  596. package/dist/esm/sheet-cell.d.ts.map +1 -1
  597. package/dist/esm/test-setup.d.ts.map +1 -1
  598. package/dist/esm/test-setup.js +6 -0
  599. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  600. package/dist/esm/validation-schema/table.schema.d.ts +11 -0
  601. package/dist/esm/validation-schema/table.schema.d.ts.map +1 -1
  602. package/dist/esm/validation-schema/table.schema.js +15 -2
  603. package/package.json +19 -11
@@ -1,11 +1,15 @@
1
1
  import { __read, __values } from "tslib";
2
- import { isNil, isNumber } from "@rowsncolumns/utils";
2
+ import { getTotalsRowFormula, isNil, isNumber } from "@rowsncolumns/utils";
3
3
  import { produceWithPatches } from "immer";
4
4
  import { createSheetCellIdentifier } from "../api/formula";
5
5
  import { createSheetDraft } from "../api/immer-utils";
6
6
  import { SheetCell } from "../sheet-cell";
7
7
  /**
8
- * Add a total row to a table.
8
+ * Add a total row to a table the way Excel does when Total Row is switched on:
9
+ * "Total" in the first column and ONE structured-reference `SUBTOTAL` in the
10
+ * last column — Sum (`109`) when that column's body is all numbers, Count
11
+ * (`103`) otherwise; every other totals cell stays blank. A single-column
12
+ * table gets the formula.
9
13
  *
10
14
  * Expects `updatedTable.range` to already include the total row, i.e.
11
15
  * `range.endRowIndex` is the row the totals are written to.
@@ -15,104 +19,134 @@ export var addTotalRow = function (_a) {
15
19
  return function (sheetId, updatedTable, saveHistory) {
16
20
  // We need to track this for history. Precedent cells
17
21
  var recalcCells = new Map();
18
- /**
19
- * 1. Validate number columns
20
- * 2. Add Subtotal function
21
- */
22
- var numberColumnIndexes = [];
23
22
  var sheetCell = new SheetCell();
24
23
  var _a = updatedTable.range, startRowIndex = _a.startRowIndex, startColumnIndex = _a.startColumnIndex, endRowIndex = _a.endRowIndex, endColumnIndex = _a.endColumnIndex;
25
- // Add total text
26
24
  var totalRowIndex = endRowIndex;
25
+ var bodyStartRowIndex = startRowIndex + (updatedTable.headerRow !== false ? 1 : 0);
27
26
  /**
28
27
  * Update sheet
29
28
  */
30
29
  onChangeSheetData === null || onChangeSheetData === void 0 ? void 0 : onChangeSheetData(function (prevSheetData) {
31
30
  var _a = __read(produceWithPatches(prevSheetData, function (draft) {
32
- var e_1, _a;
33
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
34
- // User is adding a total row
35
- for (var columnIndex = startColumnIndex; columnIndex <= endColumnIndex; columnIndex++) {
31
+ var _a, _b, _c;
32
+ // Is every non-blank body cell of the column a number? Dates are
33
+ // stored as numbers, but summing them is meaningless.
34
+ var isNumericColumn = function (columnIndex) {
35
+ var _a, _b, _c;
36
36
  var values = [];
37
- var isDateColumn = false;
38
- for (var rowIndex = startRowIndex + (updatedTable.headerRow ? 1 : 0); rowIndex < totalRowIndex; rowIndex++) {
39
- var cellData = (_d = (_c = (_b = draft[sheetId]) === null || _b === void 0 ? void 0 : _b[rowIndex]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[columnIndex];
40
- sheetCell.assign(sheetId, {
41
- rowIndex: rowIndex,
42
- columnIndex: columnIndex,
43
- }, cellData, { locale: locale });
44
- var effectiveValue = sheetCell.getEffectiveValue();
37
+ for (var rowIndex = bodyStartRowIndex; rowIndex < totalRowIndex; rowIndex++) {
38
+ var cellData = (_c = (_b = (_a = draft[sheetId]) === null || _a === void 0 ? void 0 : _a[rowIndex]) === null || _b === void 0 ? void 0 : _b.values) === null || _c === void 0 ? void 0 : _c[columnIndex];
39
+ sheetCell.assign(sheetId, { rowIndex: rowIndex, columnIndex: columnIndex }, cellData, {
40
+ locale: locale,
41
+ });
45
42
  var numberFormat = sheetCell.getNumberFormat();
46
- // Dates are stored as numbers, but summing them is meaningless
47
43
  if ((numberFormat === null || numberFormat === void 0 ? void 0 : numberFormat.type) === "DATE" ||
48
44
  (numberFormat === null || numberFormat === void 0 ? void 0 : numberFormat.type) === "DATE_TIME") {
49
- isDateColumn = true;
50
- break;
45
+ return false;
51
46
  }
47
+ var effectiveValue = sheetCell.getEffectiveValue();
52
48
  if (!isNil(effectiveValue)) {
53
49
  values.push(effectiveValue);
54
50
  }
55
51
  }
56
- if (!isDateColumn && values.length && values.every(isNumber)) {
57
- numberColumnIndexes.push(columnIndex);
58
- }
52
+ return values.length > 0 && values.every(isNumber);
53
+ };
54
+ var currentSheet = createSheetDraft(draft, sheetId, totalRowIndex);
55
+ var writeTotalCell = function (columnIndex, value) {
56
+ var _a, _b;
57
+ sheetCell.assign(sheetId, { rowIndex: totalRowIndex, columnIndex: columnIndex }, (_b = (_a = currentSheet[totalRowIndex]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b[columnIndex], { locale: locale });
58
+ sheetCell.setUserEnteredValue(value);
59
+ // The totals row's bold and top rule come from the table style's
60
+ // `totalRow` band, not from an explicit cell format.
61
+ currentSheet[totalRowIndex].values[columnIndex] =
62
+ sheetCell.getCellData();
63
+ };
64
+ var writeTotalFormula = function (columnIndex, formula) {
65
+ writeTotalCell(columnIndex, formula);
66
+ var position = { rowIndex: totalRowIndex, columnIndex: columnIndex, sheetId: sheetId };
67
+ enqueueCalculation({ type: "add", position: position });
68
+ recalcCells.set(createSheetCellIdentifier(sheetId, totalRowIndex, columnIndex), position);
69
+ };
70
+ // A column with a recorded `totalsRowFunction` (the totals dropdown's
71
+ // choice, kept across toggles) regenerates that; the others take
72
+ // Excel's defaults below.
73
+ var recorded = new Set();
74
+ for (var columnIndex = startColumnIndex; columnIndex <= endColumnIndex; columnIndex++) {
75
+ var column = (_a = updatedTable.columns) === null || _a === void 0 ? void 0 : _a[columnIndex - startColumnIndex];
76
+ var fn = column === null || column === void 0 ? void 0 : column.totalsRowFunction;
77
+ if (!fn)
78
+ continue;
79
+ recorded.add(columnIndex);
80
+ var formula = (column === null || column === void 0 ? void 0 : column.name)
81
+ ? getTotalsRowFormula(fn, updatedTable.title, column.name)
82
+ : undefined;
83
+ if (formula)
84
+ writeTotalFormula(columnIndex, formula);
85
+ }
86
+ var lastColumnName = (_c = (_b = updatedTable.columns) === null || _b === void 0 ? void 0 : _b[endColumnIndex - startColumnIndex]) === null || _c === void 0 ? void 0 : _c.name;
87
+ var lastColumnFormula = lastColumnName && !recorded.has(endColumnIndex)
88
+ ? getTotalsRowFormula(isNumericColumn(endColumnIndex) ? "sum" : "count", updatedTable.title, lastColumnName)
89
+ : undefined;
90
+ // The total label owns the first column unless the formula needs it
91
+ // (single-column table).
92
+ if (!recorded.has(startColumnIndex) &&
93
+ (endColumnIndex > startColumnIndex || !lastColumnFormula)) {
94
+ writeTotalCell(startColumnIndex, "Total");
59
95
  }
96
+ if (lastColumnFormula) {
97
+ writeTotalFormula(endColumnIndex, lastColumnFormula);
98
+ }
99
+ }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
100
+ saveHistory({
101
+ sheetData: { patches: patches, inversePatches: inversePatches },
102
+ recalcCells: { undo: recalcCells, redo: recalcCells },
103
+ });
104
+ return nextState;
105
+ });
106
+ };
107
+ };
108
+ /**
109
+ * Rewrite the totals-row cells of `columnIndexes` from their column's recorded
110
+ * `totalsRowFunction` (the totals dropdown's choice): a function writes its
111
+ * structured `SUBTOTAL`, `none` (or no name to reference) clears the cell.
112
+ *
113
+ * Expects `table.range` to include the total row (`range.endRowIndex`).
114
+ */
115
+ export var setTotalRowFunctions = function (_a) {
116
+ var locale = _a.locale, onChangeSheetData = _a.onChangeSheetData, enqueueCalculation = _a.enqueueCalculation;
117
+ return function (sheetId, table, columnIndexes, saveHistory) {
118
+ var recalcCells = new Map();
119
+ var sheetCell = new SheetCell();
120
+ var totalRowIndex = table.range.endRowIndex;
121
+ onChangeSheetData === null || onChangeSheetData === void 0 ? void 0 : onChangeSheetData(function (prevSheetData) {
122
+ var _a = __read(produceWithPatches(prevSheetData, function (draft) {
123
+ var e_1, _a;
124
+ var _b, _c, _d;
60
125
  var currentSheet = createSheetDraft(draft, sheetId, totalRowIndex);
61
- sheetCell.assign(sheetId, {
62
- rowIndex: totalRowIndex,
63
- columnIndex: startColumnIndex,
64
- }, (_f = (_e = currentSheet[totalRowIndex]) === null || _e === void 0 ? void 0 : _e.values) === null || _f === void 0 ? void 0 : _f[startColumnIndex], { locale: locale });
65
- // Add total text
66
- sheetCell.setUserEnteredValue("Total");
67
- // Bold, can be overridden by user
68
- sheetCell.setUserEnteredFormat("textFormat", {
69
- bold: true,
70
- });
71
- // Set cell data
72
- currentSheet[totalRowIndex].values[startColumnIndex] =
73
- sheetCell.getCellData();
74
126
  try {
75
- // Add subtotal
76
- for (var numberColumnIndexes_1 = __values(numberColumnIndexes), numberColumnIndexes_1_1 = numberColumnIndexes_1.next(); !numberColumnIndexes_1_1.done; numberColumnIndexes_1_1 = numberColumnIndexes_1.next()) {
77
- var columnIndex = numberColumnIndexes_1_1.value;
78
- // The total label owns the first column
79
- if (columnIndex === startColumnIndex) {
80
- continue;
81
- }
82
- var rowIndex = totalRowIndex;
83
- var cellData = (_j = (_h = (_g = draft[sheetId]) === null || _g === void 0 ? void 0 : _g[rowIndex]) === null || _h === void 0 ? void 0 : _h.values) === null || _j === void 0 ? void 0 : _j[columnIndex];
84
- sheetCell.assign(sheetId, {
85
- columnIndex: columnIndex,
86
- rowIndex: rowIndex,
87
- }, cellData, { locale: locale });
88
- var columnName = (_l = (_k = updatedTable.columns) === null || _k === void 0 ? void 0 : _k[columnIndex - startColumnIndex]) === null || _l === void 0 ? void 0 : _l.name;
89
- if (columnName) {
90
- sheetCell.setUserEnteredValue("=SUBTOTAL(109, [".concat(columnName, "])"));
127
+ for (var columnIndexes_1 = __values(columnIndexes), columnIndexes_1_1 = columnIndexes_1.next(); !columnIndexes_1_1.done; columnIndexes_1_1 = columnIndexes_1.next()) {
128
+ var columnIndex = columnIndexes_1_1.value;
129
+ var column = (_b = table.columns) === null || _b === void 0 ? void 0 : _b[columnIndex - table.range.startColumnIndex];
130
+ var formula = (column === null || column === void 0 ? void 0 : column.totalsRowFunction) && column.name
131
+ ? getTotalsRowFormula(column.totalsRowFunction, table.title, column.name)
132
+ : undefined;
133
+ sheetCell.assign(sheetId, { rowIndex: totalRowIndex, columnIndex: columnIndex }, formula ? (_d = (_c = currentSheet[totalRowIndex]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[columnIndex] : undefined, { locale: locale });
134
+ if (formula) {
135
+ sheetCell.setUserEnteredValue(formula);
91
136
  // Bold, can be overridden by user
92
- sheetCell.setUserEnteredFormat("textFormat", {
93
- bold: true,
94
- });
95
- // Set cell data
96
- currentSheet[totalRowIndex].values[columnIndex] =
97
- sheetCell.getCellData();
98
- var position = {
99
- rowIndex: rowIndex,
100
- columnIndex: columnIndex,
101
- sheetId: sheetId,
102
- };
103
- enqueueCalculation({
104
- type: "add",
105
- position: position,
106
- });
107
- // Add sheet id
108
- recalcCells.set(createSheetCellIdentifier(sheetId, rowIndex, columnIndex), position);
137
+ sheetCell.setUserEnteredFormat("textFormat", { bold: true });
109
138
  }
139
+ currentSheet[totalRowIndex].values[columnIndex] =
140
+ sheetCell.getCellData();
141
+ var position = { rowIndex: totalRowIndex, columnIndex: columnIndex, sheetId: sheetId };
142
+ enqueueCalculation({ type: "add", position: position });
143
+ recalcCells.set(createSheetCellIdentifier(sheetId, totalRowIndex, columnIndex), position);
110
144
  }
111
145
  }
112
146
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
113
147
  finally {
114
148
  try {
115
- if (numberColumnIndexes_1_1 && !numberColumnIndexes_1_1.done && (_a = numberColumnIndexes_1.return)) _a.call(numberColumnIndexes_1);
149
+ if (columnIndexes_1_1 && !columnIndexes_1_1.done && (_a = columnIndexes_1.return)) _a.call(columnIndexes_1);
116
150
  }
117
151
  finally { if (e_1) throw e_1.error; }
118
152
  }
@@ -1,21 +1,74 @@
1
- import type { GridRange } from "@rowsncolumns/common-types";
2
- import type { CellData, TableView } from "@rowsncolumns/spreadsheet";
1
+ import type { GridRange, SelectionArea } from "@rowsncolumns/common-types";
2
+ import type { CellData, Column, TableView } from "@rowsncolumns/spreadsheet";
3
3
  import type { Draft } from "immer";
4
4
  import type { GeneratedNames } from "../generated-names";
5
+ import type { SheetData } from "../hooks/use-spreadsheet-state";
6
+ /**
7
+ * Does any cell of `rowIndex` within a table's columns hold a value or formula?
8
+ * Decides whether switching Total Row on must first shift the row below the
9
+ * table down (Excel inserts a row rather than overwrite data).
10
+ */
11
+ export declare const tableRowHasContent: <T extends CellData>(rows: SheetData<T>[number] | undefined, rowIndex: number, startColumnIndex: number, endColumnIndex: number) => boolean;
12
+ /**
13
+ * Excel's Header Row → ON re-adds the header ABOVE the data when the row above the table is free:
14
+ * it exists, holds no value or formula in the table's columns, and belongs to no other table.
15
+ * Otherwise the first data row becomes the header row in place.
16
+ */
17
+ export declare const tableHeaderRowAboveIsFree: <T extends CellData>({ sheetId, table, sheetData, tables, }: {
18
+ sheetId: number;
19
+ table: TableView;
20
+ sheetData: SheetData<T> | undefined;
21
+ tables: TableView[] | undefined;
22
+ }) => boolean;
5
23
  export declare const rangesOverlap: (a: GridRange, b: GridRange) => boolean;
6
24
  export declare const tableWouldOverlap: (candidate: {
7
25
  sheetId: number;
8
26
  range: GridRange;
9
27
  id?: TableView["id"];
10
28
  }, existing: TableView[] | undefined) => boolean;
11
- type AddTableColumnOptions<T extends CellData> = {
29
+ /**
30
+ * Excel: a table's header names are unique, compared case-insensitively — a duplicate takes the
31
+ * next free numeric suffix (`Name`, `Name2`, `Name3`).
32
+ */
33
+ export declare const getUniqueTableColumnName: (name: string, taken: Iterable<string>) => string;
34
+ type TableHeaderNamesOptions = {
12
35
  sheetId: number;
13
- draft: Draft<any>;
14
36
  range: GridRange;
15
37
  getFormattedValue: (sheetId: number, rowIndex: number, columnIndex: number) => string | null | undefined;
16
- locale?: string;
17
38
  generatedNames?: GeneratedNames;
39
+ /** Columns the table already names, by position — kept as they are; only the rest are derived. */
40
+ columns?: (Column | undefined)[] | null;
18
41
  };
19
- export declare const addTableColumn: <T extends CellData>({ draft, sheetId, range, getFormattedValue, locale, generatedNames, }: AddTableColumnOptions<T>) => void;
42
+ /**
43
+ * The header names a table takes over `range` (Excel): a column the table already names keeps
44
+ * that name; every other column takes its header cell's display text, de-duplicated against the
45
+ * names before it (`Name`, `Name2`, …), and a blank header cell takes the first free `ColumnN`.
46
+ */
47
+ export declare const getTableHeaderNames: ({ sheetId, range, getFormattedValue, generatedNames, columns, }: TableHeaderNamesOptions) => string[];
48
+ type AddTableColumnOptions<T extends CellData> = TableHeaderNamesOptions & {
49
+ draft: Draft<any>;
50
+ locale?: string;
51
+ };
52
+ /**
53
+ * Write a table's header row: every header cell holds its column's name as TEXT (Excel stores
54
+ * headers as text — a `2024` header becomes the string "2024"), so a blank, numeric, formula or
55
+ * de-duplicated header cell is (re)written; a text cell already reading its name is left alone.
56
+ * The names come from {@link getTableHeaderNames}, so the table's `columns` and its cells agree.
57
+ */
58
+ export declare const addTableColumn: <T extends CellData>({ draft, sheetId, range, getFormattedValue, locale, generatedNames, columns, }: AddTableColumnOptions<T>) => string[];
59
+ export type TableHeaderRefill = {
60
+ tableId: TableView["id"];
61
+ rowIndex: number;
62
+ columnIndex: number;
63
+ /** Position of the header within `table.columns`. */
64
+ dimensionIndex: number;
65
+ name: string;
66
+ };
67
+ export declare const getTableHeaderRefills: ({ sheetId, tables, selections, generatedNames, }: {
68
+ sheetId: number;
69
+ tables: TableView[] | undefined;
70
+ selections: Pick<SelectionArea, "range">[];
71
+ generatedNames?: GeneratedNames;
72
+ }) => TableHeaderRefill[];
20
73
  export {};
21
74
  //# sourceMappingURL=table-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-utils.d.ts","sourceRoot":"","sources":["../../../interface/table-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAU,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAOzD,eAAO,MAAM,aAAa,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,KAAG,OAMxD,CAAC;AAEJ,eAAO,MAAM,iBAAiB,GAC5B,WAAW;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;CAAE,EACtE,UAAU,SAAS,EAAE,GAAG,SAAS,KAChC,OAQF,CAAC;AAEF,KAAK,qBAAqB,CAAC,CAAC,SAAS,QAAQ,IAAI;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,QAAQ,EAAE,uEAOhD,qBAAqB,CAAC,CAAC,CAAC,SAoC1B,CAAC"}
1
+ {"version":3,"file":"table-utils.d.ts","sourceRoot":"","sources":["../../../interface/table-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAGhE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,QAAQ,EACnD,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,EACtC,UAAU,MAAM,EAChB,kBAAkB,MAAM,EACxB,gBAAgB,MAAM,KACrB,OAUF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,SAAS,QAAQ,EAAE,wCAK3D;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;CACjC,KAAG,OAqBH,CAAC;AAKF,eAAO,MAAM,aAAa,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,KAAG,OAMxD,CAAC;AAEJ,eAAO,MAAM,iBAAiB,GAC5B,WAAW;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;CAAE,EACtE,UAAU,SAAS,EAAE,GAAG,SAAS,KAChC,OAQF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,EACZ,OAAO,QAAQ,CAAC,MAAM,CAAC,KACtB,MAaF,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,kGAAkG;IAClG,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,iEAMjC,uBAAuB,KAAG,MAAM,EA2BlC,CAAC;AAEF,KAAK,qBAAqB,CAAC,CAAC,SAAS,QAAQ,IAAI,uBAAuB,GAAG;IACzE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA6BF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,QAAQ,EAAE,gFAQhD,qBAAqB,CAAC,CAAC,CAAC,aAyC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAMF,eAAO,MAAM,qBAAqB,GAAI,kDAKnC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,KAAG,iBAAiB,EAuCpB,CAAC"}
@@ -1,6 +1,45 @@
1
+ import { __assign, __read, __spreadArray, __values } from "tslib";
2
+ import { getCellUserEnteredValue } from "@rowsncolumns/utils";
1
3
  import { createSheetDraft } from "../api/immer-utils";
2
4
  import { getNextTableColumnName } from "../helpers";
3
5
  import { SheetCell } from "../sheet-cell";
6
+ /**
7
+ * Does any cell of `rowIndex` within a table's columns hold a value or formula?
8
+ * Decides whether switching Total Row on must first shift the row below the
9
+ * table down (Excel inserts a row rather than overwrite data).
10
+ */
11
+ export var tableRowHasContent = function (rows, rowIndex, startColumnIndex, endColumnIndex) {
12
+ var _a;
13
+ var values = (_a = rows === null || rows === void 0 ? void 0 : rows[rowIndex]) === null || _a === void 0 ? void 0 : _a.values;
14
+ if (!values)
15
+ return false;
16
+ for (var columnIndex = startColumnIndex; columnIndex <= endColumnIndex; columnIndex++) {
17
+ var ue = getCellUserEnteredValue(values[columnIndex]);
18
+ if (ue && Object.values(ue).some(function (value) { return value !== undefined && value !== null; })) {
19
+ return true;
20
+ }
21
+ }
22
+ return false;
23
+ };
24
+ /**
25
+ * Excel's Header Row → ON re-adds the header ABOVE the data when the row above the table is free:
26
+ * it exists, holds no value or formula in the table's columns, and belongs to no other table.
27
+ * Otherwise the first data row becomes the header row in place.
28
+ */
29
+ export var tableHeaderRowAboveIsFree = function (_a) {
30
+ var sheetId = _a.sheetId, table = _a.table, sheetData = _a.sheetData, tables = _a.tables;
31
+ var rowIndex = table.range.startRowIndex - 1;
32
+ if (rowIndex < 1)
33
+ return false;
34
+ if (tableRowHasContent(sheetData === null || sheetData === void 0 ? void 0 : sheetData[sheetId], rowIndex, table.range.startColumnIndex, table.range.endColumnIndex)) {
35
+ return false;
36
+ }
37
+ return !tableWouldOverlap({
38
+ sheetId: sheetId,
39
+ id: table.id,
40
+ range: __assign(__assign({}, table.range), { startRowIndex: rowIndex, endRowIndex: rowIndex }),
41
+ }, tables);
42
+ };
4
43
  // Excel rejects (recovers + drops) tables whose rectangles overlap on the same
5
44
  // sheet. Validate before mutating state so we never accumulate bad data that
6
45
  // later fails to export cleanly.
@@ -19,26 +58,183 @@ export var tableWouldOverlap = function (candidate, existing) {
19
58
  rangesOverlap(t.range, candidate.range);
20
59
  });
21
60
  };
61
+ /**
62
+ * Excel: a table's header names are unique, compared case-insensitively — a duplicate takes the
63
+ * next free numeric suffix (`Name`, `Name2`, `Name3`).
64
+ */
65
+ export var getUniqueTableColumnName = function (name, taken) {
66
+ var e_1, _a;
67
+ var lower = new Set();
68
+ try {
69
+ for (var taken_1 = __values(taken), taken_1_1 = taken_1.next(); !taken_1_1.done; taken_1_1 = taken_1.next()) {
70
+ var existing = taken_1_1.value;
71
+ lower.add(existing.toLowerCase());
72
+ }
73
+ }
74
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
75
+ finally {
76
+ try {
77
+ if (taken_1_1 && !taken_1_1.done && (_a = taken_1.return)) _a.call(taken_1);
78
+ }
79
+ finally { if (e_1) throw e_1.error; }
80
+ }
81
+ if (!lower.has(name.toLowerCase())) {
82
+ return name;
83
+ }
84
+ var suffix = 2;
85
+ while (lower.has("".concat(name).concat(suffix).toLowerCase())) {
86
+ suffix++;
87
+ }
88
+ return "".concat(name).concat(suffix);
89
+ };
90
+ /**
91
+ * The header names a table takes over `range` (Excel): a column the table already names keeps
92
+ * that name; every other column takes its header cell's display text, de-duplicated against the
93
+ * names before it (`Name`, `Name2`, …), and a blank header cell takes the first free `ColumnN`.
94
+ */
95
+ export var getTableHeaderNames = function (_a) {
96
+ var _b;
97
+ var sheetId = _a.sheetId, range = _a.range, getFormattedValue = _a.getFormattedValue, generatedNames = _a.generatedNames, columns = _a.columns;
98
+ var names = [];
99
+ var reserved = (columns !== null && columns !== void 0 ? columns : []).flatMap(function (column) {
100
+ return (column === null || column === void 0 ? void 0 : column.name) ? [{ name: column.name }] : [];
101
+ });
102
+ for (var columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
103
+ var existing = (_b = columns === null || columns === void 0 ? void 0 : columns[columnIndex - range.startColumnIndex]) === null || _b === void 0 ? void 0 : _b.name;
104
+ if (existing) {
105
+ names.push(existing);
106
+ continue;
107
+ }
108
+ var text = getFormattedValue(sheetId, range.startRowIndex, columnIndex);
109
+ var taken = __spreadArray(__spreadArray([], __read(reserved), false), __read(names.map(function (name) { return ({ name: name }); })), false);
110
+ names.push(text
111
+ ? getUniqueTableColumnName(text, taken.map(function (column) { return column.name; }))
112
+ : getNextTableColumnName(taken, generatedNames));
113
+ }
114
+ return names;
115
+ };
116
+ /** True when the cell is plain text (not a number, boolean or formula) reading exactly `text`. */
117
+ var isTextCellReading = function (cellData, text, formattedValue) {
118
+ if (!cellData) {
119
+ return false;
120
+ }
121
+ var ue = cellData.ue;
122
+ var typed = (ue === null || ue === void 0 ? void 0 : ue.fv) != null ||
123
+ (ue === null || ue === void 0 ? void 0 : ue.formulaValue) != null ||
124
+ (ue === null || ue === void 0 ? void 0 : ue.nv) != null ||
125
+ (ue === null || ue === void 0 ? void 0 : ue.numberValue) != null ||
126
+ (ue === null || ue === void 0 ? void 0 : ue.bv) != null ||
127
+ (ue === null || ue === void 0 ? void 0 : ue.boolValue) != null;
128
+ if (typed) {
129
+ return false;
130
+ }
131
+ return ((ue === null || ue === void 0 ? void 0 : ue.sv) === text ||
132
+ (ue === null || ue === void 0 ? void 0 : ue.stringValue) === text ||
133
+ (cellData.ss != null && formattedValue === text));
134
+ };
135
+ /**
136
+ * Write a table's header row: every header cell holds its column's name as TEXT (Excel stores
137
+ * headers as text — a `2024` header becomes the string "2024"), so a blank, numeric, formula or
138
+ * de-duplicated header cell is (re)written; a text cell already reading its name is left alone.
139
+ * The names come from {@link getTableHeaderNames}, so the table's `columns` and its cells agree.
140
+ */
22
141
  export var addTableColumn = function (_a) {
23
142
  var _b, _c, _d;
24
- var draft = _a.draft, sheetId = _a.sheetId, range = _a.range, getFormattedValue = _a.getFormattedValue, locale = _a.locale, generatedNames = _a.generatedNames;
25
- // Validate first row
26
- var columns = [];
143
+ var draft = _a.draft, sheetId = _a.sheetId, range = _a.range, getFormattedValue = _a.getFormattedValue, locale = _a.locale, generatedNames = _a.generatedNames, columns = _a.columns;
144
+ var names = getTableHeaderNames({
145
+ sheetId: sheetId,
146
+ range: range,
147
+ getFormattedValue: getFormattedValue,
148
+ generatedNames: generatedNames,
149
+ columns: columns,
150
+ });
27
151
  var sheetCell = new SheetCell();
28
152
  var currentSheet = createSheetDraft(draft, sheetId, range.startRowIndex);
29
153
  for (var columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
30
- var formattedValue = getFormattedValue(sheetId, range.startRowIndex, columnIndex);
31
- // Get table column name
32
- var columnName = getNextTableColumnName(columns, generatedNames);
33
- // Add name to empty header cell
34
- if (!formattedValue) {
35
- sheetCell.assign(sheetId, { rowIndex: range.startRowIndex, columnIndex: columnIndex }, (_d = (_c = (_b = draft === null || draft === void 0 ? void 0 : draft[sheetId]) === null || _b === void 0 ? void 0 : _b[range.startRowIndex]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[columnIndex], { locale: locale });
36
- sheetCell.setUserEnteredValue(columnName);
37
- currentSheet[range.startRowIndex].values[columnIndex] =
38
- sheetCell.getCellData();
39
- }
40
- columns.push({
41
- name: formattedValue || columnName,
154
+ var name_1 = names[columnIndex - range.startColumnIndex];
155
+ var cellData = (_d = (_c = (_b = draft === null || draft === void 0 ? void 0 : draft[sheetId]) === null || _b === void 0 ? void 0 : _b[range.startRowIndex]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[columnIndex];
156
+ if (isTextCellReading(cellData, name_1, getFormattedValue(sheetId, range.startRowIndex, columnIndex))) {
157
+ continue;
158
+ }
159
+ sheetCell.assign(sheetId, { rowIndex: range.startRowIndex, columnIndex: columnIndex }, cellData, { locale: locale });
160
+ sheetCell.setUserEnteredValue(name_1, undefined, {
161
+ disableTypeInference: true,
42
162
  });
163
+ currentSheet[range.startRowIndex].values[columnIndex] =
164
+ sheetCell.getCellData();
165
+ }
166
+ return names;
167
+ };
168
+ // Excel keeps a table under Delete / Clear contents: the cells empty out but
169
+ // the table stays, and a cleared header cell falls back to the first free
170
+ // generic `ColumnN` name — a table column is never nameless. Names the table
171
+ // still uses (uncleared headers) stay reserved so the refills never collide.
172
+ export var getTableHeaderRefills = function (_a) {
173
+ var e_2, _b;
174
+ var _c;
175
+ var sheetId = _a.sheetId, tables = _a.tables, selections = _a.selections, generatedNames = _a.generatedNames;
176
+ var refills = [];
177
+ var _loop_1 = function (table) {
178
+ var e_3, _f, e_4, _g;
179
+ if (table.sheetId !== sheetId || table.headerRow === false)
180
+ return "continue";
181
+ var _h = table.range, rowIndex = _h.startRowIndex, startColumnIndex = _h.startColumnIndex, endColumnIndex = _h.endColumnIndex;
182
+ var cleared = new Set();
183
+ try {
184
+ for (var selections_1 = (e_3 = void 0, __values(selections)), selections_1_1 = selections_1.next(); !selections_1_1.done; selections_1_1 = selections_1.next()) {
185
+ var range = selections_1_1.value.range;
186
+ if (rowIndex < range.startRowIndex || rowIndex > range.endRowIndex) {
187
+ continue;
188
+ }
189
+ for (var columnIndex = Math.max(startColumnIndex, range.startColumnIndex); columnIndex <= Math.min(endColumnIndex, range.endColumnIndex); columnIndex++) {
190
+ cleared.add(columnIndex);
191
+ }
192
+ }
193
+ }
194
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
195
+ finally {
196
+ try {
197
+ if (selections_1_1 && !selections_1_1.done && (_f = selections_1.return)) _f.call(selections_1);
198
+ }
199
+ finally { if (e_3) throw e_3.error; }
200
+ }
201
+ if (!cleared.size)
202
+ return "continue";
203
+ var columns = ((_c = table.columns) !== null && _c !== void 0 ? _c : []).filter(function (_, dimensionIndex) { return !cleared.has(startColumnIndex + dimensionIndex); });
204
+ try {
205
+ for (var _j = (e_4 = void 0, __values(__spreadArray([], __read(cleared), false).sort(function (a, b) { return a - b; }))), _k = _j.next(); !_k.done; _k = _j.next()) {
206
+ var columnIndex = _k.value;
207
+ var name_2 = getNextTableColumnName(columns, generatedNames);
208
+ columns.push({ name: name_2 });
209
+ refills.push({
210
+ tableId: table.id,
211
+ rowIndex: rowIndex,
212
+ columnIndex: columnIndex,
213
+ dimensionIndex: columnIndex - startColumnIndex,
214
+ name: name_2,
215
+ });
216
+ }
217
+ }
218
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
219
+ finally {
220
+ try {
221
+ if (_k && !_k.done && (_g = _j.return)) _g.call(_j);
222
+ }
223
+ finally { if (e_4) throw e_4.error; }
224
+ }
225
+ };
226
+ try {
227
+ for (var _d = __values(tables !== null && tables !== void 0 ? tables : []), _e = _d.next(); !_e.done; _e = _d.next()) {
228
+ var table = _e.value;
229
+ _loop_1(table);
230
+ }
231
+ }
232
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
233
+ finally {
234
+ try {
235
+ if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
236
+ }
237
+ finally { if (e_2) throw e_2.error; }
43
238
  }
239
+ return refills;
44
240
  };
@@ -1,4 +1,19 @@
1
+ import type { GridRange } from "@rowsncolumns/common-types";
1
2
  import type { CellData, Sheet, TableView } from "@rowsncolumns/spreadsheet";
2
3
  import type { UseOnTableProps } from "../hooks/use-on-table";
3
- export declare const updateTable: <T extends CellData, S extends Sheet>({ locale, tables, enqueueCalculation, createHistory, onChangeTables, onChangeSheetData, getFormattedValue, getDependents, generatedNames, }: Pick<UseOnTableProps<T, S>, "locale" | "tables" | "enqueueCalculation" | "getDependents" | "createHistory" | "onChangeTables" | "onChangeSheetData" | "getFormattedValue" | "generatedNames">) => (sheetId: number, tableId: TableView["id"], updatedTable: Partial<TableView>) => void;
4
+ /**
5
+ * The range an update gives `table`: an explicit range that differs from the current one is taken
6
+ * as is (Excel's Resize Table — the dialog's range wins, whatever toggles ride along); else the
7
+ * current range grown by one row when the update turns the total row on and shrunk by one when it
8
+ * turns it off, with the header row toggle moving the top edge (Excel): OFF drops the header row
9
+ * out of the table (the range starts one row lower — never past the last data row), ON re-adds a
10
+ * header row ABOVE the data when `headerRowAboveIsFree` (see `tableHeaderRowAboveIsFree`), else
11
+ * the first data row becomes the header in place. Same rule as the rnc engine's
12
+ * `table_spec_range`. The hook's refusal guard and the update itself must agree on it, so both
13
+ * resolve it here.
14
+ */
15
+ export declare const resolveUpdatedTableRange: (table: TableView, updatedTable: Partial<TableView>, { headerRowAboveIsFree }?: {
16
+ headerRowAboveIsFree?: boolean;
17
+ }) => GridRange;
18
+ export declare const updateTable: <T extends CellData, S extends Sheet>({ locale, tables, namedRanges, enqueueCalculation, enqueueGraphOperation, getGraphNodes, createHistory, onChangeTables, onChangeSheetData, getFormattedValue, getDependents, generatedNames, sheetData, rowCount, columnCount, cellXfsRegistry, sharedStringRegistry, getSheetName, getActiveCell, enqueueStructureChange, onChangeSheets, onChangeDataValidations, onChangeConditionalFormats, }: Pick<UseOnTableProps<T, S>, "locale" | "tables" | "namedRanges" | "enqueueCalculation" | "getDependents" | "createHistory" | "onChangeTables" | "onChangeSheetData" | "getFormattedValue" | "generatedNames" | "sheetData" | "rowCount" | "columnCount" | "cellXfsRegistry" | "sharedStringRegistry" | "getSheetName" | "getActiveCell" | "enqueueGraphOperation" | "enqueueStructureChange" | "onChangeSheets" | "onChangeDataValidations" | "onChangeConditionalFormats"> & Partial<Pick<UseOnTableProps<T, S>, "getGraphNodes">>) => (sheetId: number, tableId: TableView["id"], updatedTable: Partial<TableView>) => void;
4
19
  //# sourceMappingURL=update-table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-table.d.ts","sourceRoot":"","sources":["../../../interface/update-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAI5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,6IAU9D,IAAI,CACL,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EACnB,QAAQ,GACR,QAAQ,GACR,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,CACnB,MAEG,SAAS,MAAM,EACf,SAAS,SAAS,CAAC,IAAI,CAAC,EACxB,cAAc,OAAO,CAAC,SAAS,CAAC,SA0JnC,CAAC"}
1
+ {"version":3,"file":"update-table.d.ts","sourceRoot":"","sources":["../../../interface/update-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAEV,QAAQ,EACR,KAAK,EACL,SAAS,EACV,MAAM,2BAA2B,CAAC;AAOnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAyB7D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,SAAS,EAChB,cAAc,OAAO,CAAC,SAAS,CAAC,EAChC,2BAAkC;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,KACxE,SA2BF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,mYAwB9D,IAAI,CACL,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EACnB,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,oBAAoB,GACpB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,gBAAgB,GAChB,WAAW,GACX,UAAU,GACV,aAAa,GACb,iBAAiB,GACjB,sBAAsB,GACtB,cAAc,GACd,eAAe,GACf,uBAAuB,GACvB,wBAAwB,GACxB,gBAAgB,GAChB,yBAAyB,GACzB,4BAA4B,CAC/B,GACC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,MAEnD,SAAS,MAAM,EACf,SAAS,SAAS,CAAC,IAAI,CAAC,EACxB,cAAc,OAAO,CAAC,SAAS,CAAC,SAmTnC,CAAC"}