@visactor/vtable-plugins 1.26.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.
@@ -54,7 +54,7 @@ export function openAutoFillMenu(tableInstance, endCol, endRow) {
54
54
  export function getCellMatrix(table) {
55
55
  return {
56
56
  getValue: (row, col) => {
57
- const value = table.getCellValue(col, row);
57
+ const value = table.getCellOriginValue(col, row);
58
58
  return "number" != typeof value && isNaN(Number(value)) ? {
59
59
  v: value || "",
60
60
  t: CellValueType.STRING
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auto-fill/auto-fill-helper.ts"],"names":[],"mappings":"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","file":"auto-fill-helper.js","sourcesContent":["import type { CellRange } from '@visactor/vtable/es/ts-types/table-engine';\nimport { CellValueType } from './types';\nimport type { ListTable } from '@visactor/vtable';\nimport { Direction, IDiscreteRange } from './types';\nexport interface ISelectedRangeArray {\n cols: number[];\n rows: number[];\n}\n\nexport function getSelectedRangeArray(selectedRange: CellRange): ISelectedRangeArray {\n const minCol = Math.min(selectedRange.start.col, selectedRange.end.col);\n const minRow = Math.min(selectedRange.start.row, selectedRange.end.row);\n const maxCol = Math.max(selectedRange.start.col, selectedRange.end.col);\n const maxRow = Math.max(selectedRange.start.row, selectedRange.end.row);\n const cols = [];\n const rows = [];\n for (let i = minCol; i <= maxCol; i++) {\n cols.push(i);\n }\n for (let i = minRow; i <= maxRow; i++) {\n rows.push(i);\n }\n return { cols, rows };\n}\n\n/**\n * 获取目标范围,根据源范围和选中的范围计算目标范围\n * @param direction - 方向\n * @param sourceRange - 源范围\n * @param selectedRange - 选中的范围\n * @returns 目标范围\n */\nexport function getTargetRange(direction: Direction, sourceRange: IDiscreteRange, selectedRange: ISelectedRangeArray) {\n if (direction === Direction.DOWN || direction === Direction.UP) {\n return {\n cols: selectedRange.cols,\n rows: selectedRange.rows.filter(row => !sourceRange.rows.includes(row))\n };\n } else {\n return {\n cols: selectedRange.cols.filter(col => !sourceRange.cols.includes(col)),\n rows: selectedRange.rows\n };\n }\n}\n\n/**\n * 打开自动填充菜单\n * @param tableInstance - 表格实例\n * @param endCol - 结束列\n * @param endRow - 结束行\n */\nexport function openAutoFillMenu(tableInstance: ListTable, endCol: number, endRow: number) {\n const rect = tableInstance.scenegraph.highPerformanceGetCell(endCol, endRow).globalAABBBounds;\n tableInstance.showDropDownMenu(endCol, endRow, {\n content: [\n {\n type: 'item',\n text: '复制填充',\n icon: {\n width: 16,\n height: 16,\n svg: '<svg t=\"1756136702877\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1474\" width=\"200\" height=\"200\"><path d=\"M853.333333 981.333333h-384c-72.533333 0-128-55.466667-128-128v-384c0-72.533333 55.466667-128 128-128h384c72.533333 0 128 55.466667 128 128v384c0 72.533333-55.466667 128-128 128z m-384-554.666666c-25.6 0-42.666667 17.066667-42.666666 42.666666v384c0 25.6 17.066667 42.666667 42.666666 42.666667h384c25.6 0 42.666667-17.066667 42.666667-42.666667v-384c0-25.6-17.066667-42.666667-42.666667-42.666666h-384z\" p-id=\"1475\"></path><path d=\"M213.333333 682.666667H170.666667c-72.533333 0-128-55.466667-128-128V170.666667c0-72.533333 55.466667-128 128-128h384c72.533333 0 128 55.466667 128 128v42.666666c0 25.6-17.066667 42.666667-42.666667 42.666667s-42.666667-17.066667-42.666667-42.666667V170.666667c0-25.6-17.066667-42.666667-42.666666-42.666667H170.666667c-25.6 0-42.666667 17.066667-42.666667 42.666667v384c0 25.6 17.066667 42.666667 42.666667 42.666666h42.666666c25.6 0 42.666667 17.066667 42.666667 42.666667s-17.066667 42.666667-42.666667 42.666667z\" p-id=\"1476\"></path></svg>'\n }\n },\n {\n type: 'item',\n text: '序列填充',\n icon: {\n width: 16,\n height: 16,\n svg: '<svg t=\"1756136788547\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2463\" width=\"200\" height=\"200\"><path d=\"M312.832482 65.167035H959.204489c35.706211 0 64.64232 29.473622 64.64232 65.832527 0 36.346107-28.936109 65.832527-64.629522 65.832527H312.819684c-35.693413 0-64.629522-29.473622-64.629522-65.832527 0-36.346107 28.936109-65.832527 64.629522-65.832527z m0 394.982363H959.204489c35.706211 0 64.64232 29.460824 64.64232 65.819729 0 36.358905-28.936109 65.832527-64.629522 65.832527H312.819684c-35.693413 0-64.629522-29.473622-64.629522-65.832527 0-36.346107 28.936109-65.819729 64.629522-65.819729z m0 394.969566H959.204489c35.706211 0 64.64232 29.473622 64.64232 65.819729 0 36.358905-28.936109 65.832527-64.629522 65.832527H312.819684c-35.693413 0-64.629522-29.473622-64.629522-65.832527 0-36.346107 28.936109-65.819729 64.629522-65.819729zM12.286008 69.108796V38.176211c9.892796 0.767876 19.836784 0.767876 29.72958 0A41.823619 41.823619 0 0 0 63.989626 25.672638c4.261709-4.671243 7.358807-10.315128 9.048133-16.458132 0.37114-3.058704 0.37114-6.143004 0-9.214506H114.413451v229.748352H65.93491V69.108796H12.286008z m0 510.176487a130.730805 130.730805 0 0 1 45.240665-49.374395 334.537763 334.537763 0 0 0 40.070304-32.250771 48.47854 48.47854 0 0 0 14.218495-33.581756 37.31875 37.31875 0 0 0-7.755543-24.354451 28.193829 28.193829 0 0 0-23.266628-9.879998 27.643518 27.643518 0 0 0-31.02217 15.139945 78.27211 78.27211 0 0 0-5.170362 28.30901H2.585181a114.311067 114.311067 0 0 1 10.340723-48.056208c12.388392-24.124089 38.086625-37.984242 64.629522-34.887144a79.897447 79.897447 0 0 1 57.539472 20.41269 71.783562 71.783562 0 0 1 21.321343 53.981648 74.637499 74.637499 0 0 1-14.858391 46.072531 152.16733 152.16733 0 0 1-32.967455 29.627197L90.481331 553.625443l-23.266628 17.763521c-4.082538 3.583419-7.563574 7.806734-10.353522 12.51637h99.542262v40.147092H0a110.945213 110.945213 0 0 1 10.340724-45.419837l1.945284 0.665492zM44.600769 948.582211a53.495327 53.495327 0 0 0 4.517668 23.036265 30.279891 30.279891 0 0 0 29.742378 17.110826c7.422797 0.255959 14.717614-2.073264 20.681447-6.578133 6.7829-6.962071 10.315128-16.547717 9.688029-26.325332a30.356678 30.356678 0 0 0-18.096266-30.945383 91.735527 91.735527 0 0 0-32.314761-8.561812V883.440772a83.903197 83.903197 0 0 0 30.382274-4.607253 27.106005 27.106005 0 0 0 14.858391-28.30901 30.612637 30.612637 0 0 0-7.755542-21.730877 27.528337 27.528337 0 0 0-21.321344-8.549014 26.939632 26.939632 0 0 0-23.279425 10.532692 44.063256 44.063256 0 0 0-7.102849 27.643519H2.585181a117.101015 117.101015 0 0 1 5.823056-32.916264 74.381541 74.381541 0 0 1 17.443572-25.019944 60.534186 60.534186 0 0 1 20.681447-12.503572 89.55988 89.55988 0 0 1 29.742378-3.289067A78.540867 78.540867 0 0 1 129.259044 801.79001a57.744238 57.744238 0 0 1 20.041551 46.085328 51.921182 51.921182 0 0 1-12.286008 34.887144c-4.159326 5.170362-9.470465 9.227304-15.511086 11.850879 6.7829 1.510155 12.900309 5.208756 17.45637 10.532692a57.821026 57.821026 0 0 1 17.443572 44.10165 75.136618 75.136618 0 0 1-20.028753 52.010768 76.122059 76.122059 0 0 1-59.471958 22.383571 71.962733 71.962733 0 0 1-64.629522-32.250771A97.52019 97.52019 0 0 1 1.279793 946.611331l43.308178 1.97088z\" fill=\"#515151\" p-id=\"2464\"></path></svg>'\n }\n }\n ],\n referencePosition: {\n // @ts-ignore\n rect: {\n right: rect.x2 + 110,\n bottom: rect.y2\n }\n }\n });\n}\n\nexport function getCellMatrix(table: ListTable) {\n return {\n getValue: (row: number, col: number) => {\n const value = table.getCellValue(col, row);\n if (typeof value === 'number' || !isNaN(Number(value))) {\n return {\n v: value,\n t: CellValueType.NUMBER\n };\n }\n\n return {\n v: value || '',\n t: CellValueType.STRING\n };\n },\n getMaxRows: () => {\n return table.records.length;\n },\n getMaxColumns: () => {\n return table.columns.length;\n }\n };\n}\n/**\n * 判断当前单元格是否是合并单元格\n * @param table - 表格实例\n * @param col - 列\n * @param row - 行\n * @returns 合并单元格范围 如果当前单元格不是合并单元格,则返回null\n */\nexport function isMergeCell(table: ListTable, col: number, row: number) {\n const cellRange = table.getCellRange(col, row);\n if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {\n return cellRange;\n }\n return null;\n}\n"]}
1
+ {"version":3,"sources":["../src/auto-fill/auto-fill-helper.ts"],"names":[],"mappings":"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","file":"auto-fill-helper.js","sourcesContent":["import type { CellRange } from '@visactor/vtable/es/ts-types/table-engine';\nimport { CellValueType } from './types';\nimport type { ListTable } from '@visactor/vtable';\nimport { Direction, IDiscreteRange } from './types';\nexport interface ISelectedRangeArray {\n cols: number[];\n rows: number[];\n}\n\nexport function getSelectedRangeArray(selectedRange: CellRange): ISelectedRangeArray {\n const minCol = Math.min(selectedRange.start.col, selectedRange.end.col);\n const minRow = Math.min(selectedRange.start.row, selectedRange.end.row);\n const maxCol = Math.max(selectedRange.start.col, selectedRange.end.col);\n const maxRow = Math.max(selectedRange.start.row, selectedRange.end.row);\n const cols = [];\n const rows = [];\n for (let i = minCol; i <= maxCol; i++) {\n cols.push(i);\n }\n for (let i = minRow; i <= maxRow; i++) {\n rows.push(i);\n }\n return { cols, rows };\n}\n\n/**\n * 获取目标范围,根据源范围和选中的范围计算目标范围\n * @param direction - 方向\n * @param sourceRange - 源范围\n * @param selectedRange - 选中的范围\n * @returns 目标范围\n */\nexport function getTargetRange(direction: Direction, sourceRange: IDiscreteRange, selectedRange: ISelectedRangeArray) {\n if (direction === Direction.DOWN || direction === Direction.UP) {\n return {\n cols: selectedRange.cols,\n rows: selectedRange.rows.filter(row => !sourceRange.rows.includes(row))\n };\n } else {\n return {\n cols: selectedRange.cols.filter(col => !sourceRange.cols.includes(col)),\n rows: selectedRange.rows\n };\n }\n}\n\n/**\n * 打开自动填充菜单\n * @param tableInstance - 表格实例\n * @param endCol - 结束列\n * @param endRow - 结束行\n */\nexport function openAutoFillMenu(tableInstance: ListTable, endCol: number, endRow: number) {\n const rect = tableInstance.scenegraph.highPerformanceGetCell(endCol, endRow).globalAABBBounds;\n tableInstance.showDropDownMenu(endCol, endRow, {\n content: [\n {\n type: 'item',\n text: '复制填充',\n icon: {\n width: 16,\n height: 16,\n svg: '<svg t=\"1756136702877\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1474\" width=\"200\" height=\"200\"><path d=\"M853.333333 981.333333h-384c-72.533333 0-128-55.466667-128-128v-384c0-72.533333 55.466667-128 128-128h384c72.533333 0 128 55.466667 128 128v384c0 72.533333-55.466667 128-128 128z m-384-554.666666c-25.6 0-42.666667 17.066667-42.666666 42.666666v384c0 25.6 17.066667 42.666667 42.666666 42.666667h384c25.6 0 42.666667-17.066667 42.666667-42.666667v-384c0-25.6-17.066667-42.666667-42.666667-42.666666h-384z\" p-id=\"1475\"></path><path d=\"M213.333333 682.666667H170.666667c-72.533333 0-128-55.466667-128-128V170.666667c0-72.533333 55.466667-128 128-128h384c72.533333 0 128 55.466667 128 128v42.666666c0 25.6-17.066667 42.666667-42.666667 42.666667s-42.666667-17.066667-42.666667-42.666667V170.666667c0-25.6-17.066667-42.666667-42.666666-42.666667H170.666667c-25.6 0-42.666667 17.066667-42.666667 42.666667v384c0 25.6 17.066667 42.666667 42.666667 42.666666h42.666666c25.6 0 42.666667 17.066667 42.666667 42.666667s-17.066667 42.666667-42.666667 42.666667z\" p-id=\"1476\"></path></svg>'\n }\n },\n {\n type: 'item',\n text: '序列填充',\n icon: {\n width: 16,\n height: 16,\n svg: '<svg t=\"1756136788547\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2463\" width=\"200\" height=\"200\"><path d=\"M312.832482 65.167035H959.204489c35.706211 0 64.64232 29.473622 64.64232 65.832527 0 36.346107-28.936109 65.832527-64.629522 65.832527H312.819684c-35.693413 0-64.629522-29.473622-64.629522-65.832527 0-36.346107 28.936109-65.832527 64.629522-65.832527z m0 394.982363H959.204489c35.706211 0 64.64232 29.460824 64.64232 65.819729 0 36.358905-28.936109 65.832527-64.629522 65.832527H312.819684c-35.693413 0-64.629522-29.473622-64.629522-65.832527 0-36.346107 28.936109-65.819729 64.629522-65.819729z m0 394.969566H959.204489c35.706211 0 64.64232 29.473622 64.64232 65.819729 0 36.358905-28.936109 65.832527-64.629522 65.832527H312.819684c-35.693413 0-64.629522-29.473622-64.629522-65.832527 0-36.346107 28.936109-65.819729 64.629522-65.819729zM12.286008 69.108796V38.176211c9.892796 0.767876 19.836784 0.767876 29.72958 0A41.823619 41.823619 0 0 0 63.989626 25.672638c4.261709-4.671243 7.358807-10.315128 9.048133-16.458132 0.37114-3.058704 0.37114-6.143004 0-9.214506H114.413451v229.748352H65.93491V69.108796H12.286008z m0 510.176487a130.730805 130.730805 0 0 1 45.240665-49.374395 334.537763 334.537763 0 0 0 40.070304-32.250771 48.47854 48.47854 0 0 0 14.218495-33.581756 37.31875 37.31875 0 0 0-7.755543-24.354451 28.193829 28.193829 0 0 0-23.266628-9.879998 27.643518 27.643518 0 0 0-31.02217 15.139945 78.27211 78.27211 0 0 0-5.170362 28.30901H2.585181a114.311067 114.311067 0 0 1 10.340723-48.056208c12.388392-24.124089 38.086625-37.984242 64.629522-34.887144a79.897447 79.897447 0 0 1 57.539472 20.41269 71.783562 71.783562 0 0 1 21.321343 53.981648 74.637499 74.637499 0 0 1-14.858391 46.072531 152.16733 152.16733 0 0 1-32.967455 29.627197L90.481331 553.625443l-23.266628 17.763521c-4.082538 3.583419-7.563574 7.806734-10.353522 12.51637h99.542262v40.147092H0a110.945213 110.945213 0 0 1 10.340724-45.419837l1.945284 0.665492zM44.600769 948.582211a53.495327 53.495327 0 0 0 4.517668 23.036265 30.279891 30.279891 0 0 0 29.742378 17.110826c7.422797 0.255959 14.717614-2.073264 20.681447-6.578133 6.7829-6.962071 10.315128-16.547717 9.688029-26.325332a30.356678 30.356678 0 0 0-18.096266-30.945383 91.735527 91.735527 0 0 0-32.314761-8.561812V883.440772a83.903197 83.903197 0 0 0 30.382274-4.607253 27.106005 27.106005 0 0 0 14.858391-28.30901 30.612637 30.612637 0 0 0-7.755542-21.730877 27.528337 27.528337 0 0 0-21.321344-8.549014 26.939632 26.939632 0 0 0-23.279425 10.532692 44.063256 44.063256 0 0 0-7.102849 27.643519H2.585181a117.101015 117.101015 0 0 1 5.823056-32.916264 74.381541 74.381541 0 0 1 17.443572-25.019944 60.534186 60.534186 0 0 1 20.681447-12.503572 89.55988 89.55988 0 0 1 29.742378-3.289067A78.540867 78.540867 0 0 1 129.259044 801.79001a57.744238 57.744238 0 0 1 20.041551 46.085328 51.921182 51.921182 0 0 1-12.286008 34.887144c-4.159326 5.170362-9.470465 9.227304-15.511086 11.850879 6.7829 1.510155 12.900309 5.208756 17.45637 10.532692a57.821026 57.821026 0 0 1 17.443572 44.10165 75.136618 75.136618 0 0 1-20.028753 52.010768 76.122059 76.122059 0 0 1-59.471958 22.383571 71.962733 71.962733 0 0 1-64.629522-32.250771A97.52019 97.52019 0 0 1 1.279793 946.611331l43.308178 1.97088z\" fill=\"#515151\" p-id=\"2464\"></path></svg>'\n }\n }\n ],\n referencePosition: {\n // @ts-ignore\n rect: {\n right: rect.x2 + 110,\n bottom: rect.y2\n }\n }\n });\n}\n\nexport function getCellMatrix(table: ListTable) {\n return {\n getValue: (row: number, col: number) => {\n const value = table.getCellOriginValue(col, row);\n if (typeof value === 'number' || !isNaN(Number(value))) {\n return {\n v: value,\n t: CellValueType.NUMBER\n };\n }\n\n return {\n v: value || '',\n t: CellValueType.STRING\n };\n },\n getMaxRows: () => {\n return table.records.length;\n },\n getMaxColumns: () => {\n return table.columns.length;\n }\n };\n}\n/**\n * 判断当前单元格是否是合并单元格\n * @param table - 表格实例\n * @param col - 列\n * @param row - 行\n * @returns 合并单元格范围 如果当前单元格不是合并单元格,则返回null\n */\nexport function isMergeCell(table: ListTable, col: number, row: number) {\n const cellRange = table.getCellRange(col, row);\n if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) {\n return cellRange;\n }\n return null;\n}\n"]}
@@ -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
  } & {
@@ -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, this.menuHandler = new MenuHandler, this.initDefaultMenuItems();
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),
@@ -1 +1 @@
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 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 { MENU_CONTAINER_CLASS, MENU_ITEM_CLASS, MENU_ITEM_SEPARATOR_CLASS, MENU_ITEM_SUBMENU_CLASS, MENU_STYLES, createElement, applyStyles, createIcon, MENU_ITEM_DISABLED_CLASS } from "./styles";
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", MENU_CONTAINER_CLASS),
19
- applyStyles(this.menuContainer, MENU_STYLES.menuContainer), document.body.appendChild(this.menuContainer),
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", MENU_ITEM_SEPARATOR_CLASS);
36
- applyStyles(separator, MENU_STYLES.menuItemSeparator), container.appendChild(separator);
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", MENU_ITEM_CLASS);
39
- applyStyles(menuItemElement, MENU_STYLES.menuItem);
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
- if (leftContainer.style.display = "flex", leftContainer.style.alignItems = "center",
42
- menuItem.iconName) {
43
- const icon = createIcon(menuItem.iconName);
44
- leftContainer.appendChild(icon);
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, MENU_STYLES.menuItemIcon), leftContainer.appendChild(placeholder);
53
+ applyStyles(placeholder, this.styles.menuItemIcon), leftContainer.appendChild(placeholder);
48
54
  }
49
55
  const text = createElement("span");
50
- if (text.textContent = menuItem.text, applyStyles(text, MENU_STYLES.menuItemText),
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.type = "number", input.min = "1", input.value = item.inputDefaultValue.toString(),
54
- applyStyles(input, MENU_STYLES.inputField), leftContainer.appendChild(input), input.addEventListener("keydown", (e => {
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.style.display = "flex", rightContainer.style.alignItems = "center",
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.textContent = menuItem.shortcut, applyStyles(shortcut, MENU_STYLES.menuItemShortcut),
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(MENU_ITEM_SUBMENU_CLASS);
80
+ menuItemElement.classList.add(...normalizeClassName(this.classes.menuItemSubmenu));
72
81
  const arrow = createElement("span");
73
- arrow.textContent = "▶", applyStyles(arrow, MENU_STYLES.submenuArrow), rightContainer.appendChild(arrow);
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(MENU_ITEM_DISABLED_CLASS),
76
- applyStyles(menuItemElement, MENU_STYLES.menuItemDisabled)), menuItem.disabled || (menuItem.children && 0 !== menuItem.children.length || menuItemElement.addEventListener("click", (e => {
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, MENU_STYLES.menuItemHover), null !== this.hideTimeout && (clearTimeout(this.hideTimeout),
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(MENU_STYLES.menuItemHover).forEach((key => {
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", MENU_CONTAINER_CLASS);
100
- applyStyles(submenu, MENU_STYLES.submenuContainer), this.createMenuItems(items, submenu, parentItem),
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"]}