@visactor/vtable-plugins 1.19.9-alpha.2 → 1.20.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +7 -4
  2. package/cjs/add-row-column.d.ts +2 -2
  3. package/cjs/add-row-column.js +3 -3
  4. package/cjs/add-row-column.js.map +1 -1
  5. package/cjs/auto-fill/auto-fill-helper.d.ts +23 -0
  6. package/cjs/auto-fill/auto-fill-helper.js +83 -0
  7. package/cjs/auto-fill/auto-fill-helper.js.map +1 -0
  8. package/cjs/auto-fill/auto-fill-manager.d.ts +26 -0
  9. package/cjs/auto-fill/auto-fill-manager.js +244 -0
  10. package/cjs/auto-fill/auto-fill-manager.js.map +1 -0
  11. package/cjs/auto-fill/auto-fill-services.d.ts +12 -0
  12. package/cjs/auto-fill/auto-fill-services.js +27 -0
  13. package/cjs/auto-fill/auto-fill-services.js.map +1 -0
  14. package/cjs/auto-fill/date-tools.d.ts +5 -0
  15. package/cjs/auto-fill/date-tools.js +37 -0
  16. package/cjs/auto-fill/date-tools.js.map +1 -0
  17. package/cjs/auto-fill/index.d.ts +21 -0
  18. package/cjs/auto-fill/index.js +52 -0
  19. package/cjs/auto-fill/index.js.map +1 -0
  20. package/cjs/auto-fill/rules.d.ts +10 -0
  21. package/cjs/auto-fill/rules.js +196 -0
  22. package/cjs/auto-fill/rules.js.map +1 -0
  23. package/cjs/auto-fill/series-converters.d.ts +27 -0
  24. package/cjs/auto-fill/series-converters.js +90 -0
  25. package/cjs/auto-fill/series-converters.js.map +1 -0
  26. package/cjs/auto-fill/types.d.ts +67 -0
  27. package/cjs/auto-fill/types.js +20 -0
  28. package/cjs/auto-fill/types.js.map +1 -0
  29. package/cjs/auto-fill/utils/date.d.ts +5 -0
  30. package/cjs/auto-fill/utils/date.js +76 -0
  31. package/cjs/auto-fill/utils/date.js.map +1 -0
  32. package/cjs/auto-fill/utils/fill.d.ts +82 -0
  33. package/cjs/auto-fill/utils/fill.js +361 -0
  34. package/cjs/auto-fill/utils/fill.js.map +1 -0
  35. package/cjs/carousel-animation.d.ts +1 -1
  36. package/cjs/carousel-animation.js.map +1 -1
  37. package/cjs/column-series.js +1 -1
  38. package/cjs/column-series.js.map +1 -1
  39. package/cjs/context-menu.d.ts +34 -0
  40. package/cjs/context-menu.js +157 -0
  41. package/cjs/context-menu.js.map +1 -0
  42. package/cjs/contextmenu/handle-menu-helper.d.ts +23 -0
  43. package/cjs/contextmenu/handle-menu-helper.js +107 -0
  44. package/cjs/contextmenu/handle-menu-helper.js.map +1 -0
  45. package/cjs/contextmenu/index.d.ts +3 -0
  46. package/cjs/contextmenu/index.js +22 -0
  47. package/cjs/contextmenu/index.js.map +1 -0
  48. package/cjs/contextmenu/menu-manager.d.ts +27 -0
  49. package/cjs/contextmenu/menu-manager.js +139 -0
  50. package/cjs/contextmenu/menu-manager.js.map +1 -0
  51. package/cjs/contextmenu/styles.d.ts +106 -0
  52. package/cjs/contextmenu/styles.js +195 -0
  53. package/cjs/contextmenu/styles.js.map +1 -0
  54. package/cjs/contextmenu/types.d.ts +69 -0
  55. package/cjs/contextmenu/types.js +122 -0
  56. package/cjs/contextmenu/types.js.map +1 -0
  57. package/cjs/excel-edit-cell-keyboard.js +2 -2
  58. package/cjs/excel-edit-cell-keyboard.js.map +1 -1
  59. package/cjs/excel-import.js +8 -8
  60. package/cjs/excel-import.js.map +1 -1
  61. package/cjs/fillHandleUtils/autoFillHandle.js.map +1 -1
  62. package/cjs/fillHandleUtils/translateRowObj.js.map +1 -1
  63. package/cjs/filter/condition-filter.d.ts +30 -0
  64. package/cjs/filter/condition-filter.js +271 -0
  65. package/cjs/filter/condition-filter.js.map +1 -0
  66. package/cjs/filter/filter-engine.d.ts +13 -0
  67. package/cjs/filter/filter-engine.js +102 -0
  68. package/cjs/filter/filter-engine.js.map +1 -0
  69. package/cjs/filter/filter-state-manager.d.ts +21 -0
  70. package/cjs/filter/filter-state-manager.js +102 -0
  71. package/cjs/filter/filter-state-manager.js.map +1 -0
  72. package/cjs/filter/filter-toolbar.d.ts +31 -0
  73. package/cjs/filter/filter-toolbar.js +98 -0
  74. package/cjs/filter/filter-toolbar.js.map +1 -0
  75. package/cjs/filter/filter.d.ts +26 -0
  76. package/cjs/filter/filter.js +150 -0
  77. package/cjs/filter/filter.js.map +1 -0
  78. package/cjs/filter/index.d.ts +7 -0
  79. package/cjs/filter/index.js +66 -0
  80. package/cjs/filter/index.js.map +1 -0
  81. package/cjs/filter/styles.d.ts +126 -0
  82. package/cjs/filter/styles.js +145 -0
  83. package/cjs/filter/styles.js.map +1 -0
  84. package/cjs/filter/types.d.ts +55 -0
  85. package/cjs/filter/types.js +18 -0
  86. package/cjs/filter/types.js.map +1 -0
  87. package/cjs/filter/value-filter.d.ts +31 -0
  88. package/cjs/filter/value-filter.js +280 -0
  89. package/cjs/filter/value-filter.js.map +1 -0
  90. package/cjs/focus-highlight.js +1 -1
  91. package/cjs/focus-highlight.js.map +1 -1
  92. package/cjs/gantt-export-image.js.map +1 -1
  93. package/cjs/header-highlight.js.map +1 -1
  94. package/cjs/highlight-header-when-select-cell.d.ts +1 -2
  95. package/cjs/highlight-header-when-select-cell.js +1 -1
  96. package/cjs/highlight-header-when-select-cell.js.map +1 -1
  97. package/cjs/index.d.ts +4 -0
  98. package/cjs/index.js +3 -1
  99. package/cjs/index.js.map +1 -1
  100. package/cjs/invert-highlight.js.map +1 -1
  101. package/cjs/paste-add-row-column.d.ts +1 -0
  102. package/cjs/paste-add-row-column.js +3 -2
  103. package/cjs/paste-add-row-column.js.map +1 -1
  104. package/cjs/rotate-table.js +1 -1
  105. package/cjs/rotate-table.js.map +1 -1
  106. package/cjs/row-series.js +1 -1
  107. package/cjs/row-series.js.map +1 -1
  108. package/cjs/table-carousel-animation.js +2 -3
  109. package/cjs/table-carousel-animation.js.map +1 -1
  110. package/cjs/table-export/csv/index.js +1 -1
  111. package/cjs/table-export/csv/index.js.map +1 -1
  112. package/cjs/table-export/excel/index.js +0 -1
  113. package/cjs/table-export/excel/index.js.map +1 -1
  114. package/cjs/table-export/excel/style.js.map +1 -1
  115. package/cjs/table-export/index.js.map +1 -1
  116. package/cjs/table-export/util/color.js.map +1 -1
  117. package/cjs/table-export/util/download.js.map +1 -1
  118. package/cjs/table-export/util/encode.js.map +1 -1
  119. package/cjs/table-export/util/indent.js.map +1 -1
  120. package/cjs/table-export/util/pagination.js.map +1 -1
  121. package/cjs/table-export/util/promise.js.map +1 -1
  122. package/cjs/table-export/util/type.js +1 -1
  123. package/cjs/table-export/util/type.js.map +1 -1
  124. package/cjs/table-export.js +1 -2
  125. package/cjs/table-export.js.map +1 -1
  126. package/cjs/table-series-number.d.ts +41 -0
  127. package/cjs/table-series-number.js +261 -0
  128. package/cjs/table-series-number.js.map +1 -0
  129. package/cjs/types.d.ts +1 -0
  130. package/cjs/types.js +17 -1
  131. package/cjs/types.js.map +1 -1
  132. package/cjs/wps-fill-handle.js +1 -1
  133. package/cjs/wps-fill-handle.js.map +1 -1
  134. package/dist/vtable-plugins.js +7594 -1492
  135. package/dist/vtable-plugins.min.js +14 -14
  136. package/es/add-row-column.d.ts +2 -2
  137. package/es/add-row-column.js +3 -3
  138. package/es/add-row-column.js.map +1 -1
  139. package/es/auto-fill/auto-fill-helper.d.ts +23 -0
  140. package/es/auto-fill/auto-fill-helper.js +75 -0
  141. package/es/auto-fill/auto-fill-helper.js.map +1 -0
  142. package/es/auto-fill/auto-fill-manager.d.ts +26 -0
  143. package/es/auto-fill/auto-fill-manager.js +218 -0
  144. package/es/auto-fill/auto-fill-manager.js.map +1 -0
  145. package/es/auto-fill/auto-fill-services.d.ts +12 -0
  146. package/es/auto-fill/auto-fill-services.js +19 -0
  147. package/es/auto-fill/auto-fill-services.js.map +1 -0
  148. package/es/auto-fill/date-tools.d.ts +5 -0
  149. package/es/auto-fill/date-tools.js +29 -0
  150. package/es/auto-fill/date-tools.js.map +1 -0
  151. package/es/auto-fill/index.d.ts +21 -0
  152. package/es/auto-fill/index.js +21 -0
  153. package/es/auto-fill/index.js.map +1 -0
  154. package/es/auto-fill/rules.d.ts +10 -0
  155. package/es/auto-fill/rules.js +203 -0
  156. package/es/auto-fill/rules.js.map +1 -0
  157. package/es/auto-fill/series-converters.d.ts +27 -0
  158. package/es/auto-fill/series-converters.js +83 -0
  159. package/es/auto-fill/series-converters.js.map +1 -0
  160. package/es/auto-fill/types.d.ts +67 -0
  161. package/es/auto-fill/types.js +27 -0
  162. package/es/auto-fill/types.js.map +1 -0
  163. package/es/auto-fill/utils/date.d.ts +5 -0
  164. package/es/auto-fill/utils/date.js +68 -0
  165. package/es/auto-fill/utils/date.js.map +1 -0
  166. package/es/auto-fill/utils/fill.d.ts +82 -0
  167. package/es/auto-fill/utils/fill.js +347 -0
  168. package/es/auto-fill/utils/fill.js.map +1 -0
  169. package/es/carousel-animation.d.ts +1 -1
  170. package/es/carousel-animation.js.map +1 -1
  171. package/es/column-series.js +1 -1
  172. package/es/column-series.js.map +1 -1
  173. package/es/context-menu.d.ts +34 -0
  174. package/es/context-menu.js +129 -0
  175. package/es/context-menu.js.map +1 -0
  176. package/es/contextmenu/handle-menu-helper.d.ts +23 -0
  177. package/es/contextmenu/handle-menu-helper.js +99 -0
  178. package/es/contextmenu/handle-menu-helper.js.map +1 -0
  179. package/es/contextmenu/index.d.ts +3 -0
  180. package/es/contextmenu/index.js +6 -0
  181. package/es/contextmenu/index.js.map +1 -0
  182. package/es/contextmenu/menu-manager.d.ts +27 -0
  183. package/es/contextmenu/menu-manager.js +130 -0
  184. package/es/contextmenu/menu-manager.js.map +1 -0
  185. package/es/contextmenu/styles.d.ts +106 -0
  186. package/es/contextmenu/styles.js +197 -0
  187. package/es/contextmenu/styles.js.map +1 -0
  188. package/es/contextmenu/types.d.ts +69 -0
  189. package/es/contextmenu/types.js +121 -0
  190. package/es/contextmenu/types.js.map +1 -0
  191. package/es/excel-edit-cell-keyboard.js +2 -2
  192. package/es/excel-edit-cell-keyboard.js.map +1 -1
  193. package/es/excel-import.js +8 -8
  194. package/es/excel-import.js.map +1 -1
  195. package/es/fillHandleUtils/autoFillHandle.js.map +1 -1
  196. package/es/fillHandleUtils/translateRowObj.js.map +1 -1
  197. package/es/filter/condition-filter.d.ts +30 -0
  198. package/es/filter/condition-filter.js +262 -0
  199. package/es/filter/condition-filter.js.map +1 -0
  200. package/es/filter/filter-engine.d.ts +13 -0
  201. package/es/filter/filter-engine.js +94 -0
  202. package/es/filter/filter-engine.js.map +1 -0
  203. package/es/filter/filter-state-manager.d.ts +21 -0
  204. package/es/filter/filter-state-manager.js +94 -0
  205. package/es/filter/filter-state-manager.js.map +1 -0
  206. package/es/filter/filter-toolbar.d.ts +31 -0
  207. package/es/filter/filter-toolbar.js +90 -0
  208. package/es/filter/filter-toolbar.js.map +1 -0
  209. package/es/filter/filter.d.ts +26 -0
  210. package/es/filter/filter.js +125 -0
  211. package/es/filter/filter.js.map +1 -0
  212. package/es/filter/index.d.ts +7 -0
  213. package/es/filter/index.js +14 -0
  214. package/es/filter/index.js.map +1 -0
  215. package/es/filter/styles.d.ts +126 -0
  216. package/es/filter/styles.js +140 -0
  217. package/es/filter/styles.js.map +1 -0
  218. package/es/filter/types.d.ts +55 -0
  219. package/es/filter/types.js +17 -0
  220. package/es/filter/types.js.map +1 -0
  221. package/es/filter/value-filter.d.ts +31 -0
  222. package/es/filter/value-filter.js +275 -0
  223. package/es/filter/value-filter.js.map +1 -0
  224. package/es/focus-highlight.js +1 -1
  225. package/es/focus-highlight.js.map +1 -1
  226. package/es/gantt-export-image.js.map +1 -1
  227. package/es/header-highlight.js.map +1 -1
  228. package/es/highlight-header-when-select-cell.d.ts +1 -2
  229. package/es/highlight-header-when-select-cell.js +1 -1
  230. package/es/highlight-header-when-select-cell.js.map +1 -1
  231. package/es/index.d.ts +4 -0
  232. package/es/index.js +8 -0
  233. package/es/index.js.map +1 -1
  234. package/es/invert-highlight.js.map +1 -1
  235. package/es/paste-add-row-column.d.ts +1 -0
  236. package/es/paste-add-row-column.js +3 -2
  237. package/es/paste-add-row-column.js.map +1 -1
  238. package/es/rotate-table.js +1 -1
  239. package/es/rotate-table.js.map +1 -1
  240. package/es/row-series.js +1 -1
  241. package/es/row-series.js.map +1 -1
  242. package/es/table-carousel-animation.js +3 -3
  243. package/es/table-carousel-animation.js.map +1 -1
  244. package/es/table-export/csv/index.js +1 -1
  245. package/es/table-export/csv/index.js.map +1 -1
  246. package/es/table-export/excel/index.js +1 -2
  247. package/es/table-export/excel/index.js.map +1 -1
  248. package/es/table-export/excel/style.js.map +1 -1
  249. package/es/table-export/index.js.map +1 -1
  250. package/es/table-export/util/color.js.map +1 -1
  251. package/es/table-export/util/download.js.map +1 -1
  252. package/es/table-export/util/encode.js.map +1 -1
  253. package/es/table-export/util/indent.js.map +1 -1
  254. package/es/table-export/util/pagination.js.map +1 -1
  255. package/es/table-export/util/promise.js.map +1 -1
  256. package/es/table-export/util/type.js +1 -1
  257. package/es/table-export/util/type.js.map +1 -1
  258. package/es/table-export.js +1 -2
  259. package/es/table-export.js.map +1 -1
  260. package/es/table-series-number.d.ts +41 -0
  261. package/es/table-series-number.js +253 -0
  262. package/es/table-series-number.js.map +1 -0
  263. package/es/types.d.ts +1 -0
  264. package/es/types.js +2 -1
  265. package/es/types.js.map +1 -1
  266. package/es/wps-fill-handle.js +1 -1
  267. package/es/wps-fill-handle.js.map +1 -1
  268. package/package.json +8 -8
