@rowsncolumns/spreadsheet-state 29.1.4 → 29.1.6
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/circular-reference.d.ts +31 -0
- package/dist/cjs/api/circular-reference.d.ts.map +1 -0
- package/dist/cjs/api/circular-reference.js +85 -0
- package/dist/cjs/api/copy-paste.d.ts +6 -0
- package/dist/cjs/api/copy-paste.d.ts.map +1 -1
- package/dist/cjs/api/copy-paste.js +24 -15
- package/dist/cjs/api/datatype.d.ts +2 -0
- package/dist/cjs/api/datatype.d.ts.map +1 -1
- package/dist/cjs/api/datatype.js +50 -27
- package/dist/cjs/api/decimals.d.ts +10 -0
- package/dist/cjs/api/decimals.d.ts.map +1 -1
- package/dist/cjs/api/decimals.js +34 -11
- package/dist/cjs/api/dependency.d.ts +19 -1
- package/dist/cjs/api/dependency.d.ts.map +1 -1
- package/dist/cjs/api/dependency.js +30 -14
- package/dist/cjs/api/filter-condition.d.ts +58 -0
- package/dist/cjs/api/filter-condition.d.ts.map +1 -0
- package/dist/cjs/api/filter-condition.js +157 -0
- package/dist/cjs/api/formula.d.ts.map +1 -1
- package/dist/cjs/api/formula.js +9 -7
- package/dist/cjs/api/image-embed.d.ts +41 -0
- package/dist/cjs/api/image-embed.d.ts.map +1 -0
- package/dist/cjs/api/image-embed.js +55 -0
- package/dist/cjs/api/immer-utils.d.ts.map +1 -1
- package/dist/cjs/api/immer-utils.js +43 -15
- package/dist/cjs/api/named-range-structural.d.ts +29 -3
- package/dist/cjs/api/named-range-structural.d.ts.map +1 -1
- package/dist/cjs/api/named-range-structural.js +36 -11
- package/dist/cjs/api/parse-html.d.ts.map +1 -1
- package/dist/cjs/api/parse-html.js +11 -5
- package/dist/cjs/api/structural-formula-update.d.ts +20 -1
- package/dist/cjs/api/structural-formula-update.d.ts.map +1 -1
- package/dist/cjs/api/structural-formula-update.js +264 -90
- package/dist/cjs/api/structural-guards.d.ts +11 -0
- package/dist/cjs/api/structural-guards.d.ts.map +1 -1
- package/dist/cjs/api/structural-guards.js +45 -1
- package/dist/cjs/api/structural-table-refs.d.ts +15 -2
- package/dist/cjs/api/structural-table-refs.d.ts.map +1 -1
- package/dist/cjs/api/structural-table-refs.js +79 -35
- package/dist/cjs/commands.d.ts +17 -3
- package/dist/cjs/commands.d.ts.map +1 -1
- package/dist/cjs/components/editors/conditional-format-rule-editor.d.ts.map +1 -1
- package/dist/cjs/components/editors/conditional-format-rule-editor.js +19 -7
- package/dist/cjs/constants.d.ts +4 -1
- package/dist/cjs/constants.d.ts.map +1 -1
- package/dist/cjs/constants.js +4 -0
- package/dist/cjs/helpers/sheet-title.d.ts +2 -1
- package/dist/cjs/helpers/sheet-title.d.ts.map +1 -1
- package/dist/cjs/helpers/sheet-title.js +3 -1
- package/dist/cjs/hooks/use-can-edit-cellrange.d.ts +1 -1
- package/dist/cjs/hooks/use-can-edit-cellrange.d.ts.map +1 -1
- package/dist/cjs/hooks/use-can-edit-cellrange.js +1 -1
- package/dist/cjs/hooks/use-on-calculation-success.d.ts +5 -1
- package/dist/cjs/hooks/use-on-calculation-success.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-calculation-success.js +20 -3
- package/dist/cjs/hooks/use-on-copy.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-copy.js +23 -25
- package/dist/cjs/hooks/use-on-create-sheet.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-create-sheet.js +11 -1
- package/dist/cjs/hooks/use-on-delete.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-delete.js +15 -3
- package/dist/cjs/hooks/use-on-drag-n-drop.d.ts +5 -0
- package/dist/cjs/hooks/use-on-drag-n-drop.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-drag-n-drop.js +6 -5
- package/dist/cjs/hooks/use-on-filter-table.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-filter-table.js +6 -1
- package/dist/cjs/hooks/use-on-find-replace.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-find-replace.js +111 -23
- package/dist/cjs/hooks/use-on-insert-image.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-insert-image.js +20 -33
- package/dist/cjs/hooks/use-on-paste.d.ts +2 -1
- package/dist/cjs/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-paste.js +53 -24
- package/dist/cjs/hooks/use-on-rename-sheet.d.ts +3 -1
- package/dist/cjs/hooks/use-on-rename-sheet.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-rename-sheet.js +19 -9
- package/dist/cjs/hooks/use-on-sort-column.d.ts +7 -1
- package/dist/cjs/hooks/use-on-sort-column.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-sort-column.js +25 -8
- package/dist/cjs/hooks/use-on-sort-range.d.ts +16 -2
- package/dist/cjs/hooks/use-on-sort-range.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-sort-range.js +72 -40
- package/dist/cjs/hooks/use-on-sort-table.d.ts +7 -2
- package/dist/cjs/hooks/use-on-sort-table.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-sort-table.js +25 -4
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts +5 -3
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.js +7 -0
- package/dist/cjs/hooks/utils/sort-rows.d.ts +15 -0
- package/dist/cjs/hooks/utils/sort-rows.d.ts.map +1 -1
- package/dist/cjs/hooks/utils/sort-rows.js +16 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/interface/delete-column.d.ts.map +1 -1
- package/dist/cjs/interface/delete-column.js +254 -101
- package/dist/cjs/interface/delete-row.d.ts.map +1 -1
- package/dist/cjs/interface/delete-row.js +233 -81
- package/dist/cjs/interface/duplicate-sheet.d.ts.map +1 -1
- package/dist/cjs/interface/duplicate-sheet.js +4 -9
- package/dist/cjs/interface/insert-column.d.ts.map +1 -1
- package/dist/cjs/interface/insert-column.js +1 -1
- package/dist/cjs/interface/insert-row.d.ts.map +1 -1
- package/dist/cjs/interface/insert-row.js +1 -1
- package/dist/cjs/interface/new-sheet.d.ts.map +1 -1
- package/dist/cjs/interface/new-sheet.js +6 -13
- package/dist/cjs/sheet-cell.d.ts +9 -0
- package/dist/cjs/sheet-cell.d.ts.map +1 -1
- package/dist/cjs/sheet-cell.js +46 -9
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/api/circular-reference.d.ts +31 -0
- package/dist/esm/api/circular-reference.d.ts.map +1 -0
- package/dist/esm/api/circular-reference.js +55 -0
- package/dist/esm/api/copy-paste.d.ts +6 -0
- package/dist/esm/api/copy-paste.d.ts.map +1 -1
- package/dist/esm/api/copy-paste.js +26 -14
- package/dist/esm/api/datatype.d.ts +2 -0
- package/dist/esm/api/datatype.d.ts.map +1 -1
- package/dist/esm/api/datatype.js +50 -27
- package/dist/esm/api/decimals.d.ts +10 -0
- package/dist/esm/api/decimals.d.ts.map +1 -1
- package/dist/esm/api/decimals.js +31 -10
- package/dist/esm/api/dependency.d.ts +19 -1
- package/dist/esm/api/dependency.d.ts.map +1 -1
- package/dist/esm/api/dependency.js +15 -10
- package/dist/esm/api/filter-condition.d.ts +58 -0
- package/dist/esm/api/filter-condition.d.ts.map +1 -0
- package/dist/esm/api/filter-condition.js +146 -0
- package/dist/esm/api/formula.d.ts.map +1 -1
- package/dist/esm/api/formula.js +9 -7
- package/dist/esm/api/image-embed.d.ts +41 -0
- package/dist/esm/api/image-embed.d.ts.map +1 -0
- package/dist/esm/api/image-embed.js +52 -0
- package/dist/esm/api/immer-utils.d.ts.map +1 -1
- package/dist/esm/api/immer-utils.js +43 -14
- package/dist/esm/api/named-range-structural.d.ts +29 -3
- package/dist/esm/api/named-range-structural.d.ts.map +1 -1
- package/dist/esm/api/named-range-structural.js +35 -11
- package/dist/esm/api/parse-html.d.ts.map +1 -1
- package/dist/esm/api/parse-html.js +14 -5
- package/dist/esm/api/structural-formula-update.d.ts +20 -1
- package/dist/esm/api/structural-formula-update.d.ts.map +1 -1
- package/dist/esm/api/structural-formula-update.js +151 -55
- package/dist/esm/api/structural-guards.d.ts +11 -0
- package/dist/esm/api/structural-guards.d.ts.map +1 -1
- package/dist/esm/api/structural-guards.js +31 -0
- package/dist/esm/api/structural-table-refs.d.ts +15 -2
- package/dist/esm/api/structural-table-refs.d.ts.map +1 -1
- package/dist/esm/api/structural-table-refs.js +49 -18
- package/dist/esm/commands.d.ts +17 -3
- package/dist/esm/commands.d.ts.map +1 -1
- package/dist/esm/components/editors/conditional-format-rule-editor.d.ts.map +1 -1
- package/dist/esm/components/editors/conditional-format-rule-editor.js +18 -7
- package/dist/esm/constants.d.ts +4 -1
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/constants.js +4 -0
- package/dist/esm/helpers/sheet-title.d.ts +2 -1
- package/dist/esm/helpers/sheet-title.d.ts.map +1 -1
- package/dist/esm/helpers/sheet-title.js +3 -1
- package/dist/esm/hooks/use-can-edit-cellrange.d.ts +1 -1
- package/dist/esm/hooks/use-can-edit-cellrange.d.ts.map +1 -1
- package/dist/esm/hooks/use-can-edit-cellrange.js +1 -1
- package/dist/esm/hooks/use-on-calculation-success.d.ts +5 -1
- package/dist/esm/hooks/use-on-calculation-success.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-calculation-success.js +19 -3
- package/dist/esm/hooks/use-on-copy.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-copy.js +17 -17
- package/dist/esm/hooks/use-on-create-sheet.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-create-sheet.js +11 -1
- package/dist/esm/hooks/use-on-delete.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-delete.js +15 -3
- package/dist/esm/hooks/use-on-drag-n-drop.d.ts +5 -0
- package/dist/esm/hooks/use-on-drag-n-drop.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-drag-n-drop.js +7 -4
- package/dist/esm/hooks/use-on-filter-table.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-filter-table.js +13 -2
- package/dist/esm/hooks/use-on-find-replace.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-find-replace.js +111 -23
- package/dist/esm/hooks/use-on-insert-image.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-insert-image.js +15 -25
- package/dist/esm/hooks/use-on-paste.d.ts +2 -1
- package/dist/esm/hooks/use-on-paste.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-paste.js +46 -15
- package/dist/esm/hooks/use-on-rename-sheet.d.ts +3 -1
- package/dist/esm/hooks/use-on-rename-sheet.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-rename-sheet.js +19 -9
- package/dist/esm/hooks/use-on-sort-column.d.ts +7 -1
- package/dist/esm/hooks/use-on-sort-column.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-sort-column.js +18 -1
- package/dist/esm/hooks/use-on-sort-range.d.ts +16 -2
- package/dist/esm/hooks/use-on-sort-range.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-sort-range.js +30 -3
- package/dist/esm/hooks/use-on-sort-table.d.ts +7 -2
- package/dist/esm/hooks/use-on-sort-table.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-sort-table.js +25 -4
- package/dist/esm/hooks/use-spreadsheet-state.d.ts +5 -3
- package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.js +7 -0
- package/dist/esm/hooks/utils/sort-rows.d.ts +15 -0
- package/dist/esm/hooks/utils/sort-rows.d.ts.map +1 -1
- package/dist/esm/hooks/utils/sort-rows.js +15 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/dist/esm/interface/delete-column.d.ts.map +1 -1
- package/dist/esm/interface/delete-column.js +111 -80
- package/dist/esm/interface/delete-row.d.ts.map +1 -1
- package/dist/esm/interface/delete-row.js +91 -59
- package/dist/esm/interface/duplicate-sheet.d.ts.map +1 -1
- package/dist/esm/interface/duplicate-sheet.js +4 -9
- package/dist/esm/interface/insert-column.d.ts.map +1 -1
- package/dist/esm/interface/insert-column.js +1 -1
- package/dist/esm/interface/insert-row.d.ts.map +1 -1
- package/dist/esm/interface/insert-row.js +1 -1
- package/dist/esm/interface/new-sheet.d.ts.map +1 -1
- package/dist/esm/interface/new-sheet.js +6 -13
- package/dist/esm/sheet-cell.d.ts +9 -0
- package/dist/esm/sheet-cell.d.ts.map +1 -1
- package/dist/esm/sheet-cell.js +46 -7
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +9 -9
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
export declare const pattern_number = "#";
|
|
2
2
|
export declare const pattern_number_thousands = "#,##0";
|
|
3
3
|
export declare const getDecimalPlaces: (value: string | number, locale?: string) => number;
|
|
4
|
+
/**
|
|
5
|
+
* Whether a typed literal groups its integer part with the locale's thousands
|
|
6
|
+
* separator (`1,000` / `1,234.56` in en-US, `1.234,56` in de-DE, `1 234` in
|
|
7
|
+
* fr-FR). In a comma-decimal locale a canonical dot-decimal string (`1.234`)
|
|
8
|
+
* is ambiguous — the programmatic decimal 1.234, or the grouped 1234 — so when
|
|
9
|
+
* the caller knows what the literal parsed to (`parsedValue`) that decides;
|
|
10
|
+
* without it the canonical reading wins, so the locale's `.` group separator
|
|
11
|
+
* is not mistaken for grouping. Rust `has_thousands_grouping`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const hasThousandsGrouping: (value: string | number, locale?: string, parsedValue?: number) => boolean;
|
|
4
14
|
export declare const detectDecimalPattern: (value: string | number | boolean | Date | undefined, defaultPattern?: string, locale?: string) => string;
|
|
5
15
|
export declare const changeDecimals: (pattern?: string | undefined, changeBy?: number, delta?: boolean) => string;
|
|
6
16
|
export declare const getCurrentDecimalCountInPattern: (pattern?: string | undefined | null) => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimals.d.ts","sourceRoot":"","sources":["../../../api/decimals.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAyDhD,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,GAAG,MAAM,EACtB,SAAS,MAAM,KACd,MAsCF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EACnD,uBAA+B,EAC/B,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"decimals.d.ts","sourceRoot":"","sources":["../../../api/decimals.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAyDhD,eAAO,MAAM,gBAAgB,GAC3B,OAAO,MAAM,GAAG,MAAM,EACtB,SAAS,MAAM,KACd,MAsCF,CAAC;AAcF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,GAAG,MAAM,EACtB,SAAS,MAAM,EACf,cAAc,MAAM,KACnB,OAeF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EACnD,uBAA+B,EAC/B,SAAS,MAAM,WAsBhB,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,UAAS,MAAM,GAAG,SAAc,EAChC,WAAU,MAAU,EACpB,eAAY,WAuCb,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,UAAS,MAAM,GAAG,SAAS,GAAG,IAAS,WAexC,CAAC;AAGF,eAAO,MAAM,oBAAoB,GAAI,UAAS,MAAM,GAAG,SAAc,WAwBpE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,UAAS,MAAM,GAAG,SAAc,WAQvE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,UAAS,MAAM,GAAG,SAAc,YAIrE,CAAC"}
|
package/dist/esm/api/decimals.js
CHANGED
|
@@ -73,19 +73,40 @@ export const getDecimalPlaces = (value, locale) => {
|
|
|
73
73
|
// Return the length of the decimal part
|
|
74
74
|
return decimalPart.length;
|
|
75
75
|
};
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
const WHITESPACE_GROUP_REGEX = /[\s\u00A0\u202F]/;
|
|
77
|
+
/**
|
|
78
|
+
* Whether `integerPart` contains the locale's group separator. Locales that
|
|
79
|
+
* group with a space accept the whole whitespace family (regular, no-break,
|
|
80
|
+
* narrow no-break) — users type a plain space for fr-FR's `\u202F`.
|
|
81
|
+
*/
|
|
82
|
+
const integerPartHasGroup = (integerPart, group) => group.trim() === ""
|
|
83
|
+
? WHITESPACE_GROUP_REGEX.test(integerPart)
|
|
84
|
+
: integerPart.includes(group);
|
|
85
|
+
/**
|
|
86
|
+
* Whether a typed literal groups its integer part with the locale's thousands
|
|
87
|
+
* separator (`1,000` / `1,234.56` in en-US, `1.234,56` in de-DE, `1 234` in
|
|
88
|
+
* fr-FR). In a comma-decimal locale a canonical dot-decimal string (`1.234`)
|
|
89
|
+
* is ambiguous — the programmatic decimal 1.234, or the grouped 1234 — so when
|
|
90
|
+
* the caller knows what the literal parsed to (`parsedValue`) that decides;
|
|
91
|
+
* without it the canonical reading wins, so the locale's `.` group separator
|
|
92
|
+
* is not mistaken for grouping. Rust `has_thousands_grouping`.
|
|
93
|
+
*/
|
|
94
|
+
export const hasThousandsGrouping = (value, locale, parsedValue) => {
|
|
95
|
+
const str = typeof value === "number" ? normalizeFloatingPointString(value) : value;
|
|
78
96
|
const { decimal, group } = getLocaleSeparators(locale);
|
|
79
97
|
const groupSeparator = group ?? ",";
|
|
80
98
|
const decimalSeparator = decimal ?? ".";
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
99
|
+
if (decimalSeparator !== "." && CANONICAL_DOT_DECIMAL_REGEX.test(str)) {
|
|
100
|
+
return (parsedValue !== undefined &&
|
|
101
|
+
Number(str) !== parsedValue &&
|
|
102
|
+
integerPartHasGroup(str, groupSeparator));
|
|
103
|
+
}
|
|
104
|
+
const integerPart = str.split(decimalSeparator)[0];
|
|
105
|
+
return Boolean(groupSeparator) && integerPartHasGroup(integerPart, groupSeparator);
|
|
106
|
+
};
|
|
107
|
+
export const detectDecimalPattern = (value, defaultPattern = pattern_number, locale) => {
|
|
108
|
+
const str = typeof value === "number" ? normalizeFloatingPointString(value) : String(value);
|
|
109
|
+
const hasThousands = hasThousandsGrouping(str, locale);
|
|
89
110
|
const decimalsLen = getDecimalPlaces(value, locale);
|
|
90
111
|
// Use "0" pattern for numbers less than 1 to ensure leading zero
|
|
91
112
|
const numValue = Number(str.replace(/[^0-9.-]/g, ""));
|
|
@@ -38,7 +38,17 @@ export declare const collectUniqueDependentsForRange: <T extends CellData>(param
|
|
|
38
38
|
rowIndex: number;
|
|
39
39
|
columnIndex: number;
|
|
40
40
|
}>;
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* One reference shift of a structural edit: the references inside `sourceRange` move by the
|
|
43
|
+
* deltas, those inside `deletedRange` break to `#REF!`.
|
|
44
|
+
*/
|
|
45
|
+
export type FormulaMoveStep = {
|
|
46
|
+
rowDelta: number;
|
|
47
|
+
columnDelta: number;
|
|
48
|
+
sourceRange?: GridRange;
|
|
49
|
+
deletedRange?: GridRange;
|
|
50
|
+
};
|
|
51
|
+
export declare const moveFormulaAtPosition: <T extends CellData>({ draft, position, destinationSheetId, activeSheetName, enqueueCalculation, enqueueGraphOperation, recalcCells, movedKeys, rowDelta, columnDelta, sourceRange, deletedRange, steps, destinationPosition, locale, rowCount, columnCount, cellXfsRegistry, sharedStringRegistry, }: {
|
|
42
52
|
draft: Draft<SheetData<T>>;
|
|
43
53
|
position: {
|
|
44
54
|
sheetId: number;
|
|
@@ -56,6 +66,14 @@ export declare const moveFormulaAtPosition: <T extends CellData>({ draft, positi
|
|
|
56
66
|
sourceRange?: GridRange;
|
|
57
67
|
/** Cells removed by a delete-cells shift — references into it become `#REF!` (SHF-09). */
|
|
58
68
|
deletedRange?: GridRange;
|
|
69
|
+
/**
|
|
70
|
+
* Several shifts applied to the formula text in order, one per deleted band of a
|
|
71
|
+
* non-contiguous delete (Ctrl-selected rows 2 and 4): each step shifts the references inside
|
|
72
|
+
* its own `sourceRange` by its delta and breaks those inside its `deletedRange`. Replaces the
|
|
73
|
+
* single `rowDelta` / `columnDelta` / `sourceRange` / `deletedRange` shift when given; pass
|
|
74
|
+
* `destinationPosition` with it (the cell's own move is not any single step's delta).
|
|
75
|
+
*/
|
|
76
|
+
steps?: FormulaMoveStep[];
|
|
59
77
|
/**
|
|
60
78
|
* Where the formula cell itself ends up. Defaults to `position + delta` (the cell moves with the
|
|
61
79
|
* shift). A dependent OUTSIDE the shifted band keeps its place while its references into the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../../api/dependency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAIrD,KAAK,0BAA0B,CAAC,CAAC,SAAS,QAAQ,IAAI;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,kBAAkB,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC7E,qBAAqB,CAAC,EAAE,UAAU,CAChC,OAAO,cAAc,CACtB,CAAC,uBAAuB,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACzD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAI,CAAC,SAAS,QAAQ,EAAE,0QAoBjE,0BAA0B,CAAC,CAAC,CAAC,SAwO/B,CAAC;AAIF,eAAO,MAAM,+BAA+B,GAAI,CAAC,SAAS,QAAQ,EAAE,QAAQ;IAC1E,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,CAAC;IACvB,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC;CACnE;aAIc,MAAM;cAAY,MAAM;iBAAe,MAAM;EAsC3D,CAAC;AAGF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../../api/dependency.ts"],"names":[],"mappings":"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"}
|
|
@@ -205,7 +205,7 @@ export const collectUniqueDependentsForRange = (params) => {
|
|
|
205
205
|
return dependentMap;
|
|
206
206
|
};
|
|
207
207
|
// Process a single formula move at a specific position with the specified deltas.
|
|
208
|
-
export const moveFormulaAtPosition = ({ draft, position, destinationSheetId, activeSheetName, enqueueCalculation, enqueueGraphOperation, recalcCells, movedKeys, rowDelta = 0, columnDelta = 0, sourceRange, deletedRange, destinationPosition, locale, rowCount, columnCount, cellXfsRegistry, sharedStringRegistry, }) => {
|
|
208
|
+
export const moveFormulaAtPosition = ({ draft, position, destinationSheetId, activeSheetName, enqueueCalculation, enqueueGraphOperation, recalcCells, movedKeys, rowDelta = 0, columnDelta = 0, sourceRange, deletedRange, steps, destinationPosition, locale, rowCount, columnCount, cellXfsRegistry, sharedStringRegistry, }) => {
|
|
209
209
|
const sheetCell = new SheetCell();
|
|
210
210
|
const currentSheet = createSheetDraft(draft, position.sheetId, position.rowIndex);
|
|
211
211
|
const cellData = currentSheet[position.rowIndex]?.values?.[position.columnIndex];
|
|
@@ -218,15 +218,20 @@ export const moveFormulaAtPosition = ({ draft, position, destinationSheetId, act
|
|
|
218
218
|
const resolvedSheetName = activeSheetName ?? "";
|
|
219
219
|
// The delta is applied to the references inside `sourceRange`; the formula cell's own
|
|
220
220
|
// destination (for the graph re-key) may differ when it does not move itself.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
221
|
+
const moves = steps ?? [
|
|
222
|
+
{ rowDelta, columnDelta, sourceRange, deletedRange },
|
|
223
|
+
];
|
|
224
|
+
for (const move of moves) {
|
|
225
|
+
sheetCell.moveFormula({ rowIndex: position.rowIndex, columnIndex: position.columnIndex }, {
|
|
226
|
+
rowIndex: position.rowIndex + move.rowDelta,
|
|
227
|
+
columnIndex: position.columnIndex + move.columnDelta,
|
|
228
|
+
}, resolvedSheetName, {
|
|
229
|
+
exclusionRange: move.sourceRange,
|
|
230
|
+
deletedRange: move.deletedRange,
|
|
231
|
+
rowCount,
|
|
232
|
+
columnCount,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
230
235
|
if (previousFormula !== sheetCell.formula) {
|
|
231
236
|
// Set cell data at old position (formula updated prior to structural move)
|
|
232
237
|
currentSheet[position.rowIndex].values[position.columnIndex] =
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { BooleanCondition, ConditionType } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
export declare const isDateFilterCondition: (type: ConditionType | string | null | undefined) => boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Whether a filter clause compares the cell's NUMBER — a Number Filter or a
|
|
5
|
+
* Date Filter comparison. Text (even numeric-looking text such as `'500`),
|
|
6
|
+
* booleans, errors and blanks never satisfy such a clause.
|
|
7
|
+
*/
|
|
8
|
+
export declare const isNumericFilterCondition: (type: ConditionType | string | null | undefined) => boolean;
|
|
9
|
+
/** A cell value that takes part in a Number / Date Filter: a finite number. */
|
|
10
|
+
export declare const isNumericFilterCellValue: (value: unknown) => value is number;
|
|
11
|
+
/**
|
|
12
|
+
* How a Number / Date Filter criterion (`userEnteredValue`, the free text
|
|
13
|
+
* typed into the filter dialog) reads.
|
|
14
|
+
*
|
|
15
|
+
* - `empty`: nothing typed — the clause is inactive.
|
|
16
|
+
* - `number`: a typed literal — number, `50%`, currency, or a date / time in
|
|
17
|
+
* the document locale — as its numeric value (a date is its serial, exactly
|
|
18
|
+
* what the cell holds).
|
|
19
|
+
* - `formula`: `=…` or a cell reference; only the calculator can resolve it.
|
|
20
|
+
* - `text`: anything else; no number satisfies it.
|
|
21
|
+
*/
|
|
22
|
+
export type FilterCriterion = {
|
|
23
|
+
kind: "empty";
|
|
24
|
+
} | {
|
|
25
|
+
kind: "number";
|
|
26
|
+
value: number;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "formula";
|
|
29
|
+
} | {
|
|
30
|
+
kind: "text";
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Classify a filter criterion the way Excel's Custom AutoFilter reads the typed
|
|
34
|
+
* box — as a cell entry in the workbook `locale` (`1/15/2024` is Jan 15 in
|
|
35
|
+
* en-US, `15.1.2024` in de-DE, `2024-02-01` anywhere, `6,5` is 6.5 in de-DE),
|
|
36
|
+
* so a Date Filter compares serials instead of quoting the text.
|
|
37
|
+
*/
|
|
38
|
+
export declare const classifyFilterCriterion: (raw: string | undefined | null, locale?: string) => FilterCriterion;
|
|
39
|
+
/**
|
|
40
|
+
* Decide one Number Filter / Date Filter clause against a cell's typed value,
|
|
41
|
+
* the way Excel does — without the calculator:
|
|
42
|
+
*
|
|
43
|
+
* - Only NUMBERS take part. Text (including numeric-looking text such as
|
|
44
|
+
* `'500`), booleans, errors and blanks never satisfy `> 500` / `after
|
|
45
|
+
* 1/15/2024` and are hidden (`false`). The calculator's coercion would say
|
|
46
|
+
* text > number is TRUE and a blank is 0 — neither is Excel. "Does not
|
|
47
|
+
* equal" is the complement of "equals": text and blanks stay visible.
|
|
48
|
+
* - A typed date criterion is read in the document `locale` and compared as a
|
|
49
|
+
* SERIAL; Date Filters compare calendar days (`INT`), so `1/15/2024 14:00`
|
|
50
|
+
* equals `1/15/2024` and is not after it.
|
|
51
|
+
* - A `=…` / reference criterion is `undefined` — left to the calculator, which
|
|
52
|
+
* then compares a number (the cell-type gate has already run). An empty
|
|
53
|
+
* criterion is `undefined` too (an inactive clause).
|
|
54
|
+
*
|
|
55
|
+
* `undefined` for a condition type this evaluator does not own.
|
|
56
|
+
*/
|
|
57
|
+
export declare const evaluateNumericFilterCondition: (condition: BooleanCondition | null | undefined, value: unknown, locale?: string) => boolean | undefined;
|
|
58
|
+
//# sourceMappingURL=filter-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-condition.d.ts","sourceRoot":"","sources":["../../../api/filter-condition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACd,MAAM,2BAA2B,CAAC;AA4CnC,eAAO,MAAM,qBAAqB,GAChC,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAC9C,OACsE,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAC9C,OAKA,CAAC;AAEJ,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MACd,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,EAC9B,SAAS,MAAM,KACd,eAcF,CAAC;AAKF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,8BAA8B,GACzC,WAAW,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,OAAO,EACd,SAAS,MAAM,KACd,OAAO,GAAG,SA2DZ,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { checkIfStringIsReference } from "@rowsncolumns/utils";
|
|
2
|
+
import { detectValueTypeAndPattern } from "./datatype";
|
|
3
|
+
/**
|
|
4
|
+
* Excel's Number Filters and Date Filters — the AutoFilter clauses that act on
|
|
5
|
+
* the cell's NUMBER (a date is its serial) and hide every non-numeric cell.
|
|
6
|
+
* Twin of `is_numeric_filter_kind` in the Rust engine (`rnc-store/support.rs`);
|
|
7
|
+
* the shared table `libs/common-types/fixtures/filter-evaluator-table.json`
|
|
8
|
+
* (`numeric`) keeps the two evaluators identical.
|
|
9
|
+
*/
|
|
10
|
+
const NUMBER_FILTER_CONDITION_TYPES = new Set([
|
|
11
|
+
"NUMBER_EQ",
|
|
12
|
+
"NUMBER_NOT_EQ",
|
|
13
|
+
"NUMBER_GREATER",
|
|
14
|
+
"NUMBER_GREATER_THAN_EQ",
|
|
15
|
+
"NUMBER_LESS",
|
|
16
|
+
"NUMBER_LESS_THAN_EQ",
|
|
17
|
+
"NUMBER_BETWEEN",
|
|
18
|
+
"NUMBER_NOT_BETWEEN",
|
|
19
|
+
]);
|
|
20
|
+
const DATE_FILTER_CONDITION_TYPES = new Set([
|
|
21
|
+
"DATE_EQ",
|
|
22
|
+
"DATE_NOT_EQ",
|
|
23
|
+
"DATE_BEFORE",
|
|
24
|
+
"DATE_AFTER",
|
|
25
|
+
"DATE_ON_OR_BEFORE",
|
|
26
|
+
"DATE_ON_OR_AFTER",
|
|
27
|
+
"DATE_BETWEEN",
|
|
28
|
+
"DATE_NOT_BETWEEN",
|
|
29
|
+
]);
|
|
30
|
+
const TWO_OPERAND_FILTER_CONDITION_TYPES = new Set([
|
|
31
|
+
"NUMBER_BETWEEN",
|
|
32
|
+
"NUMBER_NOT_BETWEEN",
|
|
33
|
+
"DATE_BETWEEN",
|
|
34
|
+
"DATE_NOT_BETWEEN",
|
|
35
|
+
]);
|
|
36
|
+
export const isDateFilterCondition = (type) => Boolean(type && DATE_FILTER_CONDITION_TYPES.has(type));
|
|
37
|
+
/**
|
|
38
|
+
* Whether a filter clause compares the cell's NUMBER — a Number Filter or a
|
|
39
|
+
* Date Filter comparison. Text (even numeric-looking text such as `'500`),
|
|
40
|
+
* booleans, errors and blanks never satisfy such a clause.
|
|
41
|
+
*/
|
|
42
|
+
export const isNumericFilterCondition = (type) => Boolean(type &&
|
|
43
|
+
(NUMBER_FILTER_CONDITION_TYPES.has(type) ||
|
|
44
|
+
DATE_FILTER_CONDITION_TYPES.has(type)));
|
|
45
|
+
/** A cell value that takes part in a Number / Date Filter: a finite number. */
|
|
46
|
+
export const isNumericFilterCellValue = (value) => typeof value === "number" && Number.isFinite(value);
|
|
47
|
+
/**
|
|
48
|
+
* Classify a filter criterion the way Excel's Custom AutoFilter reads the typed
|
|
49
|
+
* box — as a cell entry in the workbook `locale` (`1/15/2024` is Jan 15 in
|
|
50
|
+
* en-US, `15.1.2024` in de-DE, `2024-02-01` anywhere, `6,5` is 6.5 in de-DE),
|
|
51
|
+
* so a Date Filter compares serials instead of quoting the text.
|
|
52
|
+
*/
|
|
53
|
+
export const classifyFilterCriterion = (raw, locale) => {
|
|
54
|
+
const trimmed = raw?.trim() ?? "";
|
|
55
|
+
if (!trimmed)
|
|
56
|
+
return { kind: "empty" };
|
|
57
|
+
if (trimmed.startsWith("=") || checkIfStringIsReference(trimmed)) {
|
|
58
|
+
return { kind: "formula" };
|
|
59
|
+
}
|
|
60
|
+
const [formatValue, , numberValue] = detectValueTypeAndPattern(trimmed, locale ?? "en-US");
|
|
61
|
+
if (formatValue === "numberValue" && isNumericFilterCellValue(numberValue)) {
|
|
62
|
+
return { kind: "number", value: numberValue };
|
|
63
|
+
}
|
|
64
|
+
return { kind: "text" };
|
|
65
|
+
};
|
|
66
|
+
const numbersEqual = (a, b) => Math.abs(a - b) <= 1e-9 * Math.max(Math.abs(a), Math.abs(b), 1);
|
|
67
|
+
/**
|
|
68
|
+
* Decide one Number Filter / Date Filter clause against a cell's typed value,
|
|
69
|
+
* the way Excel does — without the calculator:
|
|
70
|
+
*
|
|
71
|
+
* - Only NUMBERS take part. Text (including numeric-looking text such as
|
|
72
|
+
* `'500`), booleans, errors and blanks never satisfy `> 500` / `after
|
|
73
|
+
* 1/15/2024` and are hidden (`false`). The calculator's coercion would say
|
|
74
|
+
* text > number is TRUE and a blank is 0 — neither is Excel. "Does not
|
|
75
|
+
* equal" is the complement of "equals": text and blanks stay visible.
|
|
76
|
+
* - A typed date criterion is read in the document `locale` and compared as a
|
|
77
|
+
* SERIAL; Date Filters compare calendar days (`INT`), so `1/15/2024 14:00`
|
|
78
|
+
* equals `1/15/2024` and is not after it.
|
|
79
|
+
* - A `=…` / reference criterion is `undefined` — left to the calculator, which
|
|
80
|
+
* then compares a number (the cell-type gate has already run). An empty
|
|
81
|
+
* criterion is `undefined` too (an inactive clause).
|
|
82
|
+
*
|
|
83
|
+
* `undefined` for a condition type this evaluator does not own.
|
|
84
|
+
*/
|
|
85
|
+
export const evaluateNumericFilterCondition = (condition, value, locale) => {
|
|
86
|
+
const type = condition?.type;
|
|
87
|
+
if (!type || !isNumericFilterCondition(type))
|
|
88
|
+
return undefined;
|
|
89
|
+
const values = condition?.values ?? [];
|
|
90
|
+
if (!isNumericFilterCellValue(value)) {
|
|
91
|
+
// "Does not equal" is the complement of "equals" over the whole column: a
|
|
92
|
+
// text cell or a blank does not equal 500 and stays visible (a text cell
|
|
93
|
+
// whose display text IS the criterion hides).
|
|
94
|
+
if (type === "NUMBER_NOT_EQ" || type === "DATE_NOT_EQ") {
|
|
95
|
+
const shown = value === undefined || value === null ? "" : String(value);
|
|
96
|
+
return (shown.trim().toLowerCase() !==
|
|
97
|
+
(values[0]?.userEnteredValue ?? "").trim().toLowerCase());
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
const first = classifyFilterCriterion(values[0]?.userEnteredValue, locale);
|
|
102
|
+
const second = TWO_OPERAND_FILTER_CONDITION_TYPES.has(type)
|
|
103
|
+
? classifyFilterCriterion(values[1]?.userEnteredValue, locale)
|
|
104
|
+
: { kind: "number", value: 0 };
|
|
105
|
+
if (first.kind === "empty" || second.kind === "empty")
|
|
106
|
+
return undefined;
|
|
107
|
+
if (first.kind === "formula" || second.kind === "formula")
|
|
108
|
+
return undefined;
|
|
109
|
+
if (first.kind !== "number" || second.kind !== "number")
|
|
110
|
+
return false;
|
|
111
|
+
// Date Filters compare calendar days; Number Filters the exact values.
|
|
112
|
+
const day = isDateFilterCondition(type)
|
|
113
|
+
? (n) => Math.floor(n)
|
|
114
|
+
: (n) => n;
|
|
115
|
+
const a = day(value);
|
|
116
|
+
const lo = day(first.value);
|
|
117
|
+
const hi = day(second.value);
|
|
118
|
+
switch (type) {
|
|
119
|
+
case "NUMBER_EQ":
|
|
120
|
+
case "DATE_EQ":
|
|
121
|
+
return numbersEqual(a, lo);
|
|
122
|
+
case "NUMBER_NOT_EQ":
|
|
123
|
+
case "DATE_NOT_EQ":
|
|
124
|
+
return !numbersEqual(a, lo);
|
|
125
|
+
case "NUMBER_GREATER":
|
|
126
|
+
case "DATE_AFTER":
|
|
127
|
+
return a > lo;
|
|
128
|
+
case "NUMBER_GREATER_THAN_EQ":
|
|
129
|
+
case "DATE_ON_OR_AFTER":
|
|
130
|
+
return a >= lo;
|
|
131
|
+
case "NUMBER_LESS":
|
|
132
|
+
case "DATE_BEFORE":
|
|
133
|
+
return a < lo;
|
|
134
|
+
case "NUMBER_LESS_THAN_EQ":
|
|
135
|
+
case "DATE_ON_OR_BEFORE":
|
|
136
|
+
return a <= lo;
|
|
137
|
+
case "NUMBER_BETWEEN":
|
|
138
|
+
case "DATE_BETWEEN":
|
|
139
|
+
return a >= lo && a <= hi;
|
|
140
|
+
case "NUMBER_NOT_BETWEEN":
|
|
141
|
+
case "DATE_NOT_BETWEEN":
|
|
142
|
+
return a < lo || a > hi;
|
|
143
|
+
default:
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formula.d.ts","sourceRoot":"","sources":["../../../api/formula.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAS,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"formula.d.ts","sourceRoot":"","sources":["../../../api/formula.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/api/formula.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cleanupColumnName, cleanupSpecialItem, cleanupTableName, detectCurrentRow, isRangeToken, lexify, stripPropertyFromCellRef, tokenVocabulary, } from "@rowsncolumns/calculator";
|
|
2
|
-
import { addressToCell, alpha2number, cellToAddress, desanitizeSheetName, number2Alpha, sanitizeSheetName, } from "@rowsncolumns/utils";
|
|
2
|
+
import { addressToCell, alpha2number, cellToAddress, desanitizeSheetName, escapeCharacters, number2Alpha, sanitizeSheetName, } from "@rowsncolumns/utils";
|
|
3
3
|
export { ERROR_CIRCULAR_DEPENDENCY, ERROR_REFERENCE, formulaToRelativeReference, } from "@rowsncolumns/calculator";
|
|
4
4
|
/**
|
|
5
5
|
* Update sheet name in formula
|
|
@@ -10,20 +10,22 @@ export { ERROR_CIRCULAR_DEPENDENCY, ERROR_REFERENCE, formulaToRelativeReference,
|
|
|
10
10
|
export const updateSheetName = (formulaValue, newName, oldName) => {
|
|
11
11
|
const tokens = cloneTokens(lexify(formulaValue).tokens);
|
|
12
12
|
const newTokens = [];
|
|
13
|
+
// Sheet names compare case-insensitively (Excel's rule); the old name is a literal, not a pattern —
|
|
14
|
+
// `Q1 (2024)` or `Sheet.2` must match exactly that title.
|
|
15
|
+
const isOldName = new RegExp("^" + escapeCharacters(oldName) + "$", "i");
|
|
16
|
+
// `sanitizeSheetName` re-quotes the new name the way Excel writes it — `'2024'!A1`, `'A1'!A1`,
|
|
17
|
+
// `'TRUE'!A1` — and drops quotes a plain identifier no longer needs (rowsncolumns/spreadsheet#939 K-10).
|
|
13
18
|
for (const token of tokens) {
|
|
14
19
|
if (token.tokenType.name === tokenVocabulary.Sheet.name) {
|
|
15
20
|
token.image =
|
|
16
|
-
sanitizeSheetName(token.image
|
|
17
|
-
|
|
18
|
-
.replace(new RegExp("^" + oldName + "$", "gi"), newName)) + "!";
|
|
21
|
+
sanitizeSheetName(token.image.slice(0, -1).replace(isOldName, newName)) +
|
|
22
|
+
"!";
|
|
19
23
|
}
|
|
20
24
|
if (token.tokenType.name === tokenVocabulary.SheetQuoted.name) {
|
|
21
25
|
const cleanSheetName = desanitizeSheetName(token.image);
|
|
22
26
|
if (cleanSheetName) {
|
|
23
27
|
token.image =
|
|
24
|
-
sanitizeSheetName(cleanSheetName
|
|
25
|
-
.slice(0, -1)
|
|
26
|
-
.replace(new RegExp("^" + oldName + "$", "gi"), newName)) + "!";
|
|
28
|
+
sanitizeSheetName(cleanSheetName.slice(0, -1).replace(isOldName, newName)) + "!";
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
newTokens.push(token);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { CellInterface } from "@rowsncolumns/common-types";
|
|
2
|
+
import type { EmbeddedObject } from "@rowsncolumns/spreadsheet";
|
|
3
|
+
import type { UseSpreadsheetProps } from "../hooks/use-spreadsheet-state";
|
|
4
|
+
/**
|
|
5
|
+
* Upper bound (px) for a floating image's longer side when the grid's viewport is unknown — a
|
|
6
|
+
* paste or drop outside a mounted `CanvasGrid` (no `getSheetDimensions`). With a viewport the image
|
|
7
|
+
* is capped to the viewport instead, so a picture is never larger than what the user can see.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_IMAGE_EMBED_MAX_DIMENSION = 800;
|
|
10
|
+
/** The visible grid area in pixels — `CanvasGrid`'s `getSheetDimensions()` (width, height). */
|
|
11
|
+
export type ImageViewport = readonly [width: number, height: number];
|
|
12
|
+
export type ImageEmbedSize = {
|
|
13
|
+
widthPixels: number;
|
|
14
|
+
heightPixels: number;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Excel / Google Sheets default size for an inserted picture: its natural pixel size, only scaled
|
|
18
|
+
* DOWN (aspect ratio kept) when it would not fit the viewport. Never scales up. An image with an
|
|
19
|
+
* unknown / degenerate size (0 or NaN) is left as-is so the caller can still place it.
|
|
20
|
+
*/
|
|
21
|
+
export declare const fitImageToViewport: (width: number, height: number, viewport?: ImageViewport | null) => ImageEmbedSize;
|
|
22
|
+
export type CreateImageEmbedOptions = {
|
|
23
|
+
sheetId: number;
|
|
24
|
+
/** The cell the picture's top-left corner is anchored to (Excel anchors a pasted picture at the active cell). */
|
|
25
|
+
anchorCell: CellInterface;
|
|
26
|
+
imageUrl: string;
|
|
27
|
+
/** Natural image size in pixels; fitted to `viewport` by {@link fitImageToViewport}. */
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
viewport?: ImageViewport | null;
|
|
31
|
+
/** A fixed id (replacing an existing embed keeps its id); defaults to `idCreationStrategy("embed")` / a uuid. */
|
|
32
|
+
embedId?: EmbeddedObject["embedId"];
|
|
33
|
+
idCreationStrategy?: UseSpreadsheetProps["idCreationStrategy"];
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* The ONE way a picture becomes a floating object over the cells — shared by the clipboard paste,
|
|
37
|
+
* the file drop, the Insert → Image dialog and the engine command handlers, so every entry point
|
|
38
|
+
* produces the same movable, resizable, aspect-locked embed anchored at the target cell.
|
|
39
|
+
*/
|
|
40
|
+
export declare const createImageEmbed: ({ sheetId, anchorCell, imageUrl, width, height, viewport, embedId, idCreationStrategy, }: CreateImageEmbedOptions) => EmbeddedObject;
|
|
41
|
+
//# sourceMappingURL=image-embed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-embed.d.ts","sourceRoot":"","sources":["../../../api/image-embed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD,+FAA+F;AAC/F,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,WAAW,aAAa,GAAG,IAAI,KAC9B,cAaF,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,UAAU,EAAE,aAAa,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,iHAAiH;IACjH,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,kBAAkB,CAAC,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CAChE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,0FAS9B,uBAAuB,KAAG,cAyB5B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { uuid } from "@rowsncolumns/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Upper bound (px) for a floating image's longer side when the grid's viewport is unknown — a
|
|
4
|
+
* paste or drop outside a mounted `CanvasGrid` (no `getSheetDimensions`). With a viewport the image
|
|
5
|
+
* is capped to the viewport instead, so a picture is never larger than what the user can see.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_IMAGE_EMBED_MAX_DIMENSION = 800;
|
|
8
|
+
/**
|
|
9
|
+
* Excel / Google Sheets default size for an inserted picture: its natural pixel size, only scaled
|
|
10
|
+
* DOWN (aspect ratio kept) when it would not fit the viewport. Never scales up. An image with an
|
|
11
|
+
* unknown / degenerate size (0 or NaN) is left as-is so the caller can still place it.
|
|
12
|
+
*/
|
|
13
|
+
export const fitImageToViewport = (width, height, viewport) => {
|
|
14
|
+
if (!(width > 0) || !(height > 0)) {
|
|
15
|
+
return { widthPixels: width, heightPixels: height };
|
|
16
|
+
}
|
|
17
|
+
const [maxWidth, maxHeight] = viewport && viewport[0] > 0 && viewport[1] > 0
|
|
18
|
+
? viewport
|
|
19
|
+
: [DEFAULT_IMAGE_EMBED_MAX_DIMENSION, DEFAULT_IMAGE_EMBED_MAX_DIMENSION];
|
|
20
|
+
const scale = Math.min(1, maxWidth / width, maxHeight / height);
|
|
21
|
+
return {
|
|
22
|
+
widthPixels: Math.round(width * scale),
|
|
23
|
+
heightPixels: Math.round(height * scale),
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* The ONE way a picture becomes a floating object over the cells — shared by the clipboard paste,
|
|
28
|
+
* the file drop, the Insert → Image dialog and the engine command handlers, so every entry point
|
|
29
|
+
* produces the same movable, resizable, aspect-locked embed anchored at the target cell.
|
|
30
|
+
*/
|
|
31
|
+
export const createImageEmbed = ({ sheetId, anchorCell, imageUrl, width, height, viewport, embedId, idCreationStrategy, }) => {
|
|
32
|
+
const { widthPixels, heightPixels } = fitImageToViewport(width, height, viewport);
|
|
33
|
+
return {
|
|
34
|
+
embedId: embedId ?? idCreationStrategy?.("embed") ?? uuid(),
|
|
35
|
+
position: {
|
|
36
|
+
sheetId,
|
|
37
|
+
overlayPosition: {
|
|
38
|
+
anchorCell: { rowIndex: anchorCell.rowIndex, columnIndex: anchorCell.columnIndex },
|
|
39
|
+
widthPixels,
|
|
40
|
+
heightPixels,
|
|
41
|
+
offsetXPixels: 0,
|
|
42
|
+
offsetYPixels: 0,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
borderColor: "transparent",
|
|
46
|
+
lockAspectRatio: true,
|
|
47
|
+
spec: {
|
|
48
|
+
type: "image",
|
|
49
|
+
imageUrl,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"immer-utils.d.ts","sourceRoot":"","sources":["../../../api/immer-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,IAAI,2BAA2B,EAC/C,SAAS,IAAI,oBAAoB,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI7E,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACZ,MAAM,2BAA2B,CAAC;AASnC,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAQxE,KAAK,SAAS,CAAC,CAAC,SAAS,QAAQ,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAC7D,KAAK,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,SAAS,IACzD,2BAA2B,CAAC,CAAC,CAAC,CAAC;AAEjC,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EACjD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC1B,SAAS,MAAM,EACf,WAAW,MAAM,KAgBD,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,EAC9D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,GACrC,UAAU,SAAS,CAAC,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAC7D,gBAAgB,MAAM,KACrB,mBAAmB,GAAG,SAUxB,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,QAAQ,EACvD,SAAS,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,KACjE,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAa9C,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,QAAQ,EACxD,UAAU,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,oBAItC,CAAC;
|
|
1
|
+
{"version":3,"file":"immer-utils.d.ts","sourceRoot":"","sources":["../../../api/immer-utils.ts"],"names":[],"mappings":"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"}
|