@rowsncolumns/spreadsheet-state 28.0.74 → 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/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/immer-utils.d.ts.map +1 -1
- package/dist/cjs/api/immer-utils.js +20 -15
- package/dist/cjs/api/intl.d.ts.map +1 -1
- package/dist/cjs/api/paint-format.d.ts +15 -1
- package/dist/cjs/api/paint-format.d.ts.map +1 -1
- package/dist/cjs/api/paint-format.js +69 -10
- package/dist/cjs/commands.d.ts +11 -1
- package/dist/cjs/commands.d.ts.map +1 -1
- package/dist/cjs/hooks/use-calculation.d.ts +1 -1
- 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-paint-format.d.ts.map +1 -1
- package/dist/cjs/hooks/use-paint-format.js +10 -7
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/cjs/hooks/use-spreadsheet-state.js +12 -1
- 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/spreadsheet-interface.d.ts +1 -1
- package/dist/cjs/sheet-cell.d.ts.map +1 -1
- package/dist/cjs/sheet-cell.js +30 -6
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- 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/immer-utils.d.ts.map +1 -1
- package/dist/esm/api/immer-utils.js +20 -15
- package/dist/esm/api/intl.d.ts.map +1 -1
- package/dist/esm/api/paint-format.d.ts +15 -1
- package/dist/esm/api/paint-format.d.ts.map +1 -1
- package/dist/esm/api/paint-format.js +46 -1
- package/dist/esm/commands.d.ts +11 -1
- package/dist/esm/commands.d.ts.map +1 -1
- package/dist/esm/hooks/use-calculation.d.ts +1 -1
- 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-paint-format.d.ts.map +1 -1
- package/dist/esm/hooks/use-paint-format.js +10 -7
- package/dist/esm/hooks/use-spreadsheet-state.d.ts +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.d.ts.map +1 -1
- package/dist/esm/hooks/use-spreadsheet-state.js +12 -1
- 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/spreadsheet-interface.d.ts +1 -1
- package/dist/esm/sheet-cell.d.ts.map +1 -1
- package/dist/esm/sheet-cell.js +30 -6
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +10 -10
|
@@ -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/cjs/api/datatype.js
CHANGED
|
@@ -605,11 +605,18 @@ export var detectValueTypeAndPattern = function (value, locale, lenientGrouping,
|
|
|
605
605
|
var percentValue = convertToNumber(value, locale, lenientGrouping) / 100;
|
|
606
606
|
return ["numberValue", "PERCENT", percentValue, pattern];
|
|
607
607
|
}
|
|
608
|
+
// A JS number carries no typed digits: its decimal expansion is float
|
|
609
|
+
// noise (0.1 + 0.2, the 5.333333333333333 of a fitted trend), never a
|
|
610
|
+
// format the user asked for. Excel keeps a computed or programmatic
|
|
611
|
+
// number General and clips it to General's significant digits, so only
|
|
612
|
+
// TEXT entry infers a decimal pattern from what was typed.
|
|
608
613
|
return [
|
|
609
614
|
"numberValue",
|
|
610
615
|
"NUMBER",
|
|
611
616
|
convertToNumber(value, locale, lenientGrouping),
|
|
612
|
-
|
|
617
|
+
typeof value === "number"
|
|
618
|
+
? "General"
|
|
619
|
+
: detectNumberFormatPattern(value, numberValue, "NUMBER", locale),
|
|
613
620
|
];
|
|
614
621
|
}
|
|
615
622
|
// 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,164 @@
|
|
|
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 var generateSeriesSpecValues = function (sourceValues, spec, count, locale) {
|
|
16
|
+
var _a;
|
|
17
|
+
if (spec.type === "autofill" || count <= 0)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (spec.type === "date") {
|
|
20
|
+
var values_1 = generateDateSeries(sourceValues, spec, count, locale);
|
|
21
|
+
return values_1 ? { seeds: [], values: values_1 } : undefined;
|
|
22
|
+
}
|
|
23
|
+
var indexed = sourceValues
|
|
24
|
+
.map(function (v, index) { return ({ index: index, value: toNumber(v) }); })
|
|
25
|
+
.filter(function (seed) { return Number.isFinite(seed.value); });
|
|
26
|
+
if (!indexed.length)
|
|
27
|
+
return undefined;
|
|
28
|
+
var numbers = indexed.map(function (seed) { return seed.value; });
|
|
29
|
+
var step = (_a = spec.step) !== null && _a !== void 0 ? _a : 1;
|
|
30
|
+
var n = numbers.length;
|
|
31
|
+
if (spec.trend) {
|
|
32
|
+
// Least-squares trend through the seeds (x = 0..n-1), continued at x = n…
|
|
33
|
+
// A single seed has no slope: the fit is the flat line through it.
|
|
34
|
+
var ys_1 = spec.type === "growth"
|
|
35
|
+
? numbers.map(function (y) { return (y > 0 ? Math.log(y) : NaN); })
|
|
36
|
+
: numbers;
|
|
37
|
+
if (ys_1.some(function (y) { return !Number.isFinite(y); }))
|
|
38
|
+
return undefined;
|
|
39
|
+
var xs = ys_1.map(function (_, i) { return i; });
|
|
40
|
+
var sumX = xs.reduce(function (a, b) { return a + b; }, 0);
|
|
41
|
+
var sumY = ys_1.reduce(function (a, b) { return a + b; }, 0);
|
|
42
|
+
var sumXY = xs.reduce(function (a, x, i) { return a + x * ys_1[i]; }, 0);
|
|
43
|
+
var sumXX = xs.reduce(function (a, x) { return a + x * x; }, 0);
|
|
44
|
+
var denom = n * sumXX - sumX * sumX;
|
|
45
|
+
var slope_1 = denom === 0 ? 0 : (n * sumXY - sumX * sumY) / denom;
|
|
46
|
+
var intercept_1 = (sumY - slope_1 * sumX) / n;
|
|
47
|
+
var fit_1 = function (x) {
|
|
48
|
+
var fitted = slope_1 * x + intercept_1;
|
|
49
|
+
return normalize(spec.type === "growth" ? Math.exp(fitted) : fitted);
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
seeds: indexed.map(function (seed, position) { return ({
|
|
53
|
+
index: seed.index,
|
|
54
|
+
value: fit_1(position),
|
|
55
|
+
}); }),
|
|
56
|
+
values: Array.from({ length: count }, function (_, i) { return fit_1(n + i); }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
var values = [];
|
|
60
|
+
var current = numbers[n - 1];
|
|
61
|
+
for (var i = 0; i < count; i++) {
|
|
62
|
+
current =
|
|
63
|
+
spec.type === "growth" ? current * step : current + step;
|
|
64
|
+
current = normalize(current);
|
|
65
|
+
if (passesStop(current, step, spec))
|
|
66
|
+
break;
|
|
67
|
+
values.push(current);
|
|
68
|
+
}
|
|
69
|
+
return { seeds: [], values: values };
|
|
70
|
+
};
|
|
71
|
+
var toNumber = function (v) {
|
|
72
|
+
return typeof v === "number"
|
|
73
|
+
? v
|
|
74
|
+
: typeof v === "string" && v.trim() !== "" && !isNaN(Number(v))
|
|
75
|
+
? Number(v)
|
|
76
|
+
: NaN;
|
|
77
|
+
};
|
|
78
|
+
/** Excel's stop rule: the series ends once a value would move past `stop` in the series' direction. */
|
|
79
|
+
var passesStop = function (value, step, spec) {
|
|
80
|
+
var stop = spec.stop;
|
|
81
|
+
if (stop === undefined || !Number.isFinite(stop))
|
|
82
|
+
return false;
|
|
83
|
+
var ascending = spec.type === "growth" ? Math.abs(step) > 1 === value > 0 : step > 0;
|
|
84
|
+
return ascending ? value > stop + 1e-9 : value < stop - 1e-9;
|
|
85
|
+
};
|
|
86
|
+
/** Snap float noise (0.1 + 0.2) to a clean decimal. */
|
|
87
|
+
var normalize = function (x) {
|
|
88
|
+
if (!Number.isFinite(x))
|
|
89
|
+
return x;
|
|
90
|
+
var r = Math.round(x * 1e10) / 1e10;
|
|
91
|
+
return Math.abs(r - Math.round(r)) < 1e-9 ? Math.round(r) : r;
|
|
92
|
+
};
|
|
93
|
+
var toDateValue = function (value) {
|
|
94
|
+
if (value instanceof Date)
|
|
95
|
+
return isNaN(value.getTime()) ? null : value;
|
|
96
|
+
if (typeof value === "string" && value.trim()) {
|
|
97
|
+
var parsed = new Date(value);
|
|
98
|
+
return isNaN(parsed.getTime()) ? null : parsed;
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
};
|
|
102
|
+
var generateDateSeries = function (sourceValues, spec, count, locale) {
|
|
103
|
+
var _a, _b;
|
|
104
|
+
var dates = sourceValues
|
|
105
|
+
.map(toDateValue)
|
|
106
|
+
.filter(function (d) { return d !== null; });
|
|
107
|
+
if (!dates.length)
|
|
108
|
+
return undefined;
|
|
109
|
+
var last = dates[dates.length - 1];
|
|
110
|
+
var step = Math.trunc((_a = spec.step) !== null && _a !== void 0 ? _a : 1) || 1;
|
|
111
|
+
var unit = (_b = spec.dateUnit) !== null && _b !== void 0 ? _b : "day";
|
|
112
|
+
var result = [];
|
|
113
|
+
var current = new Date(last);
|
|
114
|
+
var lastDayOfMonth = last.getDate();
|
|
115
|
+
for (var i = 0; i < count; i++) {
|
|
116
|
+
switch (unit) {
|
|
117
|
+
case "day":
|
|
118
|
+
current.setDate(current.getDate() + step);
|
|
119
|
+
break;
|
|
120
|
+
case "weekday": {
|
|
121
|
+
var dir = step > 0 ? 1 : -1;
|
|
122
|
+
for (var k = 0; k < Math.abs(step); k++) {
|
|
123
|
+
do {
|
|
124
|
+
current.setDate(current.getDate() + dir);
|
|
125
|
+
} while (current.getDay() === 0 || current.getDay() === 6);
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
case "month": {
|
|
130
|
+
// Keep the seed's day-of-month, clamped to the target month's length.
|
|
131
|
+
var target = new Date(last);
|
|
132
|
+
target.setDate(1);
|
|
133
|
+
target.setMonth(last.getMonth() + step * (i + 1));
|
|
134
|
+
var daysInMonth = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
|
|
135
|
+
target.setDate(Math.min(lastDayOfMonth, daysInMonth));
|
|
136
|
+
current.setTime(target.getTime());
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case "year": {
|
|
140
|
+
var target = new Date(last);
|
|
141
|
+
target.setDate(1);
|
|
142
|
+
target.setFullYear(last.getFullYear() + step * (i + 1));
|
|
143
|
+
var daysInMonth = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
|
|
144
|
+
target.setDate(Math.min(lastDayOfMonth, daysInMonth));
|
|
145
|
+
current.setTime(target.getTime());
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (spec.stop !== undefined && Number.isFinite(spec.stop)) {
|
|
150
|
+
// Date stop values are Excel serials; compare on whole days since epoch.
|
|
151
|
+
// Past the stop the line ends — the remaining cells stay untouched.
|
|
152
|
+
var serial = (current.getTime() - Date.UTC(1899, 11, 30)) / 86400000 +
|
|
153
|
+
current.getTimezoneOffset() / 1440;
|
|
154
|
+
var ascending = step > 0;
|
|
155
|
+
if (ascending ? serial > spec.stop + 1e-6 : serial < spec.stop - 1e-6) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Mirrors `generateFillValues`' date cases, which hand back locale date
|
|
160
|
+
// strings that `SheetCell` re-parses into a date-formatted serial.
|
|
161
|
+
result.push(new Date(current).toLocaleDateString(locale));
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
};
|
package/dist/cjs/api/fill.d.ts
CHANGED
|
@@ -3,11 +3,73 @@ import type { GridRange } from "@rowsncolumns/common-types";
|
|
|
3
3
|
import { Direction } from "@rowsncolumns/common-types";
|
|
4
4
|
import type { SelectionAttributes } from "@rowsncolumns/spreadsheet";
|
|
5
5
|
import type { CellData } from "@rowsncolumns/spreadsheet";
|
|
6
|
+
import type { FillModifier, FillSeriesSpec } from "@rowsncolumns/spreadsheet";
|
|
6
7
|
import type { CanvasGridProps } from "@rowsncolumns/spreadsheet";
|
|
7
8
|
import type { Draft } from "immer";
|
|
8
9
|
import type { CellXfsRegistry } from "../hooks/use-cellxfs-registry";
|
|
9
10
|
import type { useSheetProperties } from "../hooks/use-sheet-properties";
|
|
10
|
-
export type AutoFillType = "FillCopy" | "FillCustomList" | "FillDays" | "FillDefault" | "FillFormats" | "
|
|
11
|
+
export type AutoFillType = "FillCopy" | "FillCustomList" | "FillDays" | "FillDefault" | "FillFormats" | "FillHours" | "FillMonths" | "FillSeries" | "FillValues" | "FillWeekdays"
|
|
12
|
+
/** Alias of Excel's `xlFillValues` under the Auto Fill Options label ("Fill Without Formatting"). */
|
|
13
|
+
| "FillWithoutFormatting" | "FillYears" | "FlashFill" | "GrowthTrend" | "LinearTrend";
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the Ctrl/Cmd fill-handle toggle the way Excel does — ONE fill type
|
|
16
|
+
* for the whole drag, decided from what auto-detection would have done per
|
|
17
|
+
* fill line (each column of a vertical fill / row of a horizontal one).
|
|
18
|
+
* If ANY line would extend a series (2+ numbers, a date, a list name,
|
|
19
|
+
* "Item 1"), the toggle means Copy Cells for every line; only when every
|
|
20
|
+
* line would copy (lone numbers) does it mean Fill Series. Formula lines
|
|
21
|
+
* never vote (formulas always copy with relative-ref adjustment) and empty
|
|
22
|
+
* lines are ignored.
|
|
23
|
+
*/
|
|
24
|
+
export declare const resolveToggledFillType: (detectedPerLine: (AutoFillType | undefined)[]) => AutoFillType;
|
|
25
|
+
/**
|
|
26
|
+
* Excel's Auto Fill Options payload modifiers: "Fill Formatting Only" (`FillFormats`) and
|
|
27
|
+
* "Fill Without Formatting" (`FillWithoutFormatting`; `FillValues` is the VBA `xlFillValues`
|
|
28
|
+
* spelling the AI fill tool uses). Neither is a series mode — the series is detected exactly as
|
|
29
|
+
* for a plain drag; they only change WHAT lands in each target cell.
|
|
30
|
+
*/
|
|
31
|
+
export declare const isFormatsOnlyFillType: (fillType: AutoFillType | undefined) => fillType is "FillFormats";
|
|
32
|
+
export declare const isValuesOnlyFillType: (fillType: AutoFillType | undefined) => fillType is "FillValues" | "FillWithoutFormatting";
|
|
33
|
+
/**
|
|
34
|
+
* Thrown when a fill source is touched by merges that don't tile it with identically sized
|
|
35
|
+
* blocks — Excel refuses the fill with this exact message and writes nothing.
|
|
36
|
+
*/
|
|
37
|
+
export declare class MergedFillSizeError extends Error {
|
|
38
|
+
constructor();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Marks a target cell the fill leaves exactly as it is: a Series-dialog `stop` value was reached
|
|
42
|
+
* before the selection's end, and Excel writes nothing into the remaining selected cells.
|
|
43
|
+
*/
|
|
44
|
+
export declare const FILL_UNTOUCHED: unique symbol;
|
|
45
|
+
export type AutoFillCellValue<T extends CellData> = T | string | number | null | undefined | Draft<T> | typeof FILL_UNTOUCHED;
|
|
46
|
+
/** A seed cell rewritten by the fill (absolute coordinates on the sheet). */
|
|
47
|
+
export type AutoFillSeedCell<T extends CellData> = {
|
|
48
|
+
rowIndex: number;
|
|
49
|
+
columnIndex: number;
|
|
50
|
+
cell: T;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* The per-target-cell payload (indexed `[row][column]` relative to the filled area — the target
|
|
54
|
+
* rectangle beyond the source). A merged seed additionally reports the merge blocks to land and
|
|
55
|
+
* the fill extent snapped to whole blocks (the area `applyFill` actually writes). A Series-dialog
|
|
56
|
+
* Trend reports the seed cells it rewrites with the fitted values (Excel replaces the starting
|
|
57
|
+
* values) in `seedCells`.
|
|
58
|
+
*/
|
|
59
|
+
export type AutoFillResult<T extends CellData> = AutoFillCellValue<T>[][] & {
|
|
60
|
+
fillMerges?: GridRange[];
|
|
61
|
+
snappedFillBounds?: GridRange;
|
|
62
|
+
seedCells?: AutoFillSeedCell<T>[];
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* The merged-block geometry of a fill source: `undefined` when no merge touches it, the block
|
|
66
|
+
* size when identically sized merges tile it exactly (every merge inside the source, on the block
|
|
67
|
+
* lattice, and together covering it), else a {@link MergedFillSizeError}.
|
|
68
|
+
*/
|
|
69
|
+
export declare const resolveMergedFillBlock: (range: GridRange, merges: GridRange[] | null | undefined) => {
|
|
70
|
+
rows: number;
|
|
71
|
+
cols: number;
|
|
72
|
+
} | undefined;
|
|
11
73
|
/**
|
|
12
74
|
* User-defined autofill lists. Each list is an array of strings that
|
|
13
75
|
* the autofill engine treats as a cyclic sequence — e.g. starting from
|
|
@@ -36,6 +98,11 @@ export type GetAutoFillValuesProps<T extends CellData> = {
|
|
|
36
98
|
* Area user is trying to fill
|
|
37
99
|
*/
|
|
38
100
|
fillBounds: GridRange;
|
|
101
|
+
/**
|
|
102
|
+
* The sheet's merged ranges. A source tiled by identically sized merges fills block by block
|
|
103
|
+
* (each landed block merged like the seed); omit for plain per-cell fills.
|
|
104
|
+
*/
|
|
105
|
+
merges?: GridRange[] | null;
|
|
39
106
|
/**
|
|
40
107
|
* Get cell data of a sheet
|
|
41
108
|
*/
|
|
@@ -61,6 +128,18 @@ export type GetAutoFillValuesProps<T extends CellData> = {
|
|
|
61
128
|
* Auto fill type - if not specified, will auto-detect
|
|
62
129
|
*/
|
|
63
130
|
fillType?: AutoFillType;
|
|
131
|
+
/**
|
|
132
|
+
* `"toggle"` when Ctrl/Cmd was held on the fill handle at release. Only
|
|
133
|
+
* consulted when `fillType` is not set: inverts the auto-detected
|
|
134
|
+
* copy↔series decision for the whole drag (see `resolveToggledFillType`).
|
|
135
|
+
*/
|
|
136
|
+
modifier?: FillModifier;
|
|
137
|
+
/**
|
|
138
|
+
* Excel Series-dialog parameters. When present (and not `type:
|
|
139
|
+
* "autofill"`), the values come from the spec's generator — step/stop,
|
|
140
|
+
* trend, date unit — instead of the fill-type heuristics.
|
|
141
|
+
*/
|
|
142
|
+
series?: FillSeriesSpec;
|
|
64
143
|
/**
|
|
65
144
|
* User-defined autofill lists. When the selection matches a
|
|
66
145
|
* contiguous slice of one of these lists, the fill cycles through
|
|
@@ -72,6 +151,13 @@ export type GetAutoFillValuesProps<T extends CellData> = {
|
|
|
72
151
|
*/
|
|
73
152
|
getDataValidationById?: ReturnType<typeof useSheetProperties>["getDataValidationById"];
|
|
74
153
|
};
|
|
154
|
+
/**
|
|
155
|
+
* Continue a text+number series ("Item 1" → "Item 2"; "001" → "002" keeps the
|
|
156
|
+
* zero padding; "1st Period" → "2nd Period" re-derives the ordinal). One seed
|
|
157
|
+
* steps by ±1 (by fill direction); two or more take the seeds' difference.
|
|
158
|
+
*/
|
|
159
|
+
export declare const generateTextNumberSeries: (values: string[], count: number, descending?: boolean) => string[] | null;
|
|
160
|
+
export declare const generateQuarterSeries: (values: string[], count: number, descending?: boolean) => string[] | null;
|
|
75
161
|
/**
|
|
76
162
|
* Detect the fill type based on selection data
|
|
77
163
|
*/
|
|
@@ -79,10 +165,16 @@ export declare const detectFillType: (selectionData: (string | number | boolean
|
|
|
79
165
|
/**
|
|
80
166
|
* Generate fill values based on type and pattern
|
|
81
167
|
*/
|
|
82
|
-
export declare const generateFillValues: (sourceValues: any[], fillType: AutoFillType, count: number, locale?: string, customAutofillLists?: CustomAutofillList[]
|
|
168
|
+
export declare const generateFillValues: (sourceValues: any[], fillType: AutoFillType, count: number, locale?: string, customAutofillLists?: CustomAutofillList[],
|
|
169
|
+
/**
|
|
170
|
+
* The fill walks away from the selection's start (fill up / fill left), so a
|
|
171
|
+
* single seed continues backwards: "Item 5" → "Item 4", Wednesday → Tuesday.
|
|
172
|
+
* Multi-seed lines already encode the direction in their reversed order.
|
|
173
|
+
*/
|
|
174
|
+
descending?: boolean) => any[];
|
|
83
175
|
/**
|
|
84
176
|
* Get auto fill values
|
|
85
177
|
* @returns T[][]
|
|
86
178
|
*/
|
|
87
|
-
export declare const getAutoFillValues: <T extends CellData>({ sheetId, direction, selection, fillBounds, getCellData, getEffectiveValue, getFormattedValue, getSheetName, getDataValidationById, cellXfsRegistry, locale, fillType, customAutofillLists, }: GetAutoFillValuesProps<T>) => Promise<
|
|
179
|
+
export declare const getAutoFillValues: <T extends CellData>({ sheetId, direction, selection, fillBounds, getCellData, getEffectiveValue, getFormattedValue, getSheetName, getDataValidationById, cellXfsRegistry, locale, fillType: requestedFillType, modifier, series, customAutofillLists, merges, }: GetAutoFillValuesProps<T>) => Promise<AutoFillResult<T>>;
|
|
88
180
|
//# sourceMappingURL=fill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../../api/fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../../api/fill.ts"],"names":[],"mappings":"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"}
|