@imengyu/vue3-context-menu 1.1.7 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.CN.md CHANGED
@@ -7,20 +7,76 @@
7
7
 
8
8
  ---
9
9
 
10
- [查看在线演示](https://imengyu.top/pages/vue3-context-menu-demo/)
11
-
12
10
  ## 特性
13
11
 
14
12
  * 简洁易用,体积小
15
13
  * 提供组件模式和函数模式,调用方便
16
14
  * 可自定义
17
15
 
18
- ### 安装
16
+ ### 用法
19
17
 
20
18
  ```
21
19
  npm install -save @imengyu/vue3-context-menu
22
20
  ```
23
21
 
22
+ 然后在 main.ts 中导入:
23
+
24
+ ```js
25
+ import '@imengyu/vue3-context-menu/lib/vue3-context-menu.css'
26
+ import ContextMenu from '@imengyu/vue3-context-menu'
27
+
28
+ createApp(App).use(ContextMenu)
29
+ ```
30
+
31
+ 然后你就可以在 vue 文件中使用菜单了:
32
+
33
+ ```js
34
+ import ContextMenu from '@imengyu/vue3-context-menu'
35
+
36
+ onContextMenu(e : MouseEvent) {
37
+ //prevent the browser's default menu
38
+ e.preventDefault();
39
+ //show your menu
40
+ ContextMenu.showContextMenu({
41
+ x: e.x,
42
+ y: e.y,
43
+ items: [
44
+ {
45
+ label: "A menu item",
46
+ onClick: () => {
47
+ alert("You click a menu item");
48
+ }
49
+ },
50
+ {
51
+ label: "A submenu",
52
+ children: [
53
+ { label: "Item1" },
54
+ { label: "Item2" },
55
+ { label: "Item3" },
56
+ ]
57
+ },
58
+ ]
59
+ });
60
+ }
61
+ ```
62
+
63
+ 关于详细的用法,请参考文档。
64
+
24
65
  ## 文档
25
66
 
26
- [查看文档](https://imengyu.top/pages/vue3-context-menu-docs/)
67
+ [查看文档](https://imengyu.top/pages/vue3-context-menu-docs/)
68
+
69
+ [查看在线演示](https://imengyu.top/pages/vue3-context-menu-demo/)
70
+
71
+ ## 开发
72
+
73
+ ```shell
74
+ git clone git@github.com:imengyu/vue3-context-menu.git
75
+ cd vue3-context-menu
76
+ npm install
77
+ npm serve
78
+ ```
79
+
80
+ ## License
81
+
82
+ [MIT](./LICENSE)
package/README.md CHANGED
@@ -5,24 +5,119 @@ A context menu component for Vue3
5
5
 
6
6
  ![Screenshot](https://raw.githubusercontent.com/imengyu/vue3-context-menu/main/screenshot/first.png)
7
7
 
8
- [中文说明](https://github.com/imengyu/vue3-context-menu/blob/main/README.CN.md)
8
+ English | [简体中文](https://github.com/imengyu/vue3-context-menu/blob/main/README.CN.md)
9
9
 
10
10
  ---
11
11
 
12
- [Click here View online Demo](https://imengyu.top/pages/vue3-context-menu-demo/)
13
-
14
- ## features
12
+ ## Features
15
13
 
16
14
  * Simple and easy to use, small size
17
15
  * Provide component mode and function mode
18
16
  * Customizable
19
17
 
20
- ### Install
18
+ ## Documentation
19
+
20
+ [View Documentation](https://imengyu.top/pages/vue3-context-menu-docs/en/)
21
+
22
+ [Click here View online Demo](https://imengyu.top/pages/vue3-context-menu-demo/)
23
+
24
+ ### Useage
21
25
 
22
26
  ```
23
27
  npm install -save @imengyu/vue3-context-menu
24
28
  ```
25
29
 
26
- ## Documentation
30
+ Then import in the main.ts file:
31
+
32
+ ```js
33
+ import '@imengyu/vue3-context-menu/lib/vue3-context-menu.css'
34
+ import ContextMenu from '@imengyu/vue3-context-menu'
35
+
36
+ createApp(App).use(ContextMenu)
37
+ ```
38
+
39
+ Then you can use the ContextMenu in the .vue file:
40
+
41
+ ```js
42
+ import ContextMenu from '@imengyu/vue3-context-menu'
43
+
44
+ onContextMenu(e : MouseEvent) {
45
+ //prevent the browser's default menu
46
+ e.preventDefault();
47
+ //show your menu
48
+ ContextMenu.showContextMenu({
49
+ x: e.x,
50
+ y: e.y,
51
+ items: [
52
+ {
53
+ label: "A menu item",
54
+ onClick: () => {
55
+ alert("You click a menu item");
56
+ }
57
+ },
58
+ {
59
+ label: "A submenu",
60
+ children: [
61
+ { label: "Item1" },
62
+ { label: "Item2" },
63
+ { label: "Item3" },
64
+ ]
65
+ },
66
+ ]
67
+ });
68
+ }
69
+ ```
70
+
71
+ Or component:
72
+
73
+ ```html
74
+ <context-menu
75
+ v-model:show="show"
76
+ :options="optionsComponent"
77
+ >
78
+ <context-menu-item label="Simple item" @click="onMenuClick(1)" />
79
+ <context-menu-sperator /><!--use this to add sperator-->
80
+ <context-menu-group label="Menu with child">
81
+ <context-menu-item label="Item1" @click="onMenuClick(2)" />
82
+ <context-menu-item label="Item2" @click="onMenuClick(3)" />
83
+ <context-menu-group label="Child with v-for 50">
84
+ <context-menu-item v-for="index of 50" :key="index" :label="'Item3-'+index" @click="onLoopMenuClick(index)" />
85
+ </context-menu-group>
86
+ </context-menu-group>
87
+ </context-menu>
88
+ ```
89
+
90
+ ```js
91
+ data() {
92
+ return {
93
+ show: false,
94
+ optionsComponent: {
95
+ zIndex: 3,
96
+ minWidth: 230,
97
+ x: 500,
98
+ y: 200
99
+ },
100
+ }
101
+ },
102
+ methods: {
103
+ onButtonClick(e : MouseEvent) {
104
+ //Show component mode menu
105
+ this.show = true;
106
+ this.options.x = e.x;
107
+ this.options.y = e.y;
108
+ },
109
+ }
110
+ ```
111
+
112
+ ## Development
113
+
114
+ ```shell
115
+ git clone git@github.com:imengyu/vue3-context-menu.git
116
+ cd vue3-context-menu
117
+ npm install
118
+ npm serve
119
+ ```
120
+
121
+ ## License
27
122
 
28
- [View Documentation](https://imengyu.top/pages/vue3-context-menu-docs/)
123
+ [MIT](./LICENSE)
@@ -0,0 +1,146 @@
1
+ <html>
2
+ <head>
3
+ <title>vue3-context-menu test</title>
4
+ <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
5
+ <link rel="stylesheet" href="./vue3-context-menu.css" />
6
+ </head>
7
+ <body>
8
+ <script src="./vue3-context-menu.umd.js"></script>
9
+
10
+ <div id="app">
11
+ <div @contextmenu="onContextMenu($event)">{{ message }}</div>
12
+ </div>
13
+
14
+ <script>
15
+ const { createApp } = Vue
16
+
17
+ createApp({
18
+ data() {
19
+ return {
20
+ message: 'Right click here to show contextmenu !'
21
+ }
22
+ },
23
+ methods: {
24
+ onContextMenu(e) {
25
+ //prevent the browser's default menu
26
+ e.preventDefault();
27
+ //show our menu
28
+ this.$contextmenu({
29
+ items: [
30
+ {
31
+ label: 'Simple item',
32
+ onClick: () => alert('Click Simple item'),
33
+ },
34
+ {
35
+ label: "Sub menu Example",
36
+ children: [
37
+ {
38
+ label: "Back",
39
+ onClick: () => {
40
+ console.log("You click Back");
41
+ }
42
+ },
43
+ { label: "Forward", disabled: true },
44
+ {
45
+ label: "Reload",
46
+ divided: true,
47
+ icon: "icon-reload-1",
48
+ onClick: () => {
49
+ alert("You click Reload");
50
+ }
51
+ },
52
+ {
53
+ label: "Save as...",
54
+ icon: "icon-save",
55
+ onClick: () => {
56
+ alert("You click Save as");
57
+ }
58
+ },
59
+ {
60
+ label: "Print...",
61
+ icon: "icon-print",
62
+ onClick: () => {
63
+ alert("You click Print");
64
+ }
65
+ },
66
+ { label: "View source", icon: "icon-terminal" },
67
+ { label: "Inspect" }
68
+ ],
69
+ },
70
+ {
71
+ label: "Submenu with Submenu",
72
+ children: [
73
+ {
74
+ label: "Very long submenu",
75
+ divided: true,
76
+ children: [
77
+ { label: "Test1" },
78
+ { label: "Test2" },
79
+ { label: "Test3" },
80
+ { label: "Test4" },
81
+ { label: "Test5" },
82
+ { label: "Test6" },
83
+ { label: "Test7" },
84
+ { label: "Test8" },
85
+ { label: "Test9" },
86
+ { label: "Test10" },
87
+ { label: "Test11" },
88
+ { label: "Test12" },
89
+ { label: "Test13" },
90
+ { label: "Test14" },
91
+ { label: "Test15" },
92
+ { label: "Test16" },
93
+ { label: "Test17" },
94
+ { label: "Test18" },
95
+ { label: "Test19" },
96
+ { label: "Test20" },
97
+ { label: "Test21" },
98
+ { label: "Test22" },
99
+ { label: "Test23" },
100
+ { label: "Test24" },
101
+ { label: "Test25" },
102
+ { label: "Test26" },
103
+ ]
104
+ },
105
+ {
106
+ label: "A submenu",
107
+ children: [
108
+ { label: "Item1" },
109
+ { label: "Item2" },
110
+ { label: "Item3" },
111
+ ]
112
+ },
113
+ {
114
+ label: "A submenu2",
115
+ children: [
116
+ { label: "Item1" },
117
+ { label: "Item2" },
118
+ { label: "Item3" },
119
+ {
120
+ label: "A submenu",
121
+ children: [
122
+ { label: "Item1" },
123
+ { label: "Item2" },
124
+ { label: "Item3" },
125
+ ]
126
+ },
127
+ ]
128
+ },
129
+ ]
130
+ },
131
+ ],
132
+ iconFontClass: 'iconfont',
133
+ customClass: "class-a",
134
+ zIndex: 3,
135
+ minWidth: 230,
136
+ x: e.x,
137
+ y: e.y,
138
+ });
139
+ }
140
+ },
141
+ })
142
+ .use(window['vue3-context-menu'].default)
143
+ .mount('#app')
144
+ </script>
145
+ </body>
146
+ </html>
@@ -13,14 +13,16 @@
13
13
  >
14
14
  <context-menu-item label="Simple item" @click="alertContextMenuItemClicked('Item1')" />
15
15
  <context-menu-item label="Item with a icon" icon="icon-reload-1" @click="alertContextMenuItemClicked('Item2')" />
16
+ <context-menu-item label="Test item dynamic show and hide" :clickClose="false" @click="showItem=!showItem" />
17
+ <context-menu-item v-if="showItem" label="Click the item above to show/hide me" />
18
+ <context-menu-sperator v-if="showItem" />
19
+ <context-menu-item :label="itemText" :clickClose="false" @click="changeLabelText" />
16
20
  <context-menu-group label="Menu with child">
17
21
  <context-menu-item label="Item1" @click="alertContextMenuItemClicked('Item1-1')" />
18
22
  <context-menu-item label="Item1" @click="alertContextMenuItemClicked('Item1-2')" />
19
23
  </context-menu-group>
20
- <context-menu-sperator />
21
24
  <context-menu-group label="Menu with child child child">
22
25
  <context-menu-item label="Item1" @click="alertContextMenuItemClicked('Item2-1')" />
23
- <context-menu-item label="Item2" @click="alertContextMenuItemClicked('Item2-2')" />
24
26
  <context-menu-sperator />
25
27
  <context-menu-group label="Child with v-for 50">
26
28
  <context-menu-item v-for="index of 50" :key="index" :label="'Item3-'+index" @click="alertContextMenuItemClicked('Item2-3-' + index)" />
@@ -92,6 +94,8 @@ export default defineComponent({
92
94
  data() {
93
95
  return {
94
96
  show: false,
97
+ showItem: true,
98
+ itemText: 'Test item dynamic change label',
95
99
  optionsComponent: {
96
100
  iconFontClass: 'iconfont',
97
101
  customClass: "class-a",
@@ -111,6 +115,9 @@ export default defineComponent({
111
115
  //Show menu
112
116
  this.show = true;
113
117
  },
118
+ changeLabelText() {
119
+ this.itemText = (this.itemText == 'My label CHANGED!' ? 'Test item dynamic change label' : 'My label CHANGED!');
120
+ },
114
121
  alertContextMenuItemClicked(name: string) {
115
122
  alert('You clicked ' + name + ' !');
116
123
  },
@@ -207,6 +207,7 @@ const menuData = reactive<MenuOptions>({
207
207
  },
208
208
  {
209
209
  label: 'Click the item above to show/hide me',
210
+ divided: true,
210
211
  },
211
212
  {
212
213
  label: 'Test item dynamic change the label',
@@ -294,4 +295,10 @@ function onContextMenu2(e : MouseEvent) {
294
295
  y: e.y
295
296
  } as MenuOptions);
296
297
  }
297
- </script>
298
+ </script>
299
+
300
+ <style>
301
+ .class-a {
302
+ font-family: 'Times New Roman', Times, serif;
303
+ }
304
+ </style>
@@ -2786,6 +2786,7 @@ function removeContainer(container) {
2786
2786
 
2787
2787
  (_container$parentNode = container.parentNode) === null || _container$parentNode === void 0 ? void 0 : _container$parentNode.removeChild(container);
2788
2788
  }
2789
+ var DEFAULT_CONTAINER_ID = 'mx-menu-default-container';
2789
2790
  function genContainer(options) {
2790
2791
  var getContainer = options.getContainer,
2791
2792
  zIndex = options.zIndex;
@@ -2802,7 +2803,13 @@ function genContainer(options) {
2802
2803
  }
2803
2804
  }
2804
2805
 
2805
- var container = document.createElement('div');
2806
+ var container = document.getElementById(DEFAULT_CONTAINER_ID);
2807
+
2808
+ if (!container) {
2809
+ container = document.createElement('div');
2810
+ container.setAttribute('id', DEFAULT_CONTAINER_ID);
2811
+ }
2812
+
2806
2813
  container.setAttribute('class', 'mx-menu-ghost-host');
2807
2814
  container.style.zIndex = (zIndex === null || zIndex === void 0 ? void 0 : zIndex.toString()) || MenuConstOptions.defaultZindex.toString();
2808
2815
  document.body.appendChild(container);
@@ -2881,7 +2888,7 @@ function _objectSpread2(target) {
2881
2888
  }
2882
2889
  // EXTERNAL MODULE: ./node_modules/core-js/modules/web.timers.js
2883
2890
  var web_timers = __webpack_require__(2564);
2884
- ;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[4]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/ContextSubMenu.vue?vue&type=template&id=60177ee6&ts=true
2891
+ ;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[4]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/ContextSubMenu.vue?vue&type=template&id=755535e6&ts=true
2885
2892
 
2886
2893
  var _hoisted_1 = {
2887
2894
  "class": "mx-context-menu-scroll",
@@ -2954,13 +2961,14 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
2954
2961
  minWidth: item.minWidth,
2955
2962
  adjustPosition: item.adjustSubMenuPosition
2956
2963
  }, null, 8, ["items", "maxWidth", "minWidth", "adjustPosition"])];
2957
- })
2958
- } : undefined]), 1032, ["clickHandler", "disabled", "hidden", "icon", "iconFontClass", "svgIcon", "svgProps", "label", "customRender", "customClass", "clickClose", "clickableWhenHasChildren", "showRightArrow", "hasChildren"]), item.divided && _ctx.globalHasSlot('separatorRender') ? ((0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.openBlock)(), (0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.createBlock)(_component_VNodeRender, {
2964
+ }),
2965
+ key: "0"
2966
+ } : undefined]), 1032, ["clickHandler", "disabled", "hidden", "icon", "iconFontClass", "svgIcon", "svgProps", "label", "customRender", "customClass", "clickClose", "clickableWhenHasChildren", "showRightArrow", "hasChildren"]), item.hidden !== true && item.divided && _ctx.globalHasSlot('separatorRender') ? ((0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.openBlock)(), (0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.createBlock)(_component_VNodeRender, {
2959
2967
  key: 0,
2960
2968
  vnode: function vnode() {
2961
2969
  return _ctx.globalRenderSlot('separatorRender', {});
2962
2970
  }
2963
- }, null, 8, ["vnode"])) : item.divided ? ((0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.openBlock)(), (0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.createBlock)(_component_ContextMenuSeparator, {
2971
+ }, null, 8, ["vnode"])) : item.hidden !== true && item.divided ? ((0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.openBlock)(), (0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.createBlock)(_component_ContextMenuSeparator, {
2964
2972
  key: 1
2965
2973
  })) : (0,external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.createCommentVNode)("", true)]);
2966
2974
  }), 128))];
