@rowsncolumns/spreadsheet-state 28.0.73 → 28.0.75

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 (167) hide show
  1. package/dist/cjs/api/advanced-filter.d.ts +72 -0
  2. package/dist/cjs/api/advanced-filter.d.ts.map +1 -0
  3. package/dist/cjs/api/advanced-filter.js +0 -0
  4. package/dist/cjs/api/datatype.d.ts.map +1 -1
  5. package/dist/cjs/api/datatype.js +8 -1
  6. package/dist/cjs/api/fill-series-spec.d.ts +35 -0
  7. package/dist/cjs/api/fill-series-spec.d.ts.map +1 -0
  8. package/dist/cjs/api/fill-series-spec.js +164 -0
  9. package/dist/cjs/api/fill.d.ts +95 -3
  10. package/dist/cjs/api/fill.d.ts.map +1 -1
  11. package/dist/cjs/api/fill.js +1186 -418
  12. package/dist/cjs/api/goal-seek.d.ts +29 -0
  13. package/dist/cjs/api/goal-seek.d.ts.map +1 -0
  14. package/dist/cjs/api/goal-seek.js +131 -0
  15. package/dist/cjs/api/immer-utils.d.ts.map +1 -1
  16. package/dist/cjs/api/immer-utils.js +21 -15
  17. package/dist/cjs/api/intl.d.ts.map +1 -1
  18. package/dist/cjs/api/paint-format.d.ts +55 -0
  19. package/dist/cjs/api/paint-format.d.ts.map +1 -0
  20. package/dist/cjs/api/paint-format.js +174 -0
  21. package/dist/cjs/api/split-text.d.ts +12 -0
  22. package/dist/cjs/api/split-text.d.ts.map +1 -1
  23. package/dist/cjs/api/split-text.js +41 -0
  24. package/dist/cjs/api/subtotal.d.ts +85 -0
  25. package/dist/cjs/api/subtotal.d.ts.map +1 -0
  26. package/dist/cjs/api/subtotal.js +250 -0
  27. package/dist/cjs/commands.d.ts +19 -1
  28. package/dist/cjs/commands.d.ts.map +1 -1
  29. package/dist/cjs/components/editors/data-validation-rule-editor.d.ts.map +1 -1
  30. package/dist/cjs/components/editors/data-validation-rule-editor.js +83 -16
  31. package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
  32. package/dist/cjs/hooks/use-calculation-worker.js +1 -0
  33. package/dist/cjs/hooks/use-calculation.d.ts +1 -1
  34. package/dist/cjs/hooks/use-on-advanced-filter.d.ts +21 -0
  35. package/dist/cjs/hooks/use-on-advanced-filter.d.ts.map +1 -0
  36. package/dist/cjs/hooks/use-on-advanced-filter.js +42 -0
  37. package/dist/cjs/hooks/use-on-fill.d.ts +13 -4
  38. package/dist/cjs/hooks/use-on-fill.d.ts.map +1 -1
  39. package/dist/cjs/hooks/use-on-fill.js +28 -7
  40. package/dist/cjs/hooks/use-on-goal-seek.d.ts +30 -0
  41. package/dist/cjs/hooks/use-on-goal-seek.d.ts.map +1 -0
  42. package/dist/cjs/hooks/use-on-goal-seek.js +140 -0
  43. package/dist/cjs/hooks/use-on-import-excel.d.ts +10 -1
  44. package/dist/cjs/hooks/use-on-import-excel.d.ts.map +1 -1
  45. package/dist/cjs/hooks/use-on-import-excel.js +8 -4
  46. package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
  47. package/dist/cjs/hooks/use-on-merge-unmerge-cells.js +53 -34
  48. package/dist/cjs/hooks/use-on-subtotal.d.ts +26 -0
  49. package/dist/cjs/hooks/use-on-subtotal.d.ts.map +1 -0
  50. package/dist/cjs/hooks/use-on-subtotal.js +53 -0
  51. package/dist/cjs/hooks/use-paint-format.d.ts +19 -3
  52. package/dist/cjs/hooks/use-paint-format.d.ts.map +1 -1
  53. package/dist/cjs/hooks/use-paint-format.js +89 -32
  54. package/dist/cjs/hooks/use-sheet-properties.d.ts +2 -0
  55. package/dist/cjs/hooks/use-sheet-properties.d.ts.map +1 -1
  56. package/dist/cjs/hooks/use-sheet-properties.js +4 -0
  57. package/dist/cjs/hooks/use-split-text-to-columns.d.ts +2 -1
  58. package/dist/cjs/hooks/use-split-text-to-columns.d.ts.map +1 -1
  59. package/dist/cjs/hooks/use-split-text-to-columns.js +3 -2
  60. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +50 -36
  61. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  62. package/dist/cjs/hooks/use-spreadsheet-state.js +109 -19
  63. package/dist/cjs/index.d.ts +8 -0
  64. package/dist/cjs/index.d.ts.map +1 -1
  65. package/dist/cjs/index.js +8 -0
  66. package/dist/cjs/interface/apply-fill.d.ts +3 -3
  67. package/dist/cjs/interface/apply-fill.d.ts.map +1 -1
  68. package/dist/cjs/interface/apply-fill.js +100 -53
  69. package/dist/cjs/interface/change-batch-stream.d.ts.map +1 -1
  70. package/dist/cjs/interface/change-batch-stream.js +12 -6
  71. package/dist/cjs/interface/change-batch.d.ts.map +1 -1
  72. package/dist/cjs/interface/change-batch.js +17 -9
  73. package/dist/cjs/interface/change-formatting.d.ts.map +1 -1
  74. package/dist/cjs/interface/change-formatting.js +30 -11
  75. package/dist/cjs/interface/split-text.d.ts +2 -1
  76. package/dist/cjs/interface/split-text.d.ts.map +1 -1
  77. package/dist/cjs/interface/split-text.js +7 -3
  78. package/dist/cjs/interface/spreadsheet-interface.d.ts +1 -1
  79. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  80. package/dist/cjs/interface/spreadsheet-interface.js +2 -2
  81. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  82. package/dist/cjs/sheet-cell.js +37 -6
  83. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  84. package/dist/esm/api/advanced-filter.d.ts +72 -0
  85. package/dist/esm/api/advanced-filter.d.ts.map +1 -0
  86. package/dist/esm/api/advanced-filter.js +0 -0
  87. package/dist/esm/api/datatype.d.ts.map +1 -1
  88. package/dist/esm/api/datatype.js +8 -1
  89. package/dist/esm/api/fill-series-spec.d.ts +35 -0
  90. package/dist/esm/api/fill-series-spec.d.ts.map +1 -0
  91. package/dist/esm/api/fill-series-spec.js +160 -0
  92. package/dist/esm/api/fill.d.ts +95 -3
  93. package/dist/esm/api/fill.d.ts.map +1 -1
  94. package/dist/esm/api/fill.js +1158 -418
  95. package/dist/esm/api/goal-seek.d.ts +29 -0
  96. package/dist/esm/api/goal-seek.d.ts.map +1 -0
  97. package/dist/esm/api/goal-seek.js +108 -0
  98. package/dist/esm/api/immer-utils.d.ts.map +1 -1
  99. package/dist/esm/api/immer-utils.js +21 -15
  100. package/dist/esm/api/intl.d.ts.map +1 -1
  101. package/dist/esm/api/paint-format.d.ts +55 -0
  102. package/dist/esm/api/paint-format.d.ts.map +1 -0
  103. package/dist/esm/api/paint-format.js +122 -0
  104. package/dist/esm/api/split-text.d.ts +12 -0
  105. package/dist/esm/api/split-text.d.ts.map +1 -1
  106. package/dist/esm/api/split-text.js +28 -0
  107. package/dist/esm/api/subtotal.d.ts +85 -0
  108. package/dist/esm/api/subtotal.d.ts.map +1 -0
  109. package/dist/esm/api/subtotal.js +181 -0
  110. package/dist/esm/commands.d.ts +19 -1
  111. package/dist/esm/commands.d.ts.map +1 -1
  112. package/dist/esm/components/editors/data-validation-rule-editor.d.ts.map +1 -1
  113. package/dist/esm/components/editors/data-validation-rule-editor.js +52 -4
  114. package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
  115. package/dist/esm/hooks/use-calculation-worker.js +1 -0
  116. package/dist/esm/hooks/use-calculation.d.ts +1 -1
  117. package/dist/esm/hooks/use-on-advanced-filter.d.ts +21 -0
  118. package/dist/esm/hooks/use-on-advanced-filter.d.ts.map +1 -0
  119. package/dist/esm/hooks/use-on-advanced-filter.js +41 -0
  120. package/dist/esm/hooks/use-on-fill.d.ts +13 -4
  121. package/dist/esm/hooks/use-on-fill.d.ts.map +1 -1
  122. package/dist/esm/hooks/use-on-fill.js +24 -4
  123. package/dist/esm/hooks/use-on-goal-seek.d.ts +30 -0
  124. package/dist/esm/hooks/use-on-goal-seek.d.ts.map +1 -0
  125. package/dist/esm/hooks/use-on-goal-seek.js +82 -0
  126. package/dist/esm/hooks/use-on-import-excel.d.ts +10 -1
  127. package/dist/esm/hooks/use-on-import-excel.d.ts.map +1 -1
  128. package/dist/esm/hooks/use-on-import-excel.js +8 -4
  129. package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
  130. package/dist/esm/hooks/use-on-merge-unmerge-cells.js +13 -13
  131. package/dist/esm/hooks/use-on-subtotal.d.ts +26 -0
  132. package/dist/esm/hooks/use-on-subtotal.d.ts.map +1 -0
  133. package/dist/esm/hooks/use-on-subtotal.js +48 -0
  134. package/dist/esm/hooks/use-paint-format.d.ts +19 -3
  135. package/dist/esm/hooks/use-paint-format.d.ts.map +1 -1
  136. package/dist/esm/hooks/use-paint-format.js +75 -30
  137. package/dist/esm/hooks/use-sheet-properties.d.ts +2 -0
  138. package/dist/esm/hooks/use-sheet-properties.d.ts.map +1 -1
  139. package/dist/esm/hooks/use-sheet-properties.js +4 -0
  140. package/dist/esm/hooks/use-split-text-to-columns.d.ts +2 -1
  141. package/dist/esm/hooks/use-split-text-to-columns.d.ts.map +1 -1
  142. package/dist/esm/hooks/use-split-text-to-columns.js +3 -2
  143. package/dist/esm/hooks/use-spreadsheet-state.d.ts +50 -36
  144. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  145. package/dist/esm/hooks/use-spreadsheet-state.js +100 -17
  146. package/dist/esm/index.d.ts +8 -0
  147. package/dist/esm/index.d.ts.map +1 -1
  148. package/dist/esm/index.js +8 -0
  149. package/dist/esm/interface/apply-fill.d.ts +3 -3
  150. package/dist/esm/interface/apply-fill.d.ts.map +1 -1
  151. package/dist/esm/interface/apply-fill.js +93 -48
  152. package/dist/esm/interface/change-batch-stream.d.ts.map +1 -1
  153. package/dist/esm/interface/change-batch-stream.js +12 -6
  154. package/dist/esm/interface/change-batch.d.ts.map +1 -1
  155. package/dist/esm/interface/change-batch.js +15 -9
  156. package/dist/esm/interface/change-formatting.d.ts.map +1 -1
  157. package/dist/esm/interface/change-formatting.js +28 -11
  158. package/dist/esm/interface/split-text.d.ts +2 -1
  159. package/dist/esm/interface/split-text.d.ts.map +1 -1
  160. package/dist/esm/interface/split-text.js +6 -3
  161. package/dist/esm/interface/spreadsheet-interface.d.ts +1 -1
  162. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  163. package/dist/esm/interface/spreadsheet-interface.js +2 -2
  164. package/dist/esm/sheet-cell.d.ts.map +1 -1
  165. package/dist/esm/sheet-cell.js +37 -6
  166. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  167. package/package.json +20 -20
