@visactor/vtable-plugins 1.26.1-alpha.0 → 1.26.2-alpha.1
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/context-menu.d.ts +2 -0
- package/cjs/context-menu.js +5 -4
- package/cjs/context-menu.js.map +1 -1
- package/cjs/contextmenu/menu-manager.d.ts +4 -0
- package/cjs/contextmenu/menu-manager.js +46 -34
- package/cjs/contextmenu/menu-manager.js.map +1 -1
- package/cjs/contextmenu/styles.d.ts +46 -102
- package/cjs/contextmenu/styles.js +182 -99
- package/cjs/contextmenu/styles.js.map +1 -1
- package/cjs/contextmenu/types.d.ts +21 -0
- package/cjs/contextmenu/types.js.map +1 -1
- package/dist/vtable-plugins.js +222 -48
- package/dist/vtable-plugins.min.js +2 -2
- package/es/context-menu.d.ts +2 -0
- package/es/context-menu.js +5 -2
- package/es/context-menu.js.map +1 -1
- package/es/contextmenu/menu-manager.d.ts +4 -0
- package/es/contextmenu/menu-manager.js +40 -28
- package/es/contextmenu/menu-manager.js.map +1 -1
- package/es/contextmenu/styles.d.ts +46 -102
- package/es/contextmenu/styles.js +97 -25
- package/es/contextmenu/styles.js.map +1 -1
- package/es/contextmenu/types.d.ts +21 -0
- package/es/contextmenu/types.js.map +1 -1
- package/package.json +8 -8
|
@@ -1,107 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function createElement(tag, className, styles) {
|
|
4
|
-
const element = document.createElement(tag);
|
|
5
|
-
return className && (element.className = className), styles && applyStyles(element, styles),
|
|
6
|
-
element;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function applyStyles(element, styles) {
|
|
10
|
-
Object.entries(styles).forEach((([key, value]) => {
|
|
11
|
-
element.style[key] = value;
|
|
12
|
-
}));
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function createIcon(iconName) {
|
|
16
|
-
const iconElement = createElement("span");
|
|
17
|
-
switch (iconName) {
|
|
18
|
-
case "copy":
|
|
19
|
-
iconElement.innerHTML = "📋";
|
|
20
|
-
break;
|
|
21
|
-
|
|
22
|
-
case "paste":
|
|
23
|
-
iconElement.innerHTML = "📌";
|
|
24
|
-
break;
|
|
25
|
-
|
|
26
|
-
case "cut":
|
|
27
|
-
iconElement.innerHTML = "✂️";
|
|
28
|
-
break;
|
|
29
|
-
|
|
30
|
-
case "delete":
|
|
31
|
-
iconElement.innerHTML = "🗑️";
|
|
32
|
-
break;
|
|
33
|
-
|
|
34
|
-
case "insert":
|
|
35
|
-
iconElement.innerHTML = "➕";
|
|
36
|
-
break;
|
|
37
|
-
|
|
38
|
-
case "sort":
|
|
39
|
-
iconElement.innerHTML = "🔃";
|
|
40
|
-
break;
|
|
41
|
-
|
|
42
|
-
case "protect":
|
|
43
|
-
iconElement.innerHTML = "🔒";
|
|
44
|
-
break;
|
|
45
|
-
|
|
46
|
-
case "hide":
|
|
47
|
-
iconElement.innerHTML = "👁️";
|
|
48
|
-
break;
|
|
49
|
-
|
|
50
|
-
case "freeze":
|
|
51
|
-
iconElement.innerHTML = "❄️";
|
|
52
|
-
break;
|
|
53
|
-
|
|
54
|
-
case "up-arrow":
|
|
55
|
-
iconElement.innerHTML = "🔼";
|
|
56
|
-
break;
|
|
57
|
-
|
|
58
|
-
case "down-arrow":
|
|
59
|
-
iconElement.innerHTML = "🔽";
|
|
60
|
-
break;
|
|
61
|
-
|
|
62
|
-
case "left-arrow":
|
|
63
|
-
iconElement.innerHTML = "◀️";
|
|
64
|
-
break;
|
|
65
|
-
|
|
66
|
-
case "right-arrow":
|
|
67
|
-
iconElement.innerHTML = "▶️";
|
|
68
|
-
break;
|
|
69
|
-
|
|
70
|
-
default:
|
|
71
|
-
iconElement.innerHTML = "•";
|
|
72
|
-
}
|
|
73
|
-
return applyStyles(iconElement, exports.MENU_STYLES.menuItemIcon), iconElement;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function createNumberInputItem(label, defaultValue = 1, iconName, callback) {
|
|
77
|
-
const container = createElement("div");
|
|
78
|
-
if (applyStyles(container, exports.MENU_STYLES.inputContainer), iconName) {
|
|
79
|
-
const icon = createIcon(iconName);
|
|
80
|
-
container.appendChild(icon);
|
|
81
|
-
}
|
|
82
|
-
const labelElement = createElement("label");
|
|
83
|
-
labelElement.textContent = label, applyStyles(labelElement, exports.MENU_STYLES.inputLabel),
|
|
84
|
-
container.appendChild(labelElement);
|
|
85
|
-
const input = createElement("input");
|
|
86
|
-
input.type = "number", input.min = "1", input.value = defaultValue.toString(), applyStyles(input, exports.MENU_STYLES.inputField),
|
|
87
|
-
container.appendChild(input);
|
|
88
|
-
const wrapper = createElement("div");
|
|
89
|
-
return wrapper.appendChild(container), wrapper;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
3
|
Object.defineProperty(exports, "__esModule", {
|
|
93
4
|
value: !0
|
|
94
|
-
}), exports.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
5
|
+
}), exports.normalizeClassName = exports.normalizeItemClassNameConfig = exports.createNumberInputItem = exports.createIcon = exports.applyStyles = exports.createElement = exports.mergeClasses = exports.mergeStyles = exports.sanitizeSvg = exports.MENU_CLASSES = exports.MENU_STYLES = void 0;
|
|
6
|
+
|
|
7
|
+
const vutils_1 = require("@visactor/vutils");
|
|
8
|
+
|
|
9
|
+
exports.MENU_STYLES = {
|
|
98
10
|
menuContainer: {
|
|
99
11
|
position: "absolute",
|
|
100
12
|
backgroundColor: "#ffffff",
|
|
101
13
|
boxShadow: "0 2px 10px rgba(0, 0, 0, 0.2)",
|
|
102
14
|
borderRadius: "4px",
|
|
103
15
|
padding: "5px 0",
|
|
104
|
-
zIndex:
|
|
16
|
+
zIndex: "1000",
|
|
105
17
|
minWidth: "180px",
|
|
106
18
|
maxHeight: "300px",
|
|
107
19
|
overflowY: "auto",
|
|
@@ -120,7 +32,7 @@ exports.MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu", exports.ME
|
|
|
120
32
|
backgroundColor: "#f5f5f5"
|
|
121
33
|
},
|
|
122
34
|
menuItemDisabled: {
|
|
123
|
-
opacity: .5,
|
|
35
|
+
opacity: "0.5",
|
|
124
36
|
cursor: "not-allowed"
|
|
125
37
|
},
|
|
126
38
|
menuItemSeparator: {
|
|
@@ -137,7 +49,7 @@ exports.MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu", exports.ME
|
|
|
137
49
|
justifyContent: "center"
|
|
138
50
|
},
|
|
139
51
|
menuItemText: {
|
|
140
|
-
flex: 1
|
|
52
|
+
flex: "1"
|
|
141
53
|
},
|
|
142
54
|
menuItemShortcut: {
|
|
143
55
|
marginLeft: "20px",
|
|
@@ -157,7 +69,7 @@ exports.MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu", exports.ME
|
|
|
157
69
|
boxShadow: "0 2px 10px rgba(0, 0, 0, 0.2)",
|
|
158
70
|
borderRadius: "4px",
|
|
159
71
|
padding: "5px 0",
|
|
160
|
-
zIndex: 1001,
|
|
72
|
+
zIndex: "1001",
|
|
161
73
|
minWidth: "180px",
|
|
162
74
|
fontSize: "12px"
|
|
163
75
|
},
|
|
@@ -190,6 +102,177 @@ exports.MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu", exports.ME
|
|
|
190
102
|
cursor: "pointer",
|
|
191
103
|
fontSize: "12px"
|
|
192
104
|
}
|
|
193
|
-
}, exports.
|
|
194
|
-
|
|
105
|
+
}, exports.MENU_CLASSES = {
|
|
106
|
+
menuContainer: "vtable-context-menu-container",
|
|
107
|
+
submenuContainer: "vtable-context-submenu-container",
|
|
108
|
+
menuItem: "vtable-context-menu-item",
|
|
109
|
+
menuItemSeparator: "vtable-context-menu-item-separator",
|
|
110
|
+
menuItemSubmenu: "vtable-context-menu-item-submenu",
|
|
111
|
+
menuItemDisabled: "vtable-context-menu-item-disabled"
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const DANGEROUS_SVG_ELEMENTS = new Set([ "script", "iframe", "object", "embed", "form", "input", "textarea", "select", "button" ]), DANGEROUS_ATTR_PREFIXES = [ "on" ], DANGEROUS_URL_ATTRS = new Set([ "href", "xlink:href" ]);
|
|
115
|
+
|
|
116
|
+
function sanitizeSvg(svgString) {
|
|
117
|
+
const doc = (new DOMParser).parseFromString(svgString, "image/svg+xml");
|
|
118
|
+
if (doc.querySelector("parsererror")) return "";
|
|
119
|
+
const svg = doc.documentElement;
|
|
120
|
+
if ("svg" !== svg.tagName.toLowerCase()) return "";
|
|
121
|
+
sanitizeNode(svg);
|
|
122
|
+
return (new XMLSerializer).serializeToString(svg);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function sanitizeNode(node) {
|
|
126
|
+
const children = Array.from(node.children);
|
|
127
|
+
for (const child of children) DANGEROUS_SVG_ELEMENTS.has(child.tagName.toLowerCase()) ? node.removeChild(child) : sanitizeNode(child);
|
|
128
|
+
const attrs = Array.from(node.attributes);
|
|
129
|
+
for (const attr of attrs) {
|
|
130
|
+
const name = attr.name.toLowerCase();
|
|
131
|
+
if (DANGEROUS_ATTR_PREFIXES.some((prefix => name.startsWith(prefix)))) node.removeAttribute(attr.name); else if (DANGEROUS_URL_ATTRS.has(name)) {
|
|
132
|
+
const value = attr.value.trim().toLowerCase();
|
|
133
|
+
(value.startsWith("javascript:") || value.startsWith("data:")) && node.removeAttribute(attr.name);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function mergeStyles(styles) {
|
|
139
|
+
if (!styles) return Object.assign({}, exports.MENU_STYLES);
|
|
140
|
+
const result = {};
|
|
141
|
+
for (const _key in exports.MENU_STYLES) {
|
|
142
|
+
const key = _key;
|
|
143
|
+
styles[key] ? result[key] = Object.assign(Object.assign({}, exports.MENU_STYLES[key]), styles[key]) : result[key] = Object.assign({}, exports.MENU_STYLES[key]);
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function mergeClasses(classes) {
|
|
149
|
+
if (!classes) return Object.assign({}, exports.MENU_CLASSES);
|
|
150
|
+
const result = {};
|
|
151
|
+
for (const _key in exports.MENU_CLASSES) {
|
|
152
|
+
const key = _key;
|
|
153
|
+
classes[key] ? result[key] = `${exports.MENU_CLASSES[key]} ${normalizeClassName(classes[key]).join(" ")}` : result[key] = exports.MENU_CLASSES[key];
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function createElement(tag, className, styles) {
|
|
159
|
+
const element = document.createElement(tag);
|
|
160
|
+
return className && (element.className = className), styles && applyStyles(element, styles),
|
|
161
|
+
element;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function applyStyles(element, styles) {
|
|
165
|
+
for (const key in styles) {
|
|
166
|
+
const value = styles[key];
|
|
167
|
+
void 0 !== value && (element.style[key] = value);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function createIcon(icon, menuItem, iconStyles = exports.MENU_STYLES.menuItemIcon) {
|
|
172
|
+
if ("function" == typeof icon) {
|
|
173
|
+
const element = icon(menuItem);
|
|
174
|
+
return applyStyles(element, iconStyles), element;
|
|
175
|
+
}
|
|
176
|
+
if ("object" == typeof icon && "svg" in icon) {
|
|
177
|
+
const svgConfig = icon, iconElement = createElement("span"), safeSvg = sanitizeSvg(svgConfig.svg);
|
|
178
|
+
if (safeSvg) {
|
|
179
|
+
iconElement.innerHTML = safeSvg;
|
|
180
|
+
const svgEl = iconElement.querySelector("svg");
|
|
181
|
+
svgEl && (void 0 !== svgConfig.width && svgEl.setAttribute("width", String(svgConfig.width)),
|
|
182
|
+
void 0 !== svgConfig.height && svgEl.setAttribute("height", String(svgConfig.height)));
|
|
183
|
+
}
|
|
184
|
+
return applyStyles(iconElement, iconStyles), iconElement;
|
|
185
|
+
}
|
|
186
|
+
const iconName = icon, iconElement = createElement("span");
|
|
187
|
+
switch (iconName) {
|
|
188
|
+
case "copy":
|
|
189
|
+
iconElement.innerHTML = "📋";
|
|
190
|
+
break;
|
|
191
|
+
|
|
192
|
+
case "paste":
|
|
193
|
+
iconElement.innerHTML = "📌";
|
|
194
|
+
break;
|
|
195
|
+
|
|
196
|
+
case "cut":
|
|
197
|
+
iconElement.innerHTML = "✂️";
|
|
198
|
+
break;
|
|
199
|
+
|
|
200
|
+
case "delete":
|
|
201
|
+
iconElement.innerHTML = "🗑️";
|
|
202
|
+
break;
|
|
203
|
+
|
|
204
|
+
case "insert":
|
|
205
|
+
iconElement.innerHTML = "➕";
|
|
206
|
+
break;
|
|
207
|
+
|
|
208
|
+
case "sort":
|
|
209
|
+
iconElement.innerHTML = "🔃";
|
|
210
|
+
break;
|
|
211
|
+
|
|
212
|
+
case "protect":
|
|
213
|
+
iconElement.innerHTML = "🔒";
|
|
214
|
+
break;
|
|
215
|
+
|
|
216
|
+
case "hide":
|
|
217
|
+
iconElement.innerHTML = "👁️";
|
|
218
|
+
break;
|
|
219
|
+
|
|
220
|
+
case "freeze":
|
|
221
|
+
iconElement.innerHTML = "❄️";
|
|
222
|
+
break;
|
|
223
|
+
|
|
224
|
+
case "up-arrow":
|
|
225
|
+
iconElement.innerHTML = "🔼";
|
|
226
|
+
break;
|
|
227
|
+
|
|
228
|
+
case "down-arrow":
|
|
229
|
+
iconElement.innerHTML = "🔽";
|
|
230
|
+
break;
|
|
231
|
+
|
|
232
|
+
case "left-arrow":
|
|
233
|
+
iconElement.innerHTML = "◀️";
|
|
234
|
+
break;
|
|
235
|
+
|
|
236
|
+
case "right-arrow":
|
|
237
|
+
iconElement.innerHTML = "▶️";
|
|
238
|
+
break;
|
|
239
|
+
|
|
240
|
+
default:
|
|
241
|
+
iconElement.innerHTML = "•";
|
|
242
|
+
}
|
|
243
|
+
return applyStyles(iconElement, iconStyles), iconElement;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function createNumberInputItem(label, defaultValue = 1, icon, callback, styles = exports.MENU_STYLES) {
|
|
247
|
+
const container = createElement("div");
|
|
248
|
+
if (applyStyles(container, styles.inputContainer), icon) {
|
|
249
|
+
const iconEl = createIcon(icon, void 0, styles.menuItemIcon);
|
|
250
|
+
container.appendChild(iconEl);
|
|
251
|
+
}
|
|
252
|
+
const labelElement = createElement("label");
|
|
253
|
+
labelElement.textContent = label, applyStyles(labelElement, styles.inputLabel),
|
|
254
|
+
container.appendChild(labelElement);
|
|
255
|
+
const input = createElement("input");
|
|
256
|
+
input.type = "number", input.min = "1", input.value = defaultValue.toString(), applyStyles(input, styles.inputField),
|
|
257
|
+
container.appendChild(input);
|
|
258
|
+
const wrapper = createElement("div");
|
|
259
|
+
return wrapper.appendChild(container), wrapper;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function normalizeItemClassNameConfig(classNames) {
|
|
263
|
+
const normalized = {};
|
|
264
|
+
return classNames && Object.keys(classNames).forEach((item => {
|
|
265
|
+
const className = classNames[item];
|
|
266
|
+
className && (normalized[item] = normalizeClassName(className));
|
|
267
|
+
})), normalized;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function normalizeClassName(className) {
|
|
271
|
+
return className ? (0, vutils_1.isArray)(className) ? className : className.split(" ").filter(Boolean) : [];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
exports.sanitizeSvg = sanitizeSvg, exports.mergeStyles = mergeStyles, exports.mergeClasses = mergeClasses,
|
|
275
|
+
exports.createElement = createElement, exports.applyStyles = applyStyles, exports.createIcon = createIcon,
|
|
276
|
+
exports.createNumberInputItem = createNumberInputItem, exports.normalizeItemClassNameConfig = normalizeItemClassNameConfig,
|
|
277
|
+
exports.normalizeClassName = normalizeClassName;
|
|
195
278
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contextmenu/styles.ts"],"names":[],"mappings":"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","file":"styles.js","sourcesContent":["/**\n * 右键菜单的样式定义\n */\n\nexport const MENU_CONTAINER_CLASS = 'vtable-context-menu-container';\nexport const MENU_ITEM_CLASS = 'vtable-context-menu-item';\nexport const MENU_ITEM_DISABLED_CLASS = 'vtable-context-menu-item-disabled';\nexport const MENU_ITEM_SEPARATOR_CLASS = 'vtable-context-menu-item-separator';\nexport const MENU_ITEM_SUBMENU_CLASS = 'vtable-context-menu-item-submenu';\n\nexport const MENU_STYLES = {\n menuContainer: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: 1000,\n minWidth: '180px',\n maxHeight: '300px', // 设置最大高度\n overflowY: 'auto', // 添加垂直滚动\n fontSize: '12px'\n },\n menuItem: {\n padding: '6px 20px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n },\n menuItemHover: {\n backgroundColor: '#f5f5f5'\n },\n menuItemDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed'\n },\n menuItemSeparator: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '5px 0'\n },\n menuItemIcon: {\n marginRight: '8px',\n width: '16px',\n height: '16px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n menuItemText: {\n flex: 1\n },\n menuItemShortcut: {\n marginLeft: '20px',\n color: '#999',\n fontSize: '11px'\n },\n submenuArrow: {\n marginLeft: '5px',\n fontSize: '12px',\n color: '#666'\n },\n submenuContainer: {\n position: 'absolute',\n left: '100%',\n top: '0',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: 1001,\n minWidth: '180px',\n fontSize: '12px'\n },\n inputContainer: {\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'center'\n },\n inputLabel: {\n marginRight: '8px',\n whiteSpace: 'nowrap'\n },\n inputField: {\n width: '60px',\n padding: '4px',\n border: '1px solid #ddd',\n borderRadius: '3px'\n },\n buttonContainer: {\n display: 'flex',\n justifyContent: 'flex-end',\n padding: '5px 12px'\n },\n button: {\n padding: '4px 8px',\n backgroundColor: '#1890ff',\n color: 'white',\n border: 'none',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '12px'\n }\n};\n\n/**\n * 创建DOM元素\n */\nexport function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n if (styles) {\n applyStyles(element, styles);\n }\n return element;\n}\n\n/**\n * 应用样式到元素\n */\nexport function applyStyles(element: HTMLElement, styles: Record<string, any>): void {\n Object.entries(styles).forEach(([key, value]) => {\n (element.style as any)[key] = value;\n });\n}\n\n/**\n * 创建图标元素\n */\nexport function createIcon(iconName: string): HTMLElement {\n const iconElement = createElement('span');\n\n // 根据图标名称设置不同的内容\n switch (iconName) {\n case 'copy':\n iconElement.innerHTML = '📋';\n break;\n case 'paste':\n iconElement.innerHTML = '📌';\n break;\n case 'cut':\n iconElement.innerHTML = '✂️';\n break;\n case 'delete':\n iconElement.innerHTML = '🗑️';\n break;\n case 'insert':\n iconElement.innerHTML = '➕';\n break;\n case 'sort':\n iconElement.innerHTML = '🔃';\n break;\n // case 'merge':\n // iconElement.innerHTML = ;\n // break;\n // case 'unmerge':\n // iconElement.innerHTML = ;\n // break;\n case 'protect':\n iconElement.innerHTML = '🔒';\n break;\n case 'hide':\n iconElement.innerHTML = '👁️';\n break;\n case 'freeze':\n iconElement.innerHTML = '❄️';\n break;\n case 'up-arrow':\n iconElement.innerHTML = '🔼';\n break;\n case 'down-arrow':\n iconElement.innerHTML = '🔽';\n break;\n case 'left-arrow':\n iconElement.innerHTML = '◀️';\n break;\n case 'right-arrow':\n iconElement.innerHTML = '▶️';\n break;\n default:\n iconElement.innerHTML = '•';\n }\n\n applyStyles(iconElement, MENU_STYLES.menuItemIcon);\n return iconElement;\n}\n\n/**\n * 创建带有数字输入框的菜单项\n */\nexport function createNumberInputItem(\n label: string,\n defaultValue: number = 1,\n iconName: string,\n callback: (value: number) => void\n): HTMLElement {\n // 创建容器\n const container = createElement('div');\n applyStyles(container, MENU_STYLES.inputContainer);\n\n // 创建左侧图标容器\n\n // 添加图标\n if (iconName) {\n const icon = createIcon(iconName);\n container.appendChild(icon);\n }\n // 创建标签\n const labelElement = createElement('label');\n labelElement.textContent = label;\n applyStyles(labelElement, MENU_STYLES.inputLabel);\n container.appendChild(labelElement);\n\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n input.type = 'number';\n input.min = '1';\n input.value = defaultValue.toString();\n applyStyles(input, MENU_STYLES.inputField);\n container.appendChild(input);\n // 创建包装容器\n const wrapper = createElement('div');\n wrapper.appendChild(container);\n\n return wrapper;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/contextmenu/styles.ts"],"names":[],"mappings":"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","file":"styles.js","sourcesContent":["import { isArray } from '@visactor/vutils';\n/**\n * 右键菜单的样式定义\n */\n\nimport type { ClassName, MenuItem, MenuItemClassConfig, MenuItemIcon, SvgIconConfig } from './types';\n\nexport type MenuStyleDef = { [K in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[K] };\nexport type MenuStyles = typeof MENU_STYLES;\nexport type MenuClasses = typeof MENU_CLASSES;\nexport type MenuAttributions = {\n style?: { [K in keyof MenuStyles]?: Partial<MenuStyles[K]> };\n class?: { [K in keyof MenuClasses]?: Partial<MenuClasses[K]> };\n};\n\nexport const MENU_STYLES = {\n menuContainer: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: '1000',\n minWidth: '180px',\n maxHeight: '300px', // 设置最大高度\n overflowY: 'auto', // 添加垂直滚动\n fontSize: '12px'\n } as MenuStyleDef,\n menuItem: {\n padding: '6px 20px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n } as MenuStyleDef,\n menuItemHover: {\n backgroundColor: '#f5f5f5'\n } as MenuStyleDef,\n menuItemDisabled: {\n opacity: '0.5',\n cursor: 'not-allowed'\n } as MenuStyleDef,\n menuItemSeparator: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '5px 0'\n } as MenuStyleDef,\n menuItemIcon: {\n marginRight: '8px',\n width: '16px',\n height: '16px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center'\n } as MenuStyleDef,\n menuItemText: {\n flex: '1'\n } as MenuStyleDef,\n menuItemShortcut: {\n marginLeft: '20px',\n color: '#999',\n fontSize: '11px'\n } as MenuStyleDef,\n submenuArrow: {\n marginLeft: '5px',\n fontSize: '12px',\n color: '#666'\n } as MenuStyleDef,\n submenuContainer: {\n position: 'absolute',\n left: '100%',\n top: '0',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: '1001',\n minWidth: '180px',\n fontSize: '12px'\n } as MenuStyleDef,\n inputContainer: {\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'center'\n } as MenuStyleDef,\n inputLabel: {\n marginRight: '8px',\n whiteSpace: 'nowrap'\n } as MenuStyleDef,\n inputField: {\n width: '60px',\n padding: '4px',\n border: '1px solid #ddd',\n borderRadius: '3px'\n } as MenuStyleDef,\n buttonContainer: {\n display: 'flex',\n justifyContent: 'flex-end',\n padding: '5px 12px'\n } as MenuStyleDef,\n button: {\n padding: '4px 8px',\n backgroundColor: '#1890ff',\n color: 'white',\n border: 'none',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '12px'\n } as MenuStyleDef\n};\n\nexport const MENU_CLASSES = {\n menuContainer: 'vtable-context-menu-container' as ClassName,\n submenuContainer: 'vtable-context-submenu-container' as ClassName,\n menuItem: 'vtable-context-menu-item' as ClassName,\n menuItemSeparator: 'vtable-context-menu-item-separator' as ClassName,\n menuItemSubmenu: 'vtable-context-menu-item-submenu' as ClassName,\n menuItemDisabled: 'vtable-context-menu-item-disabled' as ClassName\n};\n\n/**\n * 移除用户传入的 SVG 中可能的危险元素和属性\n */\nconst DANGEROUS_SVG_ELEMENTS = new Set([\n 'script',\n 'iframe',\n 'object',\n 'embed',\n 'form',\n 'input',\n 'textarea',\n 'select',\n 'button'\n]);\nconst DANGEROUS_ATTR_PREFIXES = ['on'];\nconst DANGEROUS_URL_ATTRS = new Set(['href', 'xlink:href']);\n\nexport function sanitizeSvg(svgString: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, 'image/svg+xml');\n const errorNode = doc.querySelector('parsererror');\n if (errorNode) {\n return '';\n }\n const svg = doc.documentElement;\n if (svg.tagName.toLowerCase() !== 'svg') {\n return '';\n }\n sanitizeNode(svg);\n const serializer = new XMLSerializer();\n return serializer.serializeToString(svg);\n}\n\nfunction sanitizeNode(node: Element): void {\n const children = Array.from(node.children);\n for (const child of children) {\n if (DANGEROUS_SVG_ELEMENTS.has(child.tagName.toLowerCase())) {\n node.removeChild(child);\n } else {\n sanitizeNode(child);\n }\n }\n\n const attrs = Array.from(node.attributes);\n for (const attr of attrs) {\n const name = attr.name.toLowerCase();\n if (DANGEROUS_ATTR_PREFIXES.some(prefix => name.startsWith(prefix))) {\n node.removeAttribute(attr.name);\n continue;\n }\n if (DANGEROUS_URL_ATTRS.has(name)) {\n const value = attr.value.trim().toLowerCase();\n if (value.startsWith('javascript:') || value.startsWith('data:')) {\n node.removeAttribute(attr.name);\n }\n }\n }\n}\n\n/**\n * 合并用户自定义样式与默认样式\n */\nexport function mergeStyles(styles?: Partial<MenuStyles>): MenuStyles {\n if (!styles) {\n return { ...MENU_STYLES };\n }\n const result: any = {};\n for (const _key in MENU_STYLES) {\n const key = _key as keyof MenuStyles;\n if (styles[key]) {\n result[key] = { ...MENU_STYLES[key], ...styles[key] };\n } else {\n result[key] = { ...MENU_STYLES[key] };\n }\n }\n return result as MenuStyles;\n}\n\n/**\n * 合并用户自定义类名与默认类名\n */\nexport function mergeClasses(classes?: Partial<MenuClasses>): MenuClasses {\n if (!classes) {\n return { ...MENU_CLASSES };\n }\n const result: any = {};\n for (const _key in MENU_CLASSES) {\n const key = _key as keyof MenuClasses;\n if (classes[key]) {\n result[key] = `${MENU_CLASSES[key]} ${normalizeClassName(classes[key]).join(' ')}`;\n } else {\n result[key] = MENU_CLASSES[key];\n }\n }\n return result as MenuClasses;\n}\n\n/**\n * 创建DOM元素\n */\nexport function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n if (styles) {\n applyStyles(element, styles);\n }\n return element;\n}\n\n/**\n * 应用样式到元素\n */\nexport function applyStyles(\n element: HTMLElement,\n styles: { [K in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[K] }\n): void {\n for (const key in styles) {\n const value = styles[key];\n if (value !== undefined) {\n element.style[key] = value;\n }\n }\n}\n\n/**\n * 创建图标元素\n */\nexport function createIcon(\n icon: MenuItemIcon,\n menuItem?: MenuItem,\n iconStyles: MenuStyleDef = MENU_STYLES.menuItemIcon\n): HTMLElement {\n // 自定义渲染\n if (typeof icon === 'function') {\n const element = icon(menuItem!);\n applyStyles(element, iconStyles);\n return element;\n }\n\n // SVG 配置\n if (typeof icon === 'object' && 'svg' in icon) {\n const svgConfig = icon as SvgIconConfig;\n const iconElement = createElement('span');\n const safeSvg = sanitizeSvg(svgConfig.svg);\n if (safeSvg) {\n iconElement.innerHTML = safeSvg;\n const svgEl = iconElement.querySelector('svg');\n if (svgEl) {\n if (svgConfig.width !== undefined) {\n svgEl.setAttribute('width', String(svgConfig.width));\n }\n if (svgConfig.height !== undefined) {\n svgEl.setAttribute('height', String(svgConfig.height));\n }\n }\n }\n applyStyles(iconElement, iconStyles);\n return iconElement;\n }\n\n const iconName = icon as string;\n const iconElement = createElement('span');\n\n switch (iconName) {\n case 'copy':\n iconElement.innerHTML = '📋';\n break;\n case 'paste':\n iconElement.innerHTML = '📌';\n break;\n case 'cut':\n iconElement.innerHTML = '✂️';\n break;\n case 'delete':\n iconElement.innerHTML = '🗑️';\n break;\n case 'insert':\n iconElement.innerHTML = '➕';\n break;\n case 'sort':\n iconElement.innerHTML = '🔃';\n break;\n // case 'merge':\n // iconElement.innerHTML = ;\n // break;\n // case 'unmerge':\n // iconElement.innerHTML = ;\n // break;\n case 'protect':\n iconElement.innerHTML = '🔒';\n break;\n case 'hide':\n iconElement.innerHTML = '👁️';\n break;\n case 'freeze':\n iconElement.innerHTML = '❄️';\n break;\n case 'up-arrow':\n iconElement.innerHTML = '🔼';\n break;\n case 'down-arrow':\n iconElement.innerHTML = '🔽';\n break;\n case 'left-arrow':\n iconElement.innerHTML = '◀️';\n break;\n case 'right-arrow':\n iconElement.innerHTML = '▶️';\n break;\n default:\n iconElement.innerHTML = '•';\n }\n\n applyStyles(iconElement, iconStyles);\n return iconElement;\n}\n\n/**\n * 创建带有数字输入框的菜单项\n */\nexport function createNumberInputItem(\n label: string,\n defaultValue: number = 1,\n icon: MenuItemIcon | undefined,\n callback: (value: number) => void,\n styles: MenuStyles = MENU_STYLES\n): HTMLElement {\n // 创建容器\n const container = createElement('div');\n applyStyles(container, styles.inputContainer);\n\n // 创建左侧图标容器\n\n // 添加图标\n if (icon) {\n const iconEl = createIcon(icon, undefined, styles.menuItemIcon);\n container.appendChild(iconEl);\n }\n // 创建标签\n const labelElement = createElement('label');\n labelElement.textContent = label;\n applyStyles(labelElement, styles.inputLabel);\n container.appendChild(labelElement);\n\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n input.type = 'number';\n input.min = '1';\n input.value = defaultValue.toString();\n applyStyles(input, styles.inputField);\n container.appendChild(input);\n // 创建包装容器\n const wrapper = createElement('div');\n wrapper.appendChild(container);\n\n return wrapper;\n}\n\n/**\n * 格式化用户传入的类名配置\n */\nexport function normalizeItemClassNameConfig(classNames?: MenuItemClassConfig) {\n const normalized: MenuItemClassConfig = {};\n if (classNames) {\n Object.keys(classNames).forEach(item => {\n const className = classNames[item as keyof MenuItemClassConfig];\n if (className) {\n normalized[item as keyof MenuItemClassConfig] = normalizeClassName(className);\n }\n });\n }\n return normalized;\n}\n\n/**\n * 格式化类名,将类名统一转为数组\n */\nexport function normalizeClassName(className: ClassName): string[] {\n if (!className) {\n return [];\n }\n return isArray(className) ? className : className.split(' ').filter(Boolean);\n}\n"]}
|
|
@@ -26,12 +26,33 @@ export declare enum MenuKey {
|
|
|
26
26
|
HIDE_COLUMN = "hide_column",
|
|
27
27
|
SORT = "sort"
|
|
28
28
|
}
|
|
29
|
+
export interface SvgIconConfig {
|
|
30
|
+
svg: string;
|
|
31
|
+
width?: number;
|
|
32
|
+
height?: number;
|
|
33
|
+
}
|
|
34
|
+
export type ClassName = string | string[];
|
|
35
|
+
export interface MenuItemClassConfig {
|
|
36
|
+
item?: ClassName;
|
|
37
|
+
itemDisabled?: ClassName;
|
|
38
|
+
leftContainer?: ClassName;
|
|
39
|
+
icon?: ClassName;
|
|
40
|
+
text?: ClassName;
|
|
41
|
+
input?: ClassName;
|
|
42
|
+
rightContainer?: ClassName;
|
|
43
|
+
arrow?: ClassName;
|
|
44
|
+
shortcut?: ClassName;
|
|
45
|
+
}
|
|
46
|
+
export type IconRenderFunction = (menuItem: MenuItem) => HTMLElement;
|
|
47
|
+
export type MenuItemIcon = string | SvgIconConfig | IconRenderFunction;
|
|
29
48
|
export interface MenuItem {
|
|
30
49
|
text: string;
|
|
31
50
|
menuKey: MenuKey | string;
|
|
32
51
|
disabled?: boolean;
|
|
33
52
|
shortcut?: string;
|
|
34
53
|
iconName?: string;
|
|
54
|
+
customIcon?: MenuItemIcon;
|
|
55
|
+
customClassName?: MenuItemClassConfig;
|
|
35
56
|
iconPlaceholder?: boolean;
|
|
36
57
|
inputDefaultValue?: number;
|
|
37
58
|
children?: (MenuItem | string)[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contextmenu/types.ts"],"names":[],"mappings":"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","file":"types.js","sourcesContent":["export interface MenuClickEventArgs {\n menuKey: MenuKey;\n menuText: string;\n rowIndex?: number;\n colIndex?: number;\n cellValue?: any;\n inputValue?: number | string;\n}\n\n/**menuKey的枚举类型 */\nexport enum MenuKey {\n /** 空白无意义的key,用于占位 */\n EMPTY = '',\n COPY = 'copy',\n CUT = 'cut',\n PASTE = 'paste',\n INSERT_COLUMN_LEFT = 'insert_column_left',\n INSERT_COLUMN_RIGHT = 'insert_column_right',\n INSERT_ROW_ABOVE = 'insert_row_above',\n INSERT_ROW_BELOW = 'insert_row_below',\n DELETE_ROW = 'delete_row',\n DELETE_COLUMN = 'delete_column',\n FREEZE_TO_THIS_ROW = 'freeze_to_this_row',\n FREEZE_TO_THIS_COLUMN = 'freeze_to_this_column',\n FREEZE_TO_THIS_ROW_AND_COLUMN = 'freeze_to_this_row_and_column',\n UNFREEZE = 'unfreeze',\n MERGE_CELLS = 'merge_cells',\n UNMERGE_CELLS = 'unmerge_cells',\n HIDE_COLUMN = 'hide_column',\n SORT = 'sort'\n}\n\nexport interface MenuItem {\n text: string;\n menuKey: MenuKey | string;\n disabled?: boolean;\n shortcut?: string;\n iconName?: string;\n iconPlaceholder?: boolean; //如果没有iconName时 是否显示占位图标位置 让他与其他有图标的item对齐\n inputDefaultValue?: number;\n children?: (MenuItem | string)[];\n}\n\nexport type MenuItemOrSeparator = MenuItem | string;\n\nconst DEFAULT_MENU_ITEMS = {\n [MenuKey.COPY]: { text: '复制', menuKey: MenuKey.COPY, iconName: 'copy', shortcut: 'Ctrl+C' },\n [MenuKey.CUT]: { text: '剪切', menuKey: MenuKey.CUT, iconName: 'cut', shortcut: 'Ctrl+X' },\n [MenuKey.PASTE]: { text: '粘贴', menuKey: MenuKey.PASTE, iconName: 'paste', shortcut: 'Ctrl+V' },\n [MenuKey.INSERT_COLUMN_LEFT]: {\n text: '向左插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_LEFT,\n iconName: 'left-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_COLUMN_RIGHT]: {\n text: '向右插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_RIGHT,\n iconName: 'right-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_ABOVE]: {\n text: '向上插入行数:',\n menuKey: MenuKey.INSERT_ROW_ABOVE,\n iconName: 'up-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_BELOW]: {\n text: '向下插入行数:',\n menuKey: MenuKey.INSERT_ROW_BELOW,\n iconName: 'down-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.DELETE_ROW]: { text: '删除行', menuKey: MenuKey.DELETE_ROW },\n [MenuKey.DELETE_COLUMN]: { text: '删除列', menuKey: MenuKey.DELETE_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW]: { text: '冻结到本行', menuKey: MenuKey.FREEZE_TO_THIS_ROW },\n [MenuKey.FREEZE_TO_THIS_COLUMN]: { text: '冻结到本列', menuKey: MenuKey.FREEZE_TO_THIS_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN]: { text: '冻结到本行本列', menuKey: MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN },\n [MenuKey.UNFREEZE]: { text: '取消冻结', menuKey: MenuKey.UNFREEZE },\n [MenuKey.MERGE_CELLS]: { text: '合并单元格', menuKey: MenuKey.MERGE_CELLS },\n [MenuKey.UNMERGE_CELLS]: { text: '取消合并单元格', menuKey: MenuKey.UNMERGE_CELLS },\n [MenuKey.HIDE_COLUMN]: { text: '隐藏列', menuKey: MenuKey.HIDE_COLUMN },\n [MenuKey.SORT]: { text: '排序', menuKey: MenuKey.SORT }\n};\n\nexport const DEFAULT_BODY_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n {\n text: '插入',\n menuKey: MenuKey.EMPTY,\n iconName: 'insert',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT]\n ]\n },\n {\n text: '删除',\n menuKey: MenuKey.EMPTY,\n iconName: 'delete',\n children: [DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW], DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]]\n },\n {\n text: '冻结',\n menuKey: MenuKey.EMPTY,\n iconName: 'freeze',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.UNFREEZE]\n ]\n },\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.MERGE_CELLS], //鼠标右键所在单元格如果未被合并,则显示合并单元格\n DEFAULT_MENU_ITEMS[MenuKey.UNMERGE_CELLS] //鼠标右键所在单元格如果被合并了,则显示取消合并单元格\n // { text: '设置保护范围', menuKey: 'set_protection', iconName: 'protect' }\n];\nexport const DEFAULT_HEADER_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\nexport const DEFAULT_COLUMN_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\n\nexport const DEFAULT_ROW_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW]\n];\n\nexport const DEFAULT_CORNER_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE]\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/contextmenu/types.ts"],"names":[],"mappings":"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","file":"types.js","sourcesContent":["export interface MenuClickEventArgs {\n menuKey: MenuKey;\n menuText: string;\n rowIndex?: number;\n colIndex?: number;\n cellValue?: any;\n inputValue?: number | string;\n}\n\n/**menuKey的枚举类型 */\nexport enum MenuKey {\n /** 空白无意义的key,用于占位 */\n EMPTY = '',\n COPY = 'copy',\n CUT = 'cut',\n PASTE = 'paste',\n INSERT_COLUMN_LEFT = 'insert_column_left',\n INSERT_COLUMN_RIGHT = 'insert_column_right',\n INSERT_ROW_ABOVE = 'insert_row_above',\n INSERT_ROW_BELOW = 'insert_row_below',\n DELETE_ROW = 'delete_row',\n DELETE_COLUMN = 'delete_column',\n FREEZE_TO_THIS_ROW = 'freeze_to_this_row',\n FREEZE_TO_THIS_COLUMN = 'freeze_to_this_column',\n FREEZE_TO_THIS_ROW_AND_COLUMN = 'freeze_to_this_row_and_column',\n UNFREEZE = 'unfreeze',\n MERGE_CELLS = 'merge_cells',\n UNMERGE_CELLS = 'unmerge_cells',\n HIDE_COLUMN = 'hide_column',\n SORT = 'sort'\n}\n\n/** SVG 图标配置 */\nexport interface SvgIconConfig {\n svg: string;\n width?: number;\n height?: number;\n}\n\nexport type ClassName = string | string[];\n\nexport interface MenuItemClassConfig {\n item?: ClassName;\n itemDisabled?: ClassName;\n leftContainer?: ClassName;\n icon?: ClassName;\n text?: ClassName;\n input?: ClassName;\n rightContainer?: ClassName;\n arrow?: ClassName;\n shortcut?: ClassName;\n}\n\n/** 自定义图标渲染函数,接收菜单项信息返回一个 HTMLElement */\nexport type IconRenderFunction = (menuItem: MenuItem) => HTMLElement;\n\n/** 菜单项图标:支持内置名称字符串 / SVG 配置 / 渲染函数 */\nexport type MenuItemIcon = string | SvgIconConfig | IconRenderFunction;\n\nexport interface MenuItem {\n text: string;\n menuKey: MenuKey | string;\n disabled?: boolean;\n shortcut?: string;\n iconName?: string;\n /** 图标:内置名称字符串 / SVG 配置 / 自定义渲染函数 */\n customIcon?: MenuItemIcon;\n customClassName?: MenuItemClassConfig;\n iconPlaceholder?: boolean; //如果没有iconName时 是否显示占位图标位置 让他与其他有图标的item对齐\n inputDefaultValue?: number;\n children?: (MenuItem | string)[];\n}\n\nexport type MenuItemOrSeparator = MenuItem | string;\n\nconst DEFAULT_MENU_ITEMS = {\n [MenuKey.COPY]: { text: '复制', menuKey: MenuKey.COPY, iconName: 'copy', shortcut: 'Ctrl+C' },\n [MenuKey.CUT]: { text: '剪切', menuKey: MenuKey.CUT, iconName: 'cut', shortcut: 'Ctrl+X' },\n [MenuKey.PASTE]: { text: '粘贴', menuKey: MenuKey.PASTE, iconName: 'paste', shortcut: 'Ctrl+V' },\n [MenuKey.INSERT_COLUMN_LEFT]: {\n text: '向左插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_LEFT,\n iconName: 'left-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_COLUMN_RIGHT]: {\n text: '向右插入列数:',\n menuKey: MenuKey.INSERT_COLUMN_RIGHT,\n iconName: 'right-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_ABOVE]: {\n text: '向上插入行数:',\n menuKey: MenuKey.INSERT_ROW_ABOVE,\n iconName: 'up-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.INSERT_ROW_BELOW]: {\n text: '向下插入行数:',\n menuKey: MenuKey.INSERT_ROW_BELOW,\n iconName: 'down-arrow',\n inputDefaultValue: 1\n },\n [MenuKey.DELETE_ROW]: { text: '删除行', menuKey: MenuKey.DELETE_ROW },\n [MenuKey.DELETE_COLUMN]: { text: '删除列', menuKey: MenuKey.DELETE_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW]: { text: '冻结到本行', menuKey: MenuKey.FREEZE_TO_THIS_ROW },\n [MenuKey.FREEZE_TO_THIS_COLUMN]: { text: '冻结到本列', menuKey: MenuKey.FREEZE_TO_THIS_COLUMN },\n [MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN]: { text: '冻结到本行本列', menuKey: MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN },\n [MenuKey.UNFREEZE]: { text: '取消冻结', menuKey: MenuKey.UNFREEZE },\n [MenuKey.MERGE_CELLS]: { text: '合并单元格', menuKey: MenuKey.MERGE_CELLS },\n [MenuKey.UNMERGE_CELLS]: { text: '取消合并单元格', menuKey: MenuKey.UNMERGE_CELLS },\n [MenuKey.HIDE_COLUMN]: { text: '隐藏列', menuKey: MenuKey.HIDE_COLUMN },\n [MenuKey.SORT]: { text: '排序', menuKey: MenuKey.SORT }\n};\n\nexport const DEFAULT_BODY_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n {\n text: '插入',\n menuKey: MenuKey.EMPTY,\n iconName: 'insert',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT]\n ]\n },\n {\n text: '删除',\n menuKey: MenuKey.EMPTY,\n iconName: 'delete',\n children: [DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW], DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]]\n },\n {\n text: '冻结',\n menuKey: MenuKey.EMPTY,\n iconName: 'freeze',\n children: [\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN],\n DEFAULT_MENU_ITEMS[MenuKey.UNFREEZE]\n ]\n },\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.MERGE_CELLS], //鼠标右键所在单元格如果未被合并,则显示合并单元格\n DEFAULT_MENU_ITEMS[MenuKey.UNMERGE_CELLS] //鼠标右键所在单元格如果被合并了,则显示取消合并单元格\n // { text: '设置保护范围', menuKey: 'set_protection', iconName: 'protect' }\n];\nexport const DEFAULT_HEADER_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\nexport const DEFAULT_COLUMN_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_LEFT],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_COLUMN_RIGHT],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_COLUMN]\n];\n\nexport const DEFAULT_ROW_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE],\n '---',\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_ABOVE],\n DEFAULT_MENU_ITEMS[MenuKey.INSERT_ROW_BELOW],\n DEFAULT_MENU_ITEMS[MenuKey.DELETE_ROW]\n];\n\nexport const DEFAULT_CORNER_SERIES_MENU_ITEMS = [\n DEFAULT_MENU_ITEMS[MenuKey.COPY],\n DEFAULT_MENU_ITEMS[MenuKey.CUT],\n DEFAULT_MENU_ITEMS[MenuKey.PASTE]\n];\n"]}
|