@@ -2976,7 +2984,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
2976
2984
  })
2977
2985
  }, _hoisted_5, 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_namespaceObject.vShow, _ctx.overflow && _ctx.scrollValue > -_ctx.scrollHeight]])], 512)], 6);
2978
2986
  }
2979
- ;// CONCATENATED MODULE: ./src/ContextSubMenu.vue?vue&type=template&id=60177ee6&ts=true
2987
+ ;// CONCATENATED MODULE: ./src/ContextSubMenu.vue?vue&type=template&id=755535e6&ts=true
2980
2988
 
2981
2989
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.number.constructor.js
2982
2990
  var es_number_constructor = __webpack_require__(9653);
@@ -3479,10 +3487,10 @@ const ContextMenuSeparator_exports_ = /*#__PURE__*/(0,exportHelper/* default */.
3479
3487
  }));
3480
3488
  ;// CONCATENATED MODULE: ./src/ContextSubMenu.vue?vue&type=script&lang=ts
3481
3489
 
3482
- ;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/ContextSubMenu.vue?vue&type=style&index=0&id=60177ee6&lang=scss
3490
+ ;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/ContextSubMenu.vue?vue&type=style&index=0&id=755535e6&lang=scss
3483
3491
  // extracted by mini-css-extract-plugin
3484
3492
 
3485
- ;// CONCATENATED MODULE: ./src/ContextSubMenu.vue?vue&type=style&index=0&id=60177ee6&lang=scss
3493
+ ;// CONCATENATED MODULE: ./src/ContextSubMenu.vue?vue&type=style&index=0&id=755535e6&lang=scss
3486
3494
 
3487
3495
  ;// CONCATENATED MODULE: ./src/ContextSubMenu.vue
3488
3496
 
@@ -3933,6 +3941,7 @@ function $contextmenu(options, customSlots) {
3933
3941
  },
3934
3942
  //Close the currently open menu
3935
3943
  closeContextMenu: closeContextMenu,
3944
+ //Tools
3936
3945
  transformMenuPosition: transformMenuPosition
3937
3946
  });
3938
3947
  ;// CONCATENATED MODULE: ./index.js