@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
@@ -0,0 +1,30 @@
1
+ import type { CellInterface } from "@rowsncolumns/common-types";
2
+ import { type GoalSeekResult } from "../api/goal-seek";
3
+ import type { useCalculation } from "./use-calculation";
4
+ import type { useOnChange } from "./use-on-change";
5
+ import type { useSheetProperties } from "./use-sheet-properties";
6
+ export type { GoalSeekResult };
7
+ export type UseOnGoalSeekProps = {
8
+ getFormulaValue: ReturnType<typeof useSheetProperties>["getFormulaValue"];
9
+ getEffectiveValue: ReturnType<typeof useSheetProperties>["getEffectiveValue"];
10
+ /** The calculator's scratch evaluation (UNFORMATTED results). */
11
+ onRequestCalculate: ReturnType<typeof useCalculation>["onRequestCalculate"];
12
+ getDependents: ReturnType<typeof useCalculation>["getDependents"];
13
+ onChange: ReturnType<typeof useOnChange>;
14
+ };
15
+ /**
16
+ * Excel's Goal Seek (Data → What-If Analysis): find the value of
17
+ * `changingCell` that makes the formula in `setCell` evaluate to
18
+ * `targetValue`. Every trial is a scratch evaluation — the changing cell is
19
+ * pinned through the calculator's override map and the formula cells between
20
+ * it and the set cell (its transitive dependents, in dependency order) are
21
+ * re-evaluated into the same map, so nothing is written until the search
22
+ * ends. The final value is committed through `onChange` (one undo step,
23
+ * streamed to any engine consumer like a typed edit).
24
+ *
25
+ * Resolves to `undefined` when the set cell holds no formula or the changing
26
+ * cell is protected; otherwise the {@link GoalSeekResult} — Excel reports
27
+ * "found a solution" / "may not have found a solution" from `status`.
28
+ */
29
+ export declare const useOnGoalSeek: ({ getFormulaValue, getEffectiveValue, onRequestCalculate, getDependents, onChange, }: UseOnGoalSeekProps) => (sheetId: number, setCell: CellInterface, targetValue: number, changingCell: CellInterface) => Promise<GoalSeekResult | undefined>;
30
+ //# sourceMappingURL=use-on-goal-seek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-on-goal-seek.d.ts","sourceRoot":"","sources":["../../../hooks/use-on-goal-seek.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAIhE,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAGV,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC1E,iBAAiB,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC9E,iEAAiE;IACjE,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5E,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,QAAQ,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;CAC1C,CAAC;AAUF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,GAAI,sFAM3B,kBAAkB,eAKN,MAAM,WACN,aAAa,eACT,MAAM,gBACL,aAAa,KAC1B,OAAO,CAAC,cAAc,GAAG,SAAS,CA+DxC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { isCellNode, makeKey } from "@rowsncolumns/dag";
2
+ import { useCallback } from "react";
3
+ import { goalSeek } from "../api/goal-seek";
4
+ import { useCanEditCellRange } from "./use-can-edit-cellrange";
5
+ /** Cap on the formula chain re-evaluated per trial (a runaway dependency fan-out). */
6
+ const MAX_AFFECTED_CELLS = 2000;
7
+ const sameCell = (a, sheetId, b) => (a.sheetId ?? sheetId) === sheetId &&
8
+ a.rowIndex === b.rowIndex &&
9
+ a.columnIndex === b.columnIndex;
10
+ /**
11
+ * Excel's Goal Seek (Data → What-If Analysis): find the value of
12
+ * `changingCell` that makes the formula in `setCell` evaluate to
13
+ * `targetValue`. Every trial is a scratch evaluation — the changing cell is
14
+ * pinned through the calculator's override map and the formula cells between
15
+ * it and the set cell (its transitive dependents, in dependency order) are
16
+ * re-evaluated into the same map, so nothing is written until the search
17
+ * ends. The final value is committed through `onChange` (one undo step,
18
+ * streamed to any engine consumer like a typed edit).
19
+ *
20
+ * Resolves to `undefined` when the set cell holds no formula or the changing
21
+ * cell is protected; otherwise the {@link GoalSeekResult} — Excel reports
22
+ * "found a solution" / "may not have found a solution" from `status`.
23
+ */
24
+ export const useOnGoalSeek = ({ getFormulaValue, getEffectiveValue, onRequestCalculate, getDependents, onChange, }) => {
25
+ const canEditCellRange = useCanEditCellRange();
26
+ return useCallback(async (sheetId, setCell, targetValue, changingCell) => {
27
+ if (!Number.isFinite(targetValue))
28
+ return undefined;
29
+ if (!canEditCellRange(sheetId, changingCell)) {
30
+ console.debug("This range is protected, users cannot edit this cell range.");
31
+ return undefined;
32
+ }
33
+ const formula = getFormulaValue(sheetId, setCell.rowIndex, setCell.columnIndex);
34
+ if (!formula)
35
+ return undefined;
36
+ if (sameCell(setCell, sheetId, changingCell))
37
+ return undefined;
38
+ const changingPosition = { sheetId, ...changingCell };
39
+ // Formula cells downstream of the changing cell, in dependency order,
40
+ // minus the set cell itself (evaluated last, from the trial map).
41
+ const affected = [];
42
+ for (const node of getDependents(changingPosition)) {
43
+ if (!isCellNode(node))
44
+ continue;
45
+ const { position } = node;
46
+ if (sameCell(position, sheetId, setCell) && position.sheetId === sheetId)
47
+ continue;
48
+ if (position.conditionalFormatId != null || position.dataValidationId != null)
49
+ continue;
50
+ affected.push(position);
51
+ if (affected.length >= MAX_AFFECTED_CELLS)
52
+ break;
53
+ }
54
+ const evaluate = async (trial) => {
55
+ const overrides = new Map([[makeKey(changingPosition), trial]]);
56
+ const scratch = async (text, position) => onRequestCalculate(text, position.sheetId, position.rowIndex, position.columnIndex, {
57
+ overrides,
58
+ disablePreview: true,
59
+ });
60
+ for (const position of affected) {
61
+ const cellFormula = getFormulaValue(position.sheetId, position.rowIndex, position.columnIndex);
62
+ if (!cellFormula)
63
+ continue;
64
+ const value = await scratch(cellFormula, position);
65
+ // An errored intermediate reads as an error in the set cell too,
66
+ // which the solver treats as an unusable trial.
67
+ overrides.set(makeKey(position), value instanceof Error ? undefined : value);
68
+ }
69
+ const result = await scratch(formula, { sheetId, ...setCell });
70
+ return typeof result === "number" && Number.isFinite(result) ? result : undefined;
71
+ };
72
+ const current = getEffectiveValue(sheetId, changingCell.rowIndex, changingCell.columnIndex);
73
+ const initialValue = typeof current === "number"
74
+ ? current
75
+ : typeof current === "string" && current.trim() !== "" && Number.isFinite(Number(current))
76
+ ? Number(current)
77
+ : 0;
78
+ const result = await goalSeek({ evaluate, targetValue, initialValue });
79
+ onChange(sheetId, changingCell, String(result.value), undefined);
80
+ return result;
81
+ }, [canEditCellRange, getFormulaValue, getEffectiveValue, onRequestCalculate, getDependents, onChange]);
82
+ };
@@ -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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"}
@@ -5,7 +5,7 @@ import { produce, produceWithPatches } from "immer";
5
5
  import { useCallback, useState } from "react";
