@rowsncolumns/spreadsheet-state 28.0.73 → 28.0.74

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 (133) 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/goal-seek.d.ts +29 -0
  5. package/dist/cjs/api/goal-seek.d.ts.map +1 -0
  6. package/dist/cjs/api/goal-seek.js +131 -0
  7. package/dist/cjs/api/immer-utils.d.ts.map +1 -1
  8. package/dist/cjs/api/immer-utils.js +1 -0
  9. package/dist/cjs/api/paint-format.d.ts +41 -0
  10. package/dist/cjs/api/paint-format.d.ts.map +1 -0
  11. package/dist/cjs/api/paint-format.js +115 -0
  12. package/dist/cjs/api/split-text.d.ts +12 -0
  13. package/dist/cjs/api/split-text.d.ts.map +1 -1
  14. package/dist/cjs/api/split-text.js +41 -0
  15. package/dist/cjs/api/subtotal.d.ts +85 -0
  16. package/dist/cjs/api/subtotal.d.ts.map +1 -0
  17. package/dist/cjs/api/subtotal.js +250 -0
  18. package/dist/cjs/commands.d.ts +8 -0
  19. package/dist/cjs/commands.d.ts.map +1 -1
  20. package/dist/cjs/components/editors/data-validation-rule-editor.d.ts.map +1 -1
  21. package/dist/cjs/components/editors/data-validation-rule-editor.js +83 -16
  22. package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
  23. package/dist/cjs/hooks/use-calculation-worker.js +1 -0
  24. package/dist/cjs/hooks/use-on-advanced-filter.d.ts +21 -0
  25. package/dist/cjs/hooks/use-on-advanced-filter.d.ts.map +1 -0
  26. package/dist/cjs/hooks/use-on-advanced-filter.js +42 -0
  27. package/dist/cjs/hooks/use-on-goal-seek.d.ts +30 -0
  28. package/dist/cjs/hooks/use-on-goal-seek.d.ts.map +1 -0
  29. package/dist/cjs/hooks/use-on-goal-seek.js +140 -0
  30. package/dist/cjs/hooks/use-on-import-excel.d.ts +10 -1
  31. package/dist/cjs/hooks/use-on-import-excel.d.ts.map +1 -1
  32. package/dist/cjs/hooks/use-on-import-excel.js +8 -4
  33. package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
  34. package/dist/cjs/hooks/use-on-merge-unmerge-cells.js +53 -34
  35. package/dist/cjs/hooks/use-on-subtotal.d.ts +26 -0
  36. package/dist/cjs/hooks/use-on-subtotal.d.ts.map +1 -0
  37. package/dist/cjs/hooks/use-on-subtotal.js +53 -0
  38. package/dist/cjs/hooks/use-paint-format.d.ts +19 -3
  39. package/dist/cjs/hooks/use-paint-format.d.ts.map +1 -1
  40. package/dist/cjs/hooks/use-paint-format.js +85 -31
  41. package/dist/cjs/hooks/use-sheet-properties.d.ts +2 -0
  42. package/dist/cjs/hooks/use-sheet-properties.d.ts.map +1 -1
  43. package/dist/cjs/hooks/use-sheet-properties.js +4 -0
  44. package/dist/cjs/hooks/use-split-text-to-columns.d.ts +2 -1
  45. package/dist/cjs/hooks/use-split-text-to-columns.d.ts.map +1 -1
  46. package/dist/cjs/hooks/use-split-text-to-columns.js +3 -2
  47. package/dist/cjs/hooks/use-spreadsheet-state.d.ts +50 -36
  48. package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
  49. package/dist/cjs/hooks/use-spreadsheet-state.js +97 -18
  50. package/dist/cjs/index.d.ts +8 -0
  51. package/dist/cjs/index.d.ts.map +1 -1
  52. package/dist/cjs/index.js +8 -0
  53. package/dist/cjs/interface/change-batch-stream.d.ts.map +1 -1
  54. package/dist/cjs/interface/change-batch-stream.js +12 -6
  55. package/dist/cjs/interface/change-batch.d.ts.map +1 -1
  56. package/dist/cjs/interface/change-batch.js +17 -9
  57. package/dist/cjs/interface/change-formatting.d.ts.map +1 -1
  58. package/dist/cjs/interface/change-formatting.js +30 -11
  59. package/dist/cjs/interface/split-text.d.ts +2 -1
  60. package/dist/cjs/interface/split-text.d.ts.map +1 -1
  61. package/dist/cjs/interface/split-text.js +7 -3
  62. package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
  63. package/dist/cjs/interface/spreadsheet-interface.js +2 -2
  64. package/dist/cjs/sheet-cell.d.ts.map +1 -1
  65. package/dist/cjs/sheet-cell.js +7 -0
  66. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  67. package/dist/esm/api/advanced-filter.d.ts +72 -0
  68. package/dist/esm/api/advanced-filter.d.ts.map +1 -0
  69. package/dist/esm/api/advanced-filter.js +0 -0
  70. package/dist/esm/api/goal-seek.d.ts +29 -0
  71. package/dist/esm/api/goal-seek.d.ts.map +1 -0
  72. package/dist/esm/api/goal-seek.js +108 -0
  73. package/dist/esm/api/immer-utils.d.ts.map +1 -1
  74. package/dist/esm/api/immer-utils.js +1 -0
  75. package/dist/esm/api/paint-format.d.ts +41 -0
  76. package/dist/esm/api/paint-format.d.ts.map +1 -0
  77. package/dist/esm/api/paint-format.js +77 -0
  78. package/dist/esm/api/split-text.d.ts +12 -0
  79. package/dist/esm/api/split-text.d.ts.map +1 -1
  80. package/dist/esm/api/split-text.js +28 -0
  81. package/dist/esm/api/subtotal.d.ts +85 -0
  82. package/dist/esm/api/subtotal.d.ts.map +1 -0
  83. package/dist/esm/api/subtotal.js +181 -0
  84. package/dist/esm/commands.d.ts +8 -0
  85. package/dist/esm/commands.d.ts.map +1 -1
  86. package/dist/esm/components/editors/data-validation-rule-editor.d.ts.map +1 -1
  87. package/dist/esm/components/editors/data-validation-rule-editor.js +52 -4
  88. package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
  89. package/dist/esm/hooks/use-calculation-worker.js +1 -0
  90. package/dist/esm/hooks/use-on-advanced-filter.d.ts +21 -0
  91. package/dist/esm/hooks/use-on-advanced-filter.d.ts.map +1 -0
  92. package/dist/esm/hooks/use-on-advanced-filter.js +41 -0
  93. package/dist/esm/hooks/use-on-goal-seek.d.ts +30 -0
  94. package/dist/esm/hooks/use-on-goal-seek.d.ts.map +1 -0
  95. package/dist/esm/hooks/use-on-goal-seek.js +82 -0
  96. package/dist/esm/hooks/use-on-import-excel.d.ts +10 -1
  97. package/dist/esm/hooks/use-on-import-excel.d.ts.map +1 -1
  98. package/dist/esm/hooks/use-on-import-excel.js +8 -4
  99. package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
  100. package/dist/esm/hooks/use-on-merge-unmerge-cells.js +13 -13
  101. package/dist/esm/hooks/use-on-subtotal.d.ts +26 -0
  102. package/dist/esm/hooks/use-on-subtotal.d.ts.map +1 -0
  103. package/dist/esm/hooks/use-on-subtotal.js +48 -0
  104. package/dist/esm/hooks/use-paint-format.d.ts +19 -3
  105. package/dist/esm/hooks/use-paint-format.d.ts.map +1 -1
  106. package/dist/esm/hooks/use-paint-format.js +71 -29
  107. package/dist/esm/hooks/use-sheet-properties.d.ts +2 -0
  108. package/dist/esm/hooks/use-sheet-properties.d.ts.map +1 -1
  109. package/dist/esm/hooks/use-sheet-properties.js +4 -0
  110. package/dist/esm/hooks/use-split-text-to-columns.d.ts +2 -1
  111. package/dist/esm/hooks/use-split-text-to-columns.d.ts.map +1 -1
  112. package/dist/esm/hooks/use-split-text-to-columns.js +3 -2
  113. package/dist/esm/hooks/use-spreadsheet-state.d.ts +50 -36
  114. package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
  115. package/dist/esm/hooks/use-spreadsheet-state.js +88 -16
  116. package/dist/esm/index.d.ts +8 -0
  117. package/dist/esm/index.d.ts.map +1 -1
  118. package/dist/esm/index.js +8 -0
  119. package/dist/esm/interface/change-batch-stream.d.ts.map +1 -1
  120. package/dist/esm/interface/change-batch-stream.js +12 -6
  121. package/dist/esm/interface/change-batch.d.ts.map +1 -1
  122. package/dist/esm/interface/change-batch.js +15 -9
  123. package/dist/esm/interface/change-formatting.d.ts.map +1 -1
  124. package/dist/esm/interface/change-formatting.js +28 -11
  125. package/dist/esm/interface/split-text.d.ts +2 -1
  126. package/dist/esm/interface/split-text.d.ts.map +1 -1
  127. package/dist/esm/interface/split-text.js +6 -3
  128. package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
  129. package/dist/esm/interface/spreadsheet-interface.js +2 -2
  130. package/dist/esm/sheet-cell.d.ts.map +1 -1
  131. package/dist/esm/sheet-cell.js +7 -0
  132. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  133. package/package.json +18 -18