@@ -19,6 +19,7 @@ export type UseOnImportExcelFileProps<T extends CellData, S extends Sheet> = {
19
19
  onChangeCellXfs?: UseSpreadsheetProps<T, S>["onChangeCellXfs"];
20
20
  onRequestFonts: UseSpreadsheetProps<T, S>["onRequestFonts"];
21
21
  onChangeTheme: UseSpreadsheetProps<T, S>["onChangeTheme"];
22
+ onChangeNamedCellStyles?: UseSpreadsheetProps<T, S>["onChangeNamedCellStyles"];
22
23
  onChangeSlicers: UseSpreadsheetProps<T, S>["onChangeSlicers"];
23
24
  /**
24
25
  * Phase D1 — pivot table import. Worker emits
@@ -39,7 +40,15 @@ export type UseOnImportExcelFileProps<T extends CellData, S extends Sheet> = {
39
40
  export type ExcelImportResponse = {
40
41
  requiresRecalc?: boolean;
41
42
  iterativeCalculationOptions?: IterativeCalculationOptions;
43
+ /**
44
+ * Date system of the imported cell data — always the 1900 system: a
45
+ * `date1904` workbook is converted on import (date-formatted serials
46
+ * shifted by 1462 days), so this can be wired straight to
47
+ * `SheetCell.setUse1904` / `createExcelFile({ use1904 })`.
48
+ */
42
49
  use1904?: boolean;
50
+ /** The source workbook declared the 1904 date system (informational). */
51
+ sourceUse1904?: boolean;
43
52
  success: boolean;
44
53
  isPasswordProtected?: boolean;
45
54
  };
@@ -59,7 +68,7 @@ export type ExcelImportOptions = {
59
68
  */
60
69
  prompt?: UseSpreadsheetProps["onPrompt"];
61
70
  };