6
6
  import { SheetCell } from "../sheet-cell";
7
7
  const TIMEOUT_FONT_LOAD = 5000;
8
- export const useOnImportExcelFile = ({ enableExcelImportHistory = false, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeNamedRanges, onChangeSharedStrings, onChangeConditionalFormats, onChangeDataValidations, onChangeCellXfs, onChangeCharts, onRequestFonts, onChangeTheme, onCreateDataValidationRule, onClearHistory, onChangeHistory, onChangeSlicers, onChangePivotTables, evaluateConditionalFormatting, evaluateDataValidations, clearRangeCache, onConfirm, onPrompt, }) => {
8
+ export const useOnImportExcelFile = ({ enableExcelImportHistory = false, onChangeSheetData, onChangeSheets, onChangeTables, onChangeEmbeds, onChangeNamedRanges, onChangeSharedStrings, onChangeConditionalFormats, onChangeDataValidations, onChangeCellXfs, onChangeCharts, onRequestFonts, onChangeTheme, onChangeNamedCellStyles, onCreateDataValidationRule, onClearHistory, onChangeHistory, onChangeSlicers, onChangePivotTables, evaluateConditionalFormatting, evaluateDataValidations, clearRangeCache, onConfirm, onPrompt, }) => {
9
9
  const [isImportingExcelfile, setIsImporting] = useState(false);
10
10
  const [showLoader, hideLoader] = useLoadingIndicator();
11
11
  const getViewPort = useGetViewPort();
@@ -229,7 +229,7 @@ export const useOnImportExcelFile = ({ enableExcelImportHistory = false, onChang
229
229
  const { observable, sendMessage } = createExcelImportWorker(file, minRowCount, minColumnCount);
230
230
  let requiresRecalc = false;
231
231
  let iterativeCalculationOptions;
232
- let use1904 = false;
232
+ let sourceUse1904 = false;
233
233
  let isPromptingForPassword = false;
234
234
  let isPasswordProtected = false;
235
235
  // Set import
@@ -345,7 +345,7 @@ export const useOnImportExcelFile = ({ enableExcelImportHistory = false, onChang
345
345
  requiresRecalc = response.requiresRecalc ?? false;
346
346
  iterativeCalculationOptions =
347
347
  response.iterativeCalculationOptions ?? undefined;
348
- use1904 = response.use1904 ?? false;
348
+ sourceUse1904 = response.use1904 ?? false;
349
349
  }
350
350
  if (response.responseType === ResponseType.GET_SHEETS_SUCCESS) {
351
351
  onChangeSheets(response.sheets);
@@ -357,6 +357,9 @@ export const useOnImportExcelFile = ({ enableExcelImportHistory = false, onChang
357
357
  if (response.theme) {
358
358
  onChangeTheme?.(response.theme);
359
359
  }
360
+ if (response.namedCellStyles) {
361
+ onChangeNamedCellStyles?.(response.namedCellStyles);
362
+ }
360
363
  }
361
364
  if (response.responseType === ResponseType.GET_CONDITIONAL_FORMATTING) {
362
365
  showLoader("Loading conditional formatting");
@@ -555,7 +558,8 @@ export const useOnImportExcelFile = ({ enableExcelImportHistory = false, onChang
555
558
  resolve({
556
559
  requiresRecalc,
557
560
  iterativeCalculationOptions,
558
- use1904,
561
+ use1904: false,
562
+ sourceUse1904,
559
563
  success: true,
560
564
  isPasswordProtected,
561
565
  });
@@ -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"}
@@ -51,6 +51,13 @@ export const useOnMergeUnMergeCells = ({ locale, merges, cellXfsRegistry, shared
51
51
  });
52
52
  }
53
53
  }
54
+ else if (selections.length > 1) {
55
+ // A multi-area selection merges each area on its own (Excel's Merge & Center on a
56
+ // Ctrl-selection). The format painter tiles a source block's merges through this path.
57
+ for (const sel of selections) {
58
+ newMerges.push(sel.range);
59
+ }
60
+ }
54
61
  else {
55
62
  newMerges.push(range);
56
63
  }
@@ -136,22 +143,15 @@ export const useOnMergeUnMergeCells = ({ locale, merges, cellXfsRegistry, shared
136
143
  // Keep track of master cells
137
144
  // Merging cells only keeps the upper-left value and discards other values.
138
145
  const masterCells = new Set();
139
- if (direction === Direction.Right) {
140
- for (let rowIndex = range.startRowIndex; rowIndex <= range.endRowIndex; rowIndex++) {
141
- masterCells.add(cellIdentifier(rowIndex, range.startColumnIndex));
142
- }
143
- }
144
- else if (direction === Direction.Down) {
145
- for (let columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
146
- masterCells.add(cellIdentifier(range.startRowIndex, columnIndex));
147
- }
148
- }
149
- else {
150
- masterCells.add(cellIdentifier(range.startRowIndex, range.startColumnIndex));
146
+ for (const merge of newMerges) {
147
+ masterCells.add(cellIdentifier(merge.startRowIndex, merge.startColumnIndex));
151
148
  }
152
149
  // Create a cell
153
150
  const sheetCell = new SheetCell();
154
- for (const [rowIndex, columnIndex] of iterateCellsInRange(range)) {
151
+ const mergedCells = newMerges.flatMap((merge) => [
152
+ ...iterateCellsInRange(merge),
153
+ ]);
154
+ for (const [rowIndex, columnIndex] of mergedCells) {
155
155
  const cellId = cellIdentifier(rowIndex, columnIndex);
156
156
  if (masterCells.has(cellId)) {
157
157
  continue;
@@ -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,48 @@
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 const useOnSubtotal = ({ getEffectiveValue, getFormattedValue, getFormulaValue, getRowOutlineLevel, onDeleteRow, onInsertRow, onChangeBatch, onGroupRows, onUngroupRows, }) => {
14
+ const canEditCellRange = useCanEditCellRange();
15
+ return useCallback((sheetId, options) => {
16
+ if (!canEditCellRange(sheetId, options.range)) {
17
+ console.debug("This range is protected, users cannot edit this cell range.");
18
+ return undefined;
19
+ }
20
+ const plan = planSubtotals(options, {
21
+ getValue: (rowIndex, columnIndex) => getFormattedValue(sheetId, rowIndex, columnIndex) ??
22
+ getEffectiveValue(sheetId, rowIndex, columnIndex),
23
+ getFormula: (rowIndex, columnIndex) => getFormulaValue(sheetId, rowIndex, columnIndex),
24
+ getOutlineLevel: (rowIndex) => getRowOutlineLevel(sheetId, rowIndex),
25
+ });
26
+ if (!plan)
27
+ return undefined;
28
+ applySubtotalPlan(sheetId, plan, {
29
+ onDeleteRow,
30
+ onInsertRow,
31
+ onChangeBatch,
32
+ onGroupRows,
33
+ onUngroupRows,
34
+ });
35
+ return plan;
36
+ }, [
37
+ canEditCellRange,
38
+ getEffectiveValue,
39
+ getFormattedValue,
40
+ getFormulaValue,
41
+ getRowOutlineLevel,
42
+ onDeleteRow,
43
+ onInsertRow,
44
+ onChangeBatch,
45
+ onGroupRows,
46
+ onUngroupRows,
47
+ ]);
48
+ };
@@ -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,26 +1,67 @@
1
- import { selectionFromActiveCell } from "@rowsncolumns/grid";
2
1
  import { useCallback, useState } from "react";
2
+ import { collectPaintMerges, getBandedCellFormat, layerBandedFormat, paintSourceForActiveCell, spreadMergeAnchorFormats, tilePaintMerges, } from "../api/paint-format";
3
3
  // A paint-format target spanning at least this many rows/cols is a header-click
4
4
  // full-column/row selection, not an intentional drag — bound it to the pattern.
5
5
  const UNBOUNDED_PAINT_SPAN = 10_000;
6
- export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, }) => {
7
- const [paintFormats, setPaintFormats] = useState([]);
8
- const onSavePaintFormat = useCallback((sheetId, activeCell, selections) => {
9
- const finalSelections = selections.length
10
- ? selections
11
- : selectionFromActiveCell(activeCell);
12
- const paintFormats = [];
13
- for (const sel of finalSelections) {
14
- for (let rowIndex = sel.range.startRowIndex; rowIndex <= sel.range.endRowIndex; rowIndex++) {
6
+ const EMPTY_PATTERN = {
7
+ formats: [],
8
+ merges: [],
9
+ rows: 0,
10
+ cols: 0,
11
+ };
12
+ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChangeSelections, getMerges, onPaintMerges, getBandedCells, }) => {
13
+ const [pattern, setPattern] = useState(EMPTY_PATTERN);
14
+ const paintFormats = pattern.formats;
15
+ /**
16
+ * Capture the visible look of `range`: the effective format of every cell layered over the
17
+ * table stripe the grid paints beneath it, plus the merges fully inside the range.
18
+ */
19
+ const capturePattern = useCallback((sheetId, ranges) => {
20
+ const bandedCells = getBandedCells?.(sheetId);
21
+ const formats = [];
22
+ for (const range of ranges) {
23
+ for (let rowIndex = range.startRowIndex; rowIndex <= range.endRowIndex; rowIndex++) {
15
24
  const rowFormats = [];
16
- for (let columnIndex = sel.range.startColumnIndex; columnIndex <= sel.range.endColumnIndex; columnIndex++) {
17
- rowFormats.push(getEffectiveFormat(sheetId, rowIndex, columnIndex));
25
+ for (let columnIndex = range.startColumnIndex; columnIndex <= range.endColumnIndex; columnIndex++) {
26
+ rowFormats.push(layerBandedFormat(getEffectiveFormat(sheetId, rowIndex, columnIndex), getBandedCellFormat(bandedCells, rowIndex, columnIndex)));
18
27
  }
19
- paintFormats.push(rowFormats);
28
+ formats.push(rowFormats);
20
29
  }
21
30
  }
22
- setPaintFormats(paintFormats);
23
- }, [getEffectiveFormat]);
31
+ // Merges travel with a single-block source only; a multi-area capture has no single
32
+ // tiling origin (the format rows are stacked, as before).
33
+ const source = ranges.length === 1 ? ranges[0] : undefined;
34
+ const merges = source
35
+ ? collectPaintMerges(getMerges?.(sheetId), source)
36
+ : [];
37
+ // Excel keeps a merged area's style on every constituent cell; the grid paints the anchor's.
38
+ spreadMergeAnchorFormats(formats, merges);
39
+ return {
40
+ formats,
41
+ merges,
42
+ rows: formats.length,
43
+ cols: formats[0]?.length ?? 0,
44
+ };
45
+ }, [getEffectiveFormat, getBandedCells, getMerges]);
46
+ /**
47
+ * Replace the target's merges with the pattern's, tiled with the pattern's period.
48
+ */
49
+ const applyPatternMerges = useCallback((sheetId, activeCell, current, targets) => {
50
+ if (!current.merges.length || !onPaintMerges)
51
+ return;
52
+ for (const target of targets) {
53
+ const tiled = tilePaintMerges(current.merges, current.rows, current.cols, target);
54
+ onPaintMerges(sheetId, activeCell, target, tiled);
55
+ }
56
+ }, [onPaintMerges]);
57
+ const onSavePaintFormat = useCallback((sheetId, activeCell, selections) => {
58
+ // A plain click on a merged cell arms the painter with the anchor and NO selection (the
59
+ // grid clears the list) — Excel treats that click as the whole merged area.
60
+ const ranges = selections.length
61
+ ? selections.map((sel) => sel.range)
62
+ : [paintSourceForActiveCell(getMerges?.(sheetId), activeCell)];
63
+ setPattern(capturePattern(sheetId, ranges));
64
+ }, [capturePattern, getMerges]);
24
65
  // Applies a saved paintFormat
25
66
  const onApplyPaintFormat = useCallback((sheetId, activeCell, selections) => {
26
67
  /**
@@ -32,9 +73,7 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
32
73
  // `changeFormatting` repeats the grid via its rolling indices). Only
33
74
  // header-click full-column/row targets are bounded to the pattern so a paint
34
75
  // never enumerates an entire 1M-row column.
35
- const clampEnd = (start, end, span) => end - start >= UNBOUNDED_PAINT_SPAN
36
- ? Math.min(end, start + span)
37
- : end;
76
+ const clampEnd = (start, end, span) => end - start >= UNBOUNDED_PAINT_SPAN ? Math.min(end, start + span) : end;
38
77
  const newSelections = selections?.length
39
78
  ? selections.map((sel) => ({
40
79
  ...sel,
@@ -58,6 +97,8 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
58
97
  onChangeFormatting(sheetId, activeCell, newSelections, paintFormats, {
59
98
  replace: true,
60
99
  });
100
+ // Merges tile with the same period as the formats.
101
+ applyPatternMerges(sheetId, activeCell, pattern, newSelections.map((sel) => sel.range));
61
102
  /**
62
103
  * User has made selections. lets preserve it
63
104
  */
@@ -65,8 +106,14 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
65
106
  onChangeSelections?.(sheetId, newSelections);
66
107
  }
67
108
  // Reset paintformats
68
- setPaintFormats([]);
69
- }, [paintFormats, onChangeSelections, onChangeFormatting]);
109
+ setPattern(EMPTY_PATTERN);
110
+ }, [
111
+ pattern,
112
+ paintFormats,
113
+ onChangeSelections,
114
+ onChangeFormatting,
115
+ applyPatternMerges,
116
+ ]);
70
117
  /**
71
118
  * Copy formatting from a source range to target range
72
119
  */
@@ -79,24 +126,22 @@ export const usePaintFormat = ({ getEffectiveFormat, onChangeFormatting, onChang
79
126
  * Sheet range to paste to
80
127
  */
81
128
  targetSheetRange) => {
82
- const paintFormats = [];
83
- for (let rowIndex = sourceSheetRange.startRowIndex; rowIndex <= sourceSheetRange.endRowIndex; rowIndex++) {
84
- const rowFormats = [];
85
- for (let columnIndex = sourceSheetRange.startColumnIndex; columnIndex <= sourceSheetRange.endColumnIndex; columnIndex++) {
86
- rowFormats.push(getEffectiveFormat(sourceSheetRange.sheetId, rowIndex, columnIndex));
87
- }
88
- paintFormats.push(rowFormats);
89
- }
129
+ const captured = capturePattern(sourceSheetRange.sheetId, [
130
+ sourceSheetRange,
131
+ ]);
90
132
  // Apply
91
133
  const activeCell = {
92
134
  rowIndex: targetSheetRange.startRowIndex,
93
135
  columnIndex: targetSheetRange.startColumnIndex,
94
136
  };
95
137
  // Copy formatting
96
- onChangeFormatting(targetSheetRange.sheetId, activeCell, [{ range: targetSheetRange }], paintFormats, {
138
+ onChangeFormatting(targetSheetRange.sheetId, activeCell, [{ range: targetSheetRange }], captured.formats, {
97
139
  replace: true,
98
140
  });
99
- }, [onChangeFormatting, getEffectiveFormat]);
141
+ applyPatternMerges(targetSheetRange.sheetId, activeCell, captured, [
142
+ targetSheetRange,
143
+ ]);
144
+ }, [onChangeFormatting, capturePattern, applyPatternMerges]);
100
145
  return {
101
146
  isPaintFormatActive: paintFormats.length > 0,
102
147
  onSavePaintFormat,
@@ -49,6 +49,7 @@ export type UseSheetPropertiesProps<T extends CellData, S extends Sheet> = {
49
49
  getPrecedents?: (cell: FormulaPosition) => FormulaPrecedents;
50
50
  };
51
51
  export declare const useSheetProperties: <T extends CellData = CellData, S extends Sheet = Sheet>({ conditionalFormats, sheetData, sheets, activeSheetId, dataValidations, protectFormulas, getEffectiveStructuredValue, cellXfs, cellXfsRegistry, cellStyles, sharedStrings, locale, use1904, lenientGrouping, getPrecedents, }: UseSheetPropertiesProps<T, S>) => {
52
+ getFormulaValue: (sheetId: number, rowIndex: number, columnIndex: number) => string | undefined;
52
53
  getDataRowCount: (sheetId?: number) => number | undefined;
53
54
  getNonEmptyRowCount: (sheetId: number) => number | undefined;
54
55
  getNonEmptyColumnCount: (sheetId: number, rowIndex: number) => number | undefined;
@@ -87,6 +88,7 @@ export declare const useSheetProperties: <T extends CellData = CellData, S exten
87
88
  getFormulasFromRange: (sheetRange: SheetRange, hiddenDimensionStategy?: HIDDEN_DIMENSION_STRATEGY) => (string | undefined)[];
88
89
  isHiddenRow: (sheetId: number, rowIndex: number) => boolean;
89
90
  isHiddenByFilterRow: (sheetId: number, rowIndex: number) => boolean;
91
+ getRowOutlineLevel: (sheetId: number, rowIndex: number) => number;
90
92
  getSheetRowCount: (sheetId: number) => number;
91
93
  getSheetColumnCount: (sheetId: number) => number;
92
94
  getColumnWidth: (sheetId: number, columnIndex: number) => number;
@@ -1 +1 @@
1
- {"version":3,"file":"use-sheet-properties.d.ts","sourceRoot":"","sources":["../../../hooks/use-sheet-properties.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-sheet-properties.d.ts","sourceRoot":"","sources":["../../../hooks/use-sheet-properties.ts"],"names":[],"mappings":"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"}
@@ -226,6 +226,8 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
226
226
  const metaData = sheetMetaDataById.get(sheetId)?.rowMetadata?.[rowIndex];
227
227
  return Boolean(metaData?.hiddenByUser || metaData?.hiddenByFilter);
228
228
  }, [sheetMetaDataById]);
229
+ // Outline (row grouping) level, 0 when the row is not grouped
230
+ const getRowOutlineLevel = useCallback((sheetId, rowIndex) => sheetMetaDataById.get(sheetId)?.rowMetadata?.[rowIndex]?.outlineLevel ?? 0, [sheetMetaDataById]);
229
231
  // Hidden by filter row
230
232
  const isHiddenByFilterRow = useCallback((sheetId, rowIndex) => {
231
233
  const metaData = sheetMetaDataById.get(sheetId)?.rowMetadata?.[rowIndex];
@@ -867,6 +869,7 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
867
869
  return columnarData;
868
870
  }, [getEffectiveValue, getFormattedValue]));
869
871
  return {
872
+ getFormulaValue,
870
873
  getDataRowCount,
871
874
  getNonEmptyRowCount,
872
875
  getNonEmptyColumnCount,
@@ -898,6 +901,7 @@ export const useSheetProperties = ({ conditionalFormats, sheetData, sheets, acti
898
901
  getFormulasFromRange,
899
902
  isHiddenRow,
900
903
  isHiddenByFilterRow,
904
+ getRowOutlineLevel,
901
905
  getSheetRowCount,
902
906
  getSheetColumnCount,
903
907
  getColumnWidth,
@@ -1,5 +1,6 @@
1
1
  import type { CellInterface, SelectionArea } from "@rowsncolumns/common-types";
2
2
  import type { CellData, SelectionAttributes, Sheet } from "@rowsncolumns/spreadsheet";
3
+ import type { SplitTextOptions } from "../api/split-text";
3
4
  import type { useCalculation } from "./use-calculation";
4
5
  import type { useSheetProperties } from "./use-sheet-properties";
5
6
  import type { useSheetState } from "./use-sheet-state";
@@ -15,5 +16,5 @@ export type UseSplitTextToColumnsProps<T extends CellData, S extends Sheet> = {
15
16
  onChangeSelections: ReturnType<typeof useSheetState>["onChangeSelections"];
16
17
  onCommand?: OnCommand;
17
18
  };
18
- export declare const useSplitTextToColumns: <T extends CellData, S extends Sheet>({ locale, getFormattedValue, onChangeSheetData, enqueueCalculation, createHistory, onChangeSelections, onCommand, }: UseSplitTextToColumnsProps<T, S>) => (sheetId: number, activeCell: CellInterface, selections?: SelectionArea<SelectionAttributes>[], delimiter?: string) => void;
19
+ export declare const useSplitTextToColumns: <T extends CellData, S extends Sheet>({ locale, getFormattedValue, onChangeSheetData, enqueueCalculation, createHistory, onChangeSelections, onCommand, }: UseSplitTextToColumnsProps<T, S>) => (sheetId: number, activeCell: CellInterface, selections?: SelectionArea<SelectionAttributes>[], delimiter?: string, options?: SplitTextOptions) => void;
19
20
  //# sourceMappingURL=use-split-text-to-columns.d.ts.map