@rowsncolumns/spreadsheet-state 28.0.73 → 28.0.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/datatype.d.ts.map +1 -1
- package/dist/cjs/api/datatype.js +8 -1
- package/dist/cjs/api/fill-series-spec.d.ts +35 -0
- package/dist/cjs/api/fill-series-spec.d.ts.map +1 -0
- package/dist/cjs/api/fill-series-spec.js +164 -0
- package/dist/cjs/api/fill.d.ts +95 -3
- package/dist/cjs/api/fill.d.ts.map +1 -1
- package/dist/cjs/api/fill.js +1186 -418
- 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 +21 -15
- package/dist/cjs/api/intl.d.ts.map +1 -1
- package/dist/cjs/api/paint-format.d.ts +55 -0
- package/dist/cjs/api/paint-format.d.ts.map +1 -0
- package/dist/cjs/api/paint-format.js +174 -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 +19 -1
- 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-calculation.d.ts +1 -1
- 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-fill.d.ts +13 -4
- package/dist/cjs/hooks/use-on-fill.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-fill.js +28 -7
- 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 +89 -32
- 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 +109 -19
- 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/apply-fill.d.ts +3 -3
- package/dist/cjs/interface/apply-fill.d.ts.map +1 -1
- package/dist/cjs/interface/apply-fill.js +100 -53
- 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 +1 -1
- 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 +37 -6
- 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/datatype.d.ts.map +1 -1
- package/dist/esm/api/datatype.js +8 -1
- package/dist/esm/api/fill-series-spec.d.ts +35 -0
- package/dist/esm/api/fill-series-spec.d.ts.map +1 -0
- package/dist/esm/api/fill-series-spec.js +160 -0
- package/dist/esm/api/fill.d.ts +95 -3
- package/dist/esm/api/fill.d.ts.map +1 -1
- package/dist/esm/api/fill.js +1158 -418
- 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 +21 -15
- package/dist/esm/api/intl.d.ts.map +1 -1
- package/dist/esm/api/paint-format.d.ts +55 -0
- package/dist/esm/api/paint-format.d.ts.map +1 -0
- package/dist/esm/api/paint-format.js +122 -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 +19 -1
- 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-calculation.d.ts +1 -1
- 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-fill.d.ts +13 -4
- package/dist/esm/hooks/use-on-fill.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-fill.js +24 -4
- 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 +75 -30
- 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 +100 -17
- 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/apply-fill.d.ts +3 -3
- package/dist/esm/interface/apply-fill.d.ts.map +1 -1
- package/dist/esm/interface/apply-fill.js +93 -48
- 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 +1 -1
- 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 +37 -6
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +20 -20
|
@@ -3,7 +3,7 @@ import { tokenize as defaultTokenizer } from "@rowsncolumns/calculator";
|
|
|
3
3
|
import { isCellCoordinate, isCellNode, isCellRangeNode, isStaticNode, } from "@rowsncolumns/dag";
|
|
4
4
|
import { FormulaError } from "@rowsncolumns/fast-formula-parser";
|
|
5
5
|
import { defaultSpreadsheetTheme, } from "@rowsncolumns/spreadsheet";
|
|
6
|
-
import { addressToCell, canUseDOM, cellToAddress, DEFAULT_ACTIVE_CELL, DEFAULT_COLUMN_COUNT, DEFAULT_COLUMN_WIDTH, DEFAULT_ROW_COUNT, DEFAULT_ROW_HEIGHT, generateSelectionsFromFormula, getCellEffectiveFormat, getCellEffectiveValue, getCellFormattedValue, getCellUserEnteredFormat, getCellUserEnteredValue, getColumnIndexFromColumnName, getExtendedValueBool, getExtendedValueError, getExtendedValueFormula, getExtendedValueNumber, getExtendedValueString, isAreasEqual, isCellWithinBounds, isNil, iterateCellsInRange, pointToPixel, } from "@rowsncolumns/utils";
|
|
6
|
+
import { addressToCell, canUseDOM, cellToAddress, DEFAULT_ACTIVE_CELL, DEFAULT_COLUMN_COUNT, DEFAULT_COLUMN_WIDTH, DEFAULT_ROW_COUNT, DEFAULT_ROW_HEIGHT, generateSelectionsFromFormula, getCellEffectiveFormat, getCellEffectiveValue, getCellFormattedValue, getCellUserEnteredFormat, cellFormatWrapsText, getCellUserEnteredValue, getColumnIndexFromColumnName, getExtendedValueBool, getExtendedValueError, getExtendedValueFormula, getExtendedValueNumber, getExtendedValueString, isAreasEqual, isCellWithinBounds, isNil, iterateCellsInRange, pointToPixel, } from "@rowsncolumns/utils";
|
|
7
7
|
import { enableMapSet, enablePatches, produceWithPatches } from "immer";
|
|
8
8
|
import { buildConditionalFormatExpression } from "../api/conditional-format";
|
|
9
9
|
import { isConditionalFormatFormulaRule } from "../api/conditional-format";
|
|
@@ -1348,7 +1348,7 @@ var Spreadsheet = /** @class */ (function () {
|
|
|
1348
1348
|
fontSize: (_d = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.textFormat) === null || _d === void 0 ? void 0 : _d.fontSize,
|
|
1349
1349
|
fontFamily: (_e = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.textFormat) === null || _e === void 0 ? void 0 : _e.fontFamily,
|
|
1350
1350
|
italic: (_f = effectiveFormat === null || effectiveFormat === void 0 ? void 0 : effectiveFormat.textFormat) === null || _f === void 0 ? void 0 : _f.italic,
|
|
1351
|
-
shouldWrap: (effectiveFormat
|
|
1351
|
+
shouldWrap: cellFormatWrapsText(effectiveFormat),
|
|
1352
1352
|
};
|
|
1353
1353
|
};
|
|
1354
1354
|
Spreadsheet.prototype.shouldWrapCell = function (sheetId, rowIndex, columnIndex) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet-cell.d.ts","sourceRoot":"","sources":["../../sheet-cell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,SAAS,EACT,cAAc,EACf,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EACV,MAAM,EACN,OAAO,EACP,QAAQ,EACR,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,UAAU,EACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA2BtD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAuBnC,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sheet-cell.d.ts","sourceRoot":"","sources":["../../sheet-cell.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/sheet-cell.js
CHANGED
|
@@ -8,7 +8,7 @@ import { isDataValidationFormulaRule } from "./api/data-validation";
|
|
|
8
8
|
import { checkBooleanRule } from "./api/validation";
|
|
9
9
|
import { createFormattedValue, createNumberValue, detectNumberFormatPattern, detectNumberFormatType, detectValueType, detectValueTypeAndPattern, isMultiline, isNumber, isValidURLorEmail, } from "./api/datatype";
|
|
10
10
|
import { changeDecimals, getDecimalPlaces, pattern_number, pattern_number_thousands, } from "./api/decimals";
|
|
11
|
-
import { formulaToRelativeReference, updateColumnName, updateNamedRangeName, updateSheetName, } from "./api/formula";
|
|
11
|
+
import { ERROR_REFERENCE, formulaToRelativeReference, updateColumnName, updateNamedRangeName, updateSheetName, } from "./api/formula";
|
|
12
12
|
import { getLocaleSeparators } from "./api/intl";
|
|
13
13
|
import { AWAITING_CALCULATION } from "./helpers";
|
|
14
14
|
export var defaultSheetId = 1;
|
|
@@ -70,6 +70,14 @@ var hasGeneralPattern = function (format) {
|
|
|
70
70
|
* format is preserved as-is.
|
|
71
71
|
*/
|
|
72
72
|
var isGeneralNumberFormat = function (format) { return !format || (hasGeneralType(format) && hasGeneralPattern(format)); };
|
|
73
|
+
/**
|
|
74
|
+
* The explicit "General" format (Excel numFmtId 0). Written when the user
|
|
75
|
+
* picks General so the cell stops deriving a format from its formula.
|
|
76
|
+
*/
|
|
77
|
+
var GENERAL_NUMBER_FORMAT = {
|
|
78
|
+
type: "GENERAL",
|
|
79
|
+
pattern: "General",
|
|
80
|
+
};
|
|
73
81
|
var stripExcelTextPrefix = function (value) { return value.slice(1); };
|
|
74
82
|
var getHyperlinkTarget = function (hyperlink) {
|
|
75
83
|
if (typeof hyperlink === "string") {
|
|
@@ -478,6 +486,13 @@ var SheetCell = /** @class */ (function () {
|
|
|
478
486
|
catch (err) {
|
|
479
487
|
console.log("Error moving formula", err, this.formula, from, to);
|
|
480
488
|
if (err instanceof FormulaError) {
|
|
489
|
+
// A relative reference pushed off the grid has no address: Excel writes the `#REF!`
|
|
490
|
+
// token into the formula itself (`=A2` filled left from B2 becomes `=#REF!`). The error
|
|
491
|
+
// carries that rewritten text — keeping the unshifted source would leave a formula that
|
|
492
|
+
// silently references the wrong (here: its own) cell.
|
|
493
|
+
if (err.message === ERROR_REFERENCE && typeof err.details === "string") {
|
|
494
|
+
this.userEnteredValue = { fv: err.details };
|
|
495
|
+
}
|
|
481
496
|
this.effectiveValue = {
|
|
482
497
|
ev: {
|
|
483
498
|
type: "Error",
|
|
@@ -919,6 +934,13 @@ var SheetCell = /** @class */ (function () {
|
|
|
919
934
|
this.setStringValue(formulaValue);
|
|
920
935
|
return;
|
|
921
936
|
}
|
|
937
|
+
// A lone "=" has no expression to evaluate: Excel and Sheets keep it as
|
|
938
|
+
// the text "=" rather than a formula that can only show a parse error.
|
|
939
|
+
// The Rust store (`rnc-store` set-value / paste) applies the same rule.
|
|
940
|
+
if (formulaValue.trim() === "=") {
|
|
941
|
+
this.setStringValue(formulaValue);
|
|
942
|
+
return;
|
|
943
|
+
}
|
|
922
944
|
this.clearSharedStringIndex();
|
|
923
945
|
// Balance parenthesis
|
|
924
946
|
formulaValue = balanceFormula(formulaValue);
|
|
@@ -1453,25 +1475,34 @@ var SheetCell = /** @class */ (function () {
|
|
|
1453
1475
|
SheetCell.prototype.setNumberFormat = function (value) {
|
|
1454
1476
|
var _a, _b;
|
|
1455
1477
|
var previousFormatType = (_b = (_a = this.userEnteredFormat) === null || _a === void 0 ? void 0 : _a.numberFormat) === null || _b === void 0 ? void 0 : _b.type;
|
|
1456
|
-
|
|
1478
|
+
// A nullish patch means "the user chose General" (the toolbar's General
|
|
1479
|
+
// item, programmatic callers). Persist it as the explicit General
|
|
1480
|
+
// sentinel rather than deleting the slot: with NO `numberFormat` a
|
|
1481
|
+
// formula cell keeps deriving its format from the formula (`=DATE()` →
|
|
1482
|
+
// date), so General could never win over the derived date. Excel stamps
|
|
1483
|
+
// numFmtId 0 and shows the serial. `isGeneralNumberFormat` still treats
|
|
1484
|
+
// the sentinel as General, so typed input keeps auto-formatting.
|
|
1485
|
+
var numberFormat = value !== null && value !== void 0 ? value : __assign({}, GENERAL_NUMBER_FORMAT);
|
|
1486
|
+
var numberFormatType = numberFormat.type;
|
|
1457
1487
|
var hasUserEnteredValue = this.getUserEnteredValue() !== undefined;
|
|
1458
1488
|
if (!isNil(this.sharedStringIndex) &&
|
|
1459
1489
|
numberFormatType &&
|
|
1460
|
-
numberFormatType !== "TEXT"
|
|
1490
|
+
numberFormatType !== "TEXT" &&
|
|
1491
|
+
numberFormatType !== "GENERAL") {
|
|
1461
1492
|
return;
|
|
1462
1493
|
}
|
|
1463
|
-
set(this, "userEnteredFormat.numberFormat",
|
|
1494
|
+
set(this, "userEnteredFormat.numberFormat", numberFormat);
|
|
1464
1495
|
var effectiveValue = this.getEffectiveValue();
|
|
1465
1496
|
if (effectiveValue === null || effectiveValue === undefined) {
|
|
1466
1497
|
return;
|
|
1467
1498
|
}
|
|
1468
1499
|
if (numberFormatType === "TEXT") {
|
|
1469
1500
|
var userValue = this.getUserEnteredValue();
|
|
1470
|
-
this.formatAsText(userValue !== null && userValue !== void 0 ? userValue : effectiveValue,
|
|
1501
|
+
this.formatAsText(userValue !== null && userValue !== void 0 ? userValue : effectiveValue, numberFormat, !hasUserEnteredValue);
|
|
1471
1502
|
}
|
|
1472
1503
|
else {
|
|
1473
1504
|
var preserveUserEnteredText = previousFormatType === "TEXT";
|
|
1474
|
-
this.formatAsNumber(effectiveValue,
|
|
1505
|
+
this.formatAsNumber(effectiveValue, numberFormat, preserveUserEnteredText, !hasUserEnteredValue);
|
|
1475
1506
|
}
|
|
1476
1507
|
};
|
|
1477
1508
|
SheetCell.prototype.formatAsText = function (effectiveValue, numberFormat, keepUserEnteredUnset) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../../cellxfs-registry.ts","../../commands.ts","../../generated-names.ts","../../helpers.ts","../../index.ts","../../server-utils.ts","../../server.browser.ts","../../server.ts","../../shared-string-registry.ts","../../sheet-cell.ts","../../test-setup.ts","../../types.ts","../../vitest.config.ts","../../api/border.ts","../../api/conditional-format.ts","../../api/copy-paste.ts","../../api/data-validation.ts","../../api/datatype.ts","../../api/date.ts","../../api/decimals.ts","../../api/dependency.ts","../../api/fill.ts","../../api/filter-range.ts","../../api/filter.ts","../../api/format-caches.ts","../../api/formula.ts","../../api/immer-utils.ts","../../api/intl.ts","../../api/merges.ts","../../api/outline.ts","../../api/parse-html.ts","../../api/paste-special.ts","../../api/patches.ts","../../api/pivot-range.ts","../../api/range-rule-helpers.ts","../../api/range.ts","../../api/rename-sheet.ts","../../api/selection.ts","../../api/sort.ts","../../api/split-text.ts","../../api/structural-formula-update.ts","../../api/table.ts","../../api/validation.ts","../../api/xlsx-source.ts","../../atoms/delete-sheet-atom.ts","../../atoms/dialog-state.atom.ts","../../atoms/editing-data-validation-id.atom.ts","../../atoms/editing-embed.atom.ts","../../atoms/editing-table.atom.ts","../../atoms/error-state.atom.ts","../../atoms/index.ts","../../atoms/insert-image-state.atom.ts","../../atoms/named-range.atom.ts","../../atoms/resize-dimension.atom.ts","../../atoms/sheet-observer.atom.ts","../../components/index.tsx","../../components/dialogs/delete-sheet-confirmation.tsx","../../components/dialogs/error-state.tsx","../../components/editors/cell-format-editor.tsx","../../components/editors/conditional-format-editor.tsx","../../components/editors/conditional-format-rule-editor.tsx","../../components/editors/data-validation-editor.tsx","../../components/editors/data-validation-rule-editor.tsx","../../components/editors/embed-editor.tsx","../../components/editors/insert-image-editor.tsx","../../components/editors/insert-link-editor.tsx","../../components/editors/named-range-editor.tsx","../../components/editors/resize-dimension-editor.tsx","../../components/editors/sheet-filter.tsx","../../components/editors/table-editor.tsx","../../helpers/iterative-calculation.ts","../../helpers/sheet-title.ts","../../hooks/use-async-datasource.ts","../../hooks/use-calculation-initialize.ts","../../hooks/use-calculation-process-array.ts","../../hooks/use-calculation-queue.ts","../../hooks/use-calculation-worker.ts","../../hooks/use-calculation.ts","../../hooks/use-can-edit-cellrange.ts","../../hooks/use-cellxfs-registry.ts","../../hooks/use-citations.ts","../../hooks/use-comments.ts","../../hooks/use-conditional-formatting-rules.ts","../../hooks/use-data-validation-rules.ts","../../hooks/use-deferred-calculation-flush.ts","../../hooks/use-idle-scheduler.ts","../../hooks/use-indent.ts","../../hooks/use-named-range.ts","../../hooks/use-on-adjust-row-height.ts","../../hooks/use-on-autoresize.ts","../../hooks/use-on-banded-ranges.ts","../../hooks/use-on-calculation-begin.ts","../../hooks/use-on-calculation-success.ts","../../hooks/use-on-change-batch-stream.ts","../../hooks/use-on-change-batch.ts","../../hooks/use-on-change-calculated-column.ts","../../hooks/use-on-change-decimals.ts","../../hooks/use-on-change-formatting.ts","../../hooks/use-on-change-sheet-tabcolor.ts","../../hooks/use-on-change-table-column.ts","../../hooks/use-on-change-theme.ts","../../hooks/use-on-change.ts","../../hooks/use-on-clear-formatting.ts","../../hooks/use-on-collapse-column-group.ts","../../hooks/use-on-collapse-row-group.ts","../../hooks/use-on-copy.ts","../../hooks/use-on-create-named-range.ts","../../hooks/use-on-create-sheet.ts","../../hooks/use-on-delete-cells-shift-left.ts","../../hooks/use-on-delete-cells-shift-up.ts","../../hooks/use-on-delete-column.ts","../../hooks/use-on-delete-named-range.ts","../../hooks/use-on-delete-row.ts","../../hooks/use-on-delete-sheet.ts","../../hooks/use-on-delete-table-row.ts","../../hooks/use-on-delete.ts","../../hooks/use-on-drag-n-drop.ts","../../hooks/use-on-duplicate-sheet.ts","../../hooks/use-on-embeds.ts","../../hooks/use-on-expand-column-group.ts","../../hooks/use-on-expand-row-group.ts","../../hooks/use-on-fill-range.ts","../../hooks/use-on-fill.ts","../../hooks/use-on-filter-table.ts","../../hooks/use-on-find-replace.ts","../../hooks/use-on-freeze.ts","../../hooks/use-on-group-columns.ts","../../hooks/use-on-group-rows.ts","../../hooks/use-on-hide-column.ts","../../hooks/use-on-hide-row.ts","../../hooks/use-on-hide-show-sheet.ts","../../hooks/use-on-import-csv-legacy.ts","../../hooks/use-on-import-csv.ts","../../hooks/use-on-import-excel.ts","../../hooks/use-on-insert-autosum.ts","../../hooks/use-on-insert-cells-shift-down.ts","../../hooks/use-on-insert-cells-shift-right.ts","../../hooks/use-on-insert-checkbox.ts","../../hooks/use-on-insert-column.ts","../../hooks/use-on-insert-date-time.ts","../../hooks/use-on-insert-date.ts","../../hooks/use-on-insert-image.ts","../../hooks/use-on-insert-link.ts","../../hooks/use-on-insert-note.ts","../../hooks/use-on-insert-row.ts","../../hooks/use-on-insert-table-row.ts","../../hooks/use-on-insert-time.ts","../../hooks/use-on-locale-change.ts","../../hooks/use-on-merge-unmerge-cells.ts","../../hooks/use-on-move-columns.ts","../../hooks/use-on-move-rows.ts","../../hooks/use-on-move-selection.ts","../../hooks/use-on-move-sheet.ts","../../hooks/use-on-move-table-columns.ts","../../hooks/use-on-paste.ts","../../hooks/use-on-protect-range.ts","../../hooks/use-on-protect-sheet.ts","../../hooks/use-on-remove-duplicates.ts","../../hooks/use-on-rename-sheet.ts","../../hooks/use-on-request-calculate-wrapper.ts","../../hooks/use-on-request-conditional-format.ts","../../hooks/use-on-request-data-validation.ts","../../hooks/use-on-request-define-named-range.ts","../../hooks/use-on-request-delete-sheet.ts","../../hooks/use-on-request-edit-table.ts","../../hooks/use-on-request-format-cells.ts","../../hooks/use-on-request-insert-image.ts","../../hooks/use-on-request-insert-link.ts","../../hooks/use-on-request-resize.ts","../../hooks/use-on-request-update-named-range.ts","../../hooks/use-on-resize-table.ts","../../hooks/use-on-resize.ts","../../hooks/use-on-set-outline-depth.ts","../../hooks/use-on-show-column.ts","../../hooks/use-on-show-row.ts","../../hooks/use-on-sort-column.ts","../../hooks/use-on-sort-range.ts","../../hooks/use-on-sort-table.ts","../../hooks/use-on-table.ts","../../hooks/use-on-trace-dependents-precedents.tsx","../../hooks/use-on-ungroup-columns.ts","../../hooks/use-on-ungroup-rows.ts","../../hooks/use-on-update-named-range.ts","../../hooks/use-on-update-note.ts","../../hooks/use-on-update-sheet.ts","../../hooks/use-paint-format.ts","../../hooks/use-search.ts","../../hooks/use-select-next-prev-sheet.ts","../../hooks/use-sheet-observer.ts","../../hooks/use-sheet-properties.ts","../../hooks/use-sheet-state.ts","../../hooks/use-sheetdata-subscriber.ts","../../hooks/use-slicers.ts","../../hooks/use-split-text-to-columns.ts","../../hooks/use-spreadsheet-state.ts","../../hooks/use-ss-registry.ts","../../hooks/use-structured-reference.ts","../../hooks/use-undo-redo-actions.ts","../../hooks/use-undo-redo.ts","../../hooks/utils/frozen-sort.ts","../../hooks/utils/sort-rows.ts","../../interface/apply-fill.ts","../../interface/auto-resize.ts","../../interface/calculation-interface.ts","../../interface/change-batch-stream.ts","../../interface/change-batch.ts","../../interface/change-border.ts","../../interface/change-calculated-column.ts","../../interface/change-decimals.ts","../../interface/change-formatting.ts","../../interface/change-sheet-tabcolor.ts","../../interface/change-table-column.ts","../../interface/change-theme.ts","../../interface/chart-extensions.ts","../../interface/citations.ts","../../interface/clear-formatting.ts","../../interface/conditional-formatting-rules.ts","../../interface/create-table.ts","../../interface/data-validation-rules.ts","../../interface/data-validation-utils.ts","../../interface/delete-cells-shift-left.ts","../../interface/delete-cells-shift-up.ts","../../interface/delete-cells.ts","../../interface/delete-column.ts","../../interface/delete-row.ts","../../interface/delete-sheet.ts","../../interface/delete-table-column.ts","../../interface/delete-table-row.ts","../../interface/duplicate-sheet.ts","../../interface/embeds.ts","../../interface/freeze.ts","../../interface/helpers.ts","../../interface/hide-column.ts","../../interface/hide-row.ts","../../interface/indent.ts","../../interface/insert-cells-shift-down.ts","../../interface/insert-cells-shift-right.ts","../../interface/insert-column.ts","../../interface/insert-note.ts","../../interface/insert-row.ts","../../interface/insert-table-row.ts","../../interface/interface-cli.ts","../../interface/named-range-operations.ts","../../interface/new-sheet.ts","../../interface/pivot-extensions.ts","../../interface/remove-duplicates.ts","../../interface/remove-table.ts","../../interface/resize-utils.ts","../../interface/resize.ts","../../interface/slicers.ts","../../interface/split-text.ts","../../interface/spreadsheet-interface.ts","../../interface/table-totalrow.ts","../../interface/table-utils.ts","../../interface/update-sheet.ts","../../interface/update-table.ts","../../validation-schema/table.schema.ts"],"version":"5.8.3"}
|
|
1
|
+
{"root":["../../cellxfs-registry.ts","../../commands.ts","../../generated-names.ts","../../helpers.ts","../../index.ts","../../server-utils.ts","../../server.browser.ts","../../server.ts","../../shared-string-registry.ts","../../sheet-cell.ts","../../test-setup.ts","../../types.ts","../../vitest.config.ts","../../api/advanced-filter.ts","../../api/border.ts","../../api/conditional-format.ts","../../api/copy-paste.ts","../../api/data-validation.ts","../../api/datatype.ts","../../api/date.ts","../../api/decimals.ts","../../api/dependency.ts","../../api/fill-series-spec.ts","../../api/fill.ts","../../api/filter-range.ts","../../api/filter.ts","../../api/format-caches.ts","../../api/formula.ts","../../api/goal-seek.ts","../../api/immer-utils.ts","../../api/intl.ts","../../api/merges.ts","../../api/outline.ts","../../api/paint-format.ts","../../api/parse-html.ts","../../api/paste-special.ts","../../api/patches.ts","../../api/pivot-range.ts","../../api/range-rule-helpers.ts","../../api/range.ts","../../api/rename-sheet.ts","../../api/selection.ts","../../api/sort.ts","../../api/split-text.ts","../../api/structural-formula-update.ts","../../api/subtotal.ts","../../api/table.ts","../../api/validation.ts","../../api/xlsx-source.ts","../../atoms/delete-sheet-atom.ts","../../atoms/dialog-state.atom.ts","../../atoms/editing-data-validation-id.atom.ts","../../atoms/editing-embed.atom.ts","../../atoms/editing-table.atom.ts","../../atoms/error-state.atom.ts","../../atoms/index.ts","../../atoms/insert-image-state.atom.ts","../../atoms/named-range.atom.ts","../../atoms/resize-dimension.atom.ts","../../atoms/sheet-observer.atom.ts","../../components/index.tsx","../../components/dialogs/delete-sheet-confirmation.tsx","../../components/dialogs/error-state.tsx","../../components/editors/cell-format-editor.tsx","../../components/editors/conditional-format-editor.tsx","../../components/editors/conditional-format-rule-editor.tsx","../../components/editors/data-validation-editor.tsx","../../components/editors/data-validation-rule-editor.tsx","../../components/editors/embed-editor.tsx","../../components/editors/insert-image-editor.tsx","../../components/editors/insert-link-editor.tsx","../../components/editors/named-range-editor.tsx","../../components/editors/resize-dimension-editor.tsx","../../components/editors/sheet-filter.tsx","../../components/editors/table-editor.tsx","../../helpers/iterative-calculation.ts","../../helpers/sheet-title.ts","../../hooks/use-async-datasource.ts","../../hooks/use-calculation-initialize.ts","../../hooks/use-calculation-process-array.ts","../../hooks/use-calculation-queue.ts","../../hooks/use-calculation-worker.ts","../../hooks/use-calculation.ts","../../hooks/use-can-edit-cellrange.ts","../../hooks/use-cellxfs-registry.ts","../../hooks/use-citations.ts","../../hooks/use-comments.ts","../../hooks/use-conditional-formatting-rules.ts","../../hooks/use-data-validation-rules.ts","../../hooks/use-deferred-calculation-flush.ts","../../hooks/use-idle-scheduler.ts","../../hooks/use-indent.ts","../../hooks/use-named-range.ts","../../hooks/use-on-adjust-row-height.ts","../../hooks/use-on-advanced-filter.ts","../../hooks/use-on-autoresize.ts","../../hooks/use-on-banded-ranges.ts","../../hooks/use-on-calculation-begin.ts","../../hooks/use-on-calculation-success.ts","../../hooks/use-on-change-batch-stream.ts","../../hooks/use-on-change-batch.ts","../../hooks/use-on-change-calculated-column.ts","../../hooks/use-on-change-decimals.ts","../../hooks/use-on-change-formatting.ts","../../hooks/use-on-change-sheet-tabcolor.ts","../../hooks/use-on-change-table-column.ts","../../hooks/use-on-change-theme.ts","../../hooks/use-on-change.ts","../../hooks/use-on-clear-formatting.ts","../../hooks/use-on-collapse-column-group.ts","../../hooks/use-on-collapse-row-group.ts","../../hooks/use-on-copy.ts","../../hooks/use-on-create-named-range.ts","../../hooks/use-on-create-sheet.ts","../../hooks/use-on-delete-cells-shift-left.ts","../../hooks/use-on-delete-cells-shift-up.ts","../../hooks/use-on-delete-column.ts","../../hooks/use-on-delete-named-range.ts","../../hooks/use-on-delete-row.ts","../../hooks/use-on-delete-sheet.ts","../../hooks/use-on-delete-table-row.ts","../../hooks/use-on-delete.ts","../../hooks/use-on-drag-n-drop.ts","../../hooks/use-on-duplicate-sheet.ts","../../hooks/use-on-embeds.ts","../../hooks/use-on-expand-column-group.ts","../../hooks/use-on-expand-row-group.ts","../../hooks/use-on-fill-range.ts","../../hooks/use-on-fill.ts","../../hooks/use-on-filter-table.ts","../../hooks/use-on-find-replace.ts","../../hooks/use-on-freeze.ts","../../hooks/use-on-goal-seek.ts","../../hooks/use-on-group-columns.ts","../../hooks/use-on-group-rows.ts","../../hooks/use-on-hide-column.ts","../../hooks/use-on-hide-row.ts","../../hooks/use-on-hide-show-sheet.ts","../../hooks/use-on-import-csv-legacy.ts","../../hooks/use-on-import-csv.ts","../../hooks/use-on-import-excel.ts","../../hooks/use-on-insert-autosum.ts","../../hooks/use-on-insert-cells-shift-down.ts","../../hooks/use-on-insert-cells-shift-right.ts","../../hooks/use-on-insert-checkbox.ts","../../hooks/use-on-insert-column.ts","../../hooks/use-on-insert-date-time.ts","../../hooks/use-on-insert-date.ts","../../hooks/use-on-insert-image.ts","../../hooks/use-on-insert-link.ts","../../hooks/use-on-insert-note.ts","../../hooks/use-on-insert-row.ts","../../hooks/use-on-insert-table-row.ts","../../hooks/use-on-insert-time.ts","../../hooks/use-on-locale-change.ts","../../hooks/use-on-merge-unmerge-cells.ts","../../hooks/use-on-move-columns.ts","../../hooks/use-on-move-rows.ts","../../hooks/use-on-move-selection.ts","../../hooks/use-on-move-sheet.ts","../../hooks/use-on-move-table-columns.ts","../../hooks/use-on-paste.ts","../../hooks/use-on-protect-range.ts","../../hooks/use-on-protect-sheet.ts","../../hooks/use-on-remove-duplicates.ts","../../hooks/use-on-rename-sheet.ts","../../hooks/use-on-request-calculate-wrapper.ts","../../hooks/use-on-request-conditional-format.ts","../../hooks/use-on-request-data-validation.ts","../../hooks/use-on-request-define-named-range.ts","../../hooks/use-on-request-delete-sheet.ts","../../hooks/use-on-request-edit-table.ts","../../hooks/use-on-request-format-cells.ts","../../hooks/use-on-request-insert-image.ts","../../hooks/use-on-request-insert-link.ts","../../hooks/use-on-request-resize.ts","../../hooks/use-on-request-update-named-range.ts","../../hooks/use-on-resize-table.ts","../../hooks/use-on-resize.ts","../../hooks/use-on-set-outline-depth.ts","../../hooks/use-on-show-column.ts","../../hooks/use-on-show-row.ts","../../hooks/use-on-sort-column.ts","../../hooks/use-on-sort-range.ts","../../hooks/use-on-sort-table.ts","../../hooks/use-on-subtotal.ts","../../hooks/use-on-table.ts","../../hooks/use-on-trace-dependents-precedents.tsx","../../hooks/use-on-ungroup-columns.ts","../../hooks/use-on-ungroup-rows.ts","../../hooks/use-on-update-named-range.ts","../../hooks/use-on-update-note.ts","../../hooks/use-on-update-sheet.ts","../../hooks/use-paint-format.ts","../../hooks/use-search.ts","../../hooks/use-select-next-prev-sheet.ts","../../hooks/use-sheet-observer.ts","../../hooks/use-sheet-properties.ts","../../hooks/use-sheet-state.ts","../../hooks/use-sheetdata-subscriber.ts","../../hooks/use-slicers.ts","../../hooks/use-split-text-to-columns.ts","../../hooks/use-spreadsheet-state.ts","../../hooks/use-ss-registry.ts","../../hooks/use-structured-reference.ts","../../hooks/use-undo-redo-actions.ts","../../hooks/use-undo-redo.ts","../../hooks/utils/frozen-sort.ts","../../hooks/utils/sort-rows.ts","../../interface/apply-fill.ts","../../interface/auto-resize.ts","../../interface/calculation-interface.ts","../../interface/change-batch-stream.ts","../../interface/change-batch.ts","../../interface/change-border.ts","../../interface/change-calculated-column.ts","../../interface/change-decimals.ts","../../interface/change-formatting.ts","../../interface/change-sheet-tabcolor.ts","../../interface/change-table-column.ts","../../interface/change-theme.ts","../../interface/chart-extensions.ts","../../interface/citations.ts","../../interface/clear-formatting.ts","../../interface/conditional-formatting-rules.ts","../../interface/create-table.ts","../../interface/data-validation-rules.ts","../../interface/data-validation-utils.ts","../../interface/delete-cells-shift-left.ts","../../interface/delete-cells-shift-up.ts","../../interface/delete-cells.ts","../../interface/delete-column.ts","../../interface/delete-row.ts","../../interface/delete-sheet.ts","../../interface/delete-table-column.ts","../../interface/delete-table-row.ts","../../interface/duplicate-sheet.ts","../../interface/embeds.ts","../../interface/freeze.ts","../../interface/helpers.ts","../../interface/hide-column.ts","../../interface/hide-row.ts","../../interface/indent.ts","../../interface/insert-cells-shift-down.ts","../../interface/insert-cells-shift-right.ts","../../interface/insert-column.ts","../../interface/insert-note.ts","../../interface/insert-row.ts","../../interface/insert-table-row.ts","../../interface/interface-cli.ts","../../interface/named-range-operations.ts","../../interface/new-sheet.ts","../../interface/pivot-extensions.ts","../../interface/remove-duplicates.ts","../../interface/remove-table.ts","../../interface/resize-utils.ts","../../interface/resize.ts","../../interface/slicers.ts","../../interface/split-text.ts","../../interface/spreadsheet-interface.ts","../../interface/table-totalrow.ts","../../interface/table-utils.ts","../../interface/update-sheet.ts","../../interface/update-table.ts","../../validation-schema/table.schema.ts"],"version":"5.8.3"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { GridRange } from "@rowsncolumns/common-types";
|
|
2
|
+
import type { AdvancedFilterAction, AdvancedFilterOptions } from "@rowsncolumns/spreadsheet";
|
|
3
|
+
/**
|
|
4
|
+
* Excel's Data → Sort & Filter → Advanced: a list range (header row + records)
|
|
5
|
+
* filtered by a CRITERIA RANGE — a header row naming list columns, then one
|
|
6
|
+
* or more criteria rows. Conditions on one criteria row AND together; the
|
|
7
|
+
* rows OR together. A criterion cell is an Excel comparison string:
|
|
8
|
+
*
|
|
9
|
+
* `>100` `<=5` `<>done` `=apple` operator + value
|
|
10
|
+
* `app` text begins with "app" (case-insensitive)
|
|
11
|
+
* `="=apple"` → `=apple` exact text match
|
|
12
|
+
* `a*e` `?at` `~*` `*` any run, `?` one char, `~` escapes
|
|
13
|
+
* blank no condition (a fully blank criteria row
|
|
14
|
+
* matches every record, as in Excel)
|
|
15
|
+
*
|
|
16
|
+
* Numbers compare numerically when both sides are numeric; text compares
|
|
17
|
+
* case-insensitively. A criteria header that matches no list header is a
|
|
18
|
+
* computed criterion in Excel — those need a formula per record and are not
|
|
19
|
+
* evaluated here (the condition is ignored; see the compatibility doc).
|
|
20
|
+
*/
|
|
21
|
+
export type { AdvancedFilterAction, AdvancedFilterOptions };
|
|
22
|
+
export type CellValueReader = (rowIndex: number, columnIndex: number) => string | number | boolean | null | undefined;
|
|
23
|
+
type Operator = "=" | "<>" | "<" | "<=" | ">" | ">=" | "begins";
|
|
24
|
+
export type Criterion = {
|
|
25
|
+
columnIndex: number;
|
|
26
|
+
operator: Operator;
|
|
27
|
+
value: string;
|
|
28
|
+
};
|
|
29
|
+
/** Excel wildcard pattern → anchored RegExp (`~` escapes `*`, `?`, `~`). */
|
|
30
|
+
export declare const wildcardToRegExp: (pattern: string, anchorEnd?: boolean) => RegExp;
|
|
31
|
+
/** Whether one record cell satisfies one criterion. */
|
|
32
|
+
export declare const matchesCriterion: (cellValue: string | number | boolean | null | undefined, criterion: Criterion) => boolean;
|
|
33
|
+
/**
|
|
34
|
+
* One OR-branch of the criteria range: the AND-ed criteria of one criteria
|
|
35
|
+
* row. An empty array is a blank criteria row — it matches every record.
|
|
36
|
+
*/
|
|
37
|
+
export type CriteriaRow = Criterion[];
|
|
38
|
+
/**
|
|
39
|
+
* Reads the criteria range against the list's header row. Criteria headers
|
|
40
|
+
* resolve to list columns case-insensitively; a header without a list match
|
|
41
|
+
* (a computed criterion) is skipped.
|
|
42
|
+
*/
|
|
43
|
+
export declare const parseCriteriaRange: (listRange: GridRange, criteriaRange: GridRange, getValue: CellValueReader) => CriteriaRow[];
|
|
44
|
+
/** A record matches when any criteria row's conditions all hold. */
|
|
45
|
+
export declare const matchesCriteria: (rowIndex: number, criteriaRows: CriteriaRow[], getValue: CellValueReader) => boolean;
|
|
46
|
+
export type AdvancedFilterPlan = {
|
|
47
|
+
/** Record rows that satisfy the criteria (absolute indexes, ascending). */
|
|
48
|
+
matchingRows: number[];
|
|
49
|
+
/** `filter`: record rows to hide (non-matching). */
|
|
50
|
+
hideRows: number[];
|
|
51
|
+
/** `filter`: record rows to show (matching — undoes an earlier in-place filter). */
|
|
52
|
+
showRows: number[];
|
|
53
|
+
/** `copy`: the header row + matching records to write at `copyTo`. */
|
|
54
|
+
copy?: {
|
|
55
|
+
range: GridRange;
|
|
56
|
+
values: (string | number | boolean | null)[][];
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Plans an Advanced Filter over the list range. Returns `undefined` when the
|
|
61
|
+
* list has no records, or `copy` was asked for without a destination.
|
|
62
|
+
*/
|
|
63
|
+
export declare const planAdvancedFilter: (options: AdvancedFilterOptions, getValue: CellValueReader) => AdvancedFilterPlan | undefined;
|
|
64
|
+
/** The state callbacks a plan is applied through — the same in both engines. */
|
|
65
|
+
export type AdvancedFilterPlanExecutor = {
|
|
66
|
+
onHideRow: (sheetId: number, rowIndexes: number[]) => void;
|
|
67
|
+
onShowRow: (sheetId: number, rowIndexes: number[]) => void;
|
|
68
|
+
onChangeBatch: (sheetId: number, range: GridRange, values: (string | number | boolean | null)[][]) => void;
|
|
69
|
+
};
|
|
70
|
+
/** Applies an {@link AdvancedFilterPlan}: show the matches, hide the rest, or write the copy. */
|
|
71
|
+
export declare const applyAdvancedFilterPlan: (sheetId: number, plan: AdvancedFilterPlan, executor: AdvancedFilterPlanExecutor) => void;
|
|
72
|
+
//# sourceMappingURL=advanced-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-filter.d.ts","sourceRoot":"","sources":["../../../api/advanced-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AACH,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,CAC5B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAElD,KAAK,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,QAAQ,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAkBF,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,EAAE,mBAAgB,KAAG,MAepE,CAAC;AAqBF,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EACvD,WAAW,SAAS,KACnB,OA6CF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,EAAE,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,WAAW,SAAS,EACpB,eAAe,SAAS,EACxB,UAAU,eAAe,KACxB,WAAW,EAuCb,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,cAAc,WAAW,EAAE,EAC3B,UAAU,eAAe,KACxB,OAOF,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,2EAA2E;IAC3E,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sEAAsE;IACtE,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;KAAE,CAAC;CAC7E,CAAC;AAkBF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,qBAAqB,EAC9B,UAAU,eAAe,KACxB,kBAAkB,GAAG,SAsDvB,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3D,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,KAC3C,IAAI,CAAC;CACX,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,uBAAuB,GAClC,SAAS,MAAM,EACf,MAAM,kBAAkB,EACxB,UAAU,0BAA0B,SAQrC,CAAC"}
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datatype.d.ts","sourceRoot":"","sources":["../../../api/datatype.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"datatype.d.ts","sourceRoot":"","sources":["../../../api/datatype.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/api/datatype.js
CHANGED
|
@@ -574,11 +574,18 @@ export const detectValueTypeAndPattern = (value, locale, lenientGrouping = true,
|
|
|
574
574
|
const percentValue = convertToNumber(value, locale, lenientGrouping) / 100;
|
|
575
575
|
return ["numberValue", "PERCENT", percentValue, pattern];
|
|
576
576
|
}
|
|
577
|
+
// A JS number carries no typed digits: its decimal expansion is float
|
|
578
|
+
// noise (0.1 + 0.2, the 5.333333333333333 of a fitted trend), never a
|
|
579
|
+
// format the user asked for. Excel keeps a computed or programmatic
|
|
580
|
+
// number General and clips it to General's significant digits, so only
|
|
581
|
+
// TEXT entry infers a decimal pattern from what was typed.
|
|
577
582
|
return [
|
|
578
583
|
"numberValue",
|
|
579
584
|
"NUMBER",
|
|
580
585
|
convertToNumber(value, locale, lenientGrouping),
|
|
581
|
-
|
|
586
|
+
typeof value === "number"
|
|
587
|
+
? "General"
|
|
588
|
+
: detectNumberFormatPattern(value, numberValue, "NUMBER", locale),
|
|
582
589
|
];
|
|
583
590
|
}
|
|
584
591
|
// Date time (check before date to catch time-only formats like "1:00 AM")
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { FillSeriesSpec } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
/** One fill line's Series-dialog result (see {@link generateSeriesSpecValues}). */
|
|
3
|
+
export type SeriesSpecLine = {
|
|
4
|
+
/**
|
|
5
|
+
* Trend only: the fitted value of every numeric seed as `{ index, value }`
|
|
6
|
+
* (`index` into the caller's `sourceValues`) — Excel replaces the starting
|
|
7
|
+
* values with the trend it fitted through them. Empty for every other spec.
|
|
8
|
+
*/
|
|
9
|
+
seeds: {
|
|
10
|
+
index: number;
|
|
11
|
+
value: number;
|
|
12
|
+
}[];
|
|
13
|
+
/**
|
|
14
|
+
* The target values in fill order. SHORTER than the requested count when
|
|
15
|
+
* `stop` ends the series early — the targets past it are left untouched
|
|
16
|
+
* (Excel writes nothing there).
|
|
17
|
+
*/
|
|
18
|
+
values: unknown[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Value generator behind Excel's Series dialog (Home > Fill > Series…). The
|
|
22
|
+
* spec is explicit user intent, so unlike drag auto-fill nothing is detected:
|
|
23
|
+
* Linear adds `step`, Growth multiplies by `step`, Date advances `step`
|
|
24
|
+
* `dateUnit`s (weekday skips Sat/Sun, month clamps to month-end). `trend` fits
|
|
25
|
+
* a least-squares line (Linear) / exponential (Growth) through the seeds and,
|
|
26
|
+
* as Excel does, REWRITES the seeds with the fitted values before continuing
|
|
27
|
+
* the fit (a lone seed fits a flat line — the value repeats). A `stop` value
|
|
28
|
+
* ends the series at the last value that does not pass it: the line comes
|
|
29
|
+
* back shorter and the remaining selected cells are left alone. Returns
|
|
30
|
+
* `undefined` when the spec does not apply (AutoFill type, or seeds that are
|
|
31
|
+
* not numbers/dates) so the caller falls back to the regular fill-type
|
|
32
|
+
* generator.
|
|
33
|
+
*/
|
|
34
|
+
export declare const generateSeriesSpecValues: (sourceValues: unknown[], spec: FillSeriesSpec, count: number, locale?: string) => SeriesSpecLine | undefined;
|
|
35
|
+
//# sourceMappingURL=fill-series-spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill-series-spec.d.ts","sourceRoot":"","sources":["../../../api/fill-series-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG;IAC3B;;;;OAIG;IACH,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C;;;;OAIG;IACH,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB,GACnC,cAAc,OAAO,EAAE,EACvB,MAAM,cAAc,EACpB,OAAO,MAAM,EACb,SAAS,MAAM,KACd,cAAc,GAAG,SAqDnB,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Value generator behind Excel's Series dialog (Home > Fill > Series…). The
|
|
3
|
+
* spec is explicit user intent, so unlike drag auto-fill nothing is detected:
|
|
4
|
+
* Linear adds `step`, Growth multiplies by `step`, Date advances `step`
|
|
5
|
+
* `dateUnit`s (weekday skips Sat/Sun, month clamps to month-end). `trend` fits
|
|
6
|
+
* a least-squares line (Linear) / exponential (Growth) through the seeds and,
|
|
7
|
+
* as Excel does, REWRITES the seeds with the fitted values before continuing
|
|
8
|
+
* the fit (a lone seed fits a flat line — the value repeats). A `stop` value
|
|
9
|
+
* ends the series at the last value that does not pass it: the line comes
|
|
10
|
+
* back shorter and the remaining selected cells are left alone. Returns
|
|
11
|
+
* `undefined` when the spec does not apply (AutoFill type, or seeds that are
|
|
12
|
+
* not numbers/dates) so the caller falls back to the regular fill-type
|
|
13
|
+
* generator.
|
|
14
|
+
*/
|
|
15
|
+
export const generateSeriesSpecValues = (sourceValues, spec, count, locale) => {
|
|
16
|
+
if (spec.type === "autofill" || count <= 0)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (spec.type === "date") {
|
|
19
|
+
const values = generateDateSeries(sourceValues, spec, count, locale);
|
|
20
|
+
return values ? { seeds: [], values } : undefined;
|
|
21
|
+
}
|
|
22
|
+
const indexed = sourceValues
|
|
23
|
+
.map((v, index) => ({ index, value: toNumber(v) }))
|
|
24
|
+
.filter((seed) => Number.isFinite(seed.value));
|
|
25
|
+
if (!indexed.length)
|
|
26
|
+
return undefined;
|
|
27
|
+
const numbers = indexed.map((seed) => seed.value);
|
|
28
|
+
const step = spec.step ?? 1;
|
|
29
|
+
const n = numbers.length;
|
|
30
|
+
if (spec.trend) {
|
|
31
|
+
// Least-squares trend through the seeds (x = 0..n-1), continued at x = n…
|
|
32
|
+
// A single seed has no slope: the fit is the flat line through it.
|
|
33
|
+
const ys = spec.type === "growth"
|
|
34
|
+
? numbers.map((y) => (y > 0 ? Math.log(y) : NaN))
|
|
35
|
+
: numbers;
|
|
36
|
+
if (ys.some((y) => !Number.isFinite(y)))
|
|
37
|
+
return undefined;
|
|
38
|
+
const xs = ys.map((_, i) => i);
|
|
39
|
+
const sumX = xs.reduce((a, b) => a + b, 0);
|
|
40
|
+
const sumY = ys.reduce((a, b) => a + b, 0);
|
|
41
|
+
const sumXY = xs.reduce((a, x, i) => a + x * ys[i], 0);
|
|
42
|
+
const sumXX = xs.reduce((a, x) => a + x * x, 0);
|
|
43
|
+
const denom = n * sumXX - sumX * sumX;
|
|
44
|
+
const slope = denom === 0 ? 0 : (n * sumXY - sumX * sumY) / denom;
|
|
45
|
+
const intercept = (sumY - slope * sumX) / n;
|
|
46
|
+
const fit = (x) => {
|
|
47
|
+
const fitted = slope * x + intercept;
|
|
48
|
+
return normalize(spec.type === "growth" ? Math.exp(fitted) : fitted);
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
seeds: indexed.map((seed, position) => ({
|
|
52
|
+
index: seed.index,
|
|
53
|
+
value: fit(position),
|
|
54
|
+
})),
|
|
55
|
+
values: Array.from({ length: count }, (_, i) => fit(n + i)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const values = [];
|
|
59
|
+
let current = numbers[n - 1];
|
|
60
|
+
for (let i = 0; i < count; i++) {
|
|
61
|
+
current =
|
|
62
|
+
spec.type === "growth" ? current * step : current + step;
|
|
63
|
+
current = normalize(current);
|
|
64
|
+
if (passesStop(current, step, spec))
|
|
65
|
+
break;
|
|
66
|
+
values.push(current);
|
|
67
|
+
}
|
|
68
|
+
return { seeds: [], values };
|
|
69
|
+
};
|
|
70
|
+
const toNumber = (v) => typeof v === "number"
|
|
71
|
+
? v
|
|
72
|
+
: typeof v === "string" && v.trim() !== "" && !isNaN(Number(v))
|
|
73
|
+
? Number(v)
|
|
74
|
+
: NaN;
|
|
75
|
+
/** Excel's stop rule: the series ends once a value would move past `stop` in the series' direction. */
|
|
76
|
+
const passesStop = (value, step, spec) => {
|
|
77
|
+
const { stop } = spec;
|
|
78
|
+
if (stop === undefined || !Number.isFinite(stop))
|
|
79
|
+
return false;
|
|
80
|
+
const ascending = spec.type === "growth" ? Math.abs(step) > 1 === value > 0 : step > 0;
|
|
81
|
+
return ascending ? value > stop + 1e-9 : value < stop - 1e-9;
|
|
82
|
+
};
|
|
83
|
+
/** Snap float noise (0.1 + 0.2) to a clean decimal. */
|
|
84
|
+
const normalize = (x) => {
|
|
85
|
+
if (!Number.isFinite(x))
|
|
86
|
+
return x;
|
|
87
|
+
const r = Math.round(x * 1e10) / 1e10;
|
|
88
|
+
return Math.abs(r - Math.round(r)) < 1e-9 ? Math.round(r) : r;
|
|
89
|
+
};
|
|
90
|
+
const toDateValue = (value) => {
|
|
91
|
+
if (value instanceof Date)
|
|
92
|
+
return isNaN(value.getTime()) ? null : value;
|
|
93
|
+
if (typeof value === "string" && value.trim()) {
|
|
94
|
+
const parsed = new Date(value);
|
|
95
|
+
return isNaN(parsed.getTime()) ? null : parsed;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
};
|
|
99
|
+
const generateDateSeries = (sourceValues, spec, count, locale) => {
|
|
100
|
+
const dates = sourceValues
|
|
101
|
+
.map(toDateValue)
|
|
102
|
+
.filter((d) => d !== null);
|
|
103
|
+
if (!dates.length)
|
|
104
|
+
return undefined;
|
|
105
|
+
const last = dates[dates.length - 1];
|
|
106
|
+
const step = Math.trunc(spec.step ?? 1) || 1;
|
|
107
|
+
const unit = spec.dateUnit ?? "day";
|
|
108
|
+
const result = [];
|
|
109
|
+
const current = new Date(last);
|
|
110
|
+
const lastDayOfMonth = last.getDate();
|
|
111
|
+
for (let i = 0; i < count; i++) {
|
|
112
|
+
switch (unit) {
|
|
113
|
+
case "day":
|
|
114
|
+
current.setDate(current.getDate() + step);
|
|
115
|
+
break;
|
|
116
|
+
case "weekday": {
|
|
117
|
+
const dir = step > 0 ? 1 : -1;
|
|
118
|
+
for (let k = 0; k < Math.abs(step); k++) {
|
|
119
|
+
do {
|
|
120
|
+
current.setDate(current.getDate() + dir);
|
|
121
|
+
} while (current.getDay() === 0 || current.getDay() === 6);
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
case "month": {
|
|
126
|
+
// Keep the seed's day-of-month, clamped to the target month's length.
|
|
127
|
+
const target = new Date(last);
|
|
128
|
+
target.setDate(1);
|
|
129
|
+
target.setMonth(last.getMonth() + step * (i + 1));
|
|
130
|
+
const daysInMonth = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
|
|
131
|
+
target.setDate(Math.min(lastDayOfMonth, daysInMonth));
|
|
132
|
+
current.setTime(target.getTime());
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case "year": {
|
|
136
|
+
const target = new Date(last);
|
|
137
|
+
target.setDate(1);
|
|
138
|
+
target.setFullYear(last.getFullYear() + step * (i + 1));
|
|
139
|
+
const daysInMonth = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
|
|
140
|
+
target.setDate(Math.min(lastDayOfMonth, daysInMonth));
|
|
141
|
+
current.setTime(target.getTime());
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (spec.stop !== undefined && Number.isFinite(spec.stop)) {
|
|
146
|
+
// Date stop values are Excel serials; compare on whole days since epoch.
|
|
147
|
+
// Past the stop the line ends — the remaining cells stay untouched.
|
|
148
|
+
const serial = (current.getTime() - Date.UTC(1899, 11, 30)) / 86_400_000 +
|
|
149
|
+
current.getTimezoneOffset() / 1440;
|
|
150
|
+
const ascending = step > 0;
|
|
151
|
+
if (ascending ? serial > spec.stop + 1e-6 : serial < spec.stop - 1e-6) {
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Mirrors `generateFillValues`' date cases, which hand back locale date
|
|
156
|
+
// strings that `SheetCell` re-parses into a date-formatted serial.
|
|
157
|
+
result.push(new Date(current).toLocaleDateString(locale));
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
};
|