@visactor/vtable-plugins 1.26.1-alpha.0 → 1.26.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
package/es/context-menu.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ListTable } from '@visactor/vtable';
|
|
2
2
|
import type { pluginsDefinition } from '@visactor/vtable';
|
|
3
|
+
import type { MenuAttributions } from './contextmenu/styles';
|
|
3
4
|
import type { MenuItemOrSeparator, MenuClickEventArgs } from './contextmenu/types';
|
|
4
5
|
import { MenuKey } from './contextmenu/types';
|
|
5
6
|
export interface ContextMenuOptions {
|
|
@@ -9,6 +10,7 @@ export interface ContextMenuOptions {
|
|
|
9
10
|
rowSeriesNumberMenuItems?: MenuItemOrSeparator[];
|
|
10
11
|
headerCellMenuItems?: MenuItemOrSeparator[];
|
|
11
12
|
bodyCellMenuItems?: MenuItemOrSeparator[];
|
|
13
|
+
customMenuAttributions?: MenuAttributions;
|
|
12
14
|
menuClickCallback?: MenuClickCallback | ({
|
|
13
15
|
[key in MenuKey]?: MenuClickCallback;
|
|
14
16
|
} & {
|
package/es/context-menu.js
CHANGED
|
@@ -4,11 +4,13 @@ import { MenuManager } from "./contextmenu/menu-manager";
|
|
|
4
4
|
|
|
5
5
|
import { MenuHandler } from "./contextmenu/handle-menu-helper";
|
|
6
6
|
|
|
7
|
+
import { mergeClasses, mergeStyles } from "./contextmenu/styles";
|
|
8
|
+
|
|
7
9
|
import { DEFAULT_BODY_MENU_ITEMS, DEFAULT_COLUMN_SERIES_MENU_ITEMS, DEFAULT_CORNER_SERIES_MENU_ITEMS, DEFAULT_HEADER_MENU_ITEMS, DEFAULT_ROW_SERIES_MENU_ITEMS, MenuKey } from "./contextmenu/types";
|
|
8
10
|
|
|
9
11
|
export class ContextMenuPlugin {
|
|
10
12
|
constructor(pluginOptions = {}) {
|
|
11
|
-
var _a;
|
|
13
|
+
var _a, _b, _c;
|
|
12
14
|
this.id = "context-menu", this.name = "Context Menu", this.runTime = [ TABLE_EVENT_TYPE.CONTEXTMENU_CELL, TABLE_EVENT_TYPE.PLUGIN_EVENT ],
|
|
13
15
|
this.handleContextMenuCell = (eventArgs, table) => {
|
|
14
16
|
const {col: col, row: row} = eventArgs, mouseX = eventArgs.event.clientX, mouseY = eventArgs.event.clientY, isSeriesNumberCol = table.isSeriesNumber(col, row);
|
|
@@ -31,7 +33,8 @@ export class ContextMenuPlugin {
|
|
|
31
33
|
}, this.handleMenuClickCallback = (args, table) => {
|
|
32
34
|
"function" == typeof this.pluginOptions.menuClickCallback ? this.pluginOptions.menuClickCallback(args, table) : this.handleMenuClick(args, table);
|
|
33
35
|
}, this.id = null !== (_a = pluginOptions.id) && void 0 !== _a ? _a : this.id, this.pluginOptions = pluginOptions,
|
|
34
|
-
this.menuManager = new MenuManager
|
|
36
|
+
this.menuManager = new MenuManager(mergeStyles(null === (_b = pluginOptions.customMenuAttributions) || void 0 === _b ? void 0 : _b.style), mergeClasses(null === (_c = pluginOptions.customMenuAttributions) || void 0 === _c ? void 0 : _c.class)),
|
|
37
|
+
this.menuHandler = new MenuHandler, this.initDefaultMenuItems();
|
|
35
38
|
}
|
|
36
39
|
initDefaultMenuItems() {
|
|
37
40
|
this.pluginOptions.columnSeriesNumberMenuItems || (this.pluginOptions.columnSeriesNumberMenuItems = DEFAULT_COLUMN_SERIES_MENU_ITEMS),
|
package/es/context-menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context-menu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,gCAAgC,EAChC,yBAAyB,EACzB,6BAA6B,EAC7B,OAAO,EACR,MAAM,qBAAqB,CAAC;AAsC7B,MAAM,OAAO,iBAAiB;IAW5B,YAAY,gBAAoC,EAAE;;QAVlD,OAAE,GAAG,cAAc,CAAC;QACpB,SAAI,GAAG,cAAc,CAAC;QACtB,YAAO,GAAG,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAgDrE,0BAAqB,GAAG,CAAC,SAAc,EAAE,KAAmB,EAAQ,EAAE;YAE5E,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;YAG/B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YACvC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YAGvC,MAAM,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAGzD,IAAI,SAAS,GAA0B,EAAE,CAAC;YAE1C,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;gBAC5B,IAAI,iBAAiB,EAAE;oBACrB,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,2BAA2B,IAAI,EAAE,CAAC;iBAClE;qBAAM;oBACL,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,IAAI,EAAE,CAAC;iBAC1D;aACF;iBAAM;gBACL,IAAI,iBAAiB,EAAE;oBACrB,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,IAAI,EAAE,CAAC;iBAC/D;qBAAM;oBACL,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,EAAE,CAAC;iBACxD;aACF;YAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAExB,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC/C,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;oBAE1F,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;iBAClG;qBAAM;oBAEL,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC;iBACpG;gBAGD,IAAI,IAAI,CAAC,aAAa,CAAC,yBAAyB,EAAE;oBAChD,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,SAAS,EAAE,KAAkB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;iBACnG;gBAGD,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aAC3D;QACH,CAAC,CAAC;QAKM,sBAAiB,GAAG,CAAC,SAAc,EAAE,KAAmB,EAAQ,EAAE;YACxE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,eAAe,CAAC;YAC9E,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,CAAC;YAG7C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YACvC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;YAEvC,IAAI,mBAAmB,CAAC,EAAE,KAAK,qBAAqB,IAAI,SAAS,KAAK,YAAY,EAAE;gBAClF,IAAI,SAAS,GAA0B,EAAE,CAAC;gBAE1C,IAAI,QAAQ,EAAE;oBACZ,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,2BAA2B,IAAI,EAAE,CAAC;iBAClE;qBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;oBACjC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,wBAAwB,IAAI,EAAE,CAAC;iBAC/D;qBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;oBACjC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,2BAA2B,IAAI,EAAE,CAAC;iBAClE;gBAGD,IAAI,IAAI,CAAC,aAAa,CAAC,yBAAyB,EAAE;oBAChD,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,SAAS,EAAE,KAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;iBAC7G;gBAGD,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;aACrE;QACH,CAAC,CAAC;QAyBM,4BAAuB,GAAG,CAAC,IAAwB,EAAE,KAAgB,EAAE,EAAE;YAC/E,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,KAAK,UAAU,EAAE;gBAC9D,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACnD;iBAAM;gBAEL,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACnC;QACH,CAAC,CAAC;QAtJA,IAAI,CAAC,EAAE,GAAG,MAAA,aAAa,CAAC,EAAE,mCAAI,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAKO,oBAAoB;QAE1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,2BAA2B,EAAE;YACnD,IAAI,CAAC,aAAa,CAAC,2BAA2B,GAAG,gCAAgC,CAAC;SACnF;QAGD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE;YAChD,IAAI,CAAC,aAAa,CAAC,wBAAwB,GAAG,6BAA6B,CAAC;SAC7E;QAGD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,2BAA2B,EAAE;YACnD,IAAI,CAAC,aAAa,CAAC,2BAA2B,GAAG,gCAAgC,CAAC;SACnF;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,mBAAmB,GAAG,yBAAyB,CAAC;SACpE;QAGD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,iBAAiB,GAAG,uBAAuB,CAAC;SAChE;IACH,CAAC;IAyFD,GAAG,CAAC,GAAG,IAAW;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAiB,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAkB,CAAC;QAGhC,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAGjC,IAAI,OAAO,KAAK,gBAAgB,CAAC,gBAAgB,EAAE;YACjD,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;SAC9C;aAAM,IAAI,OAAO,KAAK,gBAAgB,CAAC,YAAY,EAAE;YACpD,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;SAC1C;IACH,CAAC;IAcO,eAAe,CAAC,SAAgC,EAAE,CAAS,EAAE,CAAS,EAAE,GAAW,EAAE,GAAW;QAEtG,IAAI,CAAC,WAAW,CAAC,QAAQ,CACvB,SAAS,EACT,CAAC,EACD,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,GAAG;SACd,EACD,IAAI,CAAC,KAAK,CACX,CAAC;QAGF,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClE,CAAC;IAKO,eAAe,CAAC,IAAwB,EAAE,KAAgB;QAChE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;QAC7D,IACE,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,KAAK,QAAQ;YACxD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAkB,CAAC,EACxD;YACA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACvE;aAAM;YAEL,QAAQ,OAAO,EAAE;gBACf,KAAK,OAAO,CAAC,IAAI;oBACf,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAEnC,MAAM;gBACR,KAAK,OAAO,CAAC,GAAG;oBACd,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAElC,MAAM;gBACR,KAAK,OAAO,CAAC,KAAK;oBAChB,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,OAAO,CAAC,gBAAgB;oBAC3B,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAoB,CAAC,CAAC;oBAC7E,MAAM;gBACR,KAAK,OAAO,CAAC,gBAAgB;oBAC3B,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAoB,CAAC,CAAC;oBAC7E,MAAM;gBACR,KAAK,OAAO,CAAC,kBAAkB;oBAC7B,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAoB,CAAC,CAAC;oBAC/E,MAAM;gBACR,KAAK,OAAO,CAAC,mBAAmB;oBAC9B,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAoB,CAAC,CAAC;oBAChF,MAAM;gBACR,KAAK,OAAO,CAAC,UAAU;oBACrB,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;oBACxC,MAAM;gBACR,KAAK,OAAO,CAAC,aAAa;oBACxB,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACrD,MAAM;gBACR,KAAK,OAAO,CAAC,WAAW;oBACtB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACnD,MAAM;gBACR,KAAK,OAAO,CAAC,IAAI;oBACf,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAC7C,MAAM;gBACR,KAAK,OAAO,CAAC,WAAW;oBACtB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACzC,MAAM;gBACR,KAAK,OAAO,CAAC,aAAa;oBACxB,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAC3C,MAAM;gBAIR,KAAK,OAAO,CAAC,kBAAkB;oBAC7B,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACpD,MAAM;gBACR,KAAK,OAAO,CAAC,qBAAqB;oBAChC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBACvD,MAAM;gBACR,KAAK,OAAO,CAAC,6BAA6B;oBACxC,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACvE,MAAM;gBACR,KAAK,OAAO,CAAC,QAAQ;oBACnB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;oBACvC,MAAM;gBACR;oBACE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;aAClC;SACF;IACH,CAAC;IAKD,OAAO;QACL,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACzB;QAED,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACzB;IACH,CAAC;CACF","file":"context-menu.js","sourcesContent":["import type { ListTable, BaseTableAPI } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { pluginsDefinition } from '@visactor/vtable';\nimport { MenuManager } from './contextmenu/menu-manager';\nimport { MenuHandler } from './contextmenu/handle-menu-helper';\nimport type { MenuItemOrSeparator, MenuClickEventArgs } from './contextmenu/types';\nimport {\n DEFAULT_BODY_MENU_ITEMS,\n DEFAULT_COLUMN_SERIES_MENU_ITEMS,\n DEFAULT_CORNER_SERIES_MENU_ITEMS,\n DEFAULT_HEADER_MENU_ITEMS,\n DEFAULT_ROW_SERIES_MENU_ITEMS,\n MenuKey\n} from './contextmenu/types';\n\n/**\n * 右键菜单插件选项\n */\nexport interface ContextMenuOptions {\n id?: string;\n cornerSeriesNumberMenuItems?: MenuItemOrSeparator[];\n /** 列序号列菜单项 */\n columnSeriesNumberMenuItems?: MenuItemOrSeparator[];\n /** 行序号列菜单项 */\n rowSeriesNumberMenuItems?: MenuItemOrSeparator[];\n /** 表头菜单项 */\n headerCellMenuItems?: MenuItemOrSeparator[];\n /** 表体菜单项 */\n bodyCellMenuItems?: MenuItemOrSeparator[];\n /** 菜单点击回调。如果设置是函数,则忽略内部默认的菜单项处理逻辑。如果这里配置的是个对象(对象的key为menuKey),则有匹配的menuKey时忽略内部默认的菜单项处理逻辑,\n * 以这里配置的为准 ,没有匹配的menuKey时,则使用内部默认的菜单项处理逻辑。*/\n menuClickCallback?:\n | MenuClickCallback\n | ({\n [key in MenuKey]?: MenuClickCallback;\n } & {\n [key: string]: MenuClickCallback | undefined;\n });\n\n beforeShowAdjustMenuItems?: (\n menuItems: MenuItemOrSeparator[],\n table: ListTable,\n col: number,\n row: number\n ) => MenuItemOrSeparator[];\n}\n\nexport type MenuClickCallback = (args: MenuClickEventArgs, table: ListTable) => void;\n/**\n * 右键菜单插件\n */\nexport class ContextMenuPlugin implements pluginsDefinition.IVTablePlugin {\n id = `context-menu`;\n name = 'Context Menu';\n runTime = [TABLE_EVENT_TYPE.CONTEXTMENU_CELL, TABLE_EVENT_TYPE.PLUGIN_EVENT];\n pluginOptions: ContextMenuOptions;\n table: ListTable;\n /** 菜单管理器 */\n private menuManager: MenuManager;\n /** 菜单处理器 */\n private menuHandler: MenuHandler;\n\n constructor(pluginOptions: ContextMenuOptions = {}) {\n this.id = pluginOptions.id ?? this.id;\n this.pluginOptions = pluginOptions;\n this.menuManager = new MenuManager();\n this.menuHandler = new MenuHandler();\n this.initDefaultMenuItems();\n }\n\n /**\n * 初始化默认菜单项\n */\n private initDefaultMenuItems(): void {\n // 表头序号列菜单项\n if (!this.pluginOptions.columnSeriesNumberMenuItems) {\n this.pluginOptions.columnSeriesNumberMenuItems = DEFAULT_COLUMN_SERIES_MENU_ITEMS;\n }\n\n // 表头序号列菜单项\n if (!this.pluginOptions.rowSeriesNumberMenuItems) {\n this.pluginOptions.rowSeriesNumberMenuItems = DEFAULT_ROW_SERIES_MENU_ITEMS;\n }\n\n // 表头序号列菜单项\n if (!this.pluginOptions.cornerSeriesNumberMenuItems) {\n this.pluginOptions.cornerSeriesNumberMenuItems = DEFAULT_CORNER_SERIES_MENU_ITEMS;\n }\n // 表头菜单项\n if (!this.pluginOptions.headerCellMenuItems) {\n this.pluginOptions.headerCellMenuItems = DEFAULT_HEADER_MENU_ITEMS;\n }\n\n // 表体菜单项\n if (!this.pluginOptions.bodyCellMenuItems) {\n this.pluginOptions.bodyCellMenuItems = DEFAULT_BODY_MENU_ITEMS;\n }\n }\n\n /**\n * 处理单元格右键菜单事件\n */\n private handleContextMenuCell = (eventArgs: any, table: BaseTableAPI): void => {\n // 获取单元格信息\n const { col, row } = eventArgs;\n\n // 获取鼠标位置\n const mouseX = eventArgs.event.clientX;\n const mouseY = eventArgs.event.clientY;\n\n // 判断是否为序号列\n const isSeriesNumberCol = table.isSeriesNumber(col, row);\n\n // 根据不同位置显示不同的右键菜单\n let menuItems: MenuItemOrSeparator[] = [];\n\n if (table.isHeader(col, row)) {\n if (isSeriesNumberCol) {\n menuItems = this.pluginOptions.columnSeriesNumberMenuItems || [];\n } else {\n menuItems = this.pluginOptions.headerCellMenuItems || [];\n }\n } else {\n if (isSeriesNumberCol) {\n menuItems = this.pluginOptions.rowSeriesNumberMenuItems || [];\n } else {\n menuItems = this.pluginOptions.bodyCellMenuItems || [];\n }\n }\n\n if (menuItems.length > 0) {\n // 处理合并/取消合并菜单项\n const cellRange = table.getCellRange(col, row);\n if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {\n // 如果单元格被合并,则显示取消合并单元格选项\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'merge_cells');\n } else {\n // 如果单元格未被合并,则显示合并单元格选项\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'unmerge_cells');\n }\n\n // 调整菜单项\n if (this.pluginOptions.beforeShowAdjustMenuItems) {\n menuItems = this.pluginOptions.beforeShowAdjustMenuItems(menuItems, table as ListTable, col, row);\n }\n\n // 显示右键菜单\n this.showContextMenu(menuItems, mouseX, mouseY, col, row);\n }\n };\n\n /**\n * 处理插件事件\n */\n private handlePluginEvent = (eventArgs: any, table: BaseTableAPI): void => {\n const { eventType, rowIndex, colIndex, isCorner } = eventArgs.pluginEventInfo;\n const fireEventFromPlugin = eventArgs.plugin;\n\n // 获取鼠标位置\n const mouseX = eventArgs.event.clientX;\n const mouseY = eventArgs.event.clientY;\n\n if (fireEventFromPlugin.id === 'table-series-number' && eventType === 'rightclick') {\n let menuItems: MenuItemOrSeparator[] = [];\n\n if (isCorner) {\n menuItems = this.pluginOptions.cornerSeriesNumberMenuItems || [];\n } else if (rowIndex !== undefined) {\n menuItems = this.pluginOptions.rowSeriesNumberMenuItems || [];\n } else if (colIndex !== undefined) {\n menuItems = this.pluginOptions.columnSeriesNumberMenuItems || [];\n }\n\n // 调整菜单项\n if (this.pluginOptions.beforeShowAdjustMenuItems) {\n menuItems = this.pluginOptions.beforeShowAdjustMenuItems(menuItems, table as ListTable, colIndex, rowIndex);\n }\n\n // 显示右键菜单\n this.showContextMenu(menuItems, mouseX, mouseY, colIndex, rowIndex);\n }\n };\n\n /**\n * 运行插件\n */\n run(...args: any[]) {\n const eventArgs = args[0];\n const runTime = args[1];\n const table: BaseTableAPI = args[2];\n this.table = table as ListTable;\n\n // 阻止默认右键菜单\n eventArgs.event.preventDefault();\n\n // 根据事件类型处理不同的右键菜单\n if (runTime === TABLE_EVENT_TYPE.CONTEXTMENU_CELL) {\n this.handleContextMenuCell(eventArgs, table);\n } else if (runTime === TABLE_EVENT_TYPE.PLUGIN_EVENT) {\n this.handlePluginEvent(eventArgs, table);\n }\n }\n\n /**\n * 显示右键菜单\n */\n private handleMenuClickCallback = (args: MenuClickEventArgs, table: ListTable) => {\n if (typeof this.pluginOptions.menuClickCallback === 'function') {\n this.pluginOptions.menuClickCallback(args, table);\n } else {\n // 菜单项处理逻辑\n this.handleMenuClick(args, table);\n }\n };\n\n private showContextMenu(menuItems: MenuItemOrSeparator[], x: number, y: number, col: number, row: number): void {\n // 显示菜单\n this.menuManager.showMenu(\n menuItems,\n x,\n y,\n {\n rowIndex: row,\n colIndex: col\n },\n this.table\n );\n\n // 设置菜单点击回调\n this.menuManager.setClickCallback(this.handleMenuClickCallback);\n }\n\n /**\n * 处理菜单点击事件\n */\n private handleMenuClick(args: MenuClickEventArgs, table: ListTable): void {\n const { menuKey, rowIndex, colIndex, inputValue = 1 } = args;\n if (\n typeof this.pluginOptions.menuClickCallback === 'object' &&\n this.pluginOptions.menuClickCallback[menuKey as MenuKey]\n ) {\n this.pluginOptions.menuClickCallback[menuKey as MenuKey](args, table);\n } else {\n // 根据菜单项key执行对应操作\n switch (menuKey) {\n case MenuKey.COPY:\n this.menuHandler.handleCopy(table);\n\n break;\n case MenuKey.CUT:\n this.menuHandler.handleCut(table);\n\n break;\n case MenuKey.PASTE:\n this.menuHandler.handlePaste(table);\n break;\n case MenuKey.INSERT_ROW_ABOVE:\n this.menuHandler.handleInsertRowAbove(table, rowIndex, inputValue as number);\n break;\n case MenuKey.INSERT_ROW_BELOW:\n this.menuHandler.handleInsertRowBelow(table, rowIndex, inputValue as number);\n break;\n case MenuKey.INSERT_COLUMN_LEFT:\n this.menuHandler.handleInsertColumnLeft(table, colIndex, inputValue as number);\n break;\n case MenuKey.INSERT_COLUMN_RIGHT:\n this.menuHandler.handleInsertColumnRight(table, colIndex, inputValue as number);\n break;\n case MenuKey.DELETE_ROW:\n this.menuHandler.handleDeleteRow(table);\n break;\n case MenuKey.DELETE_COLUMN:\n this.menuHandler.handleDeleteColumn(table, colIndex);\n break;\n case MenuKey.HIDE_COLUMN:\n this.menuHandler.handleHideColumn(table, colIndex);\n break;\n case MenuKey.SORT:\n this.menuHandler.handleSort(table, colIndex);\n break;\n case MenuKey.MERGE_CELLS:\n this.menuHandler.handleMergeCells(table);\n break;\n case MenuKey.UNMERGE_CELLS:\n this.menuHandler.handleUnmergeCells(table);\n break;\n // case MenuKey.SET_PROTECTION:\n // this.menuHandler.handleSetProtection(table);\n // break;\n case MenuKey.FREEZE_TO_THIS_ROW:\n this.menuHandler.handleFreezeToRow(table, rowIndex);\n break;\n case MenuKey.FREEZE_TO_THIS_COLUMN:\n this.menuHandler.handleFreezeToColumn(table, colIndex);\n break;\n case MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN:\n this.menuHandler.handleFreezeToRowAndColumn(table, rowIndex, colIndex);\n break;\n case MenuKey.UNFREEZE:\n this.menuHandler.handleUnfreeze(table);\n break;\n default:\n console.log('未处理的菜单点击:', args);\n }\n }\n }\n\n /**\n * 释放资源\n */\n release(): void {\n if (this.menuManager) {\n this.menuManager.release();\n this.menuManager = null;\n }\n\n if (this.menuHandler) {\n this.menuHandler.release();\n this.menuHandler = null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/context-menu.ts"],"names":[],"mappings":"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","file":"context-menu.js","sourcesContent":["import type { ListTable, BaseTableAPI } from '@visactor/vtable';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { pluginsDefinition } from '@visactor/vtable';\nimport { MenuManager } from './contextmenu/menu-manager';\nimport { MenuHandler } from './contextmenu/handle-menu-helper';\nimport { mergeClasses, mergeStyles } from './contextmenu/styles';\nimport type { MenuAttributions } from './contextmenu/styles';\nimport type { MenuItemOrSeparator, MenuClickEventArgs } from './contextmenu/types';\nimport {\n DEFAULT_BODY_MENU_ITEMS,\n DEFAULT_COLUMN_SERIES_MENU_ITEMS,\n DEFAULT_CORNER_SERIES_MENU_ITEMS,\n DEFAULT_HEADER_MENU_ITEMS,\n DEFAULT_ROW_SERIES_MENU_ITEMS,\n MenuKey\n} from './contextmenu/types';\n\n/**\n * 右键菜单插件选项\n */\nexport interface ContextMenuOptions {\n id?: string;\n cornerSeriesNumberMenuItems?: MenuItemOrSeparator[];\n /** 列序号列菜单项 */\n columnSeriesNumberMenuItems?: MenuItemOrSeparator[];\n /** 行序号列菜单项 */\n rowSeriesNumberMenuItems?: MenuItemOrSeparator[];\n /** 表头菜单项 */\n headerCellMenuItems?: MenuItemOrSeparator[];\n /** 表体菜单项 */\n bodyCellMenuItems?: MenuItemOrSeparator[];\n /** 自定义菜单样式 */\n customMenuAttributions?: MenuAttributions;\n /** 菜单点击回调。如果设置是函数,则忽略内部默认的菜单项处理逻辑。如果这里配置的是个对象(对象的key为menuKey),则有匹配的menuKey时忽略内部默认的菜单项处理逻辑,\n * 以这里配置的为准 ,没有匹配的menuKey时,则使用内部默认的菜单项处理逻辑。*/\n menuClickCallback?:\n | MenuClickCallback\n | ({\n [key in MenuKey]?: MenuClickCallback;\n } & {\n [key: string]: MenuClickCallback | undefined;\n });\n\n beforeShowAdjustMenuItems?: (\n menuItems: MenuItemOrSeparator[],\n table: ListTable,\n col: number,\n row: number\n ) => MenuItemOrSeparator[];\n}\n\nexport type MenuClickCallback = (args: MenuClickEventArgs, table: ListTable) => void;\n/**\n * 右键菜单插件\n */\nexport class ContextMenuPlugin implements pluginsDefinition.IVTablePlugin {\n id = `context-menu`;\n name = 'Context Menu';\n runTime = [TABLE_EVENT_TYPE.CONTEXTMENU_CELL, TABLE_EVENT_TYPE.PLUGIN_EVENT];\n pluginOptions: ContextMenuOptions;\n table: ListTable;\n /** 菜单管理器 */\n private menuManager: MenuManager;\n /** 菜单处理器 */\n private menuHandler: MenuHandler;\n\n constructor(pluginOptions: ContextMenuOptions = {}) {\n this.id = pluginOptions.id ?? this.id;\n this.pluginOptions = pluginOptions;\n this.menuManager = new MenuManager(\n mergeStyles(pluginOptions.customMenuAttributions?.style),\n mergeClasses(pluginOptions.customMenuAttributions?.class)\n );\n this.menuHandler = new MenuHandler();\n this.initDefaultMenuItems();\n }\n\n /**\n * 初始化默认菜单项\n */\n private initDefaultMenuItems(): void {\n // 表头序号列菜单项\n if (!this.pluginOptions.columnSeriesNumberMenuItems) {\n this.pluginOptions.columnSeriesNumberMenuItems = DEFAULT_COLUMN_SERIES_MENU_ITEMS;\n }\n\n // 表头序号列菜单项\n if (!this.pluginOptions.rowSeriesNumberMenuItems) {\n this.pluginOptions.rowSeriesNumberMenuItems = DEFAULT_ROW_SERIES_MENU_ITEMS;\n }\n\n // 表头序号列菜单项\n if (!this.pluginOptions.cornerSeriesNumberMenuItems) {\n this.pluginOptions.cornerSeriesNumberMenuItems = DEFAULT_CORNER_SERIES_MENU_ITEMS;\n }\n // 表头菜单项\n if (!this.pluginOptions.headerCellMenuItems) {\n this.pluginOptions.headerCellMenuItems = DEFAULT_HEADER_MENU_ITEMS;\n }\n\n // 表体菜单项\n if (!this.pluginOptions.bodyCellMenuItems) {\n this.pluginOptions.bodyCellMenuItems = DEFAULT_BODY_MENU_ITEMS;\n }\n }\n\n /**\n * 处理单元格右键菜单事件\n */\n private handleContextMenuCell = (eventArgs: any, table: BaseTableAPI): void => {\n // 获取单元格信息\n const { col, row } = eventArgs;\n\n // 获取鼠标位置\n const mouseX = eventArgs.event.clientX;\n const mouseY = eventArgs.event.clientY;\n\n // 判断是否为序号列\n const isSeriesNumberCol = table.isSeriesNumber(col, row);\n\n // 根据不同位置显示不同的右键菜单\n let menuItems: MenuItemOrSeparator[] = [];\n\n if (table.isHeader(col, row)) {\n if (isSeriesNumberCol) {\n menuItems = this.pluginOptions.columnSeriesNumberMenuItems || [];\n } else {\n menuItems = this.pluginOptions.headerCellMenuItems || [];\n }\n } else {\n if (isSeriesNumberCol) {\n menuItems = this.pluginOptions.rowSeriesNumberMenuItems || [];\n } else {\n menuItems = this.pluginOptions.bodyCellMenuItems || [];\n }\n }\n\n if (menuItems.length > 0) {\n // 处理合并/取消合并菜单项\n const cellRange = table.getCellRange(col, row);\n if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {\n // 如果单元格被合并,则显示取消合并单元格选项\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'merge_cells');\n } else {\n // 如果单元格未被合并,则显示合并单元格选项\n menuItems = menuItems.filter(item => typeof item === 'string' || item.menuKey !== 'unmerge_cells');\n }\n\n // 调整菜单项\n if (this.pluginOptions.beforeShowAdjustMenuItems) {\n menuItems = this.pluginOptions.beforeShowAdjustMenuItems(menuItems, table as ListTable, col, row);\n }\n\n // 显示右键菜单\n this.showContextMenu(menuItems, mouseX, mouseY, col, row);\n }\n };\n\n /**\n * 处理插件事件\n */\n private handlePluginEvent = (eventArgs: any, table: BaseTableAPI): void => {\n const { eventType, rowIndex, colIndex, isCorner } = eventArgs.pluginEventInfo;\n const fireEventFromPlugin = eventArgs.plugin;\n\n // 获取鼠标位置\n const mouseX = eventArgs.event.clientX;\n const mouseY = eventArgs.event.clientY;\n\n if (fireEventFromPlugin.id === 'table-series-number' && eventType === 'rightclick') {\n let menuItems: MenuItemOrSeparator[] = [];\n\n if (isCorner) {\n menuItems = this.pluginOptions.cornerSeriesNumberMenuItems || [];\n } else if (rowIndex !== undefined) {\n menuItems = this.pluginOptions.rowSeriesNumberMenuItems || [];\n } else if (colIndex !== undefined) {\n menuItems = this.pluginOptions.columnSeriesNumberMenuItems || [];\n }\n\n // 调整菜单项\n if (this.pluginOptions.beforeShowAdjustMenuItems) {\n menuItems = this.pluginOptions.beforeShowAdjustMenuItems(menuItems, table as ListTable, colIndex, rowIndex);\n }\n\n // 显示右键菜单\n this.showContextMenu(menuItems, mouseX, mouseY, colIndex, rowIndex);\n }\n };\n\n /**\n * 运行插件\n */\n run(...args: any[]) {\n const eventArgs = args[0];\n const runTime = args[1];\n const table: BaseTableAPI = args[2];\n this.table = table as ListTable;\n\n // 阻止默认右键菜单\n eventArgs.event.preventDefault();\n\n // 根据事件类型处理不同的右键菜单\n if (runTime === TABLE_EVENT_TYPE.CONTEXTMENU_CELL) {\n this.handleContextMenuCell(eventArgs, table);\n } else if (runTime === TABLE_EVENT_TYPE.PLUGIN_EVENT) {\n this.handlePluginEvent(eventArgs, table);\n }\n }\n\n /**\n * 显示右键菜单\n */\n private handleMenuClickCallback = (args: MenuClickEventArgs, table: ListTable) => {\n if (typeof this.pluginOptions.menuClickCallback === 'function') {\n this.pluginOptions.menuClickCallback(args, table);\n } else {\n // 菜单项处理逻辑\n this.handleMenuClick(args, table);\n }\n };\n\n private showContextMenu(menuItems: MenuItemOrSeparator[], x: number, y: number, col: number, row: number): void {\n // 显示菜单\n this.menuManager.showMenu(\n menuItems,\n x,\n y,\n {\n rowIndex: row,\n colIndex: col\n },\n this.table\n );\n\n // 设置菜单点击回调\n this.menuManager.setClickCallback(this.handleMenuClickCallback);\n }\n\n /**\n * 处理菜单点击事件\n */\n private handleMenuClick(args: MenuClickEventArgs, table: ListTable): void {\n const { menuKey, rowIndex, colIndex, inputValue = 1 } = args;\n if (\n typeof this.pluginOptions.menuClickCallback === 'object' &&\n this.pluginOptions.menuClickCallback[menuKey as MenuKey]\n ) {\n this.pluginOptions.menuClickCallback[menuKey as MenuKey](args, table);\n } else {\n // 根据菜单项key执行对应操作\n switch (menuKey) {\n case MenuKey.COPY:\n this.menuHandler.handleCopy(table);\n\n break;\n case MenuKey.CUT:\n this.menuHandler.handleCut(table);\n\n break;\n case MenuKey.PASTE:\n this.menuHandler.handlePaste(table);\n break;\n case MenuKey.INSERT_ROW_ABOVE:\n this.menuHandler.handleInsertRowAbove(table, rowIndex, inputValue as number);\n break;\n case MenuKey.INSERT_ROW_BELOW:\n this.menuHandler.handleInsertRowBelow(table, rowIndex, inputValue as number);\n break;\n case MenuKey.INSERT_COLUMN_LEFT:\n this.menuHandler.handleInsertColumnLeft(table, colIndex, inputValue as number);\n break;\n case MenuKey.INSERT_COLUMN_RIGHT:\n this.menuHandler.handleInsertColumnRight(table, colIndex, inputValue as number);\n break;\n case MenuKey.DELETE_ROW:\n this.menuHandler.handleDeleteRow(table);\n break;\n case MenuKey.DELETE_COLUMN:\n this.menuHandler.handleDeleteColumn(table, colIndex);\n break;\n case MenuKey.HIDE_COLUMN:\n this.menuHandler.handleHideColumn(table, colIndex);\n break;\n case MenuKey.SORT:\n this.menuHandler.handleSort(table, colIndex);\n break;\n case MenuKey.MERGE_CELLS:\n this.menuHandler.handleMergeCells(table);\n break;\n case MenuKey.UNMERGE_CELLS:\n this.menuHandler.handleUnmergeCells(table);\n break;\n // case MenuKey.SET_PROTECTION:\n // this.menuHandler.handleSetProtection(table);\n // break;\n case MenuKey.FREEZE_TO_THIS_ROW:\n this.menuHandler.handleFreezeToRow(table, rowIndex);\n break;\n case MenuKey.FREEZE_TO_THIS_COLUMN:\n this.menuHandler.handleFreezeToColumn(table, colIndex);\n break;\n case MenuKey.FREEZE_TO_THIS_ROW_AND_COLUMN:\n this.menuHandler.handleFreezeToRowAndColumn(table, rowIndex, colIndex);\n break;\n case MenuKey.UNFREEZE:\n this.menuHandler.handleUnfreeze(table);\n break;\n default:\n console.log('未处理的菜单点击:', args);\n }\n }\n }\n\n /**\n * 释放资源\n */\n release(): void {\n if (this.menuManager) {\n this.menuManager.release();\n this.menuManager = null;\n }\n\n if (this.menuHandler) {\n this.menuHandler.release();\n this.menuHandler = null;\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ListTable } from '@visactor/vtable';
|
|
2
|
+
import type { MenuClasses, MenuStyles } from './styles';
|
|
2
3
|
import type { MenuItemOrSeparator } from './types';
|
|
3
4
|
interface MenuContext {
|
|
4
5
|
rowIndex?: number;
|
|
@@ -15,6 +16,9 @@ export declare class MenuManager {
|
|
|
15
16
|
private submenuShowDelay;
|
|
16
17
|
private submenuHideDelay;
|
|
17
18
|
private menuInitializationDelay;
|
|
19
|
+
private styles;
|
|
20
|
+
private classes;
|
|
21
|
+
constructor(styles?: MenuStyles, classes?: MenuClasses);
|
|
18
22
|
showMenu(menuItems: MenuItemOrSeparator[], x: number, y: number, context: MenuContext, table: ListTable): void;
|
|
19
23
|
setClickCallback(callback: Function): void;
|
|
20
24
|
private createMenuItems;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { vglobal } from "@visactor/vtable/es/vrender";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { MENU_STYLES, createElement, applyStyles, createIcon, MENU_CLASSES, normalizeItemClassNameConfig, normalizeClassName } from "./styles";
|
|
4
4
|
|
|
5
5
|
export class MenuManager {
|
|
6
|
-
constructor() {
|
|
6
|
+
constructor(styles, classes) {
|
|
7
7
|
this.menuContainer = null, this.activeSubmenus = [], this.clickCallback = null,
|
|
8
8
|
this.table = null, this.context = {}, this.hideTimeout = null, this.showTimeout = null,
|
|
9
9
|
this.submenuShowDelay = 100, this.submenuHideDelay = 500, this.menuInitializationDelay = 200,
|
|
@@ -12,11 +12,12 @@ export class MenuManager {
|
|
|
12
12
|
for (const submenu of this.activeSubmenus) if (event.target === submenu || submenu.contains(event.target)) return;
|
|
13
13
|
this.release();
|
|
14
14
|
}
|
|
15
|
-
};
|
|
15
|
+
}, this.styles = null != styles ? styles : MENU_STYLES, this.classes = null != classes ? classes : MENU_CLASSES;
|
|
16
16
|
}
|
|
17
17
|
showMenu(menuItems, x, y, context, table) {
|
|
18
|
-
this.context = context, this.table = table, this.release(), this.menuContainer = createElement("div"
|
|
19
|
-
|
|
18
|
+
this.context = context, this.table = table, this.release(), this.menuContainer = createElement("div"),
|
|
19
|
+
this.menuContainer.classList.add(...normalizeClassName(this.classes.menuContainer)),
|
|
20
|
+
applyStyles(this.menuContainer, this.styles.menuContainer), document.body.appendChild(this.menuContainer),
|
|
20
21
|
this.menuContainer.addEventListener("contextmenu", (e => {
|
|
21
22
|
e.preventDefault();
|
|
22
23
|
})), this.createMenuItems(menuItems, this.menuContainer), this.positionMenu(this.menuContainer, x, y),
|
|
@@ -31,27 +32,33 @@ export class MenuManager {
|
|
|
31
32
|
}
|
|
32
33
|
createMenuItems(items, container, parentItem) {
|
|
33
34
|
items.forEach((item => {
|
|
35
|
+
var _a;
|
|
34
36
|
if ("string" == typeof item && "---" === item) {
|
|
35
|
-
const separator = createElement("div"
|
|
36
|
-
|
|
37
|
+
const separator = createElement("div");
|
|
38
|
+
separator.classList.add(...normalizeClassName(this.classes.menuItemSeparator)),
|
|
39
|
+
applyStyles(separator, this.styles.menuItemSeparator), container.appendChild(separator);
|
|
37
40
|
} else if ("object" == typeof item) {
|
|
38
|
-
const menuItem = item, menuItemElement = createElement("div"
|
|
39
|
-
|
|
41
|
+
const menuItem = item, customClassName = normalizeItemClassNameConfig(item.customClassName), menuItemElement = createElement("div");
|
|
42
|
+
menuItemElement.classList.add(...normalizeClassName(this.classes.menuItem)), customClassName.item && menuItemElement.classList.add(...customClassName.item),
|
|
43
|
+
applyStyles(menuItemElement, this.styles.menuItem);
|
|
40
44
|
const leftContainer = createElement("div");
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
customClassName.leftContainer && leftContainer.classList.add(...customClassName.leftContainer),
|
|
46
|
+
leftContainer.style.display = "flex", leftContainer.style.alignItems = "center";
|
|
47
|
+
const iconValue = null !== (_a = menuItem.customIcon) && void 0 !== _a ? _a : menuItem.iconName;
|
|
48
|
+
if (iconValue) {
|
|
49
|
+
const icon = createIcon(iconValue, menuItem, this.styles.menuItemIcon);
|
|
50
|
+
customClassName.icon && icon.classList.add(...customClassName.icon), leftContainer.appendChild(icon);
|
|
45
51
|
} else if (menuItem.iconPlaceholder) {
|
|
46
52
|
const placeholder = createElement("span");
|
|
47
|
-
applyStyles(placeholder,
|
|
53
|
+
applyStyles(placeholder, this.styles.menuItemIcon), leftContainer.appendChild(placeholder);
|
|
48
54
|
}
|
|
49
55
|
const text = createElement("span");
|
|
50
|
-
if (text
|
|
51
|
-
leftContainer.appendChild(text), item.inputDefaultValue) {
|
|
56
|
+
if (customClassName.text && text.classList.add(...customClassName.text), text.textContent = menuItem.text,
|
|
57
|
+
applyStyles(text, this.styles.menuItemText), leftContainer.appendChild(text), item.inputDefaultValue) {
|
|
52
58
|
const input = createElement("input");
|
|
53
|
-
input
|
|
54
|
-
|
|
59
|
+
customClassName.input && input.classList.add(...customClassName.input), input.type = "number",
|
|
60
|
+
input.min = "1", input.value = item.inputDefaultValue.toString(), applyStyles(input, this.styles.inputField),
|
|
61
|
+
leftContainer.appendChild(input), input.addEventListener("keydown", (e => {
|
|
55
62
|
"Enter" === e.key && this.handleMenuItemClick(Object.assign({
|
|
56
63
|
menuKey: menuItem.menuKey,
|
|
57
64
|
menuText: menuItem.text,
|
|
@@ -61,32 +68,36 @@ export class MenuManager {
|
|
|
61
68
|
}
|
|
62
69
|
menuItemElement.appendChild(leftContainer);
|
|
63
70
|
const rightContainer = createElement("div");
|
|
64
|
-
if (rightContainer
|
|
71
|
+
if (customClassName.rightContainer && rightContainer.classList.add(...customClassName.rightContainer),
|
|
72
|
+
rightContainer.style.display = "flex", rightContainer.style.alignItems = "center",
|
|
65
73
|
menuItem.shortcut) {
|
|
66
74
|
const shortcut = createElement("span");
|
|
67
|
-
shortcut
|
|
75
|
+
customClassName.shortcut && shortcut.classList.add(...customClassName.shortcut),
|
|
76
|
+
shortcut.textContent = menuItem.shortcut, applyStyles(shortcut, this.styles.menuItemShortcut),
|
|
68
77
|
rightContainer.appendChild(shortcut);
|
|
69
78
|
}
|
|
70
79
|
if (menuItem.children && menuItem.children.length > 0) {
|
|
71
|
-
menuItemElement.classList.add(
|
|
80
|
+
menuItemElement.classList.add(...normalizeClassName(this.classes.menuItemSubmenu));
|
|
72
81
|
const arrow = createElement("span");
|
|
73
|
-
arrow.textContent = "▶",
|
|
82
|
+
customClassName.arrow && arrow.classList.add(...customClassName.arrow), arrow.textContent = "▶",
|
|
83
|
+
applyStyles(arrow, this.styles.submenuArrow), rightContainer.appendChild(arrow);
|
|
74
84
|
}
|
|
75
|
-
menuItemElement.appendChild(rightContainer), menuItem.disabled && (menuItemElement.classList.add(
|
|
76
|
-
|
|
85
|
+
menuItemElement.appendChild(rightContainer), menuItem.disabled && (menuItemElement.classList.add(...normalizeClassName(this.classes.menuItemDisabled)),
|
|
86
|
+
customClassName.itemDisabled && menuItemElement.classList.add(...customClassName.itemDisabled),
|
|
87
|
+
applyStyles(menuItemElement, this.styles.menuItemDisabled)), menuItem.disabled || (menuItem.children && 0 !== menuItem.children.length || menuItemElement.addEventListener("click", (e => {
|
|
77
88
|
e.target instanceof HTMLInputElement || this.handleMenuItemClick(Object.assign({
|
|
78
89
|
menuKey: menuItem.menuKey,
|
|
79
90
|
menuText: menuItem.text
|
|
80
91
|
}, this.context));
|
|
81
92
|
})), menuItemElement.addEventListener("mouseenter", (() => {
|
|
82
|
-
applyStyles(menuItemElement,
|
|
93
|
+
applyStyles(menuItemElement, this.styles.menuItemHover), null !== this.hideTimeout && (clearTimeout(this.hideTimeout),
|
|
83
94
|
this.hideTimeout = null), null !== this.showTimeout && (clearTimeout(this.showTimeout),
|
|
84
95
|
this.showTimeout = null), menuItem.children && menuItem.children.length > 0 ? (this.closeAllSubmenus(),
|
|
85
96
|
this.showTimeout = setTimeout((() => {
|
|
86
97
|
document.body.contains(menuItemElement) && this.showSubmenu(menuItem.children, menuItemElement, menuItem);
|
|
87
98
|
}), this.submenuShowDelay)) : parentItem || this.closeAllSubmenus();
|
|
88
99
|
})), menuItemElement.addEventListener("mouseleave", (() => {
|
|
89
|
-
Object.keys(
|
|
100
|
+
Object.keys(this.styles.menuItemHover).forEach((key => {
|
|
90
101
|
menuItemElement.style[key] = "";
|
|
91
102
|
})), menuItem.children && menuItem.children.length > 0 && (this.hideTimeout = setTimeout((() => {
|
|
92
103
|
this.closeAllSubmenus();
|
|
@@ -96,8 +107,9 @@ export class MenuManager {
|
|
|
96
107
|
}));
|
|
97
108
|
}
|
|
98
109
|
showSubmenu(items, parentElement, parentItem) {
|
|
99
|
-
const parentRect = parentElement.getBoundingClientRect(), submenu = createElement("div"
|
|
100
|
-
|
|
110
|
+
const parentRect = parentElement.getBoundingClientRect(), submenu = createElement("div");
|
|
111
|
+
submenu.classList.add(...normalizeClassName(this.classes.menuContainer), ...normalizeClassName(this.classes.submenuContainer)),
|
|
112
|
+
applyStyles(submenu, this.styles.submenuContainer), this.createMenuItems(items, submenu, parentItem),
|
|
101
113
|
document.body.appendChild(submenu);
|
|
102
114
|
const submenuRect = submenu.getBoundingClientRect();
|
|
103
115
|
let left = parentRect.right, top = parentRect.top;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contextmenu/menu-manager.ts"],"names":[],"mappings":"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","file":"menu-manager.js","sourcesContent":["import type { ListTable } from '@visactor/vtable';\nimport { vglobal } from '@visactor/vtable/es/vrender';\nimport {\n MENU_CONTAINER_CLASS,\n MENU_ITEM_CLASS,\n MENU_ITEM_SEPARATOR_CLASS,\n MENU_ITEM_SUBMENU_CLASS,\n MENU_STYLES,\n createElement,\n applyStyles,\n createIcon,\n createNumberInputItem,\n MENU_ITEM_DISABLED_CLASS\n} from './styles';\nimport type { MenuItemOrSeparator, MenuKey } from './types';\nimport type { MenuItem } from './types';\nimport type { MenuClickEventArgs } from './types';\n\ninterface MenuContext {\n rowIndex?: number;\n colIndex?: number;\n}\n\n/**\n * 菜单管理器\n */\nexport class MenuManager {\n private menuContainer: HTMLElement | null = null;\n private activeSubmenus: HTMLElement[] = [];\n private clickCallback: Function | null = null;\n private table: ListTable | null = null;\n private context: MenuContext = {};\n private hideTimeout: any = null;\n private showTimeout: any = null;\n private submenuShowDelay = 100;\n private submenuHideDelay = 500;\n private menuInitializationDelay = 200; // 菜单初始化延迟时间(毫秒)\n\n /**\n * 显示菜单\n */\n showMenu(menuItems: MenuItemOrSeparator[], x: number, y: number, context: MenuContext, table: ListTable): void {\n // 保存上下文\n this.context = context;\n this.table = table;\n\n // 清除之前的菜单\n this.release();\n\n // 创建菜单容器\n this.menuContainer = createElement('div', MENU_CONTAINER_CLASS);\n applyStyles(this.menuContainer, MENU_STYLES.menuContainer);\n document.body.appendChild(this.menuContainer);\n this.menuContainer.addEventListener('contextmenu', (e: MouseEvent) => {\n e.preventDefault();\n });\n\n // 创建菜单项\n this.createMenuItems(menuItems, this.menuContainer);\n\n // 调整菜单位置\n this.positionMenu(this.menuContainer, x, y);\n\n // 临时禁用指针事件,防止位置调整后立即触发 mouseenter\n // 这可以避免菜单位置调整到鼠标下方时意外触发二级菜单\n this.menuContainer.style.pointerEvents = 'none';\n\n // 延迟启用指针事件\n setTimeout(() => {\n if (this.menuContainer) {\n this.menuContainer.style.pointerEvents = 'auto';\n }\n }, this.menuInitializationDelay);\n\n // 添加全局点击事件,用于关闭菜单\n setTimeout(() => {\n vglobal.addEventListener('click', this.handleDocumentClick);\n }, 0);\n }\n\n /**\n * 设置菜单点击回调\n */\n setClickCallback(callback: Function): void {\n this.clickCallback = callback;\n }\n\n /**\n * 创建菜单项\n */\n private createMenuItems(items: MenuItemOrSeparator[], container: HTMLElement, parentItem?: MenuItem): void {\n items.forEach(item => {\n if (typeof item === 'string' && item === '---') {\n // 创建分隔线\n const separator = createElement('div', MENU_ITEM_SEPARATOR_CLASS);\n applyStyles(separator, MENU_STYLES.menuItemSeparator);\n container.appendChild(separator);\n // } else if (typeof item === 'object' && 'type' in item && item.type === 'input') {\n // // 创建输入框菜单项\n // const inputItem = item as MenuItemInput;\n // const wrapper = createNumberInputItem(\n // inputItem.label,\n // inputItem.defaultValue || 1,\n // inputItem.iconName,\n // (value: number) => {\n // this.handleMenuItemClick({\n // menuKey: inputItem.menuKey,\n // menuText: inputItem.label,\n // inputValue: value,\n // ...this.context\n // });\n // }\n // );\n // container.appendChild(wrapper);\n } else if (typeof item === 'object') {\n // 创建普通菜单项\n const menuItem = item as MenuItem;\n const menuItemElement = createElement('div', MENU_ITEM_CLASS);\n applyStyles(menuItemElement, MENU_STYLES.menuItem);\n\n // 创建左侧图标容器\n const leftContainer = createElement('div');\n leftContainer.style.display = 'flex';\n leftContainer.style.alignItems = 'center';\n\n // 添加图标\n if (menuItem.iconName) {\n const icon = createIcon(menuItem.iconName);\n leftContainer.appendChild(icon);\n } else if (menuItem.iconPlaceholder) {\n // 占位图标,保持对齐\n const placeholder = createElement('span');\n applyStyles(placeholder, MENU_STYLES.menuItemIcon);\n leftContainer.appendChild(placeholder);\n }\n\n // 添加文本\n const text = createElement('span');\n text.textContent = menuItem.text;\n applyStyles(text, MENU_STYLES.menuItemText);\n leftContainer.appendChild(text);\n if (item.inputDefaultValue) {\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n input.type = 'number';\n input.min = '1';\n input.value = item.inputDefaultValue.toString();\n applyStyles(input, MENU_STYLES.inputField);\n leftContainer.appendChild(input);\n //监听enter 回车确认\n input.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n this.handleMenuItemClick({\n menuKey: menuItem.menuKey as MenuKey,\n menuText: menuItem.text,\n inputValue: parseInt(input.value, 10),\n ...this.context\n });\n }\n });\n }\n\n menuItemElement.appendChild(leftContainer);\n\n // 创建右侧容器\n const rightContainer = createElement('div');\n rightContainer.style.display = 'flex';\n rightContainer.style.alignItems = 'center';\n\n // 添加快捷键\n if (menuItem.shortcut) {\n const shortcut = createElement('span');\n shortcut.textContent = menuItem.shortcut;\n applyStyles(shortcut, MENU_STYLES.menuItemShortcut);\n rightContainer.appendChild(shortcut);\n }\n\n // 添加子菜单箭头\n if (menuItem.children && menuItem.children.length > 0) {\n menuItemElement.classList.add(MENU_ITEM_SUBMENU_CLASS);\n const arrow = createElement('span');\n arrow.textContent = '▶';\n applyStyles(arrow, MENU_STYLES.submenuArrow);\n rightContainer.appendChild(arrow);\n }\n\n menuItemElement.appendChild(rightContainer);\n\n // 禁用状态\n if (menuItem.disabled) {\n menuItemElement.classList.add(MENU_ITEM_DISABLED_CLASS);\n applyStyles(menuItemElement, MENU_STYLES.menuItemDisabled);\n }\n\n // 添加事件监听\n if (!menuItem.disabled) {\n // 点击事件\n if (!menuItem.children || menuItem.children.length === 0) {\n menuItemElement.addEventListener('click', (e: MouseEvent) => {\n //判断如果点击到input 则不触发点击事件\n if (e.target instanceof HTMLInputElement) {\n return;\n }\n this.handleMenuItemClick({\n menuKey: menuItem.menuKey as MenuKey,\n menuText: menuItem.text,\n ...this.context\n });\n });\n }\n\n // 鼠标悬停事件\n menuItemElement.addEventListener('mouseenter', () => {\n console.log('mouseenter', menuItem.text);\n // 添加悬停样式\n applyStyles(menuItemElement, MENU_STYLES.menuItemHover);\n\n // 清除隐藏定时器\n if (this.hideTimeout !== null) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n if (this.showTimeout !== null) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n\n // 如果有子菜单,显示子菜单\n if (menuItem.children && menuItem.children.length > 0) {\n // 关闭其他子菜单\n this.closeAllSubmenus();\n\n // 显示当前子菜单\n this.showTimeout = setTimeout(() => {\n if (document.body.contains(menuItemElement)) {\n this.showSubmenu(menuItem.children, menuItemElement, menuItem);\n }\n }, this.submenuShowDelay);\n } else if (!parentItem) {\n // 没有子菜单,关闭所有子菜单\n this.closeAllSubmenus();\n }\n });\n\n // 鼠标离开事件\n menuItemElement.addEventListener('mouseleave', () => {\n console.log('mouseleave', menuItem.text);\n // 移除悬停样式,使用与添加时相同的方式\n // 通过设置空对象来重置之前应用的menuItemHover样式的属性\n Object.keys(MENU_STYLES.menuItemHover).forEach(key => {\n (menuItemElement.style as any)[key] = '';\n });\n\n // 如果有子菜单,设置延迟关闭\n if (menuItem.children && menuItem.children.length > 0) {\n this.hideTimeout = setTimeout(() => {\n this.closeAllSubmenus();\n }, this.submenuHideDelay);\n }\n });\n }\n\n container.appendChild(menuItemElement);\n }\n });\n }\n\n /**\n * 显示子菜单\n */\n private showSubmenu(items: MenuItemOrSeparator[], parentElement: HTMLElement, parentItem?: MenuItem): void {\n const parentRect = parentElement.getBoundingClientRect();\n\n // 创建子菜单容器\n const submenu = createElement('div', MENU_CONTAINER_CLASS);\n applyStyles(submenu, MENU_STYLES.submenuContainer);\n\n // 创建子菜单项\n this.createMenuItems(items, submenu, parentItem);\n\n // 添加到文档\n document.body.appendChild(submenu);\n\n // 调整子菜单位置\n const submenuRect = submenu.getBoundingClientRect();\n let left = parentRect.right;\n let top = parentRect.top;\n\n // 检查是否超出视窗右侧\n if (left + submenuRect.width > window.innerWidth) {\n left = parentRect.left - submenuRect.width;\n }\n\n // 检查是否超出视窗底部\n if (top + submenuRect.height > window.innerHeight) {\n top = window.innerHeight - submenuRect.height;\n }\n\n submenu.style.left = `${left}px`;\n submenu.style.top = `${top}px`;\n\n // 添加鼠标进入事件,清除隐藏定时器\n submenu.addEventListener('mouseenter', () => {\n if (this.hideTimeout !== null) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n });\n\n // 添加鼠标离开事件,设置延迟关闭\n submenu.addEventListener('mouseleave', () => {\n this.hideTimeout = setTimeout(() => {\n this.closeAllSubmenus();\n }, this.submenuHideDelay);\n });\n\n // 保存子菜单引用\n this.activeSubmenus.push(submenu);\n }\n\n /**\n * 关闭所有子菜单\n */\n private closeAllSubmenus(): void {\n this.activeSubmenus.forEach(submenu => {\n if (submenu && submenu.parentNode) {\n submenu.parentNode.removeChild(submenu);\n }\n });\n this.activeSubmenus = [];\n }\n\n /**\n * 调整菜单位置\n */\n private positionMenu(menu: HTMLElement, x: number, y: number): void {\n const menuRect = menu.getBoundingClientRect();\n let left = x;\n let top = y;\n\n // 检查是否超出视窗右侧\n if (left + menuRect.width > window.innerWidth) {\n left = window.innerWidth - menuRect.width;\n }\n\n // 检查是否超出视窗底部\n if (top + menuRect.height > window.innerHeight) {\n top = window.innerHeight - menuRect.height;\n }\n\n menu.style.left = `${left}px`;\n menu.style.top = `${top}px`;\n }\n\n /**\n * 处理菜单项点击\n */\n private handleMenuItemClick(args: MenuClickEventArgs): void {\n // 关闭菜单\n this.release();\n // 调用回调\n if (this.clickCallback && this.table) {\n this.clickCallback(args, this.table);\n }\n }\n\n /**\n * 处理文档点击,用于关闭菜单\n */\n private handleDocumentClick = (event: MouseEvent): void => {\n // 如果点击的是菜单内部,不关闭菜单\n if (\n this.menuContainer &&\n (event.target === this.menuContainer || this.menuContainer.contains(event.target as Node))\n ) {\n return;\n }\n\n // 如果点击的是子菜单内部,不关闭菜单\n for (const submenu of this.activeSubmenus) {\n if (event.target === submenu || submenu.contains(event.target as Node)) {\n return;\n }\n }\n\n // 关闭菜单\n this.release();\n };\n\n /**\n * 销毁菜单\n */\n release(): void {\n // 关闭所有子菜单\n this.closeAllSubmenus();\n\n // 移除菜单容器\n if (this.menuContainer && this.menuContainer.parentNode) {\n this.menuContainer.parentNode.removeChild(this.menuContainer);\n this.menuContainer = null;\n }\n\n // 清除定时器\n if (this.hideTimeout !== null) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n if (this.showTimeout !== null) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n\n // 移除全局事件监听\n vglobal.removeEventListener('click', this.handleDocumentClick);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/contextmenu/menu-manager.ts"],"names":[],"mappings":"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","file":"menu-manager.js","sourcesContent":["import type { ListTable } from '@visactor/vtable';\nimport { vglobal } from '@visactor/vtable/es/vrender';\nimport {\n MENU_STYLES,\n createElement,\n applyStyles,\n createIcon,\n MENU_CLASSES,\n normalizeItemClassNameConfig,\n normalizeClassName\n} from './styles';\nimport type { MenuClasses, MenuStyles } from './styles';\nimport type { MenuItemOrSeparator, MenuKey } from './types';\nimport type { MenuItem } from './types';\nimport type { MenuClickEventArgs } from './types';\n\ninterface MenuContext {\n rowIndex?: number;\n colIndex?: number;\n}\n\n/**\n * 菜单管理器\n */\nexport class MenuManager {\n private menuContainer: HTMLElement | null = null;\n private activeSubmenus: HTMLElement[] = [];\n private clickCallback: Function | null = null;\n private table: ListTable | null = null;\n private context: MenuContext = {};\n private hideTimeout: any = null;\n private showTimeout: any = null;\n private submenuShowDelay = 100;\n private submenuHideDelay = 500;\n private menuInitializationDelay = 200; // 菜单初始化延迟时间(毫秒)\n private styles: MenuStyles;\n private classes: MenuClasses;\n\n constructor(styles?: MenuStyles, classes?: MenuClasses) {\n this.styles = styles ?? MENU_STYLES;\n this.classes = classes ?? MENU_CLASSES;\n }\n\n /**\n * 显示菜单\n */\n showMenu(menuItems: MenuItemOrSeparator[], x: number, y: number, context: MenuContext, table: ListTable): void {\n // 保存上下文\n this.context = context;\n this.table = table;\n\n // 清除之前的菜单\n this.release();\n\n // 创建菜单容器\n this.menuContainer = createElement('div');\n this.menuContainer.classList.add(...normalizeClassName(this.classes.menuContainer));\n applyStyles(this.menuContainer, this.styles.menuContainer);\n document.body.appendChild(this.menuContainer);\n this.menuContainer.addEventListener('contextmenu', (e: MouseEvent) => {\n e.preventDefault();\n });\n\n // 创建菜单项\n this.createMenuItems(menuItems, this.menuContainer);\n\n // 调整菜单位置\n this.positionMenu(this.menuContainer, x, y);\n\n // 临时禁用指针事件,防止位置调整后立即触发 mouseenter\n // 这可以避免菜单位置调整到鼠标下方时意外触发二级菜单\n this.menuContainer.style.pointerEvents = 'none';\n\n // 延迟启用指针事件\n setTimeout(() => {\n if (this.menuContainer) {\n this.menuContainer.style.pointerEvents = 'auto';\n }\n }, this.menuInitializationDelay);\n\n // 添加全局点击事件,用于关闭菜单\n setTimeout(() => {\n vglobal.addEventListener('click', this.handleDocumentClick);\n }, 0);\n }\n\n /**\n * 设置菜单点击回调\n */\n setClickCallback(callback: Function): void {\n this.clickCallback = callback;\n }\n\n /**\n * 创建菜单项\n */\n private createMenuItems(items: MenuItemOrSeparator[], container: HTMLElement, parentItem?: MenuItem): void {\n items.forEach(item => {\n if (typeof item === 'string' && item === '---') {\n // 创建分隔线\n const separator = createElement('div');\n separator.classList.add(...normalizeClassName(this.classes.menuItemSeparator));\n applyStyles(separator, this.styles.menuItemSeparator);\n container.appendChild(separator);\n } else if (typeof item === 'object') {\n // 创建普通菜单项\n const menuItem = item as MenuItem;\n const customClassName = normalizeItemClassNameConfig(item.customClassName);\n const menuItemElement = createElement('div');\n menuItemElement.classList.add(...normalizeClassName(this.classes.menuItem));\n if (customClassName.item) {\n menuItemElement.classList.add(...customClassName.item);\n }\n applyStyles(menuItemElement, this.styles.menuItem);\n\n // 创建左侧图标容器\n const leftContainer = createElement('div');\n if (customClassName.leftContainer) {\n leftContainer.classList.add(...customClassName.leftContainer);\n }\n leftContainer.style.display = 'flex';\n leftContainer.style.alignItems = 'center';\n\n // 添加图标(优先使用 customIcon)\n const iconValue = menuItem.customIcon ?? menuItem.iconName;\n if (iconValue) {\n const icon = createIcon(iconValue, menuItem, this.styles.menuItemIcon);\n if (customClassName.icon) {\n icon.classList.add(...customClassName.icon);\n }\n leftContainer.appendChild(icon);\n } else if (menuItem.iconPlaceholder) {\n // 占位图标,保持对齐\n const placeholder = createElement('span');\n applyStyles(placeholder, this.styles.menuItemIcon);\n leftContainer.appendChild(placeholder);\n }\n\n // 添加文本\n const text = createElement('span');\n if (customClassName.text) {\n text.classList.add(...customClassName.text);\n }\n text.textContent = menuItem.text;\n applyStyles(text, this.styles.menuItemText);\n leftContainer.appendChild(text);\n if (item.inputDefaultValue) {\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n if (customClassName.input) {\n input.classList.add(...customClassName.input);\n }\n input.type = 'number';\n input.min = '1';\n input.value = item.inputDefaultValue.toString();\n applyStyles(input, this.styles.inputField);\n leftContainer.appendChild(input);\n //监听enter 回车确认\n input.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n this.handleMenuItemClick({\n menuKey: menuItem.menuKey as MenuKey,\n menuText: menuItem.text,\n inputValue: parseInt(input.value, 10),\n ...this.context\n });\n }\n });\n }\n\n menuItemElement.appendChild(leftContainer);\n\n // 创建右侧容器\n const rightContainer = createElement('div');\n if (customClassName.rightContainer) {\n rightContainer.classList.add(...customClassName.rightContainer);\n }\n rightContainer.style.display = 'flex';\n rightContainer.style.alignItems = 'center';\n\n // 添加快捷键\n if (menuItem.shortcut) {\n const shortcut = createElement('span');\n if (customClassName.shortcut) {\n shortcut.classList.add(...customClassName.shortcut);\n }\n shortcut.textContent = menuItem.shortcut;\n applyStyles(shortcut, this.styles.menuItemShortcut);\n rightContainer.appendChild(shortcut);\n }\n\n // 添加子菜单箭头\n if (menuItem.children && menuItem.children.length > 0) {\n menuItemElement.classList.add(...normalizeClassName(this.classes.menuItemSubmenu));\n const arrow = createElement('span');\n if (customClassName.arrow) {\n arrow.classList.add(...customClassName.arrow);\n }\n arrow.textContent = '▶';\n applyStyles(arrow, this.styles.submenuArrow);\n rightContainer.appendChild(arrow);\n }\n\n menuItemElement.appendChild(rightContainer);\n\n // 禁用状态\n if (menuItem.disabled) {\n menuItemElement.classList.add(...normalizeClassName(this.classes.menuItemDisabled));\n if (customClassName.itemDisabled) {\n menuItemElement.classList.add(...customClassName.itemDisabled);\n }\n applyStyles(menuItemElement, this.styles.menuItemDisabled);\n }\n\n // 添加事件监听\n if (!menuItem.disabled) {\n // 点击事件\n if (!menuItem.children || menuItem.children.length === 0) {\n menuItemElement.addEventListener('click', (e: MouseEvent) => {\n //判断如果点击到input 则不触发点击事件\n if (e.target instanceof HTMLInputElement) {\n return;\n }\n this.handleMenuItemClick({\n menuKey: menuItem.menuKey as MenuKey,\n menuText: menuItem.text,\n ...this.context\n });\n });\n }\n\n // 鼠标悬停事件\n menuItemElement.addEventListener('mouseenter', () => {\n // 添加悬停样式\n applyStyles(menuItemElement, this.styles.menuItemHover);\n\n // 清除隐藏定时器\n if (this.hideTimeout !== null) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n if (this.showTimeout !== null) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n\n // 如果有子菜单,显示子菜单\n if (menuItem.children && menuItem.children.length > 0) {\n // 关闭其他子菜单\n this.closeAllSubmenus();\n\n // 显示当前子菜单\n this.showTimeout = setTimeout(() => {\n if (document.body.contains(menuItemElement)) {\n this.showSubmenu(menuItem.children, menuItemElement, menuItem);\n }\n }, this.submenuShowDelay);\n } else if (!parentItem) {\n // 没有子菜单,关闭所有子菜单\n this.closeAllSubmenus();\n }\n });\n\n // 鼠标离开事件\n menuItemElement.addEventListener('mouseleave', () => {\n // 移除悬停样式\n Object.keys(this.styles.menuItemHover).forEach(key => {\n (menuItemElement.style as any)[key] = '';\n });\n\n // 如果有子菜单,设置延迟关闭\n if (menuItem.children && menuItem.children.length > 0) {\n this.hideTimeout = setTimeout(() => {\n this.closeAllSubmenus();\n }, this.submenuHideDelay);\n }\n });\n }\n\n container.appendChild(menuItemElement);\n }\n });\n }\n\n /**\n * 显示子菜单\n */\n private showSubmenu(items: MenuItemOrSeparator[], parentElement: HTMLElement, parentItem?: MenuItem): void {\n const parentRect = parentElement.getBoundingClientRect();\n\n // 创建子菜单容器\n const submenu = createElement('div');\n submenu.classList.add(\n ...normalizeClassName(this.classes.menuContainer),\n ...normalizeClassName(this.classes.submenuContainer)\n );\n applyStyles(submenu, this.styles.submenuContainer);\n\n // 创建子菜单项\n this.createMenuItems(items, submenu, parentItem);\n\n // 添加到文档\n document.body.appendChild(submenu);\n\n // 调整子菜单位置\n const submenuRect = submenu.getBoundingClientRect();\n let left = parentRect.right;\n let top = parentRect.top;\n\n // 检查是否超出视窗右侧\n if (left + submenuRect.width > window.innerWidth) {\n left = parentRect.left - submenuRect.width;\n }\n\n // 检查是否超出视窗底部\n if (top + submenuRect.height > window.innerHeight) {\n top = window.innerHeight - submenuRect.height;\n }\n\n submenu.style.left = `${left}px`;\n submenu.style.top = `${top}px`;\n\n // 添加鼠标进入事件,清除隐藏定时器\n submenu.addEventListener('mouseenter', () => {\n if (this.hideTimeout !== null) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n });\n\n // 添加鼠标离开事件,设置延迟关闭\n submenu.addEventListener('mouseleave', () => {\n this.hideTimeout = setTimeout(() => {\n this.closeAllSubmenus();\n }, this.submenuHideDelay);\n });\n\n // 保存子菜单引用\n this.activeSubmenus.push(submenu);\n }\n\n /**\n * 关闭所有子菜单\n */\n private closeAllSubmenus(): void {\n this.activeSubmenus.forEach(submenu => {\n if (submenu && submenu.parentNode) {\n submenu.parentNode.removeChild(submenu);\n }\n });\n this.activeSubmenus = [];\n }\n\n /**\n * 调整菜单位置\n */\n private positionMenu(menu: HTMLElement, x: number, y: number): void {\n const menuRect = menu.getBoundingClientRect();\n let left = x;\n let top = y;\n\n // 检查是否超出视窗右侧\n if (left + menuRect.width > window.innerWidth) {\n left = window.innerWidth - menuRect.width;\n }\n\n // 检查是否超出视窗底部\n if (top + menuRect.height > window.innerHeight) {\n top = window.innerHeight - menuRect.height;\n }\n\n menu.style.left = `${left}px`;\n menu.style.top = `${top}px`;\n }\n\n /**\n * 处理菜单项点击\n */\n private handleMenuItemClick(args: MenuClickEventArgs): void {\n // 关闭菜单\n this.release();\n // 调用回调\n if (this.clickCallback && this.table) {\n this.clickCallback(args, this.table);\n }\n }\n\n /**\n * 处理文档点击,用于关闭菜单\n */\n private handleDocumentClick = (event: MouseEvent): void => {\n // 如果点击的是菜单内部,不关闭菜单\n if (\n this.menuContainer &&\n (event.target === this.menuContainer || this.menuContainer.contains(event.target as Node))\n ) {\n return;\n }\n\n // 如果点击的是子菜单内部,不关闭菜单\n for (const submenu of this.activeSubmenus) {\n if (event.target === submenu || submenu.contains(event.target as Node)) {\n return;\n }\n }\n\n // 关闭菜单\n this.release();\n };\n\n /**\n * 销毁菜单\n */\n release(): void {\n // 关闭所有子菜单\n this.closeAllSubmenus();\n\n // 移除菜单容器\n if (this.menuContainer && this.menuContainer.parentNode) {\n this.menuContainer.parentNode.removeChild(this.menuContainer);\n this.menuContainer = null;\n }\n\n // 清除定时器\n if (this.hideTimeout !== null) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n if (this.showTimeout !== null) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n\n // 移除全局事件监听\n vglobal.removeEventListener('click', this.handleDocumentClick);\n }\n}\n"]}
|
|
@@ -1,106 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
boxShadow: string;
|
|
11
|
-
borderRadius: string;
|
|
12
|
-
padding: string;
|
|
13
|
-
zIndex: number;
|
|
14
|
-
minWidth: string;
|
|
15
|
-
maxHeight: string;
|
|
16
|
-
overflowY: string;
|
|
17
|
-
fontSize: string;
|
|
18
|
-
};
|
|
19
|
-
menuItem: {
|
|
20
|
-
padding: string;
|
|
21
|
-
cursor: string;
|
|
22
|
-
whiteSpace: string;
|
|
23
|
-
position: string;
|
|
24
|
-
display: string;
|
|
25
|
-
alignItems: string;
|
|
26
|
-
justifyContent: string;
|
|
27
|
-
};
|
|
28
|
-
menuItemHover: {
|
|
29
|
-
backgroundColor: string;
|
|
30
|
-
};
|
|
31
|
-
menuItemDisabled: {
|
|
32
|
-
opacity: number;
|
|
33
|
-
cursor: string;
|
|
34
|
-
};
|
|
35
|
-
menuItemSeparator: {
|
|
36
|
-
height: string;
|
|
37
|
-
backgroundColor: string;
|
|
38
|
-
margin: string;
|
|
39
|
-
};
|
|
40
|
-
menuItemIcon: {
|
|
41
|
-
marginRight: string;
|
|
42
|
-
width: string;
|
|
43
|
-
height: string;
|
|
44
|
-
display: string;
|
|
45
|
-
alignItems: string;
|
|
46
|
-
justifyContent: string;
|
|
47
|
-
};
|
|
48
|
-
menuItemText: {
|
|
49
|
-
flex: number;
|
|
50
|
-
};
|
|
51
|
-
menuItemShortcut: {
|
|
52
|
-
marginLeft: string;
|
|
53
|
-
color: string;
|
|
54
|
-
fontSize: string;
|
|
55
|
-
};
|
|
56
|
-
submenuArrow: {
|
|
57
|
-
marginLeft: string;
|
|
58
|
-
fontSize: string;
|
|
59
|
-
color: string;
|
|
60
|
-
};
|
|
61
|
-
submenuContainer: {
|
|
62
|
-
position: string;
|
|
63
|
-
left: string;
|
|
64
|
-
top: string;
|
|
65
|
-
backgroundColor: string;
|
|
66
|
-
boxShadow: string;
|
|
67
|
-
borderRadius: string;
|
|
68
|
-
padding: string;
|
|
69
|
-
zIndex: number;
|
|
70
|
-
minWidth: string;
|
|
71
|
-
fontSize: string;
|
|
72
|
-
};
|
|
73
|
-
inputContainer: {
|
|
74
|
-
padding: string;
|
|
75
|
-
display: string;
|
|
76
|
-
alignItems: string;
|
|
77
|
-
};
|
|
78
|
-
inputLabel: {
|
|
79
|
-
marginRight: string;
|
|
80
|
-
whiteSpace: string;
|
|
81
|
-
};
|
|
82
|
-
inputField: {
|
|
83
|
-
width: string;
|
|
84
|
-
padding: string;
|
|
85
|
-
border: string;
|
|
86
|
-
borderRadius: string;
|
|
87
|
-
};
|
|
88
|
-
buttonContainer: {
|
|
89
|
-
display: string;
|
|
90
|
-
justifyContent: string;
|
|
91
|
-
padding: string;
|
|
1
|
+
import type { ClassName, MenuItem, MenuItemClassConfig, MenuItemIcon } from './types';
|
|
2
|
+
export type MenuStyleDef = {
|
|
3
|
+
[K in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[K];
|
|
4
|
+
};
|
|
5
|
+
export type MenuStyles = typeof MENU_STYLES;
|
|
6
|
+
export type MenuClasses = typeof MENU_CLASSES;
|
|
7
|
+
export type MenuAttributions = {
|
|
8
|
+
style?: {
|
|
9
|
+
[K in keyof MenuStyles]?: Partial<MenuStyles[K]>;
|
|
92
10
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
backgroundColor: string;
|
|
96
|
-
color: string;
|
|
97
|
-
border: string;
|
|
98
|
-
borderRadius: string;
|
|
99
|
-
cursor: string;
|
|
100
|
-
fontSize: string;
|
|
11
|
+
class?: {
|
|
12
|
+
[K in keyof MenuClasses]?: Partial<MenuClasses[K]>;
|
|
101
13
|
};
|
|
102
14
|
};
|
|
15
|
+
export declare const MENU_STYLES: {
|
|
16
|
+
menuContainer: MenuStyleDef;
|
|
17
|
+
menuItem: MenuStyleDef;
|
|
18
|
+
menuItemHover: MenuStyleDef;
|
|
19
|
+
menuItemDisabled: MenuStyleDef;
|
|
20
|
+
menuItemSeparator: MenuStyleDef;
|
|
21
|
+
menuItemIcon: MenuStyleDef;
|
|
22
|
+
menuItemText: MenuStyleDef;
|
|
23
|
+
menuItemShortcut: MenuStyleDef;
|
|
24
|
+
submenuArrow: MenuStyleDef;
|
|
25
|
+
submenuContainer: MenuStyleDef;
|
|
26
|
+
inputContainer: MenuStyleDef;
|
|
27
|
+
inputLabel: MenuStyleDef;
|
|
28
|
+
inputField: MenuStyleDef;
|
|
29
|
+
buttonContainer: MenuStyleDef;
|
|
30
|
+
button: MenuStyleDef;
|
|
31
|
+
};
|
|
32
|
+
export declare const MENU_CLASSES: {
|
|
33
|
+
menuContainer: ClassName;
|
|
34
|
+
submenuContainer: ClassName;
|
|
35
|
+
menuItem: ClassName;
|
|
36
|
+
menuItemSeparator: ClassName;
|
|
37
|
+
menuItemSubmenu: ClassName;
|
|
38
|
+
menuItemDisabled: ClassName;
|
|
39
|
+
};
|
|
40
|
+
export declare function sanitizeSvg(svgString: string): string;
|
|
41
|
+
export declare function mergeStyles(styles?: Partial<MenuStyles>): MenuStyles;
|
|
42
|
+
export declare function mergeClasses(classes?: Partial<MenuClasses>): MenuClasses;
|
|
103
43
|
export declare function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement;
|
|
104
|
-
export declare function applyStyles(element: HTMLElement, styles:
|
|
105
|
-
|
|
106
|
-
|
|
44
|
+
export declare function applyStyles(element: HTMLElement, styles: {
|
|
45
|
+
[K in keyof CSSStyleDeclaration]?: CSSStyleDeclaration[K];
|
|
46
|
+
}): void;
|
|
47
|
+
export declare function createIcon(icon: MenuItemIcon, menuItem?: MenuItem, iconStyles?: MenuStyleDef): HTMLElement;
|
|
48
|
+
export declare function createNumberInputItem(label: string, defaultValue: number, icon: MenuItemIcon | undefined, callback: (value: number) => void, styles?: MenuStyles): HTMLElement;
|
|
49
|
+
export declare function normalizeItemClassNameConfig(classNames?: MenuItemClassConfig): MenuItemClassConfig;
|
|
50
|
+
export declare function normalizeClassName(className: ClassName): string[];
|