@@ -0,0 +1,42 @@
1
+ import { useCallback } from "react";
2
+ import { applyAdvancedFilterPlan, planAdvancedFilter, } from "../api/advanced-filter";
3
+ import { useCanEditCellRange, useCanEditSheet } from "./use-can-edit-cellrange";
4
+ /**
5
+ * Excel's Data → Sort & Filter → Advanced, composed over the existing
6
+ * hide/show-row and batch-write callbacks so both engines execute it through
7
+ * the same streamed commands. Records are compared by their effective value
8
+ * (numbers stay numeric) and fall back to the displayed text. Returns the
9
+ * applied plan, or `undefined` when the list has no records, the copy
10
+ * destination is missing / protected, or the sheet cannot be edited.
11
+ */
12
+ export var useOnAdvancedFilter = function (_a) {
13
+ var getEffectiveValue = _a.getEffectiveValue, getFormattedValue = _a.getFormattedValue, onHideRow = _a.onHideRow, onShowRow = _a.onShowRow, onChangeBatch = _a.onChangeBatch;
14
+ var canEditCellRange = useCanEditCellRange();
15
+ var canEditSheet = useCanEditSheet();
16
+ return useCallback(function (sheetId, options) {
17
+ if (!canEditSheet(sheetId)) {
18
+ console.debug("This sheet is protected, users cannot filter it.");
19
+ return undefined;
20
+ }
21
+ var plan = planAdvancedFilter(options, function (rowIndex, columnIndex) {
22
+ var value = getEffectiveValue(sheetId, rowIndex, columnIndex);
23
+ return value !== null && value !== void 0 ? value : getFormattedValue(sheetId, rowIndex, columnIndex);
24
+ });
25
+ if (!plan)
26
+ return undefined;
27
+ if (plan.copy && !canEditCellRange(sheetId, plan.copy.range)) {
28
+ console.debug("This range is protected, users cannot edit this cell range.");
29
+ return undefined;
30
+ }
31
+ applyAdvancedFilterPlan(sheetId, plan, { onHideRow: onHideRow, onShowRow: onShowRow, onChangeBatch: onChangeBatch });
32
+ return plan;
33
+ }, [
34
+ canEditSheet,
35
+ canEditCellRange,
36
+ getEffectiveValue,
37
+ getFormattedValue,
38
+ onHideRow,
39
+ onShowRow,
40
+ onChangeBatch,
41
+ ]);
42
+ };
@@ -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,140 @@
1
+ import { __assign, __awaiter, __generator, __values } from "tslib";
2
+ import { isCellNode, makeKey } from "@rowsncolumns/dag";
3
+ import { useCallback } from "react";
4
+ import { goalSeek } from "../api/goal-seek";
5
+ import { useCanEditCellRange } from "./use-can-edit-cellrange";
6
+ /** Cap on the formula chain re-evaluated per trial (a runaway dependency fan-out). */
7
+ var MAX_AFFECTED_CELLS = 2000;
8
+ var sameCell = function (a, sheetId, b) {
9
+ var _a;
10
+ return ((_a = a.sheetId) !== null && _a !== void 0 ? _a : sheetId) === sheetId &&
11
+ a.rowIndex === b.rowIndex &&
12
+ a.columnIndex === b.columnIndex;
13
+ };
14
+ /**
15
+ * Excel's Goal Seek (Data → What-If Analysis): find the value of
16
+ * `changingCell` that makes the formula in `setCell` evaluate to
17
+ * `targetValue`. Every trial is a scratch evaluation — the changing cell is
18
+ * pinned through the calculator's override map and the formula cells between
19
+ * it and the set cell (its transitive dependents, in dependency order) are
20
+ * re-evaluated into the same map, so nothing is written until the search
21
+ * ends. The final value is committed through `onChange` (one undo step,
22
+ * streamed to any engine consumer like a typed edit).
23
+ *
24
+ * Resolves to `undefined` when the set cell holds no formula or the changing
25
+ * cell is protected; otherwise the {@link GoalSeekResult} — Excel reports
26
+ * "found a solution" / "may not have found a solution" from `status`.
27
+ */
28
+ export var useOnGoalSeek = function (_a) {
29
+ var getFormulaValue = _a.getFormulaValue, getEffectiveValue = _a.getEffectiveValue, onRequestCalculate = _a.onRequestCalculate, getDependents = _a.getDependents, onChange = _a.onChange;
30
+ var canEditCellRange = useCanEditCellRange();
31
+ return useCallback(function (sheetId, setCell, targetValue, changingCell) { return __awaiter(void 0, void 0, void 0, function () {
32
+ var formula, changingPosition, affected, _a, _b, node, position, evaluate, current, initialValue, result;
33
+ var e_1, _c;
34
+ return __generator(this, function (_d) {
35
+ switch (_d.label) {
36
+ case 0:
37
+ if (!Number.isFinite(targetValue))
38
+ return [2 /*return*/, undefined];
39
+ if (!canEditCellRange(sheetId, changingCell)) {
40
+ console.debug("This range is protected, users cannot edit this cell range.");
41
+ return [2 /*return*/, undefined];
42
+ }
43
+ formula = getFormulaValue(sheetId, setCell.rowIndex, setCell.columnIndex);
44
+ if (!formula)
45
+ return [2 /*return*/, undefined];
46
+ if (sameCell(setCell, sheetId, changingCell))
47
+ return [2 /*return*/, undefined];
48
+ changingPosition = __assign({ sheetId: sheetId }, changingCell);
49
+ affected = [];
50
+ try {
51
+ for (_a = __values(getDependents(changingPosition)), _b = _a.next(); !_b.done; _b = _a.next()) {
52
+ node = _b.value;
53
+ if (!isCellNode(node))
54
+ continue;
55
+ position = node.position;
56
+ if (sameCell(position, sheetId, setCell) && position.sheetId === sheetId)
57
+ continue;
58
+ if (position.conditionalFormatId != null || position.dataValidationId != null)
59
+ continue;
60
+ affected.push(position);
61
+ if (affected.length >= MAX_AFFECTED_CELLS)
62
+ break;
63
+ }
64
+ }
65
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
66
+ finally {
67
+ try {
68
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
69
+ }
70
+ finally { if (e_1) throw e_1.error; }
71
+ }
72
+ evaluate = function (trial) { return __awaiter(void 0, void 0, void 0, function () {
73
+ var overrides, scratch, affected_1, affected_1_1, position, cellFormula, value, e_2_1, result;
74
+ var e_2, _a;
75
+ return __generator(this, function (_b) {
76
+ switch (_b.label) {
77
+ case 0:
78
+ overrides = new Map([[makeKey(changingPosition), trial]]);
79
+ scratch = function (text, position) { return __awaiter(void 0, void 0, void 0, function () {
80
+ return __generator(this, function (_a) {
81
+ return [2 /*return*/, onRequestCalculate(text, position.sheetId, position.rowIndex, position.columnIndex, {
82
+ overrides: overrides,
83
+ disablePreview: true,
84
+ })];
85
+ });
86
+ }); };
87
+ _b.label = 1;
88
+ case 1:
89
+ _b.trys.push([1, 6, 7, 8]);
90
+ affected_1 = __values(affected), affected_1_1 = affected_1.next();
91
+ _b.label = 2;
92
+ case 2:
93
+ if (!!affected_1_1.done) return [3 /*break*/, 5];
94
+ position = affected_1_1.value;
95
+ cellFormula = getFormulaValue(position.sheetId, position.rowIndex, position.columnIndex);
96
+ if (!cellFormula)
97
+ return [3 /*break*/, 4];
98
+ return [4 /*yield*/, scratch(cellFormula, position)];
99
+ case 3:
100
+ value = _b.sent();
101
+ // An errored intermediate reads as an error in the set cell too,
102
+ // which the solver treats as an unusable trial.
103
+ overrides.set(makeKey(position), value instanceof Error ? undefined : value);
104
+ _b.label = 4;
105
+ case 4:
106
+ affected_1_1 = affected_1.next();
107
+ return [3 /*break*/, 2];
108
+ case 5: return [3 /*break*/, 8];
109
+ case 6:
110
+ e_2_1 = _b.sent();
111
+ e_2 = { error: e_2_1 };
112
+ return [3 /*break*/, 8];
113
+ case 7:
114
+ try {
115
+ if (affected_1_1 && !affected_1_1.done && (_a = affected_1.return)) _a.call(affected_1);
116
+ }
117
+ finally { if (e_2) throw e_2.error; }
118
+ return [7 /*endfinally*/];
119
+ case 8: return [4 /*yield*/, scratch(formula, __assign({ sheetId: sheetId }, setCell))];
120
+ case 9:
121
+ result = _b.sent();
122
+ return [2 /*return*/, typeof result === "number" && Number.isFinite(result) ? result : undefined];
123
+ }
124
+ });
125
+ }); };
126
+ current = getEffectiveValue(sheetId, changingCell.rowIndex, changingCell.columnIndex);
127
+ initialValue = typeof current === "number"
128
+ ? current
129
+ : typeof current === "string" && current.trim() !== "" && Number.isFinite(Number(current))
130
+ ? Number(current)
131
+ : 0;
132
+ return [4 /*yield*/, goalSeek({ evaluate: evaluate, targetValue: targetValue, initialValue: initialValue })];
133
+ case 1:
134
+ result = _d.sent();
135
+ onChange(sheetId, changingCell, String(result.value), undefined);
136
+ return [2 /*return*/, result];
137
+ }
138
+ });
139
+ }); }, [canEditCellRange, getFormulaValue, getEffectiveValue, onRequestCalculate, getDependents, onChange]);
140
+ };
@@ -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
+ };