@rowsncolumns/spreadsheet 10.4.1 → 10.4.4
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/atoms/sheet-context.atom.d.ts +2 -0
- package/dist/cjs/atoms/sheet-context.atom.d.ts.map +1 -1
- package/dist/cjs/atoms/sheet-context.atom.js +8 -2
- package/dist/cjs/atoms/sort-dialog.atom.d.ts +6 -2
- package/dist/cjs/atoms/sort-dialog.atom.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/cjs/components/canvas-grid/index.js +4 -2
- package/dist/cjs/components/canvas-grid/typings.d.ts +10 -0
- package/dist/cjs/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/date-tree.d.ts +23 -5
- package/dist/cjs/components/filter-box/date-tree.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/date-tree.js +76 -11
- package/dist/cjs/components/filter-box/filter-by-condition.d.ts +26 -1
- package/dist/cjs/components/filter-box/filter-by-condition.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/filter-by-condition.js +108 -9
- package/dist/cjs/components/filter-box/index.d.ts.map +1 -1
- package/dist/cjs/components/filter-box/index.js +21 -5
- package/dist/cjs/components/formula-input/index.d.ts.map +1 -1
- package/dist/cjs/components/formula-input/index.js +26 -4
- package/dist/cjs/components/sheet-tabs/index.d.ts.map +1 -1
- package/dist/cjs/components/sheet-tabs/index.js +19 -5
- package/dist/cjs/components/sort-range-dialog/index.d.ts +20 -3
- package/dist/cjs/components/sort-range-dialog/index.d.ts.map +1 -1
- package/dist/cjs/components/sort-range-dialog/index.js +20 -6
- package/dist/cjs/components/toolbar/cell-style-selector.d.ts +9 -0
- package/dist/cjs/components/toolbar/cell-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/cell-style-selector.js +12 -3
- package/dist/cjs/components/toolbar/merge-cells-selector.d.ts +27 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/merge-cells-selector.js +106 -8
- package/dist/cjs/components/toolbar/table-style-editor.d.ts +85 -0
- package/dist/cjs/components/toolbar/table-style-editor.d.ts.map +1 -0
- package/dist/cjs/components/toolbar/table-style-editor.js +235 -0
- package/dist/cjs/components/toolbar/table-style-selector.d.ts +7 -7
- package/dist/cjs/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/cjs/components/toolbar/table-style-selector.js +77 -87
- package/dist/cjs/config.d.ts +6 -0
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +7 -1
- package/dist/cjs/hooks/use-conditional-formatting.d.ts +8 -0
- package/dist/cjs/hooks/use-conditional-formatting.d.ts.map +1 -1
- package/dist/cjs/hooks/use-conditional-formatting.js +128 -77
- package/dist/cjs/hooks/use-editable.d.ts.map +1 -1
- package/dist/cjs/hooks/use-editable.js +59 -1
- package/dist/cjs/hooks/use-selection.d.ts +6 -1
- package/dist/cjs/hooks/use-selection.d.ts.map +1 -1
- package/dist/cjs/hooks/use-selection.js +37 -1
- package/dist/cjs/release-date.js +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +64 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/atoms/sheet-context.atom.d.ts +2 -0
- package/dist/esm/atoms/sheet-context.atom.d.ts.map +1 -1
- package/dist/esm/atoms/sheet-context.atom.js +3 -0
- package/dist/esm/atoms/sort-dialog.atom.d.ts +6 -2
- package/dist/esm/atoms/sort-dialog.atom.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.d.ts.map +1 -1
- package/dist/esm/components/canvas-grid/index.js +3 -1
- package/dist/esm/components/canvas-grid/typings.d.ts +10 -0
- package/dist/esm/components/canvas-grid/typings.d.ts.map +1 -1
- package/dist/esm/components/filter-box/date-tree.d.ts +23 -5
- package/dist/esm/components/filter-box/date-tree.d.ts.map +1 -1
- package/dist/esm/components/filter-box/date-tree.js +62 -10
- package/dist/esm/components/filter-box/filter-by-condition.d.ts +26 -1
- package/dist/esm/components/filter-box/filter-by-condition.d.ts.map +1 -1
- package/dist/esm/components/filter-box/filter-by-condition.js +78 -12
- package/dist/esm/components/filter-box/index.d.ts.map +1 -1
- package/dist/esm/components/filter-box/index.js +21 -5
- package/dist/esm/components/formula-input/index.d.ts.map +1 -1
- package/dist/esm/components/formula-input/index.js +26 -4
- package/dist/esm/components/sheet-tabs/index.d.ts.map +1 -1
- package/dist/esm/components/sheet-tabs/index.js +20 -6
- package/dist/esm/components/sort-range-dialog/index.d.ts +20 -3
- package/dist/esm/components/sort-range-dialog/index.d.ts.map +1 -1
- package/dist/esm/components/sort-range-dialog/index.js +17 -5
- package/dist/esm/components/toolbar/cell-style-selector.d.ts +9 -0
- package/dist/esm/components/toolbar/cell-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/cell-style-selector.js +11 -2
- package/dist/esm/components/toolbar/merge-cells-selector.d.ts +27 -1
- package/dist/esm/components/toolbar/merge-cells-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/merge-cells-selector.js +94 -10
- package/dist/esm/components/toolbar/table-style-editor.d.ts +85 -0
- package/dist/esm/components/toolbar/table-style-editor.d.ts.map +1 -0
- package/dist/esm/components/toolbar/table-style-editor.js +189 -0
- package/dist/esm/components/toolbar/table-style-selector.d.ts +7 -7
- package/dist/esm/components/toolbar/table-style-selector.d.ts.map +1 -1
- package/dist/esm/components/toolbar/table-style-selector.js +74 -81
- package/dist/esm/config.d.ts +6 -0
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +6 -0
- package/dist/esm/hooks/use-conditional-formatting.d.ts +8 -0
- package/dist/esm/hooks/use-conditional-formatting.d.ts.map +1 -1
- package/dist/esm/hooks/use-conditional-formatting.js +50 -13
- package/dist/esm/hooks/use-editable.d.ts.map +1 -1
- package/dist/esm/hooks/use-editable.js +48 -2
- package/dist/esm/hooks/use-selection.d.ts +6 -1
- package/dist/esm/hooks/use-selection.d.ts.map +1 -1
- package/dist/esm/hooks/use-selection.js +37 -1
- package/dist/esm/release-date.js +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +64 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/spreadsheet.min.css +1 -1
- package/package.json +5 -5
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SortRangeDialogHost = exports.SortRangeDialog = void 0;
|
|
3
|
+
exports.SortRangeDialogHost = exports.SortRangeDialog = exports.sortColumnLabel = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var icons_1 = require("@rowsncolumns/icons");
|
|
6
6
|
var ui_1 = require("@rowsncolumns/ui");
|
|
7
7
|
var react_1 = tslib_1.__importStar(require("react"));
|
|
8
8
|
var sort_dialog_atom_1 = require("../../atoms/sort-dialog.atom");
|
|
9
|
+
/** The label a sort level shows for a column: its header while the data has headers, else its letter. */
|
|
10
|
+
var sortColumnLabel = function (column, hasHeader) {
|
|
11
|
+
var _a;
|
|
12
|
+
var header = (_a = column.header) === null || _a === void 0 ? void 0 : _a.trim();
|
|
13
|
+
return hasHeader && header ? header : column.label;
|
|
14
|
+
};
|
|
15
|
+
exports.sortColumnLabel = sortColumnLabel;
|
|
9
16
|
var CUSTOM_LIST_PREFIX = "custom:";
|
|
10
17
|
var ColorSwatch = function (_a) {
|
|
11
18
|
var color = _a.color;
|
|
@@ -53,19 +60,23 @@ var specToLevel = function (spec, customLists) {
|
|
|
53
60
|
* routes through its existing sort callbacks.
|
|
54
61
|
*/
|
|
55
62
|
exports.SortRangeDialog = (0, react_1.memo)(function (_a) {
|
|
56
|
-
var open = _a.open, onOpenChange = _a.onOpenChange, columns = _a.columns, customLists = _a.customLists, initialSpecs = _a.initialSpecs, onApply = _a.onApply;
|
|
63
|
+
var open = _a.open, onOpenChange = _a.onOpenChange, columns = _a.columns, customLists = _a.customLists, initialSpecs = _a.initialSpecs, initialHasHeader = _a.initialHasHeader, onApply = _a.onApply;
|
|
57
64
|
var lists = (0, react_1.useMemo)(function () { return customLists !== null && customLists !== void 0 ? customLists : []; }, [customLists]);
|
|
58
65
|
var _b = tslib_1.__read((0, react_1.useState)(function () {
|
|
59
66
|
return (initialSpecs === null || initialSpecs === void 0 ? void 0 : initialSpecs.length)
|
|
60
67
|
? initialSpecs.map(function (spec) { return specToLevel(spec, lists); })
|
|
61
68
|
: [makeDefaultLevel(columns)];
|
|
62
69
|
}), 2), levels = _b[0], setLevels = _b[1];
|
|
70
|
+
var showHeaderToggle = initialHasHeader !== undefined ||
|
|
71
|
+
columns.some(function (column) { return column.header !== undefined; });
|
|
72
|
+
var _c = tslib_1.__read((0, react_1.useState)(initialHasHeader !== null && initialHasHeader !== void 0 ? initialHasHeader : false), 2), hasHeader = _c[0], setHasHeader = _c[1];
|
|
63
73
|
// Re-seed when reopened with different columns / specs.
|
|
64
74
|
(0, react_1.useEffect)(function () {
|
|
65
75
|
if (open) {
|
|
66
76
|
setLevels((initialSpecs === null || initialSpecs === void 0 ? void 0 : initialSpecs.length)
|
|
67
77
|
? initialSpecs.map(function (spec) { return specToLevel(spec, lists); })
|
|
68
78
|
: [makeDefaultLevel(columns)]);
|
|
79
|
+
setHasHeader(initialHasHeader !== null && initialHasHeader !== void 0 ? initialHasHeader : false);
|
|
69
80
|
}
|
|
70
81
|
// Only reset on open transitions.
|
|
71
82
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -133,15 +144,18 @@ exports.SortRangeDialog = (0, react_1.memo)(function (_a) {
|
|
|
133
144
|
}
|
|
134
145
|
return spec;
|
|
135
146
|
});
|
|
136
|
-
onApply(specs);
|
|
147
|
+
onApply(specs, { hasHeader: hasHeader });
|
|
137
148
|
onOpenChange(false);
|
|
138
|
-
}, [levels, lists, onApply, onOpenChange]);
|
|
149
|
+
}, [levels, lists, hasHeader, onApply, onOpenChange]);
|
|
139
150
|
return (react_1.default.createElement(ui_1.Dialog, { open: open, onOpenChange: onOpenChange },
|
|
140
151
|
react_1.default.createElement(ui_1.DialogContent, { className: "w-[640px] max-w-[92vw] pointer-events-auto" },
|
|
141
152
|
react_1.default.createElement(ui_1.DialogTitle, null, "Sort"),
|
|
142
153
|
react_1.default.createElement(ui_1.DialogCloseButton, { onClick: function () { return onOpenChange(false); } },
|
|
143
154
|
react_1.default.createElement(icons_1.Cross1Icon, null)),
|
|
144
155
|
react_1.default.createElement(ui_1.DialogBody, { className: "flex flex-col gap-3" },
|
|
156
|
+
showHeaderToggle ? (react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
|
|
157
|
+
react_1.default.createElement("input", { type: "checkbox", name: "hasHeader", checked: hasHeader, onChange: function (e) { return setHasHeader(e.target.checked); } }),
|
|
158
|
+
"My data has headers")) : null,
|
|
145
159
|
react_1.default.createElement("div", { className: "flex flex-col gap-2" }, levels.map(function (lvl, rowIndex) {
|
|
146
160
|
var _a, _b, _c, _d;
|
|
147
161
|
var col = columnByIndex.get(lvl.dimensionIndex);
|
|
@@ -162,7 +176,7 @@ exports.SortRangeDialog = (0, react_1.memo)(function (_a) {
|
|
|
162
176
|
react_1.default.createElement(ui_1.SelectTrigger, { className: "w-[160px]" },
|
|
163
177
|
react_1.default.createElement(ui_1.SelectValue, { placeholder: "Column" })),
|
|
164
178
|
react_1.default.createElement(ui_1.SelectPortal, null,
|
|
165
|
-
react_1.default.createElement(ui_1.SelectContent, null, columns.map(function (c) { return (react_1.default.createElement(ui_1.SelectItem, { key: c.dimensionIndex, value: String(c.dimensionIndex) },
|
|
179
|
+
react_1.default.createElement(ui_1.SelectContent, null, columns.map(function (c) { return (react_1.default.createElement(ui_1.SelectItem, { key: c.dimensionIndex, value: String(c.dimensionIndex) }, (0, exports.sortColumnLabel)(c, hasHeader))); })))),
|
|
166
180
|
react_1.default.createElement(ui_1.Select, { value: lvl.customListIndex != null && lvl.sortBy === "value"
|
|
167
181
|
? "".concat(CUSTOM_LIST_PREFIX).concat(lvl.customListIndex)
|
|
168
182
|
: lvl.sortBy, onValueChange: function (v) {
|
|
@@ -254,7 +268,7 @@ var SortRangeDialogHost = function () {
|
|
|
254
268
|
return (react_1.default.createElement(exports.SortRangeDialog, { open: request != null, onOpenChange: function (open) {
|
|
255
269
|
if (!open)
|
|
256
270
|
close();
|
|
257
|
-
}, columns: (_a = request === null || request === void 0 ? void 0 : request.columns) !== null && _a !== void 0 ? _a : [], customLists: request === null || request === void 0 ? void 0 : request.customLists, initialSpecs: request === null || request === void 0 ? void 0 : request.initialSpecs, onApply: function (specs) { return request === null || request === void 0 ? void 0 : request.onApply(specs); } }));
|
|
271
|
+
}, columns: (_a = request === null || request === void 0 ? void 0 : request.columns) !== null && _a !== void 0 ? _a : [], customLists: request === null || request === void 0 ? void 0 : request.customLists, initialSpecs: request === null || request === void 0 ? void 0 : request.initialSpecs, initialHasHeader: request === null || request === void 0 ? void 0 : request.initialHasHeader, onApply: function (specs, options) { return request === null || request === void 0 ? void 0 : request.onApply(specs, options); } }));
|
|
258
272
|
};
|
|
259
273
|
exports.SortRangeDialogHost = SortRangeDialogHost;
|
|
260
274
|
exports.SortRangeDialogHost.displayName = "SortRangeDialogHost";
|
|
@@ -33,6 +33,15 @@ export declare const getGalleryNamedCellStyles: (namedCellStyles: NamedCellStyle
|
|
|
33
33
|
/** CSS preview of a named style's format for the gallery swatch. */
|
|
34
34
|
export declare const getNamedCellStylePreview: (format: CellFormat | undefined, theme: SpreadsheetTheme) => React.CSSProperties;
|
|
35
35
|
export declare const getCellStyles: (theme: SpreadsheetTheme, currencySymbol?: string) => Map<string, StyleList[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Excel's built-in "Comma Style" / "Comma [0]" (numFmtId 43 / 41): accounting
|
|
38
|
+
* layout without a currency symbol — negatives in parentheses, zero as `-`,
|
|
39
|
+
* `_(`/`_)` padding so digits align. `-15` shows `(15.00)` in the cell's own
|
|
40
|
+
* colour; the `[Red]` parenthesised variants are separate built-ins (38/40)
|
|
41
|
+
* that the Format Cells dialog offers under Custom, not the toolbar style.
|
|
42
|
+
*/
|
|
43
|
+
export declare const PATTERN_COMMA_STYLE = "_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)";
|
|
44
|
+
export declare const PATTERN_COMMA_STYLE_ROUNDED = "_(* #,##0_);_(* (#,##0);_(* \"-\"??_);_(@_)";
|
|
36
45
|
export declare const CellStyleSelector: React.MemoExoticComponent<({ currency, locale, theme, selectedFormat, namedCellStyles, canAddCustomStyle, onChangeFormatting, onClearFormatting, }: CellStyleSelectorProps) => React.JSX.Element>;
|
|
37
46
|
export {};
|
|
38
47
|
//# sourceMappingURL=cell-style-selector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell-style-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/cell-style-selector.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAMrD,OAAO,KAAK,EACV,UAAU,EAEV,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAClD,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,UAAU,IAAI,CAC/C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;IAC3C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,qBAAqB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAClB,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,GAAG,aAAa,CAAC,MAAM,UAAU,CAAC,CAAC,KAClE,IAAI,CAAC;IACV,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,UAAU;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa;CAC5B,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,GACpC,iBAAiB,cAAc,EAAE,GAAG,IAAI,GAAG,SAAS,KACnD,KAAK,CAAC,cAAc,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAQ7C,CAAC;AAcJ,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,GACnC,QAAQ,UAAU,GAAG,SAAS,EAC9B,OAAO,gBAAgB,KACtB,KAAK,CAAC,aAqBR,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,OAAO,gBAAgB,EACvB,iBAAiB,MAAM,6BAgYxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,sJAUzB,sBAAsB,uBAsO1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"cell-style-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/cell-style-selector.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAMrD,OAAO,KAAK,EACV,UAAU,EAEV,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;AAClD,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,UAAU,IAAI,CAC/C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;AAEV,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,gBAAgB,CAAC;IACxB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;IAC3C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,qBAAqB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAClB,GAAG,IAAI,EAAE,UAAU,CAAC,cAAc,GAAG,aAAa,CAAC,MAAM,UAAU,CAAC,CAAC,KAClE,IAAI,CAAC;IACV,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,UAAU;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa;CAC5B,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,GACpC,iBAAiB,cAAc,EAAE,GAAG,IAAI,GAAG,SAAS,KACnD,KAAK,CAAC,cAAc,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAQ7C,CAAC;AAcJ,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,GACnC,QAAQ,UAAU,GAAG,SAAS,EAC9B,OAAO,gBAAgB,KACtB,KAAK,CAAC,aAqBR,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,OAAO,gBAAgB,EACvB,iBAAiB,MAAM,6BAgYxB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,sDAAoD,CAAC;AACrF,eAAO,MAAM,2BAA2B,gDAA8C,CAAC;AAEvF,eAAO,MAAM,iBAAiB,sJAUzB,sBAAsB,uBAsO1B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CellStyleSelector = exports.getCellStyles = exports.getNamedCellStylePreview = exports.getGalleryNamedCellStyles = void 0;
|
|
3
|
+
exports.CellStyleSelector = exports.PATTERN_COMMA_STYLE_ROUNDED = exports.PATTERN_COMMA_STYLE = exports.getCellStyles = exports.getNamedCellStylePreview = exports.getGalleryNamedCellStyles = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var icons_1 = require("@rowsncolumns/icons");
|
|
6
6
|
var icons_2 = require("@rowsncolumns/icons");
|
|
@@ -436,6 +436,15 @@ var getCellStyles = function (theme, currencySymbol) {
|
|
|
436
436
|
]);
|
|
437
437
|
};
|
|
438
438
|
exports.getCellStyles = getCellStyles;
|
|
439
|
+
/**
|
|
440
|
+
* Excel's built-in "Comma Style" / "Comma [0]" (numFmtId 43 / 41): accounting
|
|
441
|
+
* layout without a currency symbol — negatives in parentheses, zero as `-`,
|
|
442
|
+
* `_(`/`_)` padding so digits align. `-15` shows `(15.00)` in the cell's own
|
|
443
|
+
* colour; the `[Red]` parenthesised variants are separate built-ins (38/40)
|
|
444
|
+
* that the Format Cells dialog offers under Custom, not the toolbar style.
|
|
445
|
+
*/
|
|
446
|
+
exports.PATTERN_COMMA_STYLE = '_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)';
|
|
447
|
+
exports.PATTERN_COMMA_STYLE_ROUNDED = '_(* #,##0_);_(* (#,##0);_(* "-"??_);_(@_)';
|
|
439
448
|
exports.CellStyleSelector = (0, react_1.memo)(function (_a) {
|
|
440
449
|
var currency = _a.currency, locale = _a.locale, theme = _a.theme, selectedFormat = _a.selectedFormat, namedCellStyles = _a.namedCellStyles, _b = _a.canAddCustomStyle, canAddCustomStyle = _b === void 0 ? false : _b, onChangeFormatting = _a.onChangeFormatting, onClearFormatting = _a.onClearFormatting;
|
|
441
450
|
var colorIndexes = [4, 5, 6, 7, 8, 9];
|
|
@@ -451,14 +460,14 @@ exports.CellStyleSelector = (0, react_1.memo)(function (_a) {
|
|
|
451
460
|
"Comma",
|
|
452
461
|
{
|
|
453
462
|
type: "NUMBER",
|
|
454
|
-
pattern:
|
|
463
|
+
pattern: exports.PATTERN_COMMA_STYLE,
|
|
455
464
|
},
|
|
456
465
|
],
|
|
457
466
|
[
|
|
458
467
|
"Comma[0]",
|
|
459
468
|
{
|
|
460
469
|
type: "NUMBER",
|
|
461
|
-
pattern:
|
|
470
|
+
pattern: exports.PATTERN_COMMA_STYLE_ROUNDED,
|
|
462
471
|
},
|
|
463
472
|
],
|
|
464
473
|
[
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CellInterface, GridRange, SelectionArea } from "@rowsncolumns/grid";
|
|
2
2
|
import { Direction } from "@rowsncolumns/grid";
|
|
3
|
+
import type { Maybe } from "@rowsncolumns/utils";
|
|
3
4
|
import React from "react";
|
|
4
5
|
import type { TableView } from "../../types";
|
|
5
6
|
import type { SelectionAttributes } from "../canvas-grid/typings";
|
|
@@ -12,7 +13,32 @@ type MergeCellsSelectorProps = {
|
|
|
12
13
|
merges?: GridRange[] | null;
|
|
13
14
|
/** Tables of the workbook — a selection touching one on `sheetId` cannot be merged (Excel). */
|
|
14
15
|
tables?: TableView[] | null;
|
|
16
|
+
/**
|
|
17
|
+
* Cell value reader behind Excel's "Merging cells only keeps the upper-left value" warning.
|
|
18
|
+
* Defaults to the reader the grid publishes; the warning is skipped when neither is available.
|
|
19
|
+
*/
|
|
20
|
+
getFormattedValue?: (sheetId: number, rowIndex: number, columnIndex: number) => Maybe<string>;
|
|
15
21
|
};
|
|
16
|
-
|
|
22
|
+
/** Excel's wording for a merge that would drop cell values. */
|
|
23
|
+
export declare const MERGE_DISCARDS_VALUES_TITLE = "Merge cells";
|
|
24
|
+
export declare const MERGE_DISCARDS_VALUES_MESSAGE = "Merging cells only keeps the upper-left value and discards other values.";
|
|
25
|
+
/**
|
|
26
|
+
* The regions `onMergeCells` merges for a toolbar request: each row (merge
|
|
27
|
+
* horizontally), each column (merge vertically), every area of a multi-area
|
|
28
|
+
* selection, or the last selection as one block — the store action's own rules.
|
|
29
|
+
*/
|
|
30
|
+
export declare const mergeRegionsForSelection: (selections: SelectionArea[], direction?: Direction) => GridRange[];
|
|
31
|
+
/**
|
|
32
|
+
* Would this merge discard values? Excel warns when more than one cell of a
|
|
33
|
+
* merged block holds a value (the merge keeps only the upper-left one). A
|
|
34
|
+
* headless / programmatic merge never asks — this gate lives in the toolbar.
|
|
35
|
+
*/
|
|
36
|
+
export declare const mergeDiscardsValues: ({ sheetId, selections, direction, getFormattedValue, }: {
|
|
37
|
+
sheetId: number;
|
|
38
|
+
selections: SelectionArea[];
|
|
39
|
+
direction?: Direction;
|
|
40
|
+
getFormattedValue: (sheetId: number, rowIndex: number, columnIndex: number) => Maybe<string>;
|
|
41
|
+
}) => boolean;
|
|
42
|
+
export declare const MergeCellsSelector: ({ activeCell, selections, sheetId, merges, tables, onMerge, onUnMerge, getFormattedValue: getFormattedValueProp, }: MergeCellsSelectorProps) => React.JSX.Element;
|
|
17
43
|
export {};
|
|
18
44
|
//# sourceMappingURL=merge-cells-selector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-cells-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/merge-cells-selector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAkB,SAAS,EAAgB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-cells-selector.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/merge-cells-selector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,aAAa,EACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAkB,SAAS,EAAgB,MAAM,oBAAoB,CAAC;AAyB7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,KAAK,uBAAuB,GAAG;IAC7B,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CACL,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,EAChD,SAAS,CAAC,EAAE,SAAS,GACpB,IAAI,CAAC;IACR,SAAS,CACP,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAAE,GAC/C,IAAI,CAAC;IACR,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5B,+FAA+F;IAC/F,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,KAAK,CAAC,MAAM,CAAC,CAAC;CACpB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,2BAA2B,gBAAgB,CAAC;AACzD,eAAO,MAAM,6BAA6B,6EACkC,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,aAAa,EAAE,EAC3B,YAAY,SAAS,KACpB,SAAS,EAmBX,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,wDAKjC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,CACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,KAAK,CAAC,MAAM,CAAC,CAAC;CACpB,KAAG,OAcH,CAAC;AAIF,eAAO,MAAM,kBAAkB,GAAI,oHAShC,uBAAuB,sBA8IzB,CAAC"}
|
|
@@ -1,17 +1,101 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MergeCellsSelector = void 0;
|
|
3
|
+
exports.MergeCellsSelector = exports.mergeDiscardsValues = exports.mergeRegionsForSelection = exports.MERGE_DISCARDS_VALUES_MESSAGE = exports.MERGE_DISCARDS_VALUES_TITLE = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var grid_1 = require("@rowsncolumns/grid");
|
|
6
6
|
var icons_1 = require("@rowsncolumns/icons");
|
|
7
7
|
var ui_1 = require("@rowsncolumns/ui");
|
|
8
8
|
var ui_2 = require("@rowsncolumns/ui");
|
|
9
|
-
var react_1 = tslib_1.
|
|
9
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
10
10
|
var atoms_1 = require("../../atoms");
|
|
11
11
|
var config_1 = require("../../config");
|
|
12
|
+
/** Excel's wording for a merge that would drop cell values. */
|
|
13
|
+
exports.MERGE_DISCARDS_VALUES_TITLE = "Merge cells";
|
|
14
|
+
exports.MERGE_DISCARDS_VALUES_MESSAGE = "Merging cells only keeps the upper-left value and discards other values.";
|
|
15
|
+
/**
|
|
16
|
+
* The regions `onMergeCells` merges for a toolbar request: each row (merge
|
|
17
|
+
* horizontally), each column (merge vertically), every area of a multi-area
|
|
18
|
+
* selection, or the last selection as one block — the store action's own rules.
|
|
19
|
+
*/
|
|
20
|
+
var mergeRegionsForSelection = function (selections, direction) {
|
|
21
|
+
if (!selections.length)
|
|
22
|
+
return [];
|
|
23
|
+
var range = selections[selections.length - 1].range;
|
|
24
|
+
if (direction === grid_1.Direction.Right) {
|
|
25
|
+
var rows = [];
|
|
26
|
+
for (var r = range.startRowIndex; r <= range.endRowIndex; r++) {
|
|
27
|
+
rows.push(tslib_1.__assign(tslib_1.__assign({}, range), { startRowIndex: r, endRowIndex: r }));
|
|
28
|
+
}
|
|
29
|
+
return rows;
|
|
30
|
+
}
|
|
31
|
+
if (direction === grid_1.Direction.Down) {
|
|
32
|
+
var cols = [];
|
|
33
|
+
for (var c = range.startColumnIndex; c <= range.endColumnIndex; c++) {
|
|
34
|
+
cols.push(tslib_1.__assign(tslib_1.__assign({}, range), { startColumnIndex: c, endColumnIndex: c }));
|
|
35
|
+
}
|
|
36
|
+
return cols;
|
|
37
|
+
}
|
|
38
|
+
if (selections.length > 1)
|
|
39
|
+
return selections.map(function (sel) { return sel.range; });
|
|
40
|
+
return [range];
|
|
41
|
+
};
|
|
42
|
+
exports.mergeRegionsForSelection = mergeRegionsForSelection;
|
|
43
|
+
/**
|
|
44
|
+
* Would this merge discard values? Excel warns when more than one cell of a
|
|
45
|
+
* merged block holds a value (the merge keeps only the upper-left one). A
|
|
46
|
+
* headless / programmatic merge never asks — this gate lives in the toolbar.
|
|
47
|
+
*/
|
|
48
|
+
var mergeDiscardsValues = function (_a) {
|
|
49
|
+
var e_1, _b;
|
|
50
|
+
var sheetId = _a.sheetId, selections = _a.selections, direction = _a.direction, getFormattedValue = _a.getFormattedValue;
|
|
51
|
+
try {
|
|
52
|
+
for (var _c = tslib_1.__values((0, exports.mergeRegionsForSelection)(selections, direction)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
53
|
+
var region = _d.value;
|
|
54
|
+
var filled = 0;
|
|
55
|
+
for (var r = region.startRowIndex; r <= region.endRowIndex; r++) {
|
|
56
|
+
for (var c = region.startColumnIndex; c <= region.endColumnIndex; c++) {
|
|
57
|
+
var value = getFormattedValue(sheetId, r, c);
|
|
58
|
+
if (value !== null && value !== undefined && value !== "") {
|
|
59
|
+
filled++;
|
|
60
|
+
if (filled > 1)
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
68
|
+
finally {
|
|
69
|
+
try {
|
|
70
|
+
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
71
|
+
}
|
|
72
|
+
finally { if (e_1) throw e_1.error; }
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
};
|
|
76
|
+
exports.mergeDiscardsValues = mergeDiscardsValues;
|
|
12
77
|
var MergeCellsSelector = function (_a) {
|
|
13
|
-
var activeCell = _a.activeCell, _b = _a.selections, selections = _b === void 0 ? config_1.DEFAULT_ARRAY : _b, sheetId = _a.sheetId, merges = _a.merges, tables = _a.tables, onMerge = _a.onMerge, onUnMerge = _a.onUnMerge;
|
|
78
|
+
var activeCell = _a.activeCell, _b = _a.selections, selections = _b === void 0 ? config_1.DEFAULT_ARRAY : _b, sheetId = _a.sheetId, merges = _a.merges, tables = _a.tables, onMerge = _a.onMerge, onUnMerge = _a.onUnMerge, getFormattedValueProp = _a.getFormattedValue;
|
|
14
79
|
var focusSheet = (0, atoms_1.useFocusSheet)();
|
|
80
|
+
var gridGetFormattedValue = (0, atoms_1.useGetFormattedValue)();
|
|
81
|
+
var getFormattedValue = getFormattedValueProp !== null && getFormattedValueProp !== void 0 ? getFormattedValueProp : gridGetFormattedValue;
|
|
82
|
+
// A merge waiting on the "discards other values" confirmation.
|
|
83
|
+
var _c = tslib_1.__read((0, react_1.useState)(null), 2), pendingMerge = _c[0], setPendingMerge = _c[1];
|
|
84
|
+
var requestMerge = function (direction) {
|
|
85
|
+
if (getFormattedValue &&
|
|
86
|
+
(0, exports.mergeDiscardsValues)({ sheetId: sheetId, selections: selections, direction: direction, getFormattedValue: getFormattedValue })) {
|
|
87
|
+
setPendingMerge({ direction: direction });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
onMerge(sheetId, activeCell, selections, direction);
|
|
91
|
+
};
|
|
92
|
+
var confirmPendingMerge = function () {
|
|
93
|
+
if (pendingMerge) {
|
|
94
|
+
onMerge(sheetId, activeCell, selections, pendingMerge.direction);
|
|
95
|
+
}
|
|
96
|
+
setPendingMerge(null);
|
|
97
|
+
focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
|
|
98
|
+
};
|
|
15
99
|
var isMerged = !!(merges === null || merges === void 0 ? void 0 : merges.find(function (merge) {
|
|
16
100
|
return (0, grid_1.isEqualCells)({ rowIndex: merge.startRowIndex, columnIndex: merge.startColumnIndex }, activeCell);
|
|
17
101
|
}));
|
|
@@ -32,7 +116,7 @@ var MergeCellsSelector = function (_a) {
|
|
|
32
116
|
onUnMerge(sheetId, activeCell, selections);
|
|
33
117
|
}
|
|
34
118
|
else {
|
|
35
|
-
|
|
119
|
+
requestMerge();
|
|
36
120
|
}
|
|
37
121
|
}, isActive: isMerged, tooltip: isMerged ? "Unmerge All" : "Merge all", disabled: disableMenu },
|
|
38
122
|
react_1.default.createElement(icons_1.AiOutlineMergeCells, null)),
|
|
@@ -43,20 +127,34 @@ var MergeCellsSelector = function (_a) {
|
|
|
43
127
|
react_1.default.createElement(ui_1.DropdownMenuPortal, null,
|
|
44
128
|
react_1.default.createElement(ui_2.DropdownMenuContent, { align: "end" },
|
|
45
129
|
react_1.default.createElement(ui_2.DropdownMenuItem, { disabled: isMerged || selectionTouchesTable, onClick: function () {
|
|
46
|
-
|
|
130
|
+
requestMerge();
|
|
47
131
|
focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
|
|
48
132
|
} }, "Merge all"),
|
|
49
133
|
react_1.default.createElement(ui_2.DropdownMenuItem, { disabled: isMerged || selectionTouchesTable || !canMergeVertically, onClick: function () {
|
|
50
|
-
|
|
134
|
+
requestMerge(grid_1.Direction.Down);
|
|
51
135
|
focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
|
|
52
136
|
} }, "Merge vertically"),
|
|
53
137
|
react_1.default.createElement(ui_2.DropdownMenuItem, { onClick: function () {
|
|
54
|
-
|
|
138
|
+
requestMerge(grid_1.Direction.Right);
|
|
55
139
|
focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
|
|
56
140
|
}, disabled: isMerged || selectionTouchesTable || !canMergeHorizontally }, "Merge horizontally"),
|
|
57
141
|
react_1.default.createElement(ui_2.DropdownMenuItem, { disabled: !isMerged, onClick: function () {
|
|
58
142
|
onUnMerge(sheetId, activeCell, selections);
|
|
59
143
|
focusSheet === null || focusSheet === void 0 ? void 0 : focusSheet();
|
|
60
|
-
} }, "Unmerge"))))
|
|
144
|
+
} }, "Unmerge")))),
|
|
145
|
+
react_1.default.createElement(ui_1.Dialog, { modal: true, open: pendingMerge !== null, onOpenChange: function (open) {
|
|
146
|
+
if (!open)
|
|
147
|
+
setPendingMerge(null);
|
|
148
|
+
} },
|
|
149
|
+
react_1.default.createElement(ui_1.DialogContent, null,
|
|
150
|
+
react_1.default.createElement(ui_1.DialogTitle, null, exports.MERGE_DISCARDS_VALUES_TITLE),
|
|
151
|
+
react_1.default.createElement(ui_1.DialogDescription, null, exports.MERGE_DISCARDS_VALUES_MESSAGE),
|
|
152
|
+
react_1.default.createElement(ui_1.DialogBody, null,
|
|
153
|
+
react_1.default.createElement(ui_1.Stack, { className: "gap-2" },
|
|
154
|
+
react_1.default.createElement(ui_1.Button, { variant: "primary", onClick: confirmPendingMerge }, "Continue"),
|
|
155
|
+
react_1.default.createElement(ui_1.Button, { onClick: function () { return setPendingMerge(null); } }, "Cancel"))),
|
|
156
|
+
react_1.default.createElement(ui_1.DialogClose, { asChild: true },
|
|
157
|
+
react_1.default.createElement(ui_1.DialogCloseButton, null,
|
|
158
|
+
react_1.default.createElement(icons_1.Cross2Icon, null)))))));
|
|
61
159
|
};
|
|
62
160
|
exports.MergeCellsSelector = MergeCellsSelector;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { BandingProperties, CustomTableStyle, Maybe } from "../../types";
|
|
3
|
+
import type { SpreadsheetTheme } from "../canvas-grid/typings";
|
|
4
|
+
/**
|
|
5
|
+
* The style elements a custom table style can colour — the `rowProperties` fields the grid's
|
|
6
|
+
* banding resolves (`api/banded-ranges.ts`), in the order of Excel's New Table Style dialog.
|
|
7
|
+
* The first three are what the gallery swatches show and what every created style carries; the
|
|
8
|
+
* rest are only written when the user picks a colour for them.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TABLE_STYLE_ELEMENTS: readonly [{
|
|
11
|
+
readonly key: "header";
|
|
12
|
+
readonly label: "Header row";
|
|
13
|
+
readonly property: "headerColor";
|
|
14
|
+
}, {
|
|
15
|
+
readonly key: "firstBand";
|
|
16
|
+
readonly label: "First row stripe";
|
|
17
|
+
readonly property: "firstBandColor";
|
|
18
|
+
}, {
|
|
19
|
+
readonly key: "secondBand";
|
|
20
|
+
readonly label: "Second row stripe";
|
|
21
|
+
readonly property: "secondBandColor";
|
|
22
|
+
}, {
|
|
23
|
+
readonly key: "firstColumn";
|
|
24
|
+
readonly label: "First column";
|
|
25
|
+
readonly property: "firstColumnColor";
|
|
26
|
+
}, {
|
|
27
|
+
readonly key: "lastColumn";
|
|
28
|
+
readonly label: "Last column";
|
|
29
|
+
readonly property: "lastColumnColor";
|
|
30
|
+
}, {
|
|
31
|
+
readonly key: "totalRow";
|
|
32
|
+
readonly label: "Total row";
|
|
33
|
+
readonly property: "totalRowColor";
|
|
34
|
+
}];
|
|
35
|
+
export type TableStyleElementKey = (typeof TABLE_STYLE_ELEMENTS)[number]["key"];
|
|
36
|
+
/** The colour picked for each element; `undefined` leaves the element unpainted. */
|
|
37
|
+
export type TableStyleColors = Partial<Record<TableStyleElementKey, string>>;
|
|
38
|
+
/** The colours a fresh style starts from (the default palette's accent 1 and its light tint). */
|
|
39
|
+
export declare const DEFAULT_TABLE_STYLE_COLORS: TableStyleColors;
|
|
40
|
+
/**
|
|
41
|
+
* The banding a custom table style paints from its element colours. Header and the two stripes
|
|
42
|
+
* are always present (unset ones stay unpainted); the optional elements are written only when
|
|
43
|
+
* coloured, so a style that only picks the first three keeps its historical shape.
|
|
44
|
+
*/
|
|
45
|
+
export declare const buildCustomTableStyle: (name: string, colors: TableStyleColors) => CustomTableStyle;
|
|
46
|
+
/** The element colours of an existing custom style (theme colours resolved to hex). */
|
|
47
|
+
export declare const getTableStyleColors: (style: CustomTableStyle, theme: SpreadsheetTheme) => TableStyleColors;
|
|
48
|
+
/**
|
|
49
|
+
* Why a style name cannot be used, or `undefined` when it can: empty, a built-in style's name
|
|
50
|
+
* (the gallery tells the two apart by name), or another custom style's name (case-insensitive,
|
|
51
|
+
* like Excel). `currentName` is the style being edited, which may keep its own name.
|
|
52
|
+
*/
|
|
53
|
+
export declare const getTableStyleNameError: (name: string, existingNames: readonly string[], currentName?: string) => string | undefined;
|
|
54
|
+
export type TableStyleEditorProps = {
|
|
55
|
+
/** The custom style being modified; omit to create a new one. */
|
|
56
|
+
style?: CustomTableStyle;
|
|
57
|
+
/** The name a new style starts with (ignored when `style` is given). */
|
|
58
|
+
defaultName?: string;
|
|
59
|
+
theme: SpreadsheetTheme;
|
|
60
|
+
/** Names of the workbook's custom styles, for the duplicate-name check. */
|
|
61
|
+
existingNames?: readonly string[];
|
|
62
|
+
/** Create (or, when `style` is given, save) — receives the style the picks produce. */
|
|
63
|
+
onSubmit(style: CustomTableStyle): void;
|
|
64
|
+
onCancel(): void;
|
|
65
|
+
/** Offered as "Delete style" while editing; the footer omits it when absent. */
|
|
66
|
+
onDelete?(style: CustomTableStyle): void;
|
|
67
|
+
className?: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Excel's New Table Style / Modify Table Style dialog, laid out for the Format as Table gallery:
|
|
71
|
+
* name row, the table elements with a colour button each (the toolbar's colour popover), a live
|
|
72
|
+
* preview of the table the picks produce, and an Excel-ordered footer.
|
|
73
|
+
*/
|
|
74
|
+
export declare const TableStyleEditor: ({ style, defaultName, theme, existingNames, onSubmit, onCancel, onDelete, className, }: TableStyleEditorProps) => React.JSX.Element;
|
|
75
|
+
/**
|
|
76
|
+
* The table a style paints: a header row over four banded rows, with the first / last column and
|
|
77
|
+
* total row emphasis when the style colours them. Uses the grid's banding rules
|
|
78
|
+
* (`api/banded-ranges.ts`): the first body row is the first stripe, the last body row is the
|
|
79
|
+
* total row, and an edge column's colour outranks the stripe under it.
|
|
80
|
+
*/
|
|
81
|
+
export declare const TableStylePreviewCard: ({ rowProperties, theme, }: {
|
|
82
|
+
rowProperties: Maybe<BandingProperties>;
|
|
83
|
+
theme: SpreadsheetTheme;
|
|
84
|
+
}) => React.JSX.Element;
|
|
85
|
+
//# sourceMappingURL=table-style-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-style-editor.d.ts","sourceRoot":"","sources":["../../../../components/toolbar/table-style-editor.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAIxD,OAAO,KAAK,EACV,iBAAiB,EAEjB,gBAAgB,EAChB,KAAK,EACN,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;EAW/B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;AAEhF,oFAAoF;AACpF,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E,iGAAiG;AACjG,eAAO,MAAM,0BAA0B,EAAE,gBAIxC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,MAAM,EACZ,QAAQ,gBAAgB,KACvB,gBAUF,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,gBAAgB,EACvB,OAAO,gBAAgB,KACtB,gBAWF,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,MAAM,EACZ,eAAe,SAAS,MAAM,EAAE,EAChC,cAAc,MAAM,KACnB,MAAM,GAAG,SAaX,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,iEAAiE;IACjE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,gBAAgB,CAAC;IACxB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,uFAAuF;IACvF,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACxC,QAAQ,IAAI,IAAI,CAAC;IACjB,gFAAgF;IAChF,QAAQ,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,wFAS9B,qBAAqB,sBAuIvB,CAAC;AAkEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,2BAGnC;IACD,aAAa,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxC,KAAK,EAAE,gBAAgB,CAAC;CACzB,sBA2EA,CAAC"}
|