@visactor/vtable-sheet 1.20.0-alpha.0
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/cjs/components/vtable-sheet.d.ts +78 -0
- package/cjs/components/vtable-sheet.js +474 -0
- package/cjs/components/vtable-sheet.js.map +1 -0
- package/cjs/core/WorkSheet.d.ts +69 -0
- package/cjs/core/WorkSheet.js +298 -0
- package/cjs/core/WorkSheet.js.map +1 -0
- package/cjs/core/table-plugins.d.ts +3 -0
- package/cjs/core/table-plugins.js +171 -0
- package/cjs/core/table-plugins.js.map +1 -0
- package/cjs/event/event-manager.d.ts +29 -0
- package/cjs/event/event-manager.js +71 -0
- package/cjs/event/event-manager.js.map +1 -0
- package/cjs/event/event-target.d.ts +12 -0
- package/cjs/event/event-target.js +50 -0
- package/cjs/event/event-target.js.map +1 -0
- package/cjs/formula/cell-highlight-manager.d.ts +29 -0
- package/cjs/formula/cell-highlight-manager.js +141 -0
- package/cjs/formula/cell-highlight-manager.js.map +1 -0
- package/cjs/formula/formula-autocomplete.d.ts +39 -0
- package/cjs/formula/formula-autocomplete.js +239 -0
- package/cjs/formula/formula-autocomplete.js.map +1 -0
- package/cjs/formula/formula-editor.d.ts +21 -0
- package/cjs/formula/formula-editor.js +162 -0
- package/cjs/formula/formula-editor.js.map +1 -0
- package/cjs/formula/formula-helper.d.ts +8 -0
- package/cjs/formula/formula-helper.js +66 -0
- package/cjs/formula/formula-helper.js.map +1 -0
- package/cjs/formula/formula-range-selector.d.ts +19 -0
- package/cjs/formula/formula-range-selector.js +201 -0
- package/cjs/formula/formula-range-selector.js.map +1 -0
- package/cjs/formula/formula-throttle.d.ts +10 -0
- package/cjs/formula/formula-throttle.js +39 -0
- package/cjs/formula/formula-throttle.js.map +1 -0
- package/cjs/formula/formula-ui-manager.d.ts +19 -0
- package/cjs/formula/formula-ui-manager.js +226 -0
- package/cjs/formula/formula-ui-manager.js.map +1 -0
- package/cjs/formula/index.d.ts +5 -0
- package/cjs/formula/index.js +23 -0
- package/cjs/formula/index.js.map +1 -0
- package/cjs/index.d.ts +6 -0
- package/cjs/index.js +50 -0
- package/cjs/index.js.map +1 -0
- package/cjs/managers/formula-manager.d.ts +82 -0
- package/cjs/managers/formula-manager.js +445 -0
- package/cjs/managers/formula-manager.js.map +1 -0
- package/cjs/managers/menu-manager.d.ts +12 -0
- package/cjs/managers/menu-manager.js +89 -0
- package/cjs/managers/menu-manager.js.map +1 -0
- package/cjs/managers/sheet-manager.d.ts +21 -0
- package/cjs/managers/sheet-manager.js +74 -0
- package/cjs/managers/sheet-manager.js.map +1 -0
- package/cjs/managers/tab-drag-manager.d.ts +24 -0
- package/cjs/managers/tab-drag-manager.js +121 -0
- package/cjs/managers/tab-drag-manager.js.map +1 -0
- package/cjs/sheet-helper.d.ts +16 -0
- package/cjs/sheet-helper.js +64 -0
- package/cjs/sheet-helper.js.map +1 -0
- package/cjs/styles/common.d.ts +1 -0
- package/cjs/styles/common.js +17 -0
- package/cjs/styles/common.js.map +1 -0
- package/cjs/styles/formula-autocomplete.d.ts +1 -0
- package/cjs/styles/formula-autocomplete.js +17 -0
- package/cjs/styles/formula-autocomplete.js.map +1 -0
- package/cjs/styles/formula-bar.d.ts +1 -0
- package/cjs/styles/formula-bar.js +17 -0
- package/cjs/styles/formula-bar.js.map +1 -0
- package/cjs/styles/menu.d.ts +1 -0
- package/cjs/styles/menu.js +17 -0
- package/cjs/styles/menu.js.map +1 -0
- package/cjs/styles/sheet-tab.d.ts +1 -0
- package/cjs/styles/sheet-tab.js +17 -0
- package/cjs/styles/sheet-tab.js.map +1 -0
- package/cjs/styles/sheet.d.ts +1 -0
- package/cjs/styles/sheet.js +17 -0
- package/cjs/styles/sheet.js.map +1 -0
- package/cjs/styles/style-manager.d.ts +1 -0
- package/cjs/styles/style-manager.js +15 -0
- package/cjs/styles/style-manager.js.map +1 -0
- package/cjs/test/formula-complete.test.d.ts +1 -0
- package/cjs/test/formula-complete.test.js +42 -0
- package/cjs/test/formula-complete.test.js.map +1 -0
- package/cjs/tools/env.d.ts +20 -0
- package/cjs/tools/env.js +59 -0
- package/cjs/tools/env.js.map +1 -0
- package/cjs/tools/index.d.ts +3 -0
- package/cjs/tools/index.js +16 -0
- package/cjs/tools/index.js.map +1 -0
- package/cjs/tools/ui/snackbar.d.ts +1 -0
- package/cjs/tools/ui/snackbar.js +20 -0
- package/cjs/tools/ui/snackbar.js.map +1 -0
- package/cjs/ts-types/base.d.ts +44 -0
- package/cjs/ts-types/base.js +14 -0
- package/cjs/ts-types/base.js.map +1 -0
- package/cjs/ts-types/event.d.ts +79 -0
- package/cjs/ts-types/event.js +6 -0
- package/cjs/ts-types/event.js.map +1 -0
- package/cjs/ts-types/events.d.ts +1 -0
- package/cjs/ts-types/events.js +3 -0
- package/cjs/ts-types/events.js.map +1 -0
- package/cjs/ts-types/filter.d.ts +58 -0
- package/cjs/ts-types/filter.js +16 -0
- package/cjs/ts-types/filter.js.map +1 -0
- package/cjs/ts-types/formula.d.ts +51 -0
- package/cjs/ts-types/formula.js +6 -0
- package/cjs/ts-types/formula.js.map +1 -0
- package/cjs/ts-types/index.d.ts +67 -0
- package/cjs/ts-types/index.js +37 -0
- package/cjs/ts-types/index.js.map +1 -0
- package/cjs/ts-types/sheet.d.ts +45 -0
- package/cjs/ts-types/sheet.js +6 -0
- package/cjs/ts-types/sheet.js.map +1 -0
- package/cjs/vtable.d.ts +1 -0
- package/cjs/vtable.js +35 -0
- package/cjs/vtable.js.map +1 -0
- package/dist/vtable-sheet.js +114494 -0
- package/dist/vtable-sheet.min.js +853 -0
- package/es/components/vtable-sheet.d.ts +78 -0
- package/es/components/vtable-sheet.js +462 -0
- package/es/components/vtable-sheet.js.map +1 -0
- package/es/core/WorkSheet.d.ts +69 -0
- package/es/core/WorkSheet.js +298 -0
- package/es/core/WorkSheet.js.map +1 -0
- package/es/core/table-plugins.d.ts +3 -0
- package/es/core/table-plugins.js +164 -0
- package/es/core/table-plugins.js.map +1 -0
- package/es/event/event-manager.d.ts +29 -0
- package/es/event/event-manager.js +63 -0
- package/es/event/event-manager.js.map +1 -0
- package/es/event/event-target.d.ts +12 -0
- package/es/event/event-target.js +42 -0
- package/es/event/event-target.js.map +1 -0
- package/es/formula/cell-highlight-manager.d.ts +29 -0
- package/es/formula/cell-highlight-manager.js +133 -0
- package/es/formula/cell-highlight-manager.js.map +1 -0
- package/es/formula/formula-autocomplete.d.ts +39 -0
- package/es/formula/formula-autocomplete.js +231 -0
- package/es/formula/formula-autocomplete.js.map +1 -0
- package/es/formula/formula-editor.d.ts +21 -0
- package/es/formula/formula-editor.js +135 -0
- package/es/formula/formula-editor.js.map +1 -0
- package/es/formula/formula-helper.d.ts +8 -0
- package/es/formula/formula-helper.js +60 -0
- package/es/formula/formula-helper.js.map +1 -0
- package/es/formula/formula-range-selector.d.ts +19 -0
- package/es/formula/formula-range-selector.js +195 -0
- package/es/formula/formula-range-selector.js.map +1 -0
- package/es/formula/formula-throttle.d.ts +10 -0
- package/es/formula/formula-throttle.js +31 -0
- package/es/formula/formula-throttle.js.map +1 -0
- package/es/formula/formula-ui-manager.d.ts +19 -0
- package/es/formula/formula-ui-manager.js +218 -0
- package/es/formula/formula-ui-manager.js.map +1 -0
- package/es/formula/index.d.ts +5 -0
- package/es/formula/index.js +10 -0
- package/es/formula/index.js.map +1 -0
- package/es/index.d.ts +6 -0
- package/es/index.js +13 -0
- package/es/index.js.map +1 -0
- package/es/managers/formula-manager.d.ts +82 -0
- package/es/managers/formula-manager.js +441 -0
- package/es/managers/formula-manager.js.map +1 -0
- package/es/managers/menu-manager.d.ts +12 -0
- package/es/managers/menu-manager.js +81 -0
- package/es/managers/menu-manager.js.map +1 -0
- package/es/managers/sheet-manager.d.ts +21 -0
- package/es/managers/sheet-manager.js +66 -0
- package/es/managers/sheet-manager.js.map +1 -0
- package/es/managers/tab-drag-manager.d.ts +24 -0
- package/es/managers/tab-drag-manager.js +113 -0
- package/es/managers/tab-drag-manager.js.map +1 -0
- package/es/sheet-helper.d.ts +16 -0
- package/es/sheet-helper.js +54 -0
- package/es/sheet-helper.js.map +1 -0
- package/es/styles/common.d.ts +1 -0
- package/es/styles/common.js +9 -0
- package/es/styles/common.js.map +1 -0
- package/es/styles/formula-autocomplete.d.ts +1 -0
- package/es/styles/formula-autocomplete.js +9 -0
- package/es/styles/formula-autocomplete.js.map +1 -0
- package/es/styles/formula-bar.d.ts +1 -0
- package/es/styles/formula-bar.js +9 -0
- package/es/styles/formula-bar.js.map +1 -0
- package/es/styles/menu.d.ts +1 -0
- package/es/styles/menu.js +9 -0
- package/es/styles/menu.js.map +1 -0
- package/es/styles/sheet-tab.d.ts +1 -0
- package/es/styles/sheet-tab.js +9 -0
- package/es/styles/sheet-tab.js.map +1 -0
- package/es/styles/sheet.d.ts +1 -0
- package/es/styles/sheet.js +9 -0
- package/es/styles/sheet.js.map +1 -0
- package/es/styles/style-manager.d.ts +1 -0
- package/es/styles/style-manager.js +17 -0
- package/es/styles/style-manager.js.map +1 -0
- package/es/test/formula-complete.test.d.ts +1 -0
- package/es/test/formula-complete.test.js +36 -0
- package/es/test/formula-complete.test.js.map +1 -0
- package/es/tools/env.d.ts +20 -0
- package/es/tools/env.js +53 -0
- package/es/tools/env.js.map +1 -0
- package/es/tools/index.d.ts +3 -0
- package/es/tools/index.js +9 -0
- package/es/tools/index.js.map +1 -0
- package/es/tools/ui/snackbar.d.ts +1 -0
- package/es/tools/ui/snackbar.js +14 -0
- package/es/tools/ui/snackbar.js.map +1 -0
- package/es/ts-types/base.d.ts +44 -0
- package/es/ts-types/base.js +14 -0
- package/es/ts-types/base.js.map +1 -0
- package/es/ts-types/event.d.ts +79 -0
- package/es/ts-types/event.js +2 -0
- package/es/ts-types/event.js.map +1 -0
- package/es/ts-types/events.d.ts +1 -0
- package/es/ts-types/events.js +3 -0
- package/es/ts-types/events.js.map +1 -0
- package/es/ts-types/filter.d.ts +58 -0
- package/es/ts-types/filter.js +16 -0
- package/es/ts-types/filter.js.map +1 -0
- package/es/ts-types/formula.d.ts +51 -0
- package/es/ts-types/formula.js +2 -0
- package/es/ts-types/formula.js.map +1 -0
- package/es/ts-types/index.d.ts +67 -0
- package/es/ts-types/index.js +14 -0
- package/es/ts-types/index.js.map +1 -0
- package/es/ts-types/sheet.d.ts +45 -0
- package/es/ts-types/sheet.js +2 -0
- package/es/ts-types/sheet.js.map +1 -0
- package/es/vtable.d.ts +1 -0
- package/es/vtable.js +2 -0
- package/es/vtable.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.getTablePlugins = void 0;
|
|
6
|
+
|
|
7
|
+
const vtable_plugins_1 = require("@visactor/vtable-plugins"), vutils_1 = require("@visactor/vutils");
|
|
8
|
+
|
|
9
|
+
function getTablePlugins(sheetDefine, options) {
|
|
10
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
11
|
+
const plugins = [], disabledPlugins = null === (_a = null == options ? void 0 : options.VTablePluginModules) || void 0 === _a ? void 0 : _a.filter((module => module.disabled)), enabledPlugins = null === (_b = null == options ? void 0 : options.VTablePluginModules) || void 0 === _b ? void 0 : _b.filter((module => !module.disabled));
|
|
12
|
+
if (!(null == disabledPlugins ? void 0 : disabledPlugins.some((module => module.module === vtable_plugins_1.FilterPlugin)))) {
|
|
13
|
+
const filterPlugin = createFilterPlugin(sheetDefine, null === (_c = null == enabledPlugins ? void 0 : enabledPlugins.find((module => module.module === vtable_plugins_1.FilterPlugin))) || void 0 === _c ? void 0 : _c.moduleOptions);
|
|
14
|
+
plugins.push(filterPlugin);
|
|
15
|
+
}
|
|
16
|
+
if (!(null == disabledPlugins ? void 0 : disabledPlugins.some((module => module.module === vtable_plugins_1.AddRowColumnPlugin)))) {
|
|
17
|
+
const userPluginOptions = null === (_d = null == enabledPlugins ? void 0 : enabledPlugins.find((module => module.module === vtable_plugins_1.AddRowColumnPlugin))) || void 0 === _d ? void 0 : _d.moduleOptions, addRowColumnPlugin = new vtable_plugins_1.AddRowColumnPlugin(Object.assign({
|
|
18
|
+
addRowCallback: (row, tableInstance) => {
|
|
19
|
+
tableInstance.addRecord([], row - tableInstance.columnHeaderLevelCount);
|
|
20
|
+
}
|
|
21
|
+
}, userPluginOptions));
|
|
22
|
+
plugins.push(addRowColumnPlugin);
|
|
23
|
+
}
|
|
24
|
+
if (!(null == disabledPlugins ? void 0 : disabledPlugins.some((module => module.module === vtable_plugins_1.TableSeriesNumber)))) {
|
|
25
|
+
const userPluginOptions = null === (_e = null == enabledPlugins ? void 0 : enabledPlugins.find((module => module.module === vtable_plugins_1.TableSeriesNumber))) || void 0 === _e ? void 0 : _e.moduleOptions, tableSeriesNumberPlugin = new vtable_plugins_1.TableSeriesNumber(Object.assign({
|
|
26
|
+
rowCount: (null == sheetDefine ? void 0 : sheetDefine.rowCount) || 100,
|
|
27
|
+
colCount: (null == sheetDefine ? void 0 : sheetDefine.columnCount) || 100,
|
|
28
|
+
rowSeriesNumberWidth: 30,
|
|
29
|
+
colSeriesNumberHeight: 30,
|
|
30
|
+
rowSeriesNumberCellStyle: (null === (_f = null == sheetDefine ? void 0 : sheetDefine.theme) || void 0 === _f ? void 0 : _f.rowSeriesNumberCellStyle) || (null === (_g = null == options ? void 0 : options.theme) || void 0 === _g ? void 0 : _g.rowSeriesNumberCellStyle),
|
|
31
|
+
colSeriesNumberCellStyle: (null === (_h = null == sheetDefine ? void 0 : sheetDefine.theme) || void 0 === _h ? void 0 : _h.colSeriesNumberCellStyle) || (null === (_j = null == options ? void 0 : options.theme) || void 0 === _j ? void 0 : _j.colSeriesNumberCellStyle)
|
|
32
|
+
}, userPluginOptions));
|
|
33
|
+
plugins.push(tableSeriesNumberPlugin);
|
|
34
|
+
}
|
|
35
|
+
if (!(null == disabledPlugins ? void 0 : disabledPlugins.some((module => module.module === vtable_plugins_1.ContextMenuPlugin)))) {
|
|
36
|
+
const contextMenuPlugin = createContextMenuItems(sheetDefine, null === (_k = null == enabledPlugins ? void 0 : enabledPlugins.find((module => module.module === vtable_plugins_1.ContextMenuPlugin))) || void 0 === _k ? void 0 : _k.moduleOptions);
|
|
37
|
+
plugins.push(contextMenuPlugin);
|
|
38
|
+
}
|
|
39
|
+
if (!(null == disabledPlugins ? void 0 : disabledPlugins.some((module => module.module === vtable_plugins_1.ExcelEditCellKeyboardPlugin)))) {
|
|
40
|
+
const userPluginOptions = null === (_l = null == enabledPlugins ? void 0 : enabledPlugins.find((module => module.module === vtable_plugins_1.ExcelEditCellKeyboardPlugin))) || void 0 === _l ? void 0 : _l.moduleOptions, excelEditCellKeyboardPlugin = new vtable_plugins_1.ExcelEditCellKeyboardPlugin(userPluginOptions);
|
|
41
|
+
plugins.push(excelEditCellKeyboardPlugin);
|
|
42
|
+
}
|
|
43
|
+
if (!(null == disabledPlugins ? void 0 : disabledPlugins.some((module => module.module === vtable_plugins_1.AutoFillPlugin)))) {
|
|
44
|
+
const autoFillPlugin = new vtable_plugins_1.AutoFillPlugin;
|
|
45
|
+
plugins.push(autoFillPlugin);
|
|
46
|
+
}
|
|
47
|
+
return (null == options ? void 0 : options.VTablePluginModules) && options.VTablePluginModules.forEach((module => {
|
|
48
|
+
if ("function" != typeof module.module) throw new Error(`Invalid plugin: ${module.module}`);
|
|
49
|
+
plugins.push(new module.module(module.moduleOptions));
|
|
50
|
+
})), plugins;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function createFilterPlugin(sheetDefine, userPluginOptions) {
|
|
54
|
+
return new vtable_plugins_1.FilterPlugin(Object.assign({
|
|
55
|
+
enableFilter: createColumnFilterChecker(sheetDefine)
|
|
56
|
+
}, userPluginOptions));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function createColumnFilterChecker(sheetDefine) {
|
|
60
|
+
return (columnIndex, column) => {
|
|
61
|
+
var _a;
|
|
62
|
+
if (columnIndex < 0 || !sheetDefine.columns || columnIndex >= sheetDefine.columns.length) return !1;
|
|
63
|
+
const columnDefine = sheetDefine.columns[columnIndex];
|
|
64
|
+
return !!(null !== (_a = null == columnDefine ? void 0 : columnDefine.filter) && void 0 !== _a ? _a : sheetDefine.filter);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function createContextMenuItems(sheetDefine, userPluginOptions) {
|
|
69
|
+
return new vtable_plugins_1.ContextMenuPlugin(Object.assign({
|
|
70
|
+
headerCellMenuItems: [ ...vtable_plugins_1.DEFAULT_HEADER_MENU_ITEMS, {
|
|
71
|
+
text: "设置筛选器",
|
|
72
|
+
menuKey: "set_filter"
|
|
73
|
+
}, {
|
|
74
|
+
text: "取消筛选器",
|
|
75
|
+
menuKey: "cancel_filter"
|
|
76
|
+
}, {
|
|
77
|
+
text: "首行表头",
|
|
78
|
+
menuKey: "enable_first_row_as_header"
|
|
79
|
+
}, {
|
|
80
|
+
text: "取消表头",
|
|
81
|
+
menuKey: "disable_first_row_as_header"
|
|
82
|
+
} ],
|
|
83
|
+
bodyCellMenuItems: [ ...vtable_plugins_1.DEFAULT_BODY_MENU_ITEMS, {
|
|
84
|
+
text: "启用首行表头",
|
|
85
|
+
menuKey: "enable_first_row_as_header"
|
|
86
|
+
} ],
|
|
87
|
+
columnSeriesNumberMenuItems: [ ...vtable_plugins_1.DEFAULT_COLUMN_SERIES_MENU_ITEMS, {
|
|
88
|
+
text: "首行表头",
|
|
89
|
+
menuKey: "enable_first_row_as_header"
|
|
90
|
+
}, {
|
|
91
|
+
text: "取消表头",
|
|
92
|
+
menuKey: "disable_first_row_as_header"
|
|
93
|
+
} ],
|
|
94
|
+
beforeShowAdjustMenuItems: (menuItems, table, col, row) => {
|
|
95
|
+
var _a;
|
|
96
|
+
let isColumnSeriesNumber = !1, isHeaderCell = !1, isBodyCell = !1;
|
|
97
|
+
if ((0, vutils_1.isValid)(row) || (isColumnSeriesNumber = !0), (0, vutils_1.isValid)(col) && (0,
|
|
98
|
+
vutils_1.isValid)(row) && (table.isHeader(col, row) ? isHeaderCell = !0 : isBodyCell = !0),
|
|
99
|
+
isHeaderCell) {
|
|
100
|
+
menuItems = (null !== (_a = table.options.columns[col].filter) && void 0 !== _a ? _a : null == sheetDefine ? void 0 : sheetDefine.filter) ? menuItems.filter((item => "string" == typeof item || "set_filter" !== item.menuKey)) : menuItems.filter((item => "string" == typeof item || "cancel_filter" !== item.menuKey));
|
|
101
|
+
}
|
|
102
|
+
return isHeaderCell ? menuItems = menuItems.filter((item => "string" == typeof item || "enable_first_row_as_header" !== item.menuKey)) : isBodyCell ? menuItems = 0 === row ? menuItems.filter((item => "string" == typeof item || "disable_first_row_as_header" !== item.menuKey)) : menuItems.filter((item => "string" == typeof item || "enable_first_row_as_header" !== item.menuKey)) : isColumnSeriesNumber && (menuItems = table.isHeader(col, 0) ? menuItems.filter((item => "string" == typeof item || "enable_first_row_as_header" !== item.menuKey)) : menuItems.filter((item => "string" == typeof item || "disable_first_row_as_header" !== item.menuKey))),
|
|
103
|
+
menuItems;
|
|
104
|
+
},
|
|
105
|
+
menuClickCallback: {
|
|
106
|
+
set_filter: (args, table) => {
|
|
107
|
+
sheetDefine.columns[args.colIndex].filter = !0;
|
|
108
|
+
const newOptions = Object.assign(Object.assign({}, table.options), {
|
|
109
|
+
columns: table.options.columns.map(((col, index) => index === args.colIndex ? Object.assign(Object.assign({}, col), {
|
|
110
|
+
filter: !0
|
|
111
|
+
}) : col))
|
|
112
|
+
});
|
|
113
|
+
table.updateOption(newOptions, {
|
|
114
|
+
clearColWidthCache: !1,
|
|
115
|
+
clearRowHeightCache: !1
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
cancel_filter: (args, table) => {
|
|
119
|
+
sheetDefine.columns[args.colIndex].filter = !1;
|
|
120
|
+
const newOptions = Object.assign(Object.assign({}, table.options), {
|
|
121
|
+
columns: table.options.columns.map(((col, index) => index === args.colIndex ? Object.assign(Object.assign({}, col), {
|
|
122
|
+
filter: !1
|
|
123
|
+
}) : col))
|
|
124
|
+
});
|
|
125
|
+
table.updateOption(newOptions, {
|
|
126
|
+
clearColWidthCache: !1,
|
|
127
|
+
clearRowHeightCache: !1
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
enable_first_row_as_header: (args, table) => {
|
|
131
|
+
handleEnableFirstRowAsHeader(table);
|
|
132
|
+
},
|
|
133
|
+
disable_first_row_as_header: (args, table) => {
|
|
134
|
+
handleDisableFirstRowAsHeader(table);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}, userPluginOptions));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function handleEnableFirstRowAsHeader(table) {
|
|
141
|
+
const firstRecord = table.records[0], new_records = table.records.slice(1), columns = table.columns;
|
|
142
|
+
firstRecord.forEach(((item, index) => {
|
|
143
|
+
columns[index].title = item;
|
|
144
|
+
})), table.updateOption(Object.assign({}, table.options, {
|
|
145
|
+
records: new_records,
|
|
146
|
+
columns: columns,
|
|
147
|
+
showHeader: !0
|
|
148
|
+
}), {
|
|
149
|
+
clearColWidthCache: !1,
|
|
150
|
+
clearRowHeightCache: !1
|
|
151
|
+
}), table.scenegraph.updateNextFrame();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function handleDisableFirstRowAsHeader(table) {
|
|
155
|
+
const columns = table.columns, firstRecord = [];
|
|
156
|
+
columns.forEach(((col, index) => {
|
|
157
|
+
firstRecord.push(col.title);
|
|
158
|
+
}));
|
|
159
|
+
const new_records = [ firstRecord, ...table.records ];
|
|
160
|
+
table.updateOption(Object.assign({}, table.options, {
|
|
161
|
+
records: new_records,
|
|
162
|
+
columns: columns,
|
|
163
|
+
showHeader: !1
|
|
164
|
+
}), {
|
|
165
|
+
clearColWidthCache: !1,
|
|
166
|
+
clearRowHeightCache: !1
|
|
167
|
+
}), table.scenegraph.updateNextFrame();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
//# sourceMappingURL=table-plugins.js.map
|
|
171
|
+
exports.getTablePlugins = getTablePlugins;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/table-plugins.ts"],"names":[],"mappings":"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","file":"table-plugins.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\nimport {\n FilterPlugin,\n AddRowColumnPlugin,\n TableSeriesNumber,\n HighlightHeaderWhenSelectCellPlugin,\n ContextMenuPlugin,\n ExcelEditCellKeyboardPlugin,\n AutoFillPlugin,\n DEFAULT_HEADER_MENU_ITEMS,\n DEFAULT_BODY_MENU_ITEMS,\n DEFAULT_COLUMN_SERIES_MENU_ITEMS\n} from '@visactor/vtable-plugins';\nimport type {\n FilterOptions,\n MenuItemOrSeparator,\n MenuClickEventArgs,\n AddRowColumnOptions,\n TableSeriesNumberOptions,\n IHighlightHeaderWhenSelectCellPluginOptions,\n ContextMenuOptions\n} from '@visactor/vtable-plugins';\nimport type { ISheetDefine, IColumnDefine, IVTableSheetOptions } from '../ts-types';\nimport { isValid } from '@visactor/vutils';\n\n/**\n * 获取表格插件列表\n * @param sheetDefine Sheet配置定义\n * @returns 插件数组\n */\nexport function getTablePlugins(\n sheetDefine?: ISheetDefine,\n options?: IVTableSheetOptions\n): VTable.plugins.IVTablePlugin[] {\n const plugins: VTable.plugins.IVTablePlugin[] = [];\n // 结合options.VTablePluginModules,来判断是否禁用插件\n const disabledPlugins = options?.VTablePluginModules?.filter(module => module.disabled);\n const enabledPlugins = options?.VTablePluginModules?.filter(module => !module.disabled);\n if (!disabledPlugins?.some(module => module.module === FilterPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === FilterPlugin)\n ?.moduleOptions as FilterOptions;\n const filterPlugin = createFilterPlugin(sheetDefine, userPluginOptions);\n plugins.push(filterPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === AddRowColumnPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === AddRowColumnPlugin)\n ?.moduleOptions as AddRowColumnOptions;\n const addRowColumnPlugin = new AddRowColumnPlugin({\n addRowCallback: (row: number, tableInstance: VTable.ListTable) => {\n tableInstance.addRecord([], row - tableInstance.columnHeaderLevelCount);\n },\n ...userPluginOptions\n });\n plugins.push(addRowColumnPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === TableSeriesNumber)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === TableSeriesNumber)\n ?.moduleOptions as TableSeriesNumberOptions;\n const tableSeriesNumberPlugin = new TableSeriesNumber({\n rowCount: sheetDefine?.rowCount || 100,\n colCount: sheetDefine?.columnCount || 100,\n rowSeriesNumberWidth: 30,\n colSeriesNumberHeight: 30,\n rowSeriesNumberCellStyle:\n sheetDefine?.theme?.rowSeriesNumberCellStyle || options?.theme?.rowSeriesNumberCellStyle,\n colSeriesNumberCellStyle:\n sheetDefine?.theme?.colSeriesNumberCellStyle || options?.theme?.colSeriesNumberCellStyle,\n ...userPluginOptions\n });\n plugins.push(tableSeriesNumberPlugin);\n }\n // 这个插件有个bug 先不启用 #4447\n // if (!disabledPlugins?.some(module => module.module === HighlightHeaderWhenSelectCellPlugin)) {\n // const userPluginOptions = enabledPlugins?.find(module => module.module === HighlightHeaderWhenSelectCellPlugin)\n // ?.moduleOptions as IHighlightHeaderWhenSelectCellPluginOptions;\n // const highlightHeaderWhenSelectCellPlugin = new HighlightHeaderWhenSelectCellPlugin({\n // colHighlight: true,\n // rowHighlight: true,\n // ...userPluginOptions\n // });\n // plugins.push(highlightHeaderWhenSelectCellPlugin); // 这个插件有个bug 先不启用 #4447\n // }\n if (!disabledPlugins?.some(module => module.module === ContextMenuPlugin)) {\n const userPluginOptions = enabledPlugins?.find(module => module.module === ContextMenuPlugin)?.moduleOptions;\n const contextMenuPlugin = createContextMenuItems(sheetDefine, userPluginOptions);\n plugins.push(contextMenuPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === ExcelEditCellKeyboardPlugin)) {\n const userPluginOptions = enabledPlugins?.find(\n module => module.module === ExcelEditCellKeyboardPlugin\n )?.moduleOptions;\n const excelEditCellKeyboardPlugin = new ExcelEditCellKeyboardPlugin(userPluginOptions);\n plugins.push(excelEditCellKeyboardPlugin);\n }\n if (!disabledPlugins?.some(module => module.module === AutoFillPlugin)) {\n // const userPluginOptions = enabledPlugins?.find(\n // module => module.module === VTablePlugins.AutoFillPlugin\n // )?.moduleOptions;\n const autoFillPlugin = new AutoFillPlugin();\n plugins.push(autoFillPlugin);\n }\n if (options?.VTablePluginModules) {\n options.VTablePluginModules.forEach(\n (module: { module: new (options: any) => VTable.plugins.IVTablePlugin; moduleOptions: any }) => {\n if (typeof module.module === 'function') {\n // 检查是否为构造函数\n plugins.push(new module.module(module.moduleOptions));\n } else {\n throw new Error(`Invalid plugin: ${module.module}`);\n }\n }\n );\n }\n return plugins;\n}\n\n/**\n * 创建筛选插件(如果需要)\n * @param sheetDefine Sheet配置\n * @returns 筛选插件实例或null\n */\nfunction createFilterPlugin(sheetDefine?: ISheetDefine, userPluginOptions?: FilterOptions): FilterPlugin | null {\n // // 对象配置\n // if (typeof sheetDefine.filter === 'object') {\n // return new VTablePlugins.FilterPlugin({\n // filterIcon: sheetDefine.filter.filterIcon,\n // filteringIcon: sheetDefine.filter.filteringIcon,\n // enableFilter: createColumnFilterChecker(sheetDefine),\n // filterModes: sheetDefine.filter.filterModes\n // });\n // }\n return new FilterPlugin({\n enableFilter: createColumnFilterChecker(sheetDefine),\n ...userPluginOptions\n });\n}\n\n/**\n * 创建列级别筛选检查函数\n * @param sheetDefine Sheet配置\n * @returns 筛选检查函数\n */\nfunction createColumnFilterChecker(sheetDefine: ISheetDefine) {\n return (columnIndex: number, column: VTable.TYPES.ColumnDefine): boolean => {\n // 由于在 vtable-sheet,把列索引作为列的唯一标识 field,因此这里直接使用列索引\n if (columnIndex < 0 || !sheetDefine.columns || columnIndex >= sheetDefine.columns.length) {\n return false; // 默认启用,保持向后兼容\n }\n\n // 获取列定义配置\n const columnDefine = sheetDefine.columns[columnIndex] as IColumnDefine;\n const filter = !!(columnDefine?.filter ?? sheetDefine.filter);\n // 明确禁用检查\n return filter;\n };\n}\n\nfunction createContextMenuItems(sheetDefine: ISheetDefine, userPluginOptions?: ContextMenuOptions) {\n return new ContextMenuPlugin({\n headerCellMenuItems: [\n ...DEFAULT_HEADER_MENU_ITEMS,\n {\n text: '设置筛选器',\n menuKey: 'set_filter'\n },\n {\n text: '取消筛选器',\n menuKey: 'cancel_filter'\n },\n {\n text: '首行表头',\n menuKey: 'enable_first_row_as_header'\n },\n {\n text: '取消表头',\n menuKey: 'disable_first_row_as_header'\n }\n ],\n bodyCellMenuItems: [\n ...DEFAULT_BODY_MENU_ITEMS,\n {\n text: '启用首行表头',\n menuKey: 'enable_first_row_as_header'\n }\n ],\n columnSeriesNumberMenuItems: [\n ...DEFAULT_COLUMN_SERIES_MENU_ITEMS,\n {\n text: '首行表头',\n menuKey: 'enable_first_row_as_header'\n },\n {\n text: '取消表头',\n menuKey: 'disable_first_row_as_header'\n }\n ],\n beforeShowAdjustMenuItems: (\n menuItems: MenuItemOrSeparator[],\n table: VTable.ListTable,\n col: number,\n row: number\n ) => {\n console.log('beforeShowAdjustMenuItems', menuItems, table, col, row);\n let isColumnSeriesNumber = false;\n let isHeaderCell = false;\n let isBodyCell = false;\n\n if (!isValid(row)) {\n isColumnSeriesNumber = true;\n }\n if (isValid(col) && isValid(row)) {\n if (table.isHeader(col, row)) {\n isHeaderCell = true;\n } else {\n isBodyCell = true;\n }\n }\n if (isHeaderCell) {\n const column = table.options.columns[col] as IColumnDefine;\n if (column.filter ?? sheetDefine?.filter) {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'set_filter');\n } else {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'cancel_filter');\n }\n }\n\n if (isHeaderCell) {\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header');\n } else if (isBodyCell) {\n if (row === 0) {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'disable_first_row_as_header'\n );\n } else {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header'\n );\n }\n } else if (isColumnSeriesNumber) {\n if (table.isHeader(col, 0)) {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'enable_first_row_as_header'\n );\n } else {\n menuItems = menuItems.filter(\n item => typeof item === 'string' || item.menuKey !== 'disable_first_row_as_header'\n );\n }\n }\n return menuItems;\n },\n menuClickCallback: {\n set_filter: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n console.log('set_filter', args, table);\n // 更新 sheetDefine 配置\n sheetDefine.columns[args.colIndex].filter = true;\n\n // 创建新的 options 对象,确保配置变化被正确传递\n const newOptions = {\n ...table.options,\n columns: table.options.columns.map((col: VTable.ColumnDefine, index: number) => {\n if (index === args.colIndex) {\n return { ...col, filter: true };\n }\n return col;\n })\n };\n // 更新表格配置\n table.updateOption(newOptions, { clearColWidthCache: false, clearRowHeightCache: false });\n },\n cancel_filter: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n console.log('cancel_filter', args, table);\n // 更新 sheetDefine 配置\n sheetDefine.columns[args.colIndex].filter = false;\n\n // 创建新的 options 对象,确保配置变化被正确传递\n const newOptions = {\n ...table.options,\n columns: table.options.columns.map((col: VTable.ColumnDefine, index: number) => {\n if (index === args.colIndex) {\n return { ...col, filter: false };\n }\n return col;\n })\n };\n\n // 更新表格配置\n table.updateOption(newOptions, { clearColWidthCache: false, clearRowHeightCache: false });\n },\n enable_first_row_as_header: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n handleEnableFirstRowAsHeader(table);\n },\n disable_first_row_as_header: (args: MenuClickEventArgs, table: VTable.ListTable) => {\n handleDisableFirstRowAsHeader(table);\n }\n },\n ...userPluginOptions\n });\n}\n\n/**\n * 处理启用第一行作为表头\n */\nfunction handleEnableFirstRowAsHeader(table: VTable.ListTable): void {\n // 获取第一行数据\n const firstRecord = table.records[0] as string[];\n // 获取剩余数据\n const new_records = table.records.slice(1);\n //获取当前column\n const columns = table.columns;\n // 设置第一行为表头\n firstRecord.forEach((item, index) => {\n columns[index].title = item;\n });\n table.updateOption(Object.assign({}, table.options, { records: new_records, columns, showHeader: true }), {\n clearColWidthCache: false,\n clearRowHeightCache: false\n });\n // 更新渲染\n table.scenegraph.updateNextFrame();\n}\n\n/**\n * 处理禁用第一行作为表头\n */\nfunction handleDisableFirstRowAsHeader(table: VTable.ListTable): void {\n const columns = table.columns;\n const firstRecord: (string | number)[] = [];\n columns.forEach((col, index) => {\n firstRecord.push(col.title as string);\n });\n //像records中添加第一行\n const new_records = [firstRecord, ...table.records];\n table.updateOption(Object.assign({}, table.options, { records: new_records, columns, showHeader: false }), {\n clearColWidthCache: false,\n clearRowHeightCache: false\n });\n table.scenegraph.updateNextFrame();\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type VTableSheet from '../components/vtable-sheet';
|
|
2
|
+
export declare class EventManager {
|
|
3
|
+
private sheet;
|
|
4
|
+
private boundHandlers;
|
|
5
|
+
readonly handleCellSelectedBind: () => void;
|
|
6
|
+
readonly handleCellValueChangedBind: (event: any) => void;
|
|
7
|
+
readonly handleSelectionChangedForRangeModeBind: (event: any) => void;
|
|
8
|
+
constructor(sheet: VTableSheet);
|
|
9
|
+
private setupEventListeners;
|
|
10
|
+
private addEvent;
|
|
11
|
+
handleCellSelected(): void;
|
|
12
|
+
handleCellValueChanged(event: any): void;
|
|
13
|
+
handleSelectionChangedForRangeMode(event: any): void;
|
|
14
|
+
private handleMouseDown;
|
|
15
|
+
private handleMouseMove;
|
|
16
|
+
private handleMouseUp;
|
|
17
|
+
private handleDoubleClick;
|
|
18
|
+
private handleKeyDown;
|
|
19
|
+
private handleKeyUp;
|
|
20
|
+
private handleCopy;
|
|
21
|
+
private handlePaste;
|
|
22
|
+
private handleCut;
|
|
23
|
+
private handleFocus;
|
|
24
|
+
private handleBlur;
|
|
25
|
+
private handleWindowResize;
|
|
26
|
+
private getCellFromMouseCoords;
|
|
27
|
+
private getFormulaUIManager;
|
|
28
|
+
release(): void;
|
|
29
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.EventManager = void 0;
|
|
6
|
+
|
|
7
|
+
class EventManager {
|
|
8
|
+
constructor(sheet) {
|
|
9
|
+
this.boundHandlers = new Map, this.sheet = sheet, this.handleCellSelectedBind = this.handleCellSelected.bind(this),
|
|
10
|
+
this.handleCellValueChangedBind = this.handleCellValueChanged.bind(this), this.handleSelectionChangedForRangeModeBind = this.handleSelectionChangedForRangeMode.bind(this),
|
|
11
|
+
this.setupEventListeners();
|
|
12
|
+
}
|
|
13
|
+
setupEventListeners() {
|
|
14
|
+
const element = this.sheet.getContainer();
|
|
15
|
+
this.addEvent(element, "mousedown", this.handleMouseDown.bind(this)), this.addEvent(element, "mousemove", this.handleMouseMove.bind(this)),
|
|
16
|
+
this.addEvent(element, "mouseup", this.handleMouseUp.bind(this)), this.addEvent(element, "dblclick", this.handleDoubleClick.bind(this)),
|
|
17
|
+
this.addEvent(element, "keydown", this.handleKeyDown.bind(this)), this.addEvent(element, "keyup", this.handleKeyUp.bind(this)),
|
|
18
|
+
this.addEvent(element, "copy", this.handleCopy.bind(this)), this.addEvent(element, "paste", this.handlePaste.bind(this)),
|
|
19
|
+
this.addEvent(element, "cut", this.handleCut.bind(this)), this.addEvent(element, "focus", this.handleFocus.bind(this)),
|
|
20
|
+
this.addEvent(element, "blur", this.handleBlur.bind(this)), this.addEvent(window, "resize", this.handleWindowResize.bind(this));
|
|
21
|
+
}
|
|
22
|
+
addEvent(target, eventType, handler) {
|
|
23
|
+
target.addEventListener(eventType, handler), this.boundHandlers.set(`${eventType}-${handler.toString()}`, handler);
|
|
24
|
+
}
|
|
25
|
+
handleCellSelected() {
|
|
26
|
+
if (this.sheet.formulaManager.formulaWorkingOnCell) return;
|
|
27
|
+
const formulaUIManager = this.sheet.formulaUIManager;
|
|
28
|
+
formulaUIManager.isFormulaBarShowingResult = !1, formulaUIManager.clearFormula(),
|
|
29
|
+
formulaUIManager.updateFormulaBar();
|
|
30
|
+
}
|
|
31
|
+
handleCellValueChanged(event) {
|
|
32
|
+
this.sheet.formulaManager.formulaRangeSelector.handleCellValueChanged(event);
|
|
33
|
+
}
|
|
34
|
+
handleSelectionChangedForRangeMode(event) {
|
|
35
|
+
this.sheet.formulaManager.formulaRangeSelector.handleSelectionChangedForRangeMode(event);
|
|
36
|
+
}
|
|
37
|
+
handleMouseDown(event) {}
|
|
38
|
+
handleMouseMove(event) {}
|
|
39
|
+
handleMouseUp(event) {}
|
|
40
|
+
handleDoubleClick(event) {}
|
|
41
|
+
handleKeyDown(event) {}
|
|
42
|
+
handleKeyUp(event) {}
|
|
43
|
+
handleCopy(event) {}
|
|
44
|
+
handlePaste(event) {}
|
|
45
|
+
handleCut(event) {}
|
|
46
|
+
handleFocus(event) {}
|
|
47
|
+
handleBlur(event) {}
|
|
48
|
+
handleWindowResize(event) {
|
|
49
|
+
this.sheet.resize();
|
|
50
|
+
}
|
|
51
|
+
getCellFromMouseCoords(x, y) {
|
|
52
|
+
return {
|
|
53
|
+
row: 0,
|
|
54
|
+
col: 0
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
getFormulaUIManager() {
|
|
58
|
+
return this.sheet.formulaUIManager || null;
|
|
59
|
+
}
|
|
60
|
+
release() {
|
|
61
|
+
const element = this.sheet.getContainer();
|
|
62
|
+
for (const [key, handler] of this.boundHandlers.entries()) {
|
|
63
|
+
const eventType = key.split("-")[0];
|
|
64
|
+
"resize" === eventType ? window.removeEventListener(eventType, handler) : element.removeEventListener(eventType, handler);
|
|
65
|
+
}
|
|
66
|
+
this.boundHandlers.clear();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
exports.EventManager = EventManager;
|
|
71
|
+
//# sourceMappingURL=event-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/event-manager.ts"],"names":[],"mappings":"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","file":"event-manager.js","sourcesContent":["import type { CellCoord } from '../ts-types';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { FormulaUIManager } from '../formula/formula-ui-manager';\n\nexport class EventManager {\n private sheet: VTableSheet;\n private boundHandlers: Map<string, EventListener> = new Map();\n\n // 预先绑定的事件处理方法\n readonly handleCellSelectedBind: () => void;\n readonly handleCellValueChangedBind: (event: any) => void;\n readonly handleSelectionChangedForRangeModeBind: (event: any) => void;\n\n /**\n * Creates a new EventManager instance\n * @param sheet The Sheet instance\n */\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n\n // 预先绑定事件处理方法\n this.handleCellSelectedBind = this.handleCellSelected.bind(this);\n this.handleCellValueChangedBind = this.handleCellValueChanged.bind(this);\n this.handleSelectionChangedForRangeModeBind = this.handleSelectionChangedForRangeMode.bind(this);\n\n this.setupEventListeners();\n }\n\n /**\n * 设置事件监听\n */\n private setupEventListeners(): void {\n // 获取Sheet元素\n const element = this.sheet.getContainer();\n\n // 设置鼠标事件\n this.addEvent(element, 'mousedown', this.handleMouseDown.bind(this));\n this.addEvent(element, 'mousemove', this.handleMouseMove.bind(this));\n this.addEvent(element, 'mouseup', this.handleMouseUp.bind(this));\n this.addEvent(element, 'dblclick', this.handleDoubleClick.bind(this));\n\n // 设置键盘事件\n this.addEvent(element, 'keydown', this.handleKeyDown.bind(this));\n this.addEvent(element, 'keyup', this.handleKeyUp.bind(this));\n\n // 设置剪贴板事件\n this.addEvent(element, 'copy', this.handleCopy.bind(this));\n this.addEvent(element, 'paste', this.handlePaste.bind(this));\n this.addEvent(element, 'cut', this.handleCut.bind(this));\n\n // 设置焦点事件\n this.addEvent(element, 'focus', this.handleFocus.bind(this));\n this.addEvent(element, 'blur', this.handleBlur.bind(this));\n\n // 窗口大小变化事件\n this.addEvent(window, 'resize', this.handleWindowResize.bind(this));\n }\n\n /**\n * 添加事件监听\n * @param target 事件目标\n * @param eventType 事件类型\n * @param handler 事件处理函数\n */\n private addEvent(target: EventTarget, eventType: string, handler: EventListener): void {\n target.addEventListener(eventType, handler);\n this.boundHandlers.set(`${eventType}-${handler.toString()}`, handler);\n }\n\n /**\n * 处理单元格选择事件\n * 这个方法处理从Worksheet冒泡上来的cell-selected事件\n */\n handleCellSelected(): void {\n // 如果在公式编辑状态,不处理\n if (this.sheet.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n // 重置公式栏显示标志,让公式栏显示选中单元格的值\n const formulaUIManager = this.sheet.formulaUIManager;\n formulaUIManager.isFormulaBarShowingResult = false;\n formulaUIManager.clearFormula();\n formulaUIManager.updateFormulaBar();\n }\n\n /**\n * 处理单元格值变更事件\n */\n handleCellValueChanged(event: any): void {\n this.sheet.formulaManager.formulaRangeSelector.handleCellValueChanged(event);\n }\n handleSelectionChangedForRangeMode(event: any): void {\n this.sheet.formulaManager.formulaRangeSelector.handleSelectionChangedForRangeMode(event);\n }\n\n // 原有方法保持不变\n private handleMouseDown(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleMouseMove(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleMouseUp(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleDoubleClick(event: MouseEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleKeyUp(event: KeyboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleCopy(event: ClipboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handlePaste(event: ClipboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleCut(event: ClipboardEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleFocus(event: FocusEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleBlur(event: FocusEvent): void {\n // 原有逻辑保持不变\n }\n\n private handleWindowResize(event: UIEvent): void {\n // 更新Sheet大小\n this.sheet.resize();\n }\n\n private getCellFromMouseCoords(x: number, y: number): CellCoord {\n // 原有实现保持不变\n return {\n row: 0,\n col: 0\n };\n }\n\n /**\n * 获取FormulaUIManager实例\n */\n private getFormulaUIManager(): FormulaUIManager | null {\n return (this.sheet as any).formulaUIManager || null;\n }\n\n /**\n * 释放所有事件处理函数\n */\n release(): void {\n const element = this.sheet.getContainer();\n\n // 移除所有事件监听器\n for (const [key, handler] of this.boundHandlers.entries()) {\n const eventType = key.split('-')[0];\n\n if (eventType === 'resize') {\n window.removeEventListener(eventType, handler);\n } else {\n element.removeEventListener(eventType, handler);\n }\n }\n\n // 清空事件处理函数映射\n this.boundHandlers.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type EventHandler = (...args: any[]) => void;
|
|
2
|
+
export declare class EventTarget {
|
|
3
|
+
private events;
|
|
4
|
+
on(type: string, handler: EventHandler): this;
|
|
5
|
+
off(type: string, handler?: EventHandler): this;
|
|
6
|
+
fire(type: string, ...args: any[]): this;
|
|
7
|
+
once(type: string, handler: EventHandler): this;
|
|
8
|
+
removeAllListeners(): this;
|
|
9
|
+
eventNames(): string[];
|
|
10
|
+
listenerCount(type: string): number;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.EventTarget = void 0;
|
|
6
|
+
|
|
7
|
+
class EventTarget {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.events = {};
|
|
10
|
+
}
|
|
11
|
+
on(type, handler) {
|
|
12
|
+
return this.events[type] || (this.events[type] = []), this.events[type].push(handler),
|
|
13
|
+
this;
|
|
14
|
+
}
|
|
15
|
+
off(type, handler) {
|
|
16
|
+
if (!this.events[type]) return this;
|
|
17
|
+
if (handler) {
|
|
18
|
+
const idx = this.events[type].indexOf(handler);
|
|
19
|
+
idx >= 0 && this.events[type].splice(idx, 1), 0 === this.events[type].length && delete this.events[type];
|
|
20
|
+
} else delete this.events[type];
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
fire(type, ...args) {
|
|
24
|
+
if (!this.events[type]) return this;
|
|
25
|
+
const handlers = [ ...this.events[type] ];
|
|
26
|
+
for (const handler of handlers) try {
|
|
27
|
+
handler(...args);
|
|
28
|
+
} catch (e) {}
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
once(type, handler) {
|
|
32
|
+
const onceHandler = (...args) => {
|
|
33
|
+
this.off(type, onceHandler), handler(...args);
|
|
34
|
+
};
|
|
35
|
+
return this.on(type, onceHandler);
|
|
36
|
+
}
|
|
37
|
+
removeAllListeners() {
|
|
38
|
+
return this.events = {}, this;
|
|
39
|
+
}
|
|
40
|
+
eventNames() {
|
|
41
|
+
return Object.keys(this.events);
|
|
42
|
+
}
|
|
43
|
+
listenerCount(type) {
|
|
44
|
+
var _a;
|
|
45
|
+
return (null === (_a = this.events[type]) || void 0 === _a ? void 0 : _a.length) || 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
exports.EventTarget = EventTarget;
|
|
50
|
+
//# sourceMappingURL=event-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/event-target.ts"],"names":[],"mappings":";;;AAMA,MAAa,WAAW;IAAxB;QAEU,WAAM,GAAgB,EAAE,CAAC;IA+GnC,CAAC;IAvGC,EAAE,CAAC,IAAY,EAAE,OAAqB;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,GAAG,CAAC,IAAY,EAAE,OAAsB;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,OAAO,EAAE;YAEZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC1B;aAAM;YAEL,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,GAAG,IAAI,CAAC,EAAE;gBACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;aAClC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;gBAClC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aAC1B;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,IAAI,CAAC,IAAY,EAAE,GAAG,IAAW;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACtB,OAAO,IAAI,CAAC;SACb;QAGD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,IAAI;gBACF,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;aAClB;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;aACzD;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,IAAI,CAAC,IAAY,EAAE,OAAqB;QACtC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC;IAMD,kBAAkB;QAChB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,UAAU;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAOD,aAAa,CAAC,IAAY;;QACxB,OAAO,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAAE,MAAM,KAAI,CAAC,CAAC;IACxC,CAAC;CACF;AAjHD,kCAiHC","file":"event-target.js","sourcesContent":["type EventHandler = (...args: any[]) => void;\n\ninterface EventRecord {\n [key: string]: EventHandler[];\n}\n\nexport class EventTarget {\n /** 事件记录 */\n private events: EventRecord = {};\n\n /**\n * 添加事件监听器\n * @param type 事件类型\n * @param handler 事件处理函数\n * @returns 返回this,用于链式调用\n */\n on(type: string, handler: EventHandler): this {\n if (!this.events[type]) {\n this.events[type] = [];\n }\n\n this.events[type].push(handler);\n return this;\n }\n\n /**\n * 移除事件监听器\n * @param type 事件类型\n * @param handler 事件处理函数\n * @returns 返回this,用于链式调用\n */\n off(type: string, handler?: EventHandler): this {\n if (!this.events[type]) {\n return this;\n }\n\n if (!handler) {\n // 移除所有事件处理函数\n delete this.events[type];\n } else {\n // 移除特定事件处理函数\n const idx = this.events[type].indexOf(handler);\n if (idx >= 0) {\n this.events[type].splice(idx, 1);\n }\n\n if (this.events[type].length === 0) {\n delete this.events[type];\n }\n }\n\n return this;\n }\n\n /**\n * 触发事件\n * @param type 事件类型\n * @param args 传递给事件处理函数的参数\n * @returns 返回this,用于链式调用\n */\n fire(type: string, ...args: any[]): this {\n if (!this.events[type]) {\n return this;\n }\n\n // 创建一个处理函数的副本,以防止在执行期间添加/移除处理函数时出现问题\n const handlers = [...this.events[type]];\n\n for (const handler of handlers) {\n try {\n handler(...args);\n } catch (e) {\n console.error(`Error in event handler for ${type}:`, e);\n }\n }\n\n return this;\n }\n\n /**\n * 添加一次性事件监听器,在调用后自动移除\n * @param type 事件类型\n * @param handler 事件处理函数\n * @returns 返回this,用于链式调用\n */\n once(type: string, handler: EventHandler): this {\n const onceHandler = (...args: any[]) => {\n this.off(type, onceHandler);\n handler(...args);\n };\n\n return this.on(type, onceHandler);\n }\n\n /**\n * 移除所有事件监听器\n * @returns 返回this,用于链式调用\n */\n removeAllListeners(): this {\n this.events = {};\n return this;\n }\n\n /**\n * 获取所有注册的事件类型\n * @returns 事件类型数组\n */\n eventNames(): string[] {\n return Object.keys(this.events);\n }\n\n /**\n * 获取特定事件类型的监听器数量\n * @param type 事件类型\n * @returns 监听器数量\n */\n listenerCount(type: string): number {\n return this.events[type]?.length || 0;\n }\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type VTableSheet from '../components/vtable-sheet';
|
|
2
|
+
import type { CellCoord } from '../ts-types';
|
|
3
|
+
export declare class CellHighlightManager {
|
|
4
|
+
private sheet;
|
|
5
|
+
private highlightedCells;
|
|
6
|
+
private colors;
|
|
7
|
+
private colorIndex;
|
|
8
|
+
constructor(sheet: VTableSheet);
|
|
9
|
+
parseCellReferences(formula: string): Array<{
|
|
10
|
+
address: string;
|
|
11
|
+
coords: CellCoord[];
|
|
12
|
+
color: string;
|
|
13
|
+
isRange: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
private parseRangeReference;
|
|
16
|
+
highlightFormulaCells(formula: string): void;
|
|
17
|
+
private applyCellHighlight;
|
|
18
|
+
clearHighlights(): void;
|
|
19
|
+
getCellHighlightColor(coord: CellCoord): string | null;
|
|
20
|
+
getHighlightedCells(): Array<{
|
|
21
|
+
coord: CellCoord;
|
|
22
|
+
color: string;
|
|
23
|
+
}>;
|
|
24
|
+
getColorizedFormula(formula: string): Array<{
|
|
25
|
+
text: string;
|
|
26
|
+
color?: string;
|
|
27
|
+
}>;
|
|
28
|
+
release(): void;
|
|
29
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.CellHighlightManager = void 0;
|
|
6
|
+
|
|
7
|
+
class CellHighlightManager {
|
|
8
|
+
constructor(sheet) {
|
|
9
|
+
this.highlightedCells = new Map, this.colors = [ "#4A90E2", "#50C878", "#FF6B6B", "#FFD93D", "#6BCB77", "#9B59B6", "#FF8C42", "#00BCD4" ],
|
|
10
|
+
this.colorIndex = 0, this.sheet = sheet;
|
|
11
|
+
}
|
|
12
|
+
parseCellReferences(formula) {
|
|
13
|
+
const references = [], matches = formula.match(/(\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?)/gi);
|
|
14
|
+
if (!matches) return references;
|
|
15
|
+
const activeSheet = this.sheet.getActiveSheet();
|
|
16
|
+
if (!activeSheet) return references;
|
|
17
|
+
const uniqueRefs = new Set;
|
|
18
|
+
return this.colorIndex = 0, matches.forEach((match => {
|
|
19
|
+
const normalizedRef = match.replace(/\$/g, "").toUpperCase();
|
|
20
|
+
if (!uniqueRefs.has(normalizedRef)) {
|
|
21
|
+
uniqueRefs.add(normalizedRef);
|
|
22
|
+
try {
|
|
23
|
+
const isRange = normalizedRef.includes(":");
|
|
24
|
+
let coords = [];
|
|
25
|
+
if (isRange) coords = this.parseRangeReference(normalizedRef, activeSheet); else {
|
|
26
|
+
coords = [ activeSheet.coordFromAddress(normalizedRef) ];
|
|
27
|
+
}
|
|
28
|
+
if (coords.length > 0) {
|
|
29
|
+
const color = this.colors[this.colorIndex % this.colors.length];
|
|
30
|
+
this.colorIndex++, references.push({
|
|
31
|
+
address: normalizedRef,
|
|
32
|
+
coords: coords,
|
|
33
|
+
color: color,
|
|
34
|
+
isRange: isRange
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
} catch (e) {}
|
|
38
|
+
}
|
|
39
|
+
})), references;
|
|
40
|
+
}
|
|
41
|
+
parseRangeReference(rangeRef, activeSheet) {
|
|
42
|
+
const parts = rangeRef.split(":");
|
|
43
|
+
if (2 !== parts.length) throw new Error(`Invalid range reference: ${rangeRef}`);
|
|
44
|
+
const startCoord = activeSheet.coordFromAddress(parts[0]), endCoord = activeSheet.coordFromAddress(parts[1]), coords = [], startRow = Math.min(startCoord.row, endCoord.row), endRow = Math.max(startCoord.row, endCoord.row), startCol = Math.min(startCoord.col, endCoord.col), endCol = Math.max(startCoord.col, endCoord.col);
|
|
45
|
+
for (let row = startRow; row <= endRow; row++) for (let col = startCol; col <= endCol; col++) coords.push({
|
|
46
|
+
row: row,
|
|
47
|
+
col: col
|
|
48
|
+
});
|
|
49
|
+
return coords;
|
|
50
|
+
}
|
|
51
|
+
highlightFormulaCells(formula) {
|
|
52
|
+
this.clearHighlights();
|
|
53
|
+
const references = this.parseCellReferences(formula);
|
|
54
|
+
if (0 === references.length) return;
|
|
55
|
+
const activeSheet = this.sheet.getActiveSheet();
|
|
56
|
+
activeSheet && references.forEach((ref => {
|
|
57
|
+
ref.coords.forEach((coord => {
|
|
58
|
+
const key = `${coord.row}-${coord.col}`;
|
|
59
|
+
this.highlightedCells.set(key, {
|
|
60
|
+
row: coord.row,
|
|
61
|
+
col: coord.col,
|
|
62
|
+
color: ref.color
|
|
63
|
+
}), this.applyCellHighlight(activeSheet, coord, ref.color);
|
|
64
|
+
}));
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
applyCellHighlight(sheet, coord, color) {
|
|
68
|
+
const table = sheet.tableInstance;
|
|
69
|
+
if (table && table.scenegraph) try {
|
|
70
|
+
const key = `${coord.row}-${coord.col}`, highlightStyle = {
|
|
71
|
+
borderColor: [ color, color, color, color ],
|
|
72
|
+
borderLineWidth: [ 4, 4, 4, 4 ],
|
|
73
|
+
borderLineDash: [ [ 4, 4 ], [ 4, 4 ], [ 4, 4 ], [ 4, 4 ] ],
|
|
74
|
+
padding: [ 8, 8, 8, 8 ]
|
|
75
|
+
}, styleId = `highlight-${key}`;
|
|
76
|
+
table.registerCustomCellStyle(styleId, highlightStyle), table.arrangeCustomCellStyle({
|
|
77
|
+
col: coord.col,
|
|
78
|
+
row: coord.row
|
|
79
|
+
}, styleId, !1);
|
|
80
|
+
} catch (e) {}
|
|
81
|
+
}
|
|
82
|
+
clearHighlights() {
|
|
83
|
+
const activeSheet = this.sheet.getActiveSheet();
|
|
84
|
+
if (!activeSheet) return;
|
|
85
|
+
const table = activeSheet.tableInstance;
|
|
86
|
+
table && table.scenegraph && (this.highlightedCells.forEach((info => {
|
|
87
|
+
try {
|
|
88
|
+
info.row, info.col;
|
|
89
|
+
table.arrangeCustomCellStyle({
|
|
90
|
+
col: info.col,
|
|
91
|
+
row: info.row
|
|
92
|
+
}, null, !1);
|
|
93
|
+
} catch (e) {}
|
|
94
|
+
})), this.highlightedCells.clear(), this.colorIndex = 0);
|
|
95
|
+
}
|
|
96
|
+
getCellHighlightColor(coord) {
|
|
97
|
+
const key = `${coord.row}-${coord.col}`, info = this.highlightedCells.get(key);
|
|
98
|
+
return info ? info.color : null;
|
|
99
|
+
}
|
|
100
|
+
getHighlightedCells() {
|
|
101
|
+
return Array.from(this.highlightedCells.values()).map((info => ({
|
|
102
|
+
coord: {
|
|
103
|
+
row: info.row,
|
|
104
|
+
col: info.col
|
|
105
|
+
},
|
|
106
|
+
color: info.color
|
|
107
|
+
})));
|
|
108
|
+
}
|
|
109
|
+
getColorizedFormula(formula) {
|
|
110
|
+
const references = this.parseCellReferences(formula), parts = [];
|
|
111
|
+
if (0 === references.length) return [ {
|
|
112
|
+
text: formula
|
|
113
|
+
} ];
|
|
114
|
+
let lastIndex = 0;
|
|
115
|
+
const colorMap = new Map;
|
|
116
|
+
references.forEach((ref => {
|
|
117
|
+
colorMap.set(ref.address.toUpperCase(), ref.color);
|
|
118
|
+
}));
|
|
119
|
+
const regex = /(\$?[A-Z]+\$?\d+)/gi;
|
|
120
|
+
let match;
|
|
121
|
+
for (;null !== (match = regex.exec(formula)); ) {
|
|
122
|
+
match.index > lastIndex && parts.push({
|
|
123
|
+
text: formula.substring(lastIndex, match.index)
|
|
124
|
+
});
|
|
125
|
+
const normalizedRef = match[0].replace(/\$/g, "").toUpperCase(), color = colorMap.get(normalizedRef);
|
|
126
|
+
parts.push({
|
|
127
|
+
text: match[0],
|
|
128
|
+
color: color
|
|
129
|
+
}), lastIndex = match.index + match[0].length;
|
|
130
|
+
}
|
|
131
|
+
return lastIndex < formula.length && parts.push({
|
|
132
|
+
text: formula.substring(lastIndex)
|
|
133
|
+
}), parts;
|
|
134
|
+
}
|
|
135
|
+
release() {
|
|
136
|
+
this.clearHighlights(), this.highlightedCells.clear();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
exports.CellHighlightManager = CellHighlightManager;
|
|
141
|
+
//# sourceMappingURL=cell-highlight-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/formula/cell-highlight-manager.ts"],"names":[],"mappings":"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","file":"cell-highlight-manager.js","sourcesContent":["import type { WorkSheet } from '../core/WorkSheet';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { CellCoord } from '../ts-types';\n\ninterface HighlightedCell {\n row: number;\n col: number;\n color: string;\n}\n\nexport class CellHighlightManager {\n private sheet: VTableSheet;\n private highlightedCells: Map<string, HighlightedCell> = new Map();\n // /** 目前还没有自定义样式的功能 这个逻辑不需要 */\n // private originalBorderStyles: Map<string, any> = new Map(); // 保存原始边框样式\n private colors = [\n '#4A90E2', // 蓝色\n '#50C878', // 绿色\n '#FF6B6B', // 红色\n '#FFD93D', // 黄色\n '#6BCB77', // 浅绿\n '#9B59B6', // 紫色\n '#FF8C42', // 橙色\n '#00BCD4' // 青色\n ];\n private colorIndex = 0;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n }\n\n /**\n * 解析公式中的单元格引用(包括范围引用)\n */\n parseCellReferences(\n formula: string\n ): Array<{ address: string; coords: CellCoord[]; color: string; isRange: boolean }> {\n const references: Array<{ address: string; coords: CellCoord[]; color: string; isRange: boolean }> = [];\n\n // 匹配单元格引用的正则表达式(包括范围引用)\n const cellRefRegex = /(\\$?[A-Z]+\\$?\\d+(?::\\$?[A-Z]+\\$?\\d+)?)/gi;\n\n const matches = formula.match(cellRefRegex);\n if (!matches) {\n return references;\n }\n\n const activeSheet = this.sheet.getActiveSheet();\n if (!activeSheet) {\n return references;\n }\n\n const uniqueRefs = new Set<string>();\n this.colorIndex = 0;\n\n matches.forEach(match => {\n const normalizedRef = match.replace(/\\$/g, '').toUpperCase();\n\n if (!uniqueRefs.has(normalizedRef)) {\n uniqueRefs.add(normalizedRef);\n\n try {\n const isRange = normalizedRef.includes(':');\n let coords: CellCoord[] = [];\n\n if (isRange) {\n // 解析范围引用,如 A1:A4\n coords = this.parseRangeReference(normalizedRef, activeSheet);\n } else {\n // 解析单个单元格引用,如 A1\n const coord = activeSheet.coordFromAddress(normalizedRef);\n coords = [coord];\n }\n\n if (coords.length > 0) {\n const color = this.colors[this.colorIndex % this.colors.length];\n this.colorIndex++;\n\n references.push({\n address: normalizedRef,\n coords: coords,\n color: color,\n isRange: isRange\n });\n }\n } catch (e) {\n // 忽略无效的单元格引用\n console.warn(`Invalid cell reference: ${normalizedRef}`, e);\n }\n }\n });\n\n return references;\n }\n\n /**\n * 解析范围引用,如 A1:A4\n */\n private parseRangeReference(rangeRef: string, activeSheet: WorkSheet): CellCoord[] {\n const parts = rangeRef.split(':');\n if (parts.length !== 2) {\n throw new Error(`Invalid range reference: ${rangeRef}`);\n }\n\n const startCoord = activeSheet.coordFromAddress(parts[0]);\n const endCoord = activeSheet.coordFromAddress(parts[1]);\n\n const coords: CellCoord[] = [];\n\n // 生成范围内的所有单元格坐标\n const startRow = Math.min(startCoord.row, endCoord.row);\n const endRow = Math.max(startCoord.row, endCoord.row);\n const startCol = Math.min(startCoord.col, endCoord.col);\n const endCol = Math.max(startCoord.col, endCoord.col);\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n coords.push({ row, col });\n }\n }\n\n return coords;\n }\n\n /**\n * 高亮公式中引用的单元格\n */\n highlightFormulaCells(formula: string): void {\n // 清除之前的高亮\n this.clearHighlights();\n\n const references = this.parseCellReferences(formula);\n\n if (references.length === 0) {\n return;\n }\n\n const activeSheet = this.sheet.getActiveSheet();\n if (!activeSheet) {\n return;\n }\n\n // 应用高亮\n references.forEach(ref => {\n ref.coords.forEach(coord => {\n const key = `${coord.row}-${coord.col}`;\n\n // 保存高亮信息\n this.highlightedCells.set(key, {\n row: coord.row,\n col: coord.col,\n color: ref.color\n });\n\n // 应用高亮样式\n this.applyCellHighlight(activeSheet, coord, ref.color);\n });\n });\n }\n\n /**\n * 应用单元格高亮\n * 通过修改单元格的边框样式实现\n */\n private applyCellHighlight(sheet: WorkSheet, coord: CellCoord, color: string): void {\n const table = (sheet as any).tableInstance;\n if (!table || !table.scenegraph) {\n return;\n }\n\n try {\n const key = `${coord.row}-${coord.col}`;\n\n // // 保存原始样式\n // if (!this.originalBorderStyles.has(key)) {\n // const originalStyle = table.getCellStyle(coord.col, coord.row);\n // this.originalBorderStyles.set(key, originalStyle);\n // }\n\n // 创建高亮样式\n const highlightStyle = {\n // ...table._getCellStyle(coord.col, coord.row),\n borderColor: [color, color, color, color],\n borderLineWidth: [4, 4, 4, 4],\n borderLineDash: [\n [4, 4],\n [4, 4],\n [4, 4],\n [4, 4]\n ],\n padding: [8, 8, 8, 8]\n };\n\n // 注册自定义样式\n const styleId = `highlight-${key}`;\n table.registerCustomCellStyle(styleId, highlightStyle);\n\n // 应用样式到单元格\n table.arrangeCustomCellStyle({ col: coord.col, row: coord.row }, styleId, false);\n } catch (e) {\n console.error('applyCellHighlight: 错误', e);\n }\n }\n\n /**\n * 清除所有高亮\n */\n clearHighlights(): void {\n const activeSheet = this.sheet.getActiveSheet();\n if (!activeSheet) {\n return;\n }\n\n const table = (activeSheet as any).tableInstance;\n if (!table || !table.scenegraph) {\n return;\n }\n\n this.highlightedCells.forEach(info => {\n try {\n const key = `${info.row}-${info.col}`;\n const styleId = `highlight-${key}`;\n\n // 移除高亮样式\n table.arrangeCustomCellStyle({ col: info.col, row: info.row }, null, false);\n\n // // 恢复原始样式\n // const originalStyle = this.originalBorderStyles.get(key);\n // if (originalStyle) {\n // table.registerCustomCellStyle(styleId, originalStyle);\n // table.arrangeCustomCellStyle({ col: info.col, row: info.row }, styleId, true);\n // }\n } catch (e) {\n console.warn(`Failed to clear highlight at ${info.row},${info.col}:`, e);\n }\n });\n\n this.highlightedCells.clear();\n // this.originalBorderStyles.clear();\n this.colorIndex = 0;\n }\n\n /**\n * 获取单元格的高亮颜色\n */\n getCellHighlightColor(coord: CellCoord): string | null {\n const key = `${coord.row}-${coord.col}`;\n const info = this.highlightedCells.get(key);\n return info ? info.color : null;\n }\n\n /**\n * 获取高亮的单元格列表\n */\n getHighlightedCells(): Array<{ coord: CellCoord; color: string }> {\n return Array.from(this.highlightedCells.values()).map(info => ({\n coord: { row: info.row, col: info.col },\n color: info.color\n }));\n }\n\n /**\n * 获取彩色公式文本\n */\n getColorizedFormula(formula: string): Array<{ text: string; color?: string }> {\n const references = this.parseCellReferences(formula);\n const parts: Array<{ text: string; color?: string }> = [];\n\n if (references.length === 0) {\n return [{ text: formula }];\n }\n\n let lastIndex = 0;\n const colorMap = new Map<string, string>();\n references.forEach(ref => {\n colorMap.set(ref.address.toUpperCase(), ref.color);\n });\n\n const regex = /(\\$?[A-Z]+\\$?\\d+)/gi;\n let match;\n\n while ((match = regex.exec(formula)) !== null) {\n if (match.index > lastIndex) {\n parts.push({ text: formula.substring(lastIndex, match.index) });\n }\n\n const normalizedRef = match[0].replace(/\\$/g, '').toUpperCase();\n const color = colorMap.get(normalizedRef);\n parts.push({\n text: match[0],\n color: color\n });\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < formula.length) {\n parts.push({ text: formula.substring(lastIndex) });\n }\n\n return parts;\n }\n\n /**\n * 销毁管理器\n */\n release(): void {\n this.clearHighlights();\n this.highlightedCells.clear();\n // this.originalBorderStyles.clear();\n }\n}\n"]}
|