62
- export declare const useOnImportExcelFile: <T extends CellData, S extends Sheet>({ enableExcelImportHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeNamedRanges, onChangeSharedStrings, onChangeConditionalFormats, onChangeDataValidations, onChangeCellXfs, onChangeCharts, onRequestFonts, onChangeTheme, onCreateDataValidationRule, onClearHistory, onChangeHistory, onChangeSlicers, onChangePivotTables, evaluateConditionalFormatting, evaluateDataValidations, clearRangeCache, onConfirm, onPrompt, }: UseOnImportExcelFileProps<T, S>) => {
71
+ export declare const useOnImportExcelFile: <T extends CellData, S extends Sheet>({ enableExcelImportHistory, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeNamedRanges, onChangeSharedStrings, onChangeConditionalFormats, onChangeDataValidations, onChangeCellXfs, onChangeCharts, onRequestFonts, onChangeTheme, onChangeNamedCellStyles, onCreateDataValidationRule, onClearHistory, onChangeHistory, onChangeSlicers, onChangePivotTables, evaluateConditionalFormatting, evaluateDataValidations, clearRangeCache, onConfirm, onPrompt, }: UseOnImportExcelFileProps<T, S>) => {
63
72
  importExcelFile: (file: File | ArrayBuffer, options?: ExcelImportOptions) => Promise<ExcelImportResponse>;
64
73
  isImportingExcelfile: boolean;
65
74
  generateStatePatches: () => Promise<SpreadsheetPatch>;
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-import-excel.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-import-excel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-on-import-excel.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-import-excel.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import { useCallback, useState } from "react";
7
7
  import { SheetCell } from "../sheet-cell";
8
8
  var TIMEOUT_FONT_LOAD = 5000;
9
9
  export var useOnImportExcelFile = function (_a) {
10
- var _b = _a.enableExcelImportHistory, enableExcelImportHistory = _b === void 0 ? false : _b, onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeTables = _a.onChangeTables, onChangeEmbeds = _a.onChangeEmbeds, onChangeNamedRanges = _a.onChangeNamedRanges, onChangeSharedStrings = _a.onChangeSharedStrings, onChangeConditionalFormats = _a.onChangeConditionalFormats, onChangeDataValidations = _a.onChangeDataValidations, onChangeCellXfs = _a.onChangeCellXfs, onChangeCharts = _a.onChangeCharts, onRequestFonts = _a.onRequestFonts, onChangeTheme = _a.onChangeTheme, onCreateDataValidationRule = _a.onCreateDataValidationRule, onClearHistory = _a.onClearHistory, onChangeHistory = _a.onChangeHistory, onChangeSlicers = _a.onChangeSlicers, onChangePivotTables = _a.onChangePivotTables, evaluateConditionalFormatting = _a.evaluateConditionalFormatting, evaluateDataValidations = _a.evaluateDataValidations, clearRangeCache = _a.clearRangeCache, onConfirm = _a.onConfirm, onPrompt = _a.onPrompt;
10
+ var _b = _a.enableExcelImportHistory, enableExcelImportHistory = _b === void 0 ? false : _b, onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeTables = _a.onChangeTables, onChangeEmbeds = _a.onChangeEmbeds, onChangeNamedRanges = _a.onChangeNamedRanges, onChangeSharedStrings = _a.onChangeSharedStrings, onChangeConditionalFormats = _a.onChangeConditionalFormats, onChangeDataValidations = _a.onChangeDataValidations, onChangeCellXfs = _a.onChangeCellXfs, onChangeCharts = _a.onChangeCharts, onRequestFonts = _a.onRequestFonts, onChangeTheme = _a.onChangeTheme, onChangeNamedCellStyles = _a.onChangeNamedCellStyles, onCreateDataValidationRule = _a.onCreateDataValidationRule, onClearHistory = _a.onClearHistory, onChangeHistory = _a.onChangeHistory, onChangeSlicers = _a.onChangeSlicers, onChangePivotTables = _a.onChangePivotTables, evaluateConditionalFormatting = _a.evaluateConditionalFormatting, evaluateDataValidations = _a.evaluateDataValidations, clearRangeCache = _a.clearRangeCache, onConfirm = _a.onConfirm, onPrompt = _a.onPrompt;
11
11
  var _c = __read(useState(false), 2), isImportingExcelfile = _c[0], setIsImporting = _c[1];
12
12
  var _d = __read(useLoadingIndicator(), 2), showLoader = _d[0], hideLoader = _d[1];
13
13
  var getViewPort = useGetViewPort();
@@ -247,7 +247,7 @@ export var useOnImportExcelFile = function (_a) {
247
247
  var _a = createExcelImportWorker(file, minRowCount, minColumnCount), observable = _a.observable, sendMessage = _a.sendMessage;
248
248
  var requiresRecalc = false;
249
249
  var iterativeCalculationOptions;
250
- var use1904 = false;
250
+ var sourceUse1904 = false;
251
251
  var isPromptingForPassword = false;
252
252
  var isPasswordProtected = false;
253
253
  // Set import
@@ -381,7 +381,7 @@ export var useOnImportExcelFile = function (_a) {
381
381
  requiresRecalc = (_m = response.requiresRecalc) !== null && _m !== void 0 ? _m : false;
382
382
  iterativeCalculationOptions =
383
383
  (_o = response.iterativeCalculationOptions) !== null && _o !== void 0 ? _o : undefined;
384
- use1904 = (_p = response.use1904) !== null && _p !== void 0 ? _p : false;
384
+ sourceUse1904 = (_p = response.use1904) !== null && _p !== void 0 ? _p : false;
385
385
  }
386
386
  if (response.responseType === ResponseType.GET_SHEETS_SUCCESS) {
387
387
  onChangeSheets(response.sheets);
@@ -393,6 +393,9 @@ export var useOnImportExcelFile = function (_a) {
393
393
  if (response.theme) {
394
394
  onChangeTheme === null || onChangeTheme === void 0 ? void 0 : onChangeTheme(response.theme);
395
395
  }
396
+ if (response.namedCellStyles) {
397
+ onChangeNamedCellStyles === null || onChangeNamedCellStyles === void 0 ? void 0 : onChangeNamedCellStyles(response.namedCellStyles);
398
+ }
396
399
  }
397
400
  if (response.responseType === ResponseType.GET_CONDITIONAL_FORMATTING) {
398
401
  showLoader("Loading conditional formatting");
@@ -644,7 +647,8 @@ export var useOnImportExcelFile = function (_a) {
644
647
  resolve({
645
648
  requiresRecalc: requiresRecalc,
646
649
  iterativeCalculationOptions: iterativeCalculationOptions,
647
- use1904: use1904,
650
+ use1904: false,
651
+ sourceUse1904: sourceUse1904,
648
652
  success: true,
649
653
  isPasswordProtected: isPasswordProtected,
650
654
  });
@@ -1 +1 @@
1
- {"version":3,"file":"use-on-merge-unmerge-cells.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-merge-unmerge-cells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,SAAS,EAGV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAOnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAO9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,KAAK,2BAA2B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC/D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3E,kBAAkB,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC9D,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,iKAWzE,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC;4BASrB,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE,cACpC,SAAS;8BAiSZ,MAAM,cACH,aAAa,qBACN,aAAa,CAAC,mBAAmB,CAAC,EAAE;CA4I5D,CAAC"}
1
+ {"version":3,"file":"use-on-merge-unmerge-cells.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-merge-unmerge-cells.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,SAAS,EAGV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACN,MAAM,2BAA2B,CAAC;AAOnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAO9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,KAAK,2BAA2B,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,IAAI;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC/D,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5D,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3E,kBAAkB,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC9D,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,iKAWzE,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC;4BASrB,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE,cACpC,SAAS;8BAqRZ,MAAM,cACH,aAAa,qBACN,aAAa,CAAC,mBAAmB,CAAC,EAAE;CA4I5D,CAAC"}
@@ -17,6 +17,7 @@ export var useOnMergeUnMergeCells = function (_a) {
17
17
  * Merge cells
18
18
  */
19
19
  var onMergeCells = useCallback(function (sheetId, activeCell, selections, direction) {
20
+ var e_1, _a;
20
21
  if (!selections.length) {
21
22
  error("Merge Cells: Could not merge cells without selections");
22
23
  return;
@@ -45,6 +46,23 @@ export var useOnMergeUnMergeCells = function (_a) {
45
46
  newMerges.push(__assign(__assign({}, range), { startColumnIndex: columnIndex, endColumnIndex: columnIndex }));
46
47
  }
47
48
  }
49
+ else if (selections.length > 1) {
50
+ try {
51
+ // A multi-area selection merges each area on its own (Excel's Merge & Center on a
52
+ // Ctrl-selection). The format painter tiles a source block's merges through this path.
53
+ for (var selections_1 = __values(selections), selections_1_1 = selections_1.next(); !selections_1_1.done; selections_1_1 = selections_1.next()) {
54
+ var sel = selections_1_1.value;
55
+ newMerges.push(sel.range);
56
+ }
57
+ }
58
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
59
+ finally {
60
+ try {
61
+ if (selections_1_1 && !selections_1_1.done && (_a = selections_1.return)) _a.call(selections_1);
62
+ }
63
+ finally { if (e_1) throw e_1.error; }
64
+ }
65
+ }
48
66
  else {
49
67
  newMerges.push(range);
50
68
  }
@@ -82,8 +100,8 @@ export var useOnMergeUnMergeCells = function (_a) {
82
100
  // Update sheet data
83
101
  onChangeSheetData === null || onChangeSheetData === void 0 ? void 0 : onChangeSheetData(function (prevSheetData) {
84
102
  var _a = __read(produceWithPatches(prevSheetData, function (draft) {
85
- var e_1, _a, e_2, _b, e_3, _c;
86
- var _d, _e, _f, _g, _h, _j, _k, _l;
103
+ var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
104
+ var _e, _f, _g, _h, _j, _k, _l, _m;
87
105
  // First, check if we need to move content to master cells
88
106
  // If master cell is empty, find first cell with content and copy it
89
107
  var checkCell = new SheetCell();
@@ -95,7 +113,7 @@ export var useOnMergeUnMergeCells = function (_a) {
95
113
  columnIndex: mergeRange.startColumnIndex,
96
114
  };
97
115
  // Check if master cell has content
98
- var masterCellData = (_f = (_e = (_d = draft[sheetId]) === null || _d === void 0 ? void 0 : _d[masterCell.rowIndex]) === null || _e === void 0 ? void 0 : _e.values) === null || _f === void 0 ? void 0 : _f[masterCell.columnIndex];
116
+ var masterCellData = (_g = (_f = (_e = draft[sheetId]) === null || _e === void 0 ? void 0 : _e[masterCell.rowIndex]) === null || _f === void 0 ? void 0 : _f.values) === null || _g === void 0 ? void 0 : _g[masterCell.columnIndex];
99
117
  // Use current() to get plain data from Immer draft
100
118
  var plainMasterCellData = masterCellData
101
119
  ? current(masterCellData)
@@ -111,14 +129,14 @@ export var useOnMergeUnMergeCells = function (_a) {
111
129
  // If master cell is empty, find first cell with content and copy it
112
130
  if (!masterHasContent) {
113
131
  try {
114
- for (var _m = (e_2 = void 0, __values(iterateCellsInRange(mergeRange))), _o = _m.next(); !_o.done; _o = _m.next()) {
115
- var _p = __read(_o.value, 2), rowIndex = _p[0], columnIndex = _p[1];
132
+ for (var _o = (e_3 = void 0, __values(iterateCellsInRange(mergeRange))), _p = _o.next(); !_p.done; _p = _o.next()) {
133
+ var _q = __read(_p.value, 2), rowIndex = _q[0], columnIndex = _q[1];
116
134
  // Skip the master cell itself
117
135
  if (rowIndex === masterCell.rowIndex &&
118
136
  columnIndex === masterCell.columnIndex) {
119
137
  continue;
120
138
  }
121
- 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];
139
+ var cellData = (_k = (_j = (_h = draft[sheetId]) === null || _h === void 0 ? void 0 : _h[rowIndex]) === null || _j === void 0 ? void 0 : _j.values) === null || _k === void 0 ? void 0 : _k[columnIndex];
122
140
  // Use current() to get plain data from Immer draft
123
141
  var plainCellData = cellData ? current(cellData) : cellData;
124
142
  // Check if cell has content
@@ -137,50 +155,51 @@ export var useOnMergeUnMergeCells = function (_a) {
137
155
  }
138
156
  }
139
157
  }
140
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
158
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
141
159
  finally {
142
160
  try {
143
- if (_o && !_o.done && (_b = _m.return)) _b.call(_m);
161
+ if (_p && !_p.done && (_b = _o.return)) _b.call(_o);
144
162
  }
145
- finally { if (e_2) throw e_2.error; }
163
+ finally { if (e_3) throw e_3.error; }
146
164
  }
147
165
  }
148
166
  }
149
167
  }
150
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
168
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
151
169
  finally {
152
170
  try {
153
171
  if (newMerges_1_1 && !newMerges_1_1.done && (_a = newMerges_1.return)) _a.call(newMerges_1);
154
172
  }
155
- finally { if (e_1) throw e_1.error; }
173
+ finally { if (e_2) throw e_2.error; }
156
174
  }
157
175
  // Keep track of master cells
158
176
  // Merging cells only keeps the upper-left value and discards other values.
159
177
  var masterCells = new Set();
160
- if (direction === Direction.Right) {
161
- for (var rowIndex = range.startRowIndex; rowIndex <= range.endRowIndex; rowIndex++) {
162
- masterCells.add(cellIdentifier(rowIndex, range.startColumnIndex));
178
+ try {
179
+ for (var newMerges_2 = __values(newMerges), newMerges_2_1 = newMerges_2.next(); !newMerges_2_1.done; newMerges_2_1 = newMerges_2.next()) {
180
+ var merge = newMerges_2_1.value;
181
+ masterCells.add(cellIdentifier(merge.startRowIndex, merge.startColumnIndex));
163
182
  }
164
183
  }
165
- else if (direction === Direction.Down) {
166
- for (var columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
167
- masterCells.add(cellIdentifier(range.startRowIndex, columnIndex));
184
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
185
+ finally {
186
+ try {
187
+ if (newMerges_2_1 && !newMerges_2_1.done && (_c = newMerges_2.return)) _c.call(newMerges_2);
168
188
  }
169
- }
170
- else {
171
- masterCells.add(cellIdentifier(range.startRowIndex, range.startColumnIndex));
189
+ finally { if (e_4) throw e_4.error; }
172
190
  }
173
191
  // Create a cell
174
192
  var sheetCell = new SheetCell();
193
+ var mergedCells = newMerges.flatMap(function (merge) { return __spreadArray([], __read(iterateCellsInRange(merge)), false); });
175
194
  try {
176
- for (var _q = __values(iterateCellsInRange(range)), _r = _q.next(); !_r.done; _r = _q.next()) {
177
- var _s = __read(_r.value, 2), rowIndex = _s[0], columnIndex = _s[1];
195
+ for (var mergedCells_1 = __values(mergedCells), mergedCells_1_1 = mergedCells_1.next(); !mergedCells_1_1.done; mergedCells_1_1 = mergedCells_1.next()) {
196
+ var _r = __read(mergedCells_1_1.value, 2), rowIndex = _r[0], columnIndex = _r[1];
178
197
  var cellId = cellIdentifier(rowIndex, columnIndex);
179
198
  if (masterCells.has(cellId)) {
180
199
  continue;
181
200
  }
182
201
  var currentSheet = createSheetDraft(draft, sheetId, rowIndex);
183
- sheetCell.assign(sheetId, { rowIndex: rowIndex, columnIndex: columnIndex }, (_l = (_k = draft[sheetId][rowIndex]) === null || _k === void 0 ? void 0 : _k.values) === null || _l === void 0 ? void 0 : _l[columnIndex], { locale: locale, sharedStringRegistry: sharedStringRegistry, cellXfsRegistry: cellXfsRegistry });
202
+ sheetCell.assign(sheetId, { rowIndex: rowIndex, columnIndex: columnIndex }, (_m = (_l = draft[sheetId][rowIndex]) === null || _l === void 0 ? void 0 : _l.values) === null || _m === void 0 ? void 0 : _m[columnIndex], { locale: locale, sharedStringRegistry: sharedStringRegistry, cellXfsRegistry: cellXfsRegistry });
184
203
  // Clear values
185
204
  sheetCell.setUserEnteredValue(undefined);
186
205
  sheetCell.setEffectiveValue(undefined);
@@ -200,12 +219,12 @@ export var useOnMergeUnMergeCells = function (_a) {
200
219
  });
201
220
  }
202
221
  }
203
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
222
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
204
223
  finally {
205
224
  try {
206
- if (_r && !_r.done && (_c = _q.return)) _c.call(_q);
225
+ if (mergedCells_1_1 && !mergedCells_1_1.done && (_d = mergedCells_1.return)) _d.call(mergedCells_1);
207
226
  }
208
- finally { if (e_3) throw e_3.error; }
227
+ finally { if (e_5) throw e_5.error; }
209
228
  }
210
229
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
211
230
  // Update history
@@ -275,7 +294,7 @@ export var useOnMergeUnMergeCells = function (_a) {
275
294
  if (activeMerges) {
276
295
  onChangeSheetData === null || onChangeSheetData === void 0 ? void 0 : onChangeSheetData(function (prevSheetData) {
277
296
  var _a = __read(produceWithPatches(prevSheetData, function (draft) {
278
- var e_4, _a, e_5, _b;
297
+ var e_6, _a, e_7, _b;
279
298
  var _c, _d;
280
299
  try {
281
300
  for (var activeMerges_1 = __values(activeMerges), activeMerges_1_1 = activeMerges_1.next(); !activeMerges_1_1.done; activeMerges_1_1 = activeMerges_1.next()) {
@@ -288,7 +307,7 @@ export var useOnMergeUnMergeCells = function (_a) {
288
307
  // Create a cell
289
308
  var sheetCell = new SheetCell();
290
309
  try {
291
- for (var _e = (e_5 = void 0, __values(iterateCellsInRange(range))), _f = _e.next(); !_f.done; _f = _e.next()) {
310
+ for (var _e = (e_7 = void 0, __values(iterateCellsInRange(range))), _f = _e.next(); !_f.done; _f = _e.next()) {
292
311
  var _g = __read(_f.value, 2), rowIndex = _g[0], columnIndex = _g[1];
293
312
  if (isEqualCells({ rowIndex: rowIndex, columnIndex: columnIndex }, topRightCell)) {
294
313
  continue;
@@ -314,21 +333,21 @@ export var useOnMergeUnMergeCells = function (_a) {
314
333
  });
315
334
  }
316
335
  }
317
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
336
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
318
337
  finally {
319
338
  try {
320
339
  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
321
340
  }
322
- finally { if (e_5) throw e_5.error; }
341
+ finally { if (e_7) throw e_7.error; }
323
342
  }
324
343
  }
325
344
  }
326
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
345
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
327
346
  finally {
328
347
  try {
329
348
  if (activeMerges_1_1 && !activeMerges_1_1.done && (_a = activeMerges_1.return)) _a.call(activeMerges_1);
330
349
  }
331
- finally { if (e_4) throw e_4.error; }
350
+ finally { if (e_6) throw e_6.error; }
332
351
  }
333
352
  }), 3), nextState = _a[0], patches = _a[1], inversePatches = _a[2];
334
353
  // Update history
@@ -340,8 +359,8 @@ export var useOnMergeUnMergeCells = function (_a) {
340
359
  });
341
360
  // Clear selections
342
361
  // const newSelections = currentSelections
343
- var selections_1 = activeMerges.map(function (range) { return ({ range: range }); });
344
- onChangeSelections === null || onChangeSelections === void 0 ? void 0 : onChangeSelections(sheetId, selections_1);
362
+ var selections_2 = activeMerges.map(function (range) { return ({ range: range }); });
363
+ onChangeSelections === null || onChangeSelections === void 0 ? void 0 : onChangeSelections(sheetId, selections_2);
345
364
  }
346
365
  onCommand === null || onCommand === void 0 ? void 0 : onCommand({
347
366
  command: "unmerge-cells",
@@ -0,0 +1,26 @@
1
+ import type { GridRange } from "@rowsncolumns/common-types";
2
+ import { type SubtotalOptions, type SubtotalPlan, type SubtotalPlanExecutor } from "../api/subtotal";
3
+ import type { useSheetProperties } from "./use-sheet-properties";
4
+ export type { SubtotalOptions, SubtotalPlan };
5
+ export type UseOnSubtotalProps = {
6
+ getEffectiveValue: ReturnType<typeof useSheetProperties>["getEffectiveValue"];
7
+ getFormattedValue: ReturnType<typeof useSheetProperties>["getFormattedValue"];
8
+ getFormulaValue: ReturnType<typeof useSheetProperties>["getFormulaValue"];
9
+ getRowOutlineLevel: ReturnType<typeof useSheetProperties>["getRowOutlineLevel"];
10
+ onDeleteRow: SubtotalPlanExecutor["onDeleteRow"];
11
+ onInsertRow: SubtotalPlanExecutor["onInsertRow"];
12
+ onChangeBatch: (sheetId: number, ranges: GridRange, values: (string | null)[][]) => void;
13
+ onGroupRows: SubtotalPlanExecutor["onGroupRows"];
14
+ onUngroupRows: SubtotalPlanExecutor["onUngroupRows"];
15
+ };
16
+ /**
17
+ * Excel's Data → Outline → Subtotal, composed over the existing row
18
+ * insert / batch write / row grouping callbacks so both engines execute it
19
+ * through the same streamed commands (see `planSubtotals` for the layout).
20
+ * Groups on the DISPLAYED value of the group column (Excel compares what the
21
+ * cells show). "Replace current subtotals" also resets the range's outline
22
+ * before regrouping, so re-applying keeps Excel's three levels. Returns the
23
+ * applied plan, or `undefined` when the range is protected or has no data rows.
24
+ */
25
+ export declare const useOnSubtotal: ({ getEffectiveValue, getFormattedValue, getFormulaValue, getRowOutlineLevel, onDeleteRow, onInsertRow, onChangeBatch, onGroupRows, onUngroupRows, }: UseOnSubtotalProps) => (sheetId: number, options: SubtotalOptions) => SubtotalPlan | undefined;
26
+ //# sourceMappingURL=use-on-subtotal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-on-subtotal.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-subtotal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC9E,iBAAiB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC9E,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1E,kBAAkB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAChF,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACjD,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACjD,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,KACxB,IAAI,CAAC;IACV,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACjD,aAAa,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,qJAU3B,kBAAkB,eAIP,MAAM,WAAW,eAAe,KAAG,YAAY,GAAG,SAoC/D,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { useCallback } from "react";
2
+ import { applySubtotalPlan, planSubtotals, } from "../api/subtotal";
3
+ import { useCanEditCellRange } from "./use-can-edit-cellrange";
4
+ /**
5
+ * Excel's Data → Outline → Subtotal, composed over the existing row
6
+ * insert / batch write / row grouping callbacks so both engines execute it
7
+ * through the same streamed commands (see `planSubtotals` for the layout).
8
+ * Groups on the DISPLAYED value of the group column (Excel compares what the
9
+ * cells show). "Replace current subtotals" also resets the range's outline
10
+ * before regrouping, so re-applying keeps Excel's three levels. Returns the
11
+ * applied plan, or `undefined` when the range is protected or has no data rows.
12
+ */
13
+ export var useOnSubtotal = function (_a) {
14
+ var getEffectiveValue = _a.getEffectiveValue, getFormattedValue = _a.getFormattedValue, getFormulaValue = _a.getFormulaValue, getRowOutlineLevel = _a.getRowOutlineLevel, onDeleteRow = _a.onDeleteRow, onInsertRow = _a.onInsertRow, onChangeBatch = _a.onChangeBatch, onGroupRows = _a.onGroupRows, onUngroupRows = _a.onUngroupRows;
15
+ var canEditCellRange = useCanEditCellRange();
16
+ return useCallback(function (sheetId, options) {
17
+ if (!canEditCellRange(sheetId, options.range)) {
18
+ console.debug("This range is protected, users cannot edit this cell range.");
19
+ return undefined;
20
+ }
21
+ var plan = planSubtotals(options, {
22
+ getValue: function (rowIndex, columnIndex) {
23
+ var _a;
24
+ return (_a = getFormattedValue(sheetId, rowIndex, columnIndex)) !== null && _a !== void 0 ? _a : getEffectiveValue(sheetId, rowIndex, columnIndex);
25
+ },
26
+ getFormula: function (rowIndex, columnIndex) {
27
+ return getFormulaValue(sheetId, rowIndex, columnIndex);
28
+ },
29
+ getOutlineLevel: function (rowIndex) { return getRowOutlineLevel(sheetId, rowIndex); },
30
+ });
31
+ if (!plan)
32
+ return undefined;
33
+ applySubtotalPlan(sheetId, plan, {
34
+ onDeleteRow: onDeleteRow,
35
+ onInsertRow: onInsertRow,
36
+ onChangeBatch: onChangeBatch,
37
+ onGroupRows: onGroupRows,
38
+ onUngroupRows: onUngroupRows,
39
+ });
40
+ return plan;
41
+ }, [
42
+ canEditCellRange,
43
+ getEffectiveValue,
44
+ getFormattedValue,
45
+ getFormulaValue,
46
+ getRowOutlineLevel,
47
+ onDeleteRow,
48
+ onInsertRow,
49
+ onChangeBatch,
50
+ onGroupRows,
51
+ onUngroupRows,
52
+ ]);
53
+ };
@@ -1,5 +1,5 @@
1
- import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
2
- import type { SelectionAttributes, SheetRange } from "@rowsncolumns/spreadsheet";
1
+ import type { CellInterface, GridRange, SelectionArea } from "@rowsncolumns/common-types";
2
+ import type { CellFormat, SelectionAttributes, SheetRange } from "@rowsncolumns/spreadsheet";
3
3
  import type { useOnChangeFormatting } from "./use-on-change-formatting";
4
4
  import type { useSheetProperties } from "./use-sheet-properties";
5
5
  import type { useSheetState } from "./use-sheet-state";
@@ -7,8 +7,24 @@ export type UsePaintFormatProps = {
7
7
  onChangeSelections: ReturnType<typeof useSheetState>["onChangeSelections"];
8
8
  onChangeFormatting: ReturnType<typeof useOnChangeFormatting>["onChangeFormatting"];
9
9
  getEffectiveFormat: ReturnType<typeof useSheetProperties>["getEffectiveFormat"];
10
+ /**
11
+ * The merges of a sheet (absolute ranges). When provided, the painter carries the merges that
12
+ * lie fully inside the source block and tiles them onto the target (Sheets / Excel parity).
13
+ */
14
+ getMerges?: (sheetId: number) => GridRange[] | null | undefined;
15
+ /**
16
+ * Replace the merges inside `targetRange` with `merges` (already tiled, absolute). The
17
+ * spreadsheet-state wiring unmerges the target then merges each range in one step.
18
+ */
19
+ onPaintMerges?: (sheetId: number, activeCell: CellInterface, targetRange: GridRange, merges: GridRange[]) => void;
20
+ /**
21
+ * The table-banding / alternating-colour formats the grid paints on a sheet (keyed by
22
+ * `cellIdentifier`). When provided, the captured pattern carries the visible stripe colours as
23
+ * static fills, like Sheets.
24
+ */
25
+ getBandedCells?: (sheetId: number) => Map<string, CellFormat> | undefined;
10
26
  };
11
- export declare const usePaintFormat: ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, }: UsePaintFormatProps) => {
27
+ export declare const usePaintFormat: ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, getMerges, onPaintMerges, getBandedCells, }: UsePaintFormatProps) => {
12
28
  isPaintFormatActive: boolean;
13
29
  onSavePaintFormat: (sheetId: number, activeCell: CellInterface, selections: SelectionArea<SelectionAttributes>[]) => void;
14
30
  onApplyPaintFormat: (sheetId: number, activeCell: CellInterface, selections?: SelectionArea<SelectionAttributes>[]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"use-paint-format.d.ts","sourceRoot":"","sources":["../../../hooks/use-paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EAEV,mBAAmB,EACnB,UAAU,EACX,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3E,kBAAkB,EAAE,UAAU,CAC5B,OAAO,qBAAqB,CAC7B,CAAC,oBAAoB,CAAC,CAAC;IACxB,kBAAkB,EAAE,UAAU,CAC5B,OAAO,kBAAkB,CAC1B,CAAC,oBAAoB,CAAC,CAAC;CACzB,CAAC;AAMF,eAAO,MAAM,cAAc,GAAI,iEAI5B,mBAAmB;;iCAOP,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE;kCAiCvC,MAAM,cACH,aAAa,eACZ,aAAa,CAAC,mBAAmB,CAAC,EAAE;oCAsE/B,UAAU,oBAIV,UAAU;CAgDjC,CAAC"}
1
+ {"version":3,"file":"use-paint-format.d.ts","sourceRoot":"","sources":["../../../hooks/use-paint-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,UAAU,EACX,MAAM,2BAA2B,CAAC;AAYnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3E,kBAAkB,EAAE,UAAU,CAC5B,OAAO,qBAAqB,CAC7B,CAAC,oBAAoB,CAAC,CAAC;IACxB,kBAAkB,EAAE,UAAU,CAC5B,OAAO,kBAAkB,CAC1B,CAAC,oBAAoB,CAAC,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IAChE;;;OAGG;IACH,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,WAAW,EAAE,SAAS,EACtB,MAAM,EAAE,SAAS,EAAE,KAChB,IAAI,CAAC;IACV;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC;CAC3E,CAAC;AAaF,eAAO,MAAM,cAAc,GAAI,2GAO5B,mBAAmB;;iCA8EP,MAAM,cACH,aAAa,cACb,aAAa,CAAC,mBAAmB,CAAC,EAAE;kCAevC,MAAM,cACH,aAAa,eACZ,aAAa,CAAC,mBAAmB,CAAC,EAAE;oCAkF/B,UAAU,oBAIV,UAAU;CAmCjC,CAAC"}
@@ -1,39 +1,92 @@
1
1
  import { __assign, __read, __values } from "tslib";
2
- import { selectionFromActiveCell } from "@rowsncolumns/grid";
3
2
  import { useCallback, useState } from "react";
3
+ import { collectPaintMerges, getBandedCellFormat, layerBandedFormat, paintSourceForActiveCell, spreadMergeAnchorFormats, tilePaintMerges, } from "../api/paint-format";
4
4
  // A paint-format target spanning at least this many rows/cols is a header-click
5
5
  // full-column/row selection, not an intentional drag — bound it to the pattern.
6
6
  var UNBOUNDED_PAINT_SPAN = 10000;
7
+ var EMPTY_PATTERN = {
8
+ formats: [],
9
+ merges: [],
10
+ rows: 0,
11
+ cols: 0,
12
+ };
7
13
  export var usePaintFormat = function (_a) {
8
- var getEffectiveFormat = _a.getEffectiveFormat, onChangeFormatting = _a.onChangeFormatting, onChangeSelections = _a.onChangeSelections;
9
- var _b = __read(useState([]), 2), paintFormats = _b[0], setPaintFormats = _b[1];
10
- var onSavePaintFormat = useCallback(function (sheetId, activeCell, selections) {
14
+ var getEffectiveFormat = _a.getEffectiveFormat, onChangeFormatting = _a.onChangeFormatting, onChangeSelections = _a.onChangeSelections, getMerges = _a.getMerges, onPaintMerges = _a.onPaintMerges, getBandedCells = _a.getBandedCells;
15
+ var _b = __read(useState(EMPTY_PATTERN), 2), pattern = _b[0], setPattern = _b[1];
16
+ var paintFormats = pattern.formats;
17
+ /**
18
+ * Capture the visible look of `range`: the effective format of every cell layered over the
19
+ * table stripe the grid paints beneath it, plus the merges fully inside the range.
20
+ */
21
+ var capturePattern = useCallback(function (sheetId, ranges) {
11
22
  var e_1, _a;
12
- var finalSelections = selections.length
13
- ? selections
14
- : selectionFromActiveCell(activeCell);
15
- var paintFormats = [];
23
+ var _b, _c;
24
+ var bandedCells = getBandedCells === null || getBandedCells === void 0 ? void 0 : getBandedCells(sheetId);
25
+ var formats = [];
16
26
  try {
17
- for (var finalSelections_1 = __values(finalSelections), finalSelections_1_1 = finalSelections_1.next(); !finalSelections_1_1.done; finalSelections_1_1 = finalSelections_1.next()) {
18
- var sel = finalSelections_1_1.value;
19
- for (var rowIndex = sel.range.startRowIndex; rowIndex <= sel.range.endRowIndex; rowIndex++) {
27
+ for (var ranges_1 = __values(ranges), ranges_1_1 = ranges_1.next(); !ranges_1_1.done; ranges_1_1 = ranges_1.next()) {
28
+ var range = ranges_1_1.value;
29
+ for (var rowIndex = range.startRowIndex; rowIndex <= range.endRowIndex; rowIndex++) {
20
30
  var rowFormats = [];
21
- for (var columnIndex = sel.range.startColumnIndex; columnIndex <= sel.range.endColumnIndex; columnIndex++) {
22
- rowFormats.push(getEffectiveFormat(sheetId, rowIndex, columnIndex));
31
+ for (var columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
32
+ rowFormats.push(layerBandedFormat(getEffectiveFormat(sheetId, rowIndex, columnIndex), getBandedCellFormat(bandedCells, rowIndex, columnIndex)));
23
33
  }
24
- paintFormats.push(rowFormats);
34
+ formats.push(rowFormats);
25
35
  }
26
36
  }
27
37
  }
28
38
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
29
39
  finally {
30
40
  try {
31
- if (finalSelections_1_1 && !finalSelections_1_1.done && (_a = finalSelections_1.return)) _a.call(finalSelections_1);
41
+ if (ranges_1_1 && !ranges_1_1.done && (_a = ranges_1.return)) _a.call(ranges_1);
32
42
  }
33
43
  finally { if (e_1) throw e_1.error; }
34
44
  }
35
- setPaintFormats(paintFormats);
36
- }, [getEffectiveFormat]);
45
+ // Merges travel with a single-block source only; a multi-area capture has no single
46
+ // tiling origin (the format rows are stacked, as before).
47
+ var source = ranges.length === 1 ? ranges[0] : undefined;
48
+ var merges = source
49
+ ? collectPaintMerges(getMerges === null || getMerges === void 0 ? void 0 : getMerges(sheetId), source)
50
+ : [];
51
+ // Excel keeps a merged area's style on every constituent cell; the grid paints the anchor's.
52
+ spreadMergeAnchorFormats(formats, merges);
53
+ return {
54
+ formats: formats,
55
+ merges: merges,
56
+ rows: formats.length,
57
+ cols: (_c = (_b = formats[0]) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0,
58
+ };
59
+ }, [getEffectiveFormat, getBandedCells, getMerges]);
60
+ /**
61
+ * Replace the target's merges with the pattern's, tiled with the pattern's period.
62
+ */
63
+ var applyPatternMerges = useCallback(function (sheetId, activeCell, current, targets) {
64
+ var e_2, _a;
65
+ if (!current.merges.length || !onPaintMerges)
66
+ return;
67
+ try {
68
+ for (var targets_1 = __values(targets), targets_1_1 = targets_1.next(); !targets_1_1.done; targets_1_1 = targets_1.next()) {
69
+ var target = targets_1_1.value;
70
+ var tiled = tilePaintMerges(current.merges, current.rows, current.cols, target);
71
+ onPaintMerges(sheetId, activeCell, target, tiled);
72
+ }
73
+ }
74
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
75
+ finally {
76
+ try {
77
+ if (targets_1_1 && !targets_1_1.done && (_a = targets_1.return)) _a.call(targets_1);
78
+ }
79
+ finally { if (e_2) throw e_2.error; }
80
+ }
81
+ }, [onPaintMerges]);
82
+ var onSavePaintFormat = useCallback(function (sheetId, activeCell, selections) {
83
+ // A plain click on a merged cell arms the painter with the anchor and NO selection (the
84
+ // grid clears the list) — Excel treats that click as the whole merged area.
85
+ var ranges = selections.length
86
+ ? selections.map(function (sel) { return sel.range; })
87
+ : [paintSourceForActiveCell(getMerges === null || getMerges === void 0 ? void 0 : getMerges(sheetId), activeCell)];
88
+ setPattern(capturePattern(sheetId, ranges));
89
+ }, [capturePattern, getMerges]);
37
90
  // Applies a saved paintFormat
38
91
  var onApplyPaintFormat = useCallback(function (sheetId, activeCell, selections) {
39
92
  /**
@@ -46,9 +99,7 @@ export var usePaintFormat = function (_a) {
46
99
  // header-click full-column/row targets are bounded to the pattern so a paint
47
100
  // never enumerates an entire 1M-row column.
48
101
  var clampEnd = function (start, end, span) {
49
- return end - start >= UNBOUNDED_PAINT_SPAN
50
- ? Math.min(end, start + span)
51
- : end;
102
+ return end - start >= UNBOUNDED_PAINT_SPAN ? Math.min(end, start + span) : end;
52
103
  };
53
104
  var newSelections = (selections === null || selections === void 0 ? void 0 : selections.length)
54
105
  ? selections.map(function (sel) { return (__assign(__assign({}, sel), { range: __assign(__assign({}, sel.range), { endRowIndex: clampEnd(sel.range.startRowIndex, sel.range.endRowIndex, rowSpan), endColumnIndex: clampEnd(sel.range.startColumnIndex, sel.range.endColumnIndex, colSpan) }) })); })
@@ -66,6 +117,8 @@ export var usePaintFormat = function (_a) {
66
117
  onChangeFormatting(sheetId, activeCell, newSelections, paintFormats, {
67
118
  replace: true,
68
119
  });
120
+ // Merges tile with the same period as the formats.
121
+ applyPatternMerges(sheetId, activeCell, pattern, newSelections.map(function (sel) { return sel.range; }));
69
122
  /**
70
123
  * User has made selections. lets preserve it
71
124
  */
@@ -73,8 +126,14 @@ export var usePaintFormat = function (_a) {
73
126
  onChangeSelections === null || onChangeSelections === void 0 ? void 0 : onChangeSelections(sheetId, newSelections);
74
127
  }
75
128
  // Reset paintformats
76
- setPaintFormats([]);
77
- }, [paintFormats, onChangeSelections, onChangeFormatting]);
129
+ setPattern(EMPTY_PATTERN);
130
+ }, [
131
+ pattern,
132
+ paintFormats,
133
+ onChangeSelections,
134
+ onChangeFormatting,
135
+ applyPatternMerges,
136
+ ]);
78
137
  /**
79
138
  * Copy formatting from a source range to target range
80
139
  */
@@ -87,24 +146,22 @@ export var usePaintFormat = function (_a) {
87
146
  * Sheet range to paste to
88
147
  */
89
148
  targetSheetRange) {
90
- var paintFormats = [];
91
- for (var rowIndex = sourceSheetRange.startRowIndex; rowIndex <= sourceSheetRange.endRowIndex; rowIndex++) {
92
- var rowFormats = [];
93
- for (var columnIndex = sourceSheetRange.startColumnIndex; columnIndex <= sourceSheetRange.endColumnIndex; columnIndex++) {
94
- rowFormats.push(getEffectiveFormat(sourceSheetRange.sheetId, rowIndex, columnIndex));
95
- }
96
- paintFormats.push(rowFormats);
97
- }
149
+ var captured = capturePattern(sourceSheetRange.sheetId, [
150
+ sourceSheetRange,
151
+ ]);
98
152
  // Apply
99
153
  var activeCell = {
100
154
  rowIndex: targetSheetRange.startRowIndex,
101
155
  columnIndex: targetSheetRange.startColumnIndex,
102
156
  };
103
157
  // Copy formatting
104
- onChangeFormatting(targetSheetRange.sheetId, activeCell, [{ range: targetSheetRange }], paintFormats, {
158
+ onChangeFormatting(targetSheetRange.sheetId, activeCell, [{ range: targetSheetRange }], captured.formats, {
105
159
  replace: true,
106
160
  });
107
- }, [onChangeFormatting, getEffectiveFormat]);
161
+ applyPatternMerges(targetSheetRange.sheetId, activeCell, captured, [
162
+ targetSheetRange,
163
+ ]);
164
+ }, [onChangeFormatting, capturePattern, applyPatternMerges]);
108
165
  return {
109
166
  isPaintFormatActive: paintFormats.length > 0,
110
167
  onSavePaintFormat: onSavePaintFormat,