xiaodao-spreader 0.1.35 → 0.1.36
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/README.ZH.md +58 -1
- package/README.md +58 -1
- package/dist/style.css +1 -1
- package/dist/types/components/spreader/components/data-validation-input-message.vue.d.ts +6 -6
- package/dist/types/components/spreader/components/pickers/conditional-format-menu.vue.d.ts +1 -1
- package/dist/types/components/spreader/components/pickers/data-validation-alert.vue.d.ts +2 -2
- package/dist/types/components/spreader/components/pickers/data-validation-dialog.vue.d.ts +4 -4
- package/dist/types/components/spreader/components/pickers/data-validation-dropdown.vue.d.ts +7 -7
- package/dist/types/components/spreader/components/pickers/outline-picker.vue.d.ts +26 -0
- package/dist/types/components/spreader/components/spreader.vue.d.ts +9 -0
- package/dist/types/components/spreader/components/toolbar.vue.d.ts +6 -0
- package/dist/types/components/spreader/composables/core-state.d.ts +41 -1
- package/dist/types/components/spreader/composables/interactions.d.ts +10 -0
- package/dist/types/components/spreader/core/autofill.d.ts +11 -2
- package/dist/types/components/spreader/core/constants.d.ts +2 -0
- package/dist/types/components/spreader/core/outline-core.d.ts +64 -0
- package/dist/types/components/spreader/core/types.d.ts +24 -0
- package/dist/xiaodao-spreader.es.js +7896 -7127
- package/dist/xiaodao-spreader.umd.js +9 -9
- package/package.json +1 -1
|
@@ -47,6 +47,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
47
47
|
sortMenuOpen: boolean;
|
|
48
48
|
cachedSortOrder: import("@/components/spreader/core/sort-core.ts").SortOrder;
|
|
49
49
|
canSort: boolean;
|
|
50
|
+
outlineMenuOpen: boolean;
|
|
50
51
|
canFilter: boolean;
|
|
51
52
|
filterActive: boolean;
|
|
52
53
|
selHAlign: string;
|
|
@@ -103,12 +104,14 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
103
104
|
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
104
105
|
"onFreeze-change"?: ((v: string) => any) | undefined;
|
|
105
106
|
"onCf-preset"?: ((v: string) => any) | undefined;
|
|
107
|
+
"onOutline-action"?: ((v: string) => any) | undefined;
|
|
106
108
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
107
109
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
108
110
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
109
111
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
110
112
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
111
113
|
"onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
|
|
114
|
+
"onUpdate:outline-menu-open"?: ((v: boolean) => any) | undefined;
|
|
112
115
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
113
116
|
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
114
117
|
"onBorder-change"?: ((v: import("@/components/spreader/components/pickers/border-picker.vue").BorderType) => any) | undefined;
|
|
@@ -156,12 +159,14 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
156
159
|
"number-format-change": (v: string) => void;
|
|
157
160
|
"freeze-change": (v: string) => void;
|
|
158
161
|
"cf-preset": (v: string) => void;
|
|
162
|
+
"outline-action": (v: string) => void;
|
|
159
163
|
"font-size-keydown": (ev: KeyboardEvent) => void;
|
|
160
164
|
"update:font-size-menu-open": (v: boolean) => void;
|
|
161
165
|
"update:text-color-menu-open": (v: boolean) => void;
|
|
162
166
|
"update:fill-color-menu-open": (v: boolean) => void;
|
|
163
167
|
"update:border-menu-open": (v: boolean) => void;
|
|
164
168
|
"update:sort-menu-open": (v: boolean) => void;
|
|
169
|
+
"update:outline-menu-open": (v: boolean) => void;
|
|
165
170
|
"update:merge-menu-open": (v: boolean) => void;
|
|
166
171
|
"update:calc-menu-open": (v: boolean) => void;
|
|
167
172
|
"border-change": (v: import("@/components/spreader/components/pickers/border-picker.vue").BorderType) => void;
|
|
@@ -177,6 +182,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
177
182
|
mergeArrowRef: HTMLButtonElement;
|
|
178
183
|
calcArrowRef: HTMLButtonElement;
|
|
179
184
|
sortArrowRef: HTMLButtonElement;
|
|
185
|
+
outlineArrowRef: HTMLButtonElement;
|
|
180
186
|
moreBtnEl: HTMLButtonElement;
|
|
181
187
|
overflowMenuEl: HTMLDivElement;
|
|
182
188
|
}, any, import("vue").ComponentProvideOptions, {
|
|
@@ -213,6 +219,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
213
219
|
sortMenuOpen: boolean;
|
|
214
220
|
cachedSortOrder: import("@/components/spreader/core/sort-core.ts").SortOrder;
|
|
215
221
|
canSort: boolean;
|
|
222
|
+
outlineMenuOpen: boolean;
|
|
216
223
|
canFilter: boolean;
|
|
217
224
|
filterActive: boolean;
|
|
218
225
|
selHAlign: string;
|
|
@@ -269,12 +276,14 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
|
|
|
269
276
|
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
270
277
|
"onFreeze-change"?: ((v: string) => any) | undefined;
|
|
271
278
|
"onCf-preset"?: ((v: string) => any) | undefined;
|
|
279
|
+
"onOutline-action"?: ((v: string) => any) | undefined;
|
|
272
280
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
273
281
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
274
282
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
275
283
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
276
284
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
277
285
|
"onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
|
|
286
|
+
"onUpdate:outline-menu-open"?: ((v: boolean) => any) | undefined;
|
|
278
287
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
279
288
|
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
280
289
|
"onBorder-change"?: ((v: import("@/components/spreader/components/pickers/border-picker.vue").BorderType) => any) | undefined;
|
|
@@ -30,6 +30,7 @@ type __VLS_Props = {
|
|
|
30
30
|
sortMenuOpen: boolean;
|
|
31
31
|
cachedSortOrder: SortOrder;
|
|
32
32
|
canSort: boolean;
|
|
33
|
+
outlineMenuOpen: boolean;
|
|
33
34
|
/** 工具栏「筛选」按钮是否可用(单选合并单元格且无筛选态时禁用) */
|
|
34
35
|
canFilter: boolean;
|
|
35
36
|
/** 当前 worksheet 是否已启用筛选 */
|
|
@@ -93,12 +94,14 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
93
94
|
"number-format-change": (v: string) => void;
|
|
94
95
|
"freeze-change": (v: string) => void;
|
|
95
96
|
"cf-preset": (v: string) => void;
|
|
97
|
+
"outline-action": (v: string) => void;
|
|
96
98
|
"font-size-keydown": (ev: KeyboardEvent) => void;
|
|
97
99
|
"update:font-size-menu-open": (v: boolean) => void;
|
|
98
100
|
"update:text-color-menu-open": (v: boolean) => void;
|
|
99
101
|
"update:fill-color-menu-open": (v: boolean) => void;
|
|
100
102
|
"update:border-menu-open": (v: boolean) => void;
|
|
101
103
|
"update:sort-menu-open": (v: boolean) => void;
|
|
104
|
+
"update:outline-menu-open": (v: boolean) => void;
|
|
102
105
|
"update:merge-menu-open": (v: boolean) => void;
|
|
103
106
|
"update:calc-menu-open": (v: boolean) => void;
|
|
104
107
|
"border-change": (v: BorderType) => void;
|
|
@@ -144,12 +147,14 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
144
147
|
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
145
148
|
"onFreeze-change"?: ((v: string) => any) | undefined;
|
|
146
149
|
"onCf-preset"?: ((v: string) => any) | undefined;
|
|
150
|
+
"onOutline-action"?: ((v: string) => any) | undefined;
|
|
147
151
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
148
152
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
149
153
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
150
154
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
151
155
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
152
156
|
"onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
|
|
157
|
+
"onUpdate:outline-menu-open"?: ((v: boolean) => any) | undefined;
|
|
153
158
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
154
159
|
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
155
160
|
"onBorder-change"?: ((v: BorderType) => any) | undefined;
|
|
@@ -165,6 +170,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
|
165
170
|
mergeArrowRef: HTMLButtonElement;
|
|
166
171
|
calcArrowRef: HTMLButtonElement;
|
|
167
172
|
sortArrowRef: HTMLButtonElement;
|
|
173
|
+
outlineArrowRef: HTMLButtonElement;
|
|
168
174
|
moreBtnEl: HTMLButtonElement;
|
|
169
175
|
overflowMenuEl: HTMLDivElement;
|
|
170
176
|
}, any>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type ComputedRef, type Ref } from 'vue';
|
|
2
2
|
import { FormulaDeps } from '../core/formula';
|
|
3
|
-
import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion, SheetFilter, FilterColumn, ConditionalFormattingRule, ConditionalFormattingFormat, DataValidationRule, DataValidationResult, DataValidationSeverity } from '../core/types';
|
|
3
|
+
import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion, SheetFilter, FilterColumn, ConditionalFormattingRule, ConditionalFormattingFormat, DataValidationRule, DataValidationResult, DataValidationSeverity, DimensionOutline } from '../core/types';
|
|
4
4
|
import { type FilterCandidates } from '../core/filter-core';
|
|
5
|
+
import { type OutlineValidationResult } from '../core/outline-core';
|
|
5
6
|
/** 选区触发方式,影响「合并单元格是否扩大选区」。
|
|
6
7
|
* - 'cell':单元格点击/拖动(默认)→ 保持现有 expandSelectionForMerges 行为
|
|
7
8
|
* - 'row' :行头点击/拖动 → Excel 风格「穿透」合并,选区矩形保持用户点击的行范围
|
|
@@ -102,6 +103,45 @@ export interface CoreState {
|
|
|
102
103
|
getVisibleRowCount: () => number;
|
|
103
104
|
getVisibleRowAt: (index: number) => number;
|
|
104
105
|
getVisibleRowIndex: (row: number) => number;
|
|
106
|
+
/** 当前工作表行分组集合(稳定 ID,展开/折叠状态) */
|
|
107
|
+
getRowOutlines: () => DimensionOutline[];
|
|
108
|
+
/** 当前工作表列分组集合 */
|
|
109
|
+
getColumnOutlines: () => DimensionOutline[];
|
|
110
|
+
/** 在某组上创建分组;返回是否成功(失败给出提示码) */
|
|
111
|
+
addRowGroup: (start: number, end: number) => OutlineValidationResult;
|
|
112
|
+
addColumnGroup: (start: number, end: number) => OutlineValidationResult;
|
|
113
|
+
/** 取消组合:完整覆盖某个分组才允许 Ungroup,返回是否成功 */
|
|
114
|
+
removeOutline: (id: string) => boolean;
|
|
115
|
+
clearRowGroups: () => void;
|
|
116
|
+
clearColumnGroups: () => void;
|
|
117
|
+
clearAllOutlines: () => void;
|
|
118
|
+
/** 设置分组折叠状态(一次一个视图状态操作,不影响结构) */
|
|
119
|
+
setOutlineCollapsed: (id: string, collapsed: boolean, silent?: boolean) => void;
|
|
120
|
+
toggleOutline: (id: string) => void;
|
|
121
|
+
/** 当前最大分组层级(0 = 无分组) */
|
|
122
|
+
getOutlineLevel: (axis: 'row' | 'column') => number;
|
|
123
|
+
/** Outline gutter 总尺寸:无分组为 0;否则 = 等级控件条 + 层级数×单级宽度。axis='row' → 左侧 gutter 宽,axis='column' → 顶部 gutter 高 */
|
|
124
|
+
getOutlineGutterSize: (axis: 'row' | 'column') => number;
|
|
125
|
+
/** 逻辑行/列当前所处的分组层级(0 = 不在任何分组内) */
|
|
126
|
+
getRowOutlineLevel: (row: number) => number;
|
|
127
|
+
getColumnOutlineLevel: (col: number) => number;
|
|
128
|
+
/** 逻辑行/列当前是否被折叠分组隐藏 */
|
|
129
|
+
isRowCollapsed: (row: number) => boolean;
|
|
130
|
+
isColumnCollapsed: (col: number) => boolean;
|
|
131
|
+
/** 逻辑行列是否可见(Filter + Outline 组合) */
|
|
132
|
+
isRowVisible: (row: number) => boolean;
|
|
133
|
+
isColumnVisible: (col: number) => boolean;
|
|
134
|
+
/** 列是否隐藏(当前仅由列分组折叠决定) */
|
|
135
|
+
isColHidden: (col: number) => boolean;
|
|
136
|
+
/** 逻辑列宽(折叠列返回 0,供布局/命中测试使用) */
|
|
137
|
+
getColWidth: (c: number) => number;
|
|
138
|
+
/** outline 引擎注入:行列增删后的结构调整(由 sheets-ops 调用) */
|
|
139
|
+
adjustOutlinesForInsertRows: (index: number, count: number) => void;
|
|
140
|
+
adjustOutlinesForDeleteRows: (index: number, count: number) => void;
|
|
141
|
+
adjustOutlinesForInsertCols: (index: number, count: number) => void;
|
|
142
|
+
adjustOutlinesForDeleteCols: (index: number, count: number) => void;
|
|
143
|
+
/** 设置当前工作表的分组集合(加载/撤销恢复等受控场景;同时重算层级) */
|
|
144
|
+
syncOutlines: (rowOutlines: DimensionOutline[] | undefined, columnOutlines: DimensionOutline[] | undefined) => void;
|
|
105
145
|
/** 基于真实行高/列宽计算冻结区域尺寸 */
|
|
106
146
|
getFrozenMetrics: () => {
|
|
107
147
|
frozenRowsHeight: number;
|
|
@@ -83,6 +83,16 @@ export interface InteractionsState {
|
|
|
83
83
|
onDimBlur: () => void;
|
|
84
84
|
applyDimPanel: () => void;
|
|
85
85
|
closeDimPanel: () => void;
|
|
86
|
+
outlineGroupRows: () => boolean;
|
|
87
|
+
outlineGroupCols: () => boolean;
|
|
88
|
+
outlineUngroupRows: () => boolean;
|
|
89
|
+
outlineUngroupCols: () => boolean;
|
|
90
|
+
outlineExpandRows: () => void;
|
|
91
|
+
outlineCollapseRows: () => void;
|
|
92
|
+
outlineExpandCols: () => void;
|
|
93
|
+
outlineCollapseCols: () => void;
|
|
94
|
+
/** 分组校验提示:由宿主注入的应用内对话框;未注入时回退 window.alert */
|
|
95
|
+
showOutlineAlert?: (message: string) => void;
|
|
86
96
|
editInputStyle: ComputedRef<Record<string, string | number | undefined>>;
|
|
87
97
|
hScrollbarW: ComputedRef<number>;
|
|
88
98
|
vScrollbarH: ComputedRef<number>;
|
|
@@ -104,12 +104,21 @@ export declare function computeTargetRange(sourceRange: SelectionRange, draggedC
|
|
|
104
104
|
* 平移公式引用以适配目标单元格($ 绝对引用由 shiftFormulaRefs 处理)。
|
|
105
105
|
*/
|
|
106
106
|
export declare function translateFormulaForTarget(sourceFormula: string, sourceCell: CellCoord, targetCell: CellCoord, colCount: number, rowCount: number, colToLabelFn: (col: number) => string): string;
|
|
107
|
+
/** 合并兼容性校验结果:
|
|
108
|
+
* - 'ok':兼容;
|
|
109
|
+
* - 'source-overlap':源区域与某合并格部分相交(既非完全包含也非不相交);
|
|
110
|
+
* - 'target-merge-size':目标区域命中的合并格跨距不一致(对齐 Excel「要执行此操作,所有合并单元格必须大小相同」)。
|
|
111
|
+
*/
|
|
112
|
+
export type MergeCompatibilityResult = {
|
|
113
|
+
ok: boolean;
|
|
114
|
+
reason: 'ok' | 'source-overlap' | 'target-merge-size';
|
|
115
|
+
};
|
|
107
116
|
/**
|
|
108
117
|
* 校验源/目标区域与已有合并的兼容性:
|
|
109
118
|
* - 源区域不能与任何 merge 部分相交(要么完全包含,要么不相交);
|
|
110
|
-
* -
|
|
119
|
+
* - 目标区域与「未被源完全包含」的 merge 相交时,要求这些 merge 行/列跨距全部一致。
|
|
111
120
|
*/
|
|
112
|
-
export declare function validateMergeCompatibility(sourceRange: SelectionRange, targetRange: SelectionRange, merges: Record<string, SelectionRange>):
|
|
121
|
+
export declare function validateMergeCompatibility(sourceRange: SelectionRange, targetRange: SelectionRange, merges: Record<string, SelectionRange>): MergeCompatibilityResult;
|
|
113
122
|
/**
|
|
114
123
|
* 自动填充核心:根据源/目标区域与方向生成填充增量(纯函数,不 mutate sheet)。
|
|
115
124
|
* - down/right:正向延伸;up/left:反向延伸。
|
|
@@ -13,6 +13,8 @@ export declare const SCROLL_STEP = 50;
|
|
|
13
13
|
export declare const FILL_HANDLE_SIZE = 6;
|
|
14
14
|
export declare const FILL_HANDLE_HIT_PADDING = 4;
|
|
15
15
|
export declare const UNDO_MAX = 50;
|
|
16
|
+
export declare const OUTLINE_PANEL = 16;
|
|
17
|
+
export declare const OUTLINE_GUTTER = 15;
|
|
16
18
|
export declare const i18n: Record<string, Record<string, string>>;
|
|
17
19
|
export declare function t(locale: string, key: string): string;
|
|
18
20
|
export declare const DEFAULT_FONT_FAMILY = "-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Microsoft YaHei\", sans-serif";
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { DimensionOutline } from './types';
|
|
2
|
+
/** 分组校验失败的原因 */
|
|
3
|
+
export type OutlineValidationCode = 'outlineMinSize' | 'outlineCrossing' | 'outlineTooDeep' | 'outlineInvalid';
|
|
4
|
+
export interface OutlineValidationResult {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
code?: OutlineValidationCode;
|
|
7
|
+
/** 通过校验时,根据嵌套关系算出的层级(1 起) */
|
|
8
|
+
level?: number;
|
|
9
|
+
}
|
|
10
|
+
/** 范围内包含多少既有分组(严格包含该范围的组越多,层级越深) */
|
|
11
|
+
export declare function countContaining(outlines: DimensionOutline[], start: number, end: number): number;
|
|
12
|
+
/**
|
|
13
|
+
* 校验一个新分组(start/end 为 0-based 闭区间)是否可在既有分组集合上创建。
|
|
14
|
+
* 规则:
|
|
15
|
+
* - start <= end
|
|
16
|
+
* - 至少连续 2 个维度
|
|
17
|
+
* - 与既有分组要么不相交要么完全包含,禁止部分重叠
|
|
18
|
+
* - 层级(countContaining + 1)不超过 MAX_OUTLINE_LEVEL
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateGroup(existing: DimensionOutline[], start: number, end: number): OutlineValidationResult;
|
|
21
|
+
/** 创建分组后的新集合(校验失败返回原集合,同时给出校验结果供调用方提示) */
|
|
22
|
+
export declare function addOutline(existing: DimensionOutline[], axis: 'row' | 'column', start: number, end: number, id: string, opts?: {
|
|
23
|
+
collapsed?: boolean;
|
|
24
|
+
}): {
|
|
25
|
+
outlines: DimensionOutline[];
|
|
26
|
+
validation: OutlineValidationResult;
|
|
27
|
+
};
|
|
28
|
+
/** 设置某个分组的折叠状态 */
|
|
29
|
+
export declare function setOutlineCollapsed(outlines: DimensionOutline[], id: string, collapsed: boolean): DimensionOutline[];
|
|
30
|
+
/** 删除某个分组(返回新集合) */
|
|
31
|
+
export declare function removeOutline(outlines: DimensionOutline[], id: string): DimensionOutline[];
|
|
32
|
+
/** 清除全部(某方向)分组 */
|
|
33
|
+
export declare function clearOutlines(): DimensionOutline[];
|
|
34
|
+
/** 插入 count 个维度到 index 处后,调整既有分组范围(完全遵循 Range 插入语义) */
|
|
35
|
+
export declare function addOutlineForInsert(outlines: DimensionOutline[], index: number, count: number): DimensionOutline[];
|
|
36
|
+
/** 删除 [index, index+count-1] 这段维度后,调整既有分组;空组自动移除 */
|
|
37
|
+
export declare function addOutlineForDelete(outlines: DimensionOutline[], index: number, count: number): DimensionOutline[];
|
|
38
|
+
/**
|
|
39
|
+
* 根据嵌套关系重建每个分组的 level:
|
|
40
|
+
* level = (严格包含该分组的其它分组数量) + 1
|
|
41
|
+
* 注意:必须排除自身,否则每个分组都会被自己计数导致层级 +1。
|
|
42
|
+
*/
|
|
43
|
+
export declare function recomputeOutlineLevels(outlines: DimensionOutline[]): DimensionOutline[];
|
|
44
|
+
/**
|
|
45
|
+
* 维度可见性索引。
|
|
46
|
+
* - levels[i] : 维度 i 所处的 outline 层级(0 = 不在任何分组内)
|
|
47
|
+
* - hidden[i] : 维度 i 是否被某个「已折叠分组」包含(不可见)
|
|
48
|
+
* - maxLevel : 当前分组最深层级(≥1);无分组为 0
|
|
49
|
+
*/
|
|
50
|
+
export interface OutlineIndex {
|
|
51
|
+
levels: number[];
|
|
52
|
+
hidden: boolean[];
|
|
53
|
+
maxLevel: number;
|
|
54
|
+
}
|
|
55
|
+
/** 构建线性维度(行/列)的 outline 索引。count = 维度总数 */
|
|
56
|
+
export declare function buildOutlineIndex(outlines: DimensionOutline[], count: number): OutlineIndex;
|
|
57
|
+
/** 维度 i 所处的 outline 层级(无分组为 0) */
|
|
58
|
+
export declare function outlineLevelAt(outlines: DimensionOutline[], i: number): number;
|
|
59
|
+
/** 维度 i 是否被某个已折叠分组包含(不可见) */
|
|
60
|
+
export declare function isOutlineCollapsedAt(outlines: DimensionOutline[], i: number): boolean;
|
|
61
|
+
/** 是否已存在跨过该分组 cell 的既有分组(按 cell 命中) */
|
|
62
|
+
export declare function hasOutlineInRange(outlines: DimensionOutline[], start: number, end: number): boolean;
|
|
63
|
+
/** 生成稳定唯一分组 ID(避免与既有 ID 冲突) */
|
|
64
|
+
export declare function genOutlineId(existing: DimensionOutline[], axis: 'row' | 'column'): string;
|
|
@@ -252,6 +252,20 @@ export interface DataValidationResult {
|
|
|
252
252
|
title?: string;
|
|
253
253
|
message?: string;
|
|
254
254
|
}
|
|
255
|
+
/** 单个行列分组的最大支持层级(与 Excel 一致,最多 8 级) */
|
|
256
|
+
export declare const MAX_OUTLINE_LEVEL = 8;
|
|
257
|
+
/** 维度分组:属于 Sheet 的结构元数据。start/end 为 0-based 闭区间,且 start <= end */
|
|
258
|
+
export interface DimensionOutline {
|
|
259
|
+
/** 稳定唯一 ID(禁止数组 index) */
|
|
260
|
+
id: string;
|
|
261
|
+
axis: 'row' | 'column';
|
|
262
|
+
start: number;
|
|
263
|
+
end: number;
|
|
264
|
+
/** 由嵌套关系计算得到的层级(1 起),非用户手工输入 */
|
|
265
|
+
level: number;
|
|
266
|
+
/** 是否折叠(折叠时隐藏组内 Detail,逻辑行列仍存在) */
|
|
267
|
+
collapsed: boolean;
|
|
268
|
+
}
|
|
255
269
|
export interface SheetModelData {
|
|
256
270
|
name: string;
|
|
257
271
|
/** 表格级样式池:styles[0] 始终为默认空样式 {} */
|
|
@@ -278,6 +292,10 @@ export interface SheetModelData {
|
|
|
278
292
|
conditionalFormats?: ConditionalFormattingRule[];
|
|
279
293
|
/** 数据验证规则集合;旧数据缺省视为无数据验证 */
|
|
280
294
|
dataValidations?: DataValidationRule[];
|
|
295
|
+
/** 行分组集合;旧数据缺省视为无分组 */
|
|
296
|
+
rowOutlines?: DimensionOutline[];
|
|
297
|
+
/** 列分组集合;旧数据缺省视为无分组 */
|
|
298
|
+
columnOutlines?: DimensionOutline[];
|
|
281
299
|
}
|
|
282
300
|
export interface SheetState {
|
|
283
301
|
id: string;
|
|
@@ -306,6 +324,10 @@ export interface SheetState {
|
|
|
306
324
|
conditionalFormats: ConditionalFormattingRule[];
|
|
307
325
|
/** 数据验证规则集合;缺省为空数组 */
|
|
308
326
|
dataValidations: DataValidationRule[];
|
|
327
|
+
/** 行分组集合;缺省为空数组 */
|
|
328
|
+
rowOutlines: DimensionOutline[];
|
|
329
|
+
/** 列分组集合;缺省为空数组 */
|
|
330
|
+
columnOutlines: DimensionOutline[];
|
|
309
331
|
}
|
|
310
332
|
/** 视口区域:冻结窗格将画布划分为四个独立滚动区域 */
|
|
311
333
|
export interface ViewportRegion {
|
|
@@ -341,6 +363,8 @@ export interface ThemeColors {
|
|
|
341
363
|
gridLine: string;
|
|
342
364
|
selectionBg: string;
|
|
343
365
|
activeCellBorder: string;
|
|
366
|
+
outlineGroupBg1: string;
|
|
367
|
+
outlineGroupBg2: string;
|
|
344
368
|
cellText: string;
|
|
345
369
|
scrollTrack: string;
|
|
346
370
|
scrollThumb: string;
|