@@ -0,0 +1,130 @@
1
+ import { vglobal } from "@visactor/vtable/es/vrender";
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";
4
+
5
+ export class MenuManager {
6
+ constructor() {
7
+ this.menuContainer = null, this.activeSubmenus = [], this.clickCallback = null,
8
+ this.table = null, this.context = {}, this.hideTimeout = null, this.showTimeout = null,
9
+ this.submenuShowDelay = 100, this.submenuHideDelay = 500, this.handleDocumentClick = event => {
10
+ if (!this.menuContainer || event.target !== this.menuContainer && !this.menuContainer.contains(event.target)) {
11
+ for (const submenu of this.activeSubmenus) if (event.target === submenu || submenu.contains(event.target)) return;
12
+ this.release();
13
+ }
14
+ };
15
+ }
16
+ showMenu(menuItems, x, y, context, table) {
17
+ this.context = context, this.table = table, this.release(), this.menuContainer = createElement("div", MENU_CONTAINER_CLASS),
18
+ applyStyles(this.menuContainer, MENU_STYLES.menuContainer), document.body.appendChild(this.menuContainer),
19
+ this.createMenuItems(menuItems, this.menuContainer), this.positionMenu(this.menuContainer, x, y),
20
+ setTimeout((() => {
21
+ vglobal.addEventListener("click", this.handleDocumentClick);
22
+ }), 0);
23
+ }
24
+ setClickCallback(callback) {
25
+ this.clickCallback = callback;
26
+ }
27
+ createMenuItems(items, container, parentItem) {
28
+ items.forEach((item => {
29
+ if ("string" == typeof item && "---" === item) {
30
+ const separator = createElement("div", MENU_ITEM_SEPARATOR_CLASS);
31
+ applyStyles(separator, MENU_STYLES.menuItemSeparator), container.appendChild(separator);
32
+ } else if ("object" == typeof item) {
33
+ const menuItem = item, menuItemElement = createElement("div", MENU_ITEM_CLASS);
34
+ applyStyles(menuItemElement, MENU_STYLES.menuItem);
35
+ const leftContainer = createElement("div");
36
+ if (leftContainer.style.display = "flex", leftContainer.style.alignItems = "center",
37
+ menuItem.iconName) {
38
+ const icon = createIcon(menuItem.iconName);
39
+ leftContainer.appendChild(icon);
40
+ } else if (menuItem.iconPlaceholder) {
41
+ const placeholder = createElement("span");
42
+ applyStyles(placeholder, MENU_STYLES.menuItemIcon), leftContainer.appendChild(placeholder);
43
+ }
44
+ const text = createElement("span");
45
+ if (text.textContent = menuItem.text, applyStyles(text, MENU_STYLES.menuItemText),
46
+ leftContainer.appendChild(text), item.inputDefaultValue) {
47
+ const input = createElement("input");
48
+ input.type = "number", input.min = "1", input.value = item.inputDefaultValue.toString(),
49
+ applyStyles(input, MENU_STYLES.inputField), leftContainer.appendChild(input), input.addEventListener("keydown", (e => {
50
+ "Enter" === e.key && this.handleMenuItemClick(Object.assign({
51
+ menuKey: menuItem.menuKey,
52
+ menuText: menuItem.text,
53
+ inputValue: parseInt(input.value, 10)
54
+ }, this.context));
55
+ }));
56
+ }
57
+ menuItemElement.appendChild(leftContainer);
58
+ const rightContainer = createElement("div");
59
+ if (rightContainer.style.display = "flex", rightContainer.style.alignItems = "center",
60
+ menuItem.shortcut) {
61
+ const shortcut = createElement("span");
62
+ shortcut.textContent = menuItem.shortcut, applyStyles(shortcut, MENU_STYLES.menuItemShortcut),
63
+ rightContainer.appendChild(shortcut);
64
+ }
65
+ if (menuItem.children && menuItem.children.length > 0) {
66
+ menuItemElement.classList.add(MENU_ITEM_SUBMENU_CLASS);
67
+ const arrow = createElement("span");
68
+ arrow.textContent = "▶", applyStyles(arrow, MENU_STYLES.submenuArrow), rightContainer.appendChild(arrow);
69
+ }
70
+ menuItemElement.appendChild(rightContainer), menuItem.disabled && (menuItemElement.classList.add(MENU_ITEM_DISABLED_CLASS),
71
+ applyStyles(menuItemElement, MENU_STYLES.menuItemDisabled)), menuItem.disabled || (menuItem.children && 0 !== menuItem.children.length || menuItemElement.addEventListener("click", (e => {
72
+ e.target instanceof HTMLInputElement || this.handleMenuItemClick(Object.assign({
73
+ menuKey: menuItem.menuKey,
74
+ menuText: menuItem.text
75
+ }, this.context));
76
+ })), menuItemElement.addEventListener("mouseenter", (() => {
77
+ applyStyles(menuItemElement, MENU_STYLES.menuItemHover), null !== this.hideTimeout && (clearTimeout(this.hideTimeout),
78
+ this.hideTimeout = null), null !== this.showTimeout && (clearTimeout(this.showTimeout),
79
+ this.showTimeout = null), menuItem.children && menuItem.children.length > 0 ? (this.closeAllSubmenus(),
80
+ this.showTimeout = setTimeout((() => {
81
+ document.body.contains(menuItemElement) && this.showSubmenu(menuItem.children, menuItemElement, menuItem);
82
+ }), this.submenuShowDelay)) : parentItem || this.closeAllSubmenus();
83
+ })), menuItemElement.addEventListener("mouseleave", (() => {
84
+ Object.keys(MENU_STYLES.menuItemHover).forEach((key => {
85
+ menuItemElement.style[key] = "";
86
+ })), menuItem.children && menuItem.children.length > 0 && (this.hideTimeout = setTimeout((() => {
87
+ this.closeAllSubmenus();
88
+ }), this.submenuHideDelay));
89
+ }))), container.appendChild(menuItemElement);
90
+ }
91
+ }));
92
+ }
93
+ showSubmenu(items, parentElement, parentItem) {
94
+ const parentRect = parentElement.getBoundingClientRect(), submenu = createElement("div", MENU_CONTAINER_CLASS);
95
+ applyStyles(submenu, MENU_STYLES.submenuContainer), this.createMenuItems(items, submenu, parentItem),
96
+ document.body.appendChild(submenu);
97
+ const submenuRect = submenu.getBoundingClientRect();
98
+ let left = parentRect.right, top = parentRect.top;
99
+ left + submenuRect.width > window.innerWidth && (left = parentRect.left - submenuRect.width),
100
+ top + submenuRect.height > window.innerHeight && (top = window.innerHeight - submenuRect.height),
101
+ submenu.style.left = `${left}px`, submenu.style.top = `${top}px`, submenu.addEventListener("mouseenter", (() => {
102
+ null !== this.hideTimeout && (clearTimeout(this.hideTimeout), this.hideTimeout = null);
103
+ })), submenu.addEventListener("mouseleave", (() => {
104
+ this.hideTimeout = setTimeout((() => {
105
+ this.closeAllSubmenus();
106
+ }), this.submenuHideDelay);
107
+ })), this.activeSubmenus.push(submenu);
108
+ }
109
+ closeAllSubmenus() {
110
+ this.activeSubmenus.forEach((submenu => {
111
+ submenu && submenu.parentNode && submenu.parentNode.removeChild(submenu);
112
+ })), this.activeSubmenus = [];
113
+ }
114
+ positionMenu(menu, x, y) {
115
+ const menuRect = menu.getBoundingClientRect();
116
+ let left = x, top = y;
117
+ left + menuRect.width > window.innerWidth && (left = window.innerWidth - menuRect.width),
118
+ top + menuRect.height > window.innerHeight && (top = window.innerHeight - menuRect.height),
119
+ menu.style.left = `${left}px`, menu.style.top = `${top}px`;
120
+ }
121
+ handleMenuItemClick(args) {
122
+ this.release(), this.clickCallback && this.table && this.clickCallback(args, this.table);
123
+ }
124
+ release() {
125
+ this.closeAllSubmenus(), this.menuContainer && this.menuContainer.parentNode && (this.menuContainer.parentNode.removeChild(this.menuContainer),
126
+ this.menuContainer = null), null !== this.hideTimeout && (clearTimeout(this.hideTimeout),
127
+ this.hideTimeout = null), vglobal.removeEventListener("click", this.handleDocumentClick);
128
+ }
129
+ }
130
+ //# sourceMappingURL=menu-manager.js.map
@@ -0,0 +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 } 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\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\n // 创建菜单项\n this.createMenuItems(menuItems, this.menuContainer);\n\n // 调整菜单位置\n this.positionMenu(this.menuContainer, x, y);\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,\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,\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\n // 移除全局事件监听\n vglobal.removeEventListener('click', this.handleDocumentClick);\n }\n}\n"]}
@@ -0,0 +1,106 @@
1
+ export declare const MENU_CONTAINER_CLASS = "vtable-context-menu-container";
2
+ export declare const MENU_ITEM_CLASS = "vtable-context-menu-item";
3
+ export declare const MENU_ITEM_DISABLED_CLASS = "vtable-context-menu-item-disabled";
4
+ export declare const MENU_ITEM_SEPARATOR_CLASS = "vtable-context-menu-item-separator";
5
+ export declare const MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu";
6
+ export declare const MENU_STYLES: {
7
+ menuContainer: {
8
+ position: string;
9
+ backgroundColor: string;
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;
92
+ };
93
+ button: {
94
+ padding: string;
95
+ backgroundColor: string;
96
+ color: string;
97
+ border: string;
98
+ borderRadius: string;
99
+ cursor: string;
100
+ fontSize: string;
101
+ };
102
+ };
103
+ export declare function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement;
104
+ export declare function applyStyles(element: HTMLElement, styles: Record<string, any>): void;
105
+ export declare function createIcon(iconName: string): HTMLElement;
106
+ export declare function createNumberInputItem(label: string, defaultValue: number, iconName: string, callback: (value: number) => void): HTMLElement;
@@ -0,0 +1,197 @@
1
+ export const MENU_CONTAINER_CLASS = "vtable-context-menu-container";
2
+
3
+ export const MENU_ITEM_CLASS = "vtable-context-menu-item";
4
+
5
+ export const MENU_ITEM_DISABLED_CLASS = "vtable-context-menu-item-disabled";
6
+
7
+ export const MENU_ITEM_SEPARATOR_CLASS = "vtable-context-menu-item-separator";
8
+
9
+ export const MENU_ITEM_SUBMENU_CLASS = "vtable-context-menu-item-submenu";
10
+
11
+ export const MENU_STYLES = {
12
+ menuContainer: {
13
+ position: "absolute",
14
+ backgroundColor: "#ffffff",
15
+ boxShadow: "0 2px 10px rgba(0, 0, 0, 0.2)",
16
+ borderRadius: "4px",
17
+ padding: "5px 0",
18
+ zIndex: 1e3,
19
+ minWidth: "180px",
20
+ maxHeight: "300px",
21
+ overflowY: "auto",
22
+ fontSize: "12px"
23
+ },
24
+ menuItem: {
25
+ padding: "6px 20px",
26
+ cursor: "pointer",
27
+ whiteSpace: "nowrap",
28
+ position: "relative",
29
+ display: "flex",
30
+ alignItems: "center",
31
+ justifyContent: "space-between"
32
+ },
33
+ menuItemHover: {
34
+ backgroundColor: "#f5f5f5"
35
+ },
36
+ menuItemDisabled: {
37
+ opacity: .5,
38
+ cursor: "not-allowed"
39
+ },
40
+ menuItemSeparator: {
41
+ height: "1px",
42
+ backgroundColor: "#e0e0e0",
43
+ margin: "5px 0"
44
+ },
45
+ menuItemIcon: {
46
+ marginRight: "8px",
47
+ width: "16px",
48
+ height: "16px",
49
+ display: "inline-flex",
50
+ alignItems: "center",
51
+ justifyContent: "center"
52
+ },
53
+ menuItemText: {
54
+ flex: 1
55
+ },
56
+ menuItemShortcut: {
57
+ marginLeft: "20px",
58
+ color: "#999",
59
+ fontSize: "11px"
60
+ },
61
+ submenuArrow: {
62
+ marginLeft: "5px",
63
+ fontSize: "12px",
64
+ color: "#666"
65
+ },
66
+ submenuContainer: {
67
+ position: "absolute",
68
+ left: "100%",
69
+ top: "0",
70
+ backgroundColor: "#ffffff",
71
+ boxShadow: "0 2px 10px rgba(0, 0, 0, 0.2)",
72
+ borderRadius: "4px",
73
+ padding: "5px 0",
74
+ zIndex: 1001,
75
+ minWidth: "180px",
76
+ fontSize: "12px"
77
+ },
78
+ inputContainer: {
79
+ padding: "8px 12px",
80
+ display: "flex",
81
+ alignItems: "center"
82
+ },
83
+ inputLabel: {
84
+ marginRight: "8px",
85
+ whiteSpace: "nowrap"
86
+ },
87
+ inputField: {
88
+ width: "60px",
89
+ padding: "4px",
90
+ border: "1px solid #ddd",
91
+ borderRadius: "3px"
92
+ },
93
+ buttonContainer: {
94
+ display: "flex",
95
+ justifyContent: "flex-end",
96
+ padding: "5px 12px"
97
+ },
98
+ button: {
99
+ padding: "4px 8px",
100
+ backgroundColor: "#1890ff",
101
+ color: "white",
102
+ border: "none",
103
+ borderRadius: "3px",
104
+ cursor: "pointer",
105
+ fontSize: "12px"
106
+ }
107
+ };
108
+
109
+ export function createElement(tag, className, styles) {
110
+ const element = document.createElement(tag);
111
+ return className && (element.className = className), styles && applyStyles(element, styles),
112
+ element;
113
+ }
114
+
115
+ export function applyStyles(element, styles) {
116
+ Object.entries(styles).forEach((([key, value]) => {
117
+ element.style[key] = value;
118
+ }));
119
+ }
120
+
121
+ export function createIcon(iconName) {
122
+ const iconElement = createElement("span");
123
+ switch (iconName) {
124
+ case "copy":
125
+ iconElement.innerHTML = "📋";
126
+ break;
127
+
128
+ case "paste":
129
+ iconElement.innerHTML = "📌";
130
+ break;
131
+
132
+ case "cut":
133
+ iconElement.innerHTML = "✂️";
134
+ break;
135
+
136
+ case "delete":
137
+ iconElement.innerHTML = "🗑️";
138
+ break;
139
+
140
+ case "insert":
141
+ iconElement.innerHTML = "➕";
142
+ break;
143
+
144
+ case "sort":
145
+ iconElement.innerHTML = "🔃";
146
+ break;
147
+
148
+ case "protect":
149
+ iconElement.innerHTML = "🔒";
150
+ break;
151
+
152
+ case "hide":
153
+ iconElement.innerHTML = "👁️";
154
+ break;
155
+
156
+ case "freeze":
157
+ iconElement.innerHTML = "❄️";
158
+ break;
159
+
160
+ case "up-arrow":
161
+ iconElement.innerHTML = "🔼";
162
+ break;
163
+
164
+ case "down-arrow":
165
+ iconElement.innerHTML = "🔽";
166
+ break;
167
+
168
+ case "left-arrow":
169
+ iconElement.innerHTML = "◀️";
170
+ break;
171
+
172
+ case "right-arrow":
173
+ iconElement.innerHTML = "▶️";
174
+ break;
175
+
176
+ default:
177
+ iconElement.innerHTML = "•";
178
+ }
179
+ return applyStyles(iconElement, MENU_STYLES.menuItemIcon), iconElement;
180
+ }
181
+
182
+ export function createNumberInputItem(label, defaultValue = 1, iconName, callback) {
183
+ const container = createElement("div");
184
+ if (applyStyles(container, MENU_STYLES.inputContainer), iconName) {
185
+ const icon = createIcon(iconName);
186
+ container.appendChild(icon);
187
+ }
188
+ const labelElement = createElement("label");
189
+ labelElement.textContent = label, applyStyles(labelElement, MENU_STYLES.inputLabel),
190
+ container.appendChild(labelElement);
191
+ const input = createElement("input");
192
+ input.type = "number", input.min = "1", input.value = defaultValue.toString(), applyStyles(input, MENU_STYLES.inputField),
193
+ container.appendChild(input);
194
+ const wrapper = createElement("div");
195
+ return wrapper.appendChild(container), wrapper;
196
+ }
197
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contextmenu/styles.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAC1D,MAAM,CAAC,MAAM,wBAAwB,GAAG,mCAAmC,CAAC;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,oCAAoC,CAAC;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,kCAAkC,CAAC;AAE1E,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE;QACb,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,SAAS;QAC1B,SAAS,EAAE,+BAA+B;QAC1C,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;KACjB;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,eAAe;KAChC;IACD,aAAa,EAAE;QACb,eAAe,EAAE,SAAS;KAC3B;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,aAAa;KACtB;IACD,iBAAiB,EAAE;QACjB,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE,OAAO;KAChB;IACD,YAAY,EAAE;QACZ,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,aAAa;QACtB,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;KACzB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC;KACR;IACD,gBAAgB,EAAE;QAChB,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;KACjB;IACD,YAAY,EAAE;QACZ,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,MAAM;KACd;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,GAAG;QACR,eAAe,EAAE,SAAS;QAC1B,SAAS,EAAE,+BAA+B;QAC1C,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,MAAM;KACjB;IACD,cAAc,EAAE;QACd,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;KACrB;IACD,UAAU,EAAE;QACV,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,QAAQ;KACrB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,KAAK;KACpB;IACD,eAAe,EAAE;QACf,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,UAAU;QAC1B,OAAO,EAAE,UAAU;KACpB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,SAAS;QAClB,eAAe,EAAE,SAAS;QAC1B,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,MAAM;KACjB;CACF,CAAC;AAKF,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,SAAkB,EAAE,MAA4B;IACzF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,SAAS,EAAE;QACb,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;KAC/B;IACD,IAAI,MAAM,EAAE;QACV,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAC9B;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,OAAoB,EAAE,MAA2B;IAC3E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7C,OAAO,CAAC,KAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAKD,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAG1C,QAAQ,QAAQ,EAAE;QAChB,KAAK,MAAM;YACT,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,OAAO;YACV,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,KAAK;YACR,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC;YAC9B,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,CAAC,SAAS,GAAG,GAAG,CAAC;YAC5B,MAAM;QACR,KAAK,MAAM;YACT,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QAOR,KAAK,SAAS;YACZ,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,MAAM;YACT,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC;YAC9B,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,UAAU;YACb,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,YAAY;YACf,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,YAAY;YACf,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,aAAa;YAChB,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR;YACE,WAAW,CAAC,SAAS,GAAG,GAAG,CAAC;KAC/B;IAED,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IACnD,OAAO,WAAW,CAAC;AACrB,CAAC;AAKD,MAAM,UAAU,qBAAqB,CACnC,KAAa,EACb,eAAuB,CAAC,EACxB,QAAgB,EAChB,QAAiC;IAGjC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAKnD,IAAI,QAAQ,EAAE;QACZ,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KAC7B;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC;IACjC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClD,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAGpC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAqB,CAAC;IACzD,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;IACtB,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IACtC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC","file":"styles.js","sourcesContent":["/**\n * 右键菜单的样式定义\n */\n\nexport const MENU_CONTAINER_CLASS = 'vtable-context-menu-container';\nexport const MENU_ITEM_CLASS = 'vtable-context-menu-item';\nexport const MENU_ITEM_DISABLED_CLASS = 'vtable-context-menu-item-disabled';\nexport const MENU_ITEM_SEPARATOR_CLASS = 'vtable-context-menu-item-separator';\nexport const MENU_ITEM_SUBMENU_CLASS = 'vtable-context-menu-item-submenu';\n\nexport const MENU_STYLES = {\n menuContainer: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: 1000,\n minWidth: '180px',\n maxHeight: '300px', // 设置最大高度\n overflowY: 'auto', // 添加垂直滚动\n fontSize: '12px'\n },\n menuItem: {\n padding: '6px 20px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n },\n menuItemHover: {\n backgroundColor: '#f5f5f5'\n },\n menuItemDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed'\n },\n menuItemSeparator: {\n height: '1px',\n backgroundColor: '#e0e0e0',\n margin: '5px 0'\n },\n menuItemIcon: {\n marginRight: '8px',\n width: '16px',\n height: '16px',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n menuItemText: {\n flex: 1\n },\n menuItemShortcut: {\n marginLeft: '20px',\n color: '#999',\n fontSize: '11px'\n },\n submenuArrow: {\n marginLeft: '5px',\n fontSize: '12px',\n color: '#666'\n },\n submenuContainer: {\n position: 'absolute',\n left: '100%',\n top: '0',\n backgroundColor: '#ffffff',\n boxShadow: '0 2px 10px rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n padding: '5px 0',\n zIndex: 1001,\n minWidth: '180px',\n fontSize: '12px'\n },\n inputContainer: {\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'center'\n },\n inputLabel: {\n marginRight: '8px',\n whiteSpace: 'nowrap'\n },\n inputField: {\n width: '60px',\n padding: '4px',\n border: '1px solid #ddd',\n borderRadius: '3px'\n },\n buttonContainer: {\n display: 'flex',\n justifyContent: 'flex-end',\n padding: '5px 12px'\n },\n button: {\n padding: '4px 8px',\n backgroundColor: '#1890ff',\n color: 'white',\n border: 'none',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '12px'\n }\n};\n\n/**\n * 创建DOM元素\n */\nexport function createElement(tag: string, className?: string, styles?: Record<string, any>): HTMLElement {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n if (styles) {\n applyStyles(element, styles);\n }\n return element;\n}\n\n/**\n * 应用样式到元素\n */\nexport function applyStyles(element: HTMLElement, styles: Record<string, any>): void {\n Object.entries(styles).forEach(([key, value]) => {\n (element.style as any)[key] = value;\n });\n}\n\n/**\n * 创建图标元素\n */\nexport function createIcon(iconName: string): HTMLElement {\n const iconElement = createElement('span');\n\n // 根据图标名称设置不同的内容\n switch (iconName) {\n case 'copy':\n iconElement.innerHTML = '📋';\n break;\n case 'paste':\n iconElement.innerHTML = '📌';\n break;\n case 'cut':\n iconElement.innerHTML = '✂️';\n break;\n case 'delete':\n iconElement.innerHTML = '🗑️';\n break;\n case 'insert':\n iconElement.innerHTML = '➕';\n break;\n case 'sort':\n iconElement.innerHTML = '🔃';\n break;\n // case 'merge':\n // iconElement.innerHTML = ;\n // break;\n // case 'unmerge':\n // iconElement.innerHTML = ;\n // break;\n case 'protect':\n iconElement.innerHTML = '🔒';\n break;\n case 'hide':\n iconElement.innerHTML = '👁️';\n break;\n case 'freeze':\n iconElement.innerHTML = '❄️';\n break;\n case 'up-arrow':\n iconElement.innerHTML = '🔼';\n break;\n case 'down-arrow':\n iconElement.innerHTML = '🔽';\n break;\n case 'left-arrow':\n iconElement.innerHTML = '◀️';\n break;\n case 'right-arrow':\n iconElement.innerHTML = '▶️';\n break;\n default:\n iconElement.innerHTML = '•';\n }\n\n applyStyles(iconElement, MENU_STYLES.menuItemIcon);\n return iconElement;\n}\n\n/**\n * 创建带有数字输入框的菜单项\n */\nexport function createNumberInputItem(\n label: string,\n defaultValue: number = 1,\n iconName: string,\n callback: (value: number) => void\n): HTMLElement {\n // 创建容器\n const container = createElement('div');\n applyStyles(container, MENU_STYLES.inputContainer);\n\n // 创建左侧图标容器\n\n // 添加图标\n if (iconName) {\n const icon = createIcon(iconName);\n container.appendChild(icon);\n }\n // 创建标签\n const labelElement = createElement('label');\n labelElement.textContent = label;\n applyStyles(labelElement, MENU_STYLES.inputLabel);\n container.appendChild(labelElement);\n\n // 创建输入框\n const input = createElement('input') as HTMLInputElement;\n input.type = 'number';\n input.min = '1';\n input.value = defaultValue.toString();\n applyStyles(input, MENU_STYLES.inputField);\n container.appendChild(input);\n // 创建包装容器\n const wrapper = createElement('div');\n wrapper.appendChild(container);\n\n return wrapper;\n}\n"]}
@@ -0,0 +1,69 @@
1
+ export interface MenuClickEventArgs {
2
+ menuKey: MenuKey;
3
+ menuText: string;
4
+ rowIndex?: number;
5
+ colIndex?: number;
6
+ cellValue?: any;
7
+ inputValue?: number | string;
8
+ }
9
+ export declare enum MenuKey {
10
+ EMPTY = 0,
11
+ COPY = "copy",
12
+ CUT = "cut",
13
+ PASTE = "paste",
14
+ INSERT_COLUMN_LEFT = "insert_column_left",
15
+ INSERT_COLUMN_RIGHT = "insert_column_right",
16
+ INSERT_ROW_ABOVE = "insert_row_above",
17
+ INSERT_ROW_BELOW = "insert_row_below",
18
+ DELETE_ROW = "delete_row",
19
+ DELETE_COLUMN = "delete_column",
20
+ FREEZE_TO_THIS_ROW = "freeze_to_this_row",
21
+ FREEZE_TO_THIS_COLUMN = "freeze_to_this_column",
22
+ FREEZE_TO_THIS_ROW_AND_COLUMN = "freeze_to_this_row_and_column",
23
+ UNFREEZE = "unfreeze",
24
+ MERGE_CELLS = "merge_cells",
25
+ UNMERGE_CELLS = "unmerge_cells",
26
+ HIDE_COLUMN = "hide_column",
27
+ SORT = "sort"
28
+ }
29
+ export interface MenuItem {
30
+ text: string;
31
+ menuKey: MenuKey | string;
32
+ disabled?: boolean;
33
+ shortcut?: string;
34
+ iconName?: string;
35
+ iconPlaceholder?: boolean;
36
+ inputDefaultValue?: number;
37
+ children?: (MenuItem | string)[];
38
+ }
39
+ export type MenuItemOrSeparator = MenuItem | string;
40
+ export declare const DEFAULT_BODY_MENU_ITEMS: (string | {
41
+ text: string;
42
+ menuKey: MenuKey;
43
+ } | {
44
+ text: string;
45
+ menuKey: MenuKey;
46
+ iconName: string;
47
+ children: {
48
+ text: string;
49
+ menuKey: MenuKey;
50
+ }[];
51
+ })[];
52
+ export declare const DEFAULT_HEADER_MENU_ITEMS: (string | {
53
+ text: string;
54
+ menuKey: MenuKey;
55
+ })[];
56
+ export declare const DEFAULT_COLUMN_SERIES_MENU_ITEMS: (string | {
57
+ text: string;
58
+ menuKey: MenuKey;
59
+ })[];
60
+ export declare const DEFAULT_ROW_SERIES_MENU_ITEMS: (string | {
61
+ text: string;
62
+ menuKey: MenuKey;
63
+ })[];
64
+ export declare const DEFAULT_CORNER_SERIES_MENU_ITEMS: {
65
+ text: string;
66
+ menuKey: MenuKey;
67
+ iconName: string;
68
+ shortcut: string;
69
+ }[];