@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.
- package/dist/cjs/api/advanced-filter.d.ts +72 -0
- package/dist/cjs/api/advanced-filter.d.ts.map +1 -0
- package/dist/cjs/api/advanced-filter.js +0 -0
- package/dist/cjs/api/goal-seek.d.ts +29 -0
- package/dist/cjs/api/goal-seek.d.ts.map +1 -0
- package/dist/cjs/api/goal-seek.js +131 -0
- package/dist/cjs/api/immer-utils.d.ts.map +1 -1
- package/dist/cjs/api/immer-utils.js +1 -0
- package/dist/cjs/api/paint-format.d.ts +41 -0
- package/dist/cjs/api/paint-format.d.ts.map +1 -0
- package/dist/cjs/api/paint-format.js +115 -0
- package/dist/cjs/api/split-text.d.ts +12 -0
- package/dist/cjs/api/split-text.d.ts.map +1 -1
- package/dist/cjs/api/split-text.js +41 -0
- package/dist/cjs/api/subtotal.d.ts +85 -0
- package/dist/cjs/api/subtotal.d.ts.map +1 -0
- package/dist/cjs/api/subtotal.js +250 -0
- package/dist/cjs/commands.d.ts +8 -0
- package/dist/cjs/commands.d.ts.map +1 -1
- package/dist/cjs/components/editors/data-validation-rule-editor.d.ts.map +1 -1
- package/dist/cjs/components/editors/data-validation-rule-editor.js +83 -16
- package/dist/cjs/hooks/use-calculation-worker.d.ts.map +1 -1
- package/dist/cjs/hooks/use-calculation-worker.js +1 -0
- package/dist/cjs/hooks/use-on-advanced-filter.d.ts +21 -0
- package/dist/cjs/hooks/use-on-advanced-filter.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-advanced-filter.js +42 -0
- package/dist/cjs/hooks/use-on-goal-seek.d.ts +30 -0
- package/dist/cjs/hooks/use-on-goal-seek.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-goal-seek.js +140 -0
- package/dist/cjs/hooks/use-on-import-excel.d.ts +10 -1
- package/dist/cjs/hooks/use-on-import-excel.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-import-excel.js +8 -4
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-merge-unmerge-cells.js +53 -34
- package/dist/cjs/hooks/use-on-subtotal.d.ts +26 -0
- package/dist/cjs/hooks/use-on-subtotal.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-subtotal.js +53 -0
- package/dist/cjs/hooks/use-paint-format.d.ts +19 -3
- package/dist/cjs/hooks/use-paint-format.d.ts.map +1 -1
- package/dist/cjs/hooks/use-paint-format.js +85 -31
- package/dist/cjs/hooks/use-sheet-properties.d.ts +2 -0
- package/dist/cjs/hooks/use-sheet-properties.d.ts.map +1 -1
- package/dist/cjs/hooks/use-sheet-properties.js +4 -0
- package/dist/cjs/hooks/use-split-text-to-columns.d.ts +2 -1
- package/dist/cjs/hooks/use-split-text-to-columns.d.ts.map +1 -1
- package/dist/cjs/hooks/use-split-text-to-columns.js +3 -2
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts +50 -36
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.js +97 -18
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/interface/change-batch-stream.d.ts.map +1 -1
- package/dist/cjs/interface/change-batch-stream.js +12 -6
- package/dist/cjs/interface/change-batch.d.ts.map +1 -1
- package/dist/cjs/interface/change-batch.js +17 -9
- package/dist/cjs/interface/change-formatting.d.ts.map +1 -1
- package/dist/cjs/interface/change-formatting.js +30 -11
- package/dist/cjs/interface/split-text.d.ts +2 -1
- package/dist/cjs/interface/split-text.d.ts.map +1 -1
- package/dist/cjs/interface/split-text.js +7 -3
- package/dist/cjs/interface/spreadsheet-interface.d.ts.map +1 -1
- package/dist/cjs/interface/spreadsheet-interface.js +2 -2
- package/dist/cjs/sheet-cell.d.ts.map +1 -1
- package/dist/cjs/sheet-cell.js +7 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/api/advanced-filter.d.ts +72 -0
- package/dist/esm/api/advanced-filter.d.ts.map +1 -0
- package/dist/esm/api/advanced-filter.js +0 -0
- package/dist/esm/api/goal-seek.d.ts +29 -0
- package/dist/esm/api/goal-seek.d.ts.map +1 -0
- package/dist/esm/api/goal-seek.js +108 -0
- package/dist/esm/api/immer-utils.d.ts.map +1 -1
- package/dist/esm/api/immer-utils.js +1 -0
- package/dist/esm/api/paint-format.d.ts +41 -0
- package/dist/esm/api/paint-format.d.ts.map +1 -0
- package/dist/esm/api/paint-format.js +77 -0
- package/dist/esm/api/split-text.d.ts +12 -0
- package/dist/esm/api/split-text.d.ts.map +1 -1
- package/dist/esm/api/split-text.js +28 -0
- package/dist/esm/api/subtotal.d.ts +85 -0
- package/dist/esm/api/subtotal.d.ts.map +1 -0
- package/dist/esm/api/subtotal.js +181 -0
- package/dist/esm/commands.d.ts +8 -0
- package/dist/esm/commands.d.ts.map +1 -1
- package/dist/esm/components/editors/data-validation-rule-editor.d.ts.map +1 -1
- package/dist/esm/components/editors/data-validation-rule-editor.js +52 -4
- package/dist/esm/hooks/use-calculation-worker.d.ts.map +1 -1
- package/dist/esm/hooks/use-calculation-worker.js +1 -0
- package/dist/esm/hooks/use-on-advanced-filter.d.ts +21 -0
- package/dist/esm/hooks/use-on-advanced-filter.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-advanced-filter.js +41 -0
- package/dist/esm/hooks/use-on-goal-seek.d.ts +30 -0
- package/dist/esm/hooks/use-on-goal-seek.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-goal-seek.js +82 -0
- package/dist/esm/hooks/use-on-import-excel.d.ts +10 -1
- package/dist/esm/hooks/use-on-import-excel.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-import-excel.js +8 -4
- package/dist/esm/hooks/use-on-merge-unmerge-cells.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-merge-unmerge-cells.js +13 -13
- package/dist/esm/hooks/use-on-subtotal.d.ts +26 -0
- package/dist/esm/hooks/use-on-subtotal.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-subtotal.js +48 -0
- package/dist/esm/hooks/use-paint-format.d.ts +19 -3
- package/dist/esm/hooks/use-paint-format.d.ts.map +1 -1
- package/dist/esm/hooks/use-paint-format.js +71 -29
- package/dist/esm/hooks/use-sheet-properties.d.ts +2 -0
- package/dist/esm/hooks/use-sheet-properties.d.ts.map +1 -1
- package/dist/esm/hooks/use-sheet-properties.js +4 -0
- package/dist/esm/hooks/use-split-text-to-columns.d.ts +2 -1
- package/dist/esm/hooks/use-split-text-to-columns.d.ts.map +1 -1
- package/dist/esm/hooks/use-split-text-to-columns.js +3 -2
- package/dist/esm/hooks/use-spreadsheet-state.d.ts +50 -36
- package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.js +88 -16
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +8 -0
- package/dist/esm/interface/change-batch-stream.d.ts.map +1 -1
- package/dist/esm/interface/change-batch-stream.js +12 -6
- package/dist/esm/interface/change-batch.d.ts.map +1 -1
- package/dist/esm/interface/change-batch.js +15 -9
- package/dist/esm/interface/change-formatting.d.ts.map +1 -1
- package/dist/esm/interface/change-formatting.js +28 -11
- package/dist/esm/interface/split-text.d.ts +2 -1
- package/dist/esm/interface/split-text.d.ts.map +1 -1
- package/dist/esm/interface/split-text.js +6 -3
- package/dist/esm/interface/spreadsheet-interface.d.ts.map +1 -1
- package/dist/esm/interface/spreadsheet-interface.js +2 -2
- package/dist/esm/sheet-cell.d.ts.map +1 -1
- package/dist/esm/sheet-cell.js +7 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- 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
|
|
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
|
-
|
|
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:
|
|
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;
|
|
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
|
|
86
|
-
var
|
|
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 = (
|
|
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
|
|
115
|
-
var
|
|
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 = (
|
|
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 (
|
|
158
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
141
159
|
finally {
|
|
142
160
|
try {
|
|
143
|
-
if (
|
|
161
|
+
if (_p && !_p.done && (_b = _o.return)) _b.call(_o);
|
|
144
162
|
}
|
|
145
|
-
finally { if (
|
|
163
|
+
finally { if (e_3) throw e_3.error; }
|
|
146
164
|
}
|
|
147
165
|
}
|
|
148
166
|
}
|
|
149
167
|
}
|
|
150
|
-
catch (
|
|
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 (
|
|
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
|
-
|
|
161
|
-
for (var
|
|
162
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
|
177
|
-
var
|
|
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 }, (
|
|
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 (
|
|
222
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
204
223
|
finally {
|
|
205
224
|
try {
|
|
206
|
-
if (
|
|
225
|
+
if (mergedCells_1_1 && !mergedCells_1_1.done && (_d = mergedCells_1.return)) _d.call(mergedCells_1);
|
|
207
226
|
}
|
|
208
|
-
finally { if (
|
|
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
|
|
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 = (
|
|
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 (
|
|
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 (
|
|
341
|
+
finally { if (e_7) throw e_7.error; }
|
|
323
342
|
}
|
|
324
343
|
}
|
|
325
344
|
}
|
|
326
|
-
catch (
|
|
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 (
|
|
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
|
|
344
|
-
onChangeSelections === null || onChangeSelections === void 0 ? void 0 : onChangeSelections(sheetId,
|
|
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
|
+
};
|