vxe-pc-ui 4.11.30 → 4.11.31

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 (202) hide show
  1. package/es/backtop/src/backtop.js +1 -3
  2. package/es/button/src/button.js +21 -12
  3. package/es/components.js +3 -0
  4. package/es/context-menu/index.js +46 -0
  5. package/es/context-menu/src/context-menu.js +344 -0
  6. package/es/context-menu/style.css +104 -0
  7. package/es/context-menu/style.min.css +1 -0
  8. package/es/dynamics/index.js +29 -3
  9. package/es/icon/style.css +1 -1
  10. package/es/language/ar-EG.js +3 -0
  11. package/es/language/de-DE.js +3 -0
  12. package/es/language/en-US.js +3 -0
  13. package/es/language/es-ES.js +3 -0
  14. package/es/language/fr-FR.js +3 -0
  15. package/es/language/hu-HU.js +3 -0
  16. package/es/language/hy-AM.js +4 -1
  17. package/es/language/id-ID.js +3 -0
  18. package/es/language/it-IT.js +3 -0
  19. package/es/language/ja-JP.js +3 -0
  20. package/es/language/ko-KR.js +3 -0
  21. package/es/language/ms-MY.js +3 -0
  22. package/es/language/nb-NO.js +3 -0
  23. package/es/language/pt-BR.js +3 -0
  24. package/es/language/ru-RU.js +3 -0
  25. package/es/language/th-TH.js +3 -0
  26. package/es/language/ug-CN.js +3 -0
  27. package/es/language/uk-UA.js +3 -0
  28. package/es/language/uz-UZ.js +3 -0
  29. package/es/language/vi-VN.js +3 -0
  30. package/es/language/zh-CHT.js +3 -0
  31. package/es/language/zh-CN.js +4 -1
  32. package/es/print/src/print.js +24 -1
  33. package/es/print/src/util.js +8 -1
  34. package/es/style.css +1 -1
  35. package/es/style.min.css +1 -1
  36. package/es/tree/src/tree.js +69 -21
  37. package/es/ui/index.js +8 -3
  38. package/es/ui/src/log.js +1 -1
  39. package/es/vxe-context-menu/index.js +3 -0
  40. package/es/vxe-context-menu/style.css +104 -0
  41. package/es/vxe-context-menu/style.min.css +1 -0
  42. package/lib/backtop/src/backtop.js +0 -2
  43. package/lib/backtop/src/backtop.min.js +1 -1
  44. package/lib/button/src/button.js +12 -6
  45. package/lib/button/src/button.min.js +1 -1
  46. package/lib/components.js +13 -1
  47. package/lib/components.min.js +1 -1
  48. package/lib/context-menu/index.js +56 -0
  49. package/lib/context-menu/index.min.js +1 -0
  50. package/lib/context-menu/src/context-menu.js +361 -0
  51. package/lib/context-menu/src/context-menu.min.js +1 -0
  52. package/lib/context-menu/style/index.js +1 -0
  53. package/lib/context-menu/style/style.css +104 -0
  54. package/lib/context-menu/style/style.min.css +1 -0
  55. package/lib/dynamics/index.js +33 -3
  56. package/lib/dynamics/index.min.js +1 -1
  57. package/lib/icon/style/style.css +1 -1
  58. package/lib/icon/style/style.min.css +1 -1
  59. package/lib/index.umd.js +602 -40
  60. package/lib/index.umd.min.js +1 -1
  61. package/lib/language/ar-EG.js +3 -0
  62. package/lib/language/ar-EG.min.js +1 -1
  63. package/lib/language/ar-EG.umd.js +3 -0
  64. package/lib/language/de-DE.js +3 -0
  65. package/lib/language/de-DE.min.js +1 -1
  66. package/lib/language/de-DE.umd.js +3 -0
  67. package/lib/language/en-US.js +3 -0
  68. package/lib/language/en-US.min.js +1 -1
  69. package/lib/language/en-US.umd.js +3 -0
  70. package/lib/language/es-ES.js +3 -0
  71. package/lib/language/es-ES.min.js +1 -1
  72. package/lib/language/es-ES.umd.js +3 -0
  73. package/lib/language/fr-FR.js +3 -0
  74. package/lib/language/fr-FR.min.js +1 -1
  75. package/lib/language/fr-FR.umd.js +3 -0
  76. package/lib/language/hu-HU.js +3 -0
  77. package/lib/language/hu-HU.min.js +1 -1
  78. package/lib/language/hu-HU.umd.js +3 -0
  79. package/lib/language/hy-AM.js +4 -1
  80. package/lib/language/hy-AM.min.js +1 -1
  81. package/lib/language/hy-AM.umd.js +4 -1
  82. package/lib/language/id-ID.js +3 -0
  83. package/lib/language/id-ID.min.js +1 -1
  84. package/lib/language/id-ID.umd.js +3 -0
  85. package/lib/language/it-IT.js +3 -0
  86. package/lib/language/it-IT.min.js +1 -1
  87. package/lib/language/it-IT.umd.js +3 -0
  88. package/lib/language/ja-JP.js +3 -0
  89. package/lib/language/ja-JP.min.js +1 -1
  90. package/lib/language/ja-JP.umd.js +3 -0
  91. package/lib/language/ko-KR.js +3 -0
  92. package/lib/language/ko-KR.min.js +1 -1
  93. package/lib/language/ko-KR.umd.js +3 -0
  94. package/lib/language/ms-MY.js +3 -0
  95. package/lib/language/ms-MY.min.js +1 -1
  96. package/lib/language/ms-MY.umd.js +3 -0
  97. package/lib/language/nb-NO.js +3 -0
  98. package/lib/language/nb-NO.min.js +1 -1
  99. package/lib/language/nb-NO.umd.js +3 -0
  100. package/lib/language/pt-BR.js +3 -0
  101. package/lib/language/pt-BR.min.js +1 -1
  102. package/lib/language/pt-BR.umd.js +3 -0
  103. package/lib/language/ru-RU.js +3 -0
  104. package/lib/language/ru-RU.min.js +1 -1
  105. package/lib/language/ru-RU.umd.js +3 -0
  106. package/lib/language/th-TH.js +3 -0
  107. package/lib/language/th-TH.min.js +1 -1
  108. package/lib/language/th-TH.umd.js +3 -0
  109. package/lib/language/ug-CN.js +3 -0
  110. package/lib/language/ug-CN.min.js +1 -1
  111. package/lib/language/ug-CN.umd.js +3 -0
  112. package/lib/language/uk-UA.js +3 -0
  113. package/lib/language/uk-UA.min.js +1 -1
  114. package/lib/language/uk-UA.umd.js +3 -0
  115. package/lib/language/uz-UZ.js +3 -0
  116. package/lib/language/uz-UZ.min.js +1 -1
  117. package/lib/language/uz-UZ.umd.js +3 -0
  118. package/lib/language/vi-VN.js +3 -0
  119. package/lib/language/vi-VN.min.js +1 -1
  120. package/lib/language/vi-VN.umd.js +3 -0
  121. package/lib/language/zh-CHT.js +3 -0
  122. package/lib/language/zh-CHT.min.js +1 -1
  123. package/lib/language/zh-CHT.umd.js +3 -0
  124. package/lib/language/zh-CN.js +4 -1
  125. package/lib/language/zh-CN.min.js +1 -1
  126. package/lib/language/zh-CN.umd.js +4 -1
  127. package/lib/print/src/print.js +42 -1
  128. package/lib/print/src/print.min.js +1 -1
  129. package/lib/print/src/util.js +9 -2
  130. package/lib/print/src/util.min.js +1 -1
  131. package/lib/style.css +1 -1
  132. package/lib/style.min.css +1 -1
  133. package/lib/tree/src/tree.js +78 -20
  134. package/lib/tree/src/tree.min.js +1 -1
  135. package/lib/ui/index.js +8 -3
  136. package/lib/ui/index.min.js +1 -1
  137. package/lib/ui/src/log.js +1 -1
  138. package/lib/ui/src/log.min.js +1 -1
  139. package/lib/vxe-context-menu/index.js +22 -0
  140. package/lib/vxe-context-menu/index.min.js +1 -0
  141. package/lib/vxe-context-menu/style/index.js +1 -0
  142. package/lib/vxe-context-menu/style/style.css +104 -0
  143. package/lib/vxe-context-menu/style/style.min.css +1 -0
  144. package/package.json +1 -1
  145. package/packages/backtop/src/backtop.ts +1 -4
  146. package/packages/button/src/button.ts +22 -13
  147. package/packages/components.ts +3 -0
  148. package/packages/context-menu/index.ts +54 -0
  149. package/packages/context-menu/src/context-menu.ts +388 -0
  150. package/packages/dynamics/index.ts +36 -9
  151. package/packages/language/ar-EG.ts +3 -0
  152. package/packages/language/de-DE.ts +3 -0
  153. package/packages/language/en-US.ts +3 -0
  154. package/packages/language/es-ES.ts +3 -0
  155. package/packages/language/fr-FR.ts +3 -0
  156. package/packages/language/hu-HU.ts +3 -0
  157. package/packages/language/hy-AM.ts +4 -1
  158. package/packages/language/id-ID.ts +3 -0
  159. package/packages/language/it-IT.ts +3 -0
  160. package/packages/language/ja-JP.ts +3 -0
  161. package/packages/language/ko-KR.ts +3 -0
  162. package/packages/language/ms-MY.ts +3 -0
  163. package/packages/language/nb-NO.ts +3 -0
  164. package/packages/language/pt-BR.ts +3 -0
  165. package/packages/language/ru-RU.ts +3 -0
  166. package/packages/language/th-TH.ts +3 -0
  167. package/packages/language/ug-CN.ts +3 -0
  168. package/packages/language/uk-UA.ts +3 -0
  169. package/packages/language/uz-UZ.ts +3 -0
  170. package/packages/language/vi-VN.ts +3 -0
  171. package/packages/language/zh-CHT.ts +3 -0
  172. package/packages/language/zh-CN.ts +4 -1
  173. package/packages/print/src/print.ts +24 -1
  174. package/packages/print/src/util.ts +9 -1
  175. package/packages/tree/src/tree.ts +73 -22
  176. package/packages/ui/index.ts +8 -2
  177. package/styles/all.scss +1 -0
  178. package/styles/components/backtop.scss +1 -1
  179. package/styles/components/context-menu.scss +105 -0
  180. package/styles/theme/base.scss +3 -0
  181. package/types/all.d.ts +3 -0
  182. package/types/components/button.d.ts +2 -0
  183. package/types/components/context-menu.d.ts +284 -0
  184. package/types/components/password-input.d.ts +2 -0
  185. package/types/components/print.d.ts +8 -0
  186. package/types/components/table.d.ts +8 -0
  187. package/types/components/tree.d.ts +46 -1
  188. package/types/ui/global-config.d.ts +2 -0
  189. package/types/ui/global-icon.d.ts +4 -0
  190. package/types/ui/index.d.ts +3 -0
  191. /package/es/icon/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  192. /package/es/icon/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  193. /package/es/icon/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
  194. /package/es/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  195. /package/es/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  196. /package/es/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
  197. /package/lib/icon/style/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  198. /package/lib/icon/style/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  199. /package/lib/icon/style/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
  200. /package/lib/{iconfont.1767491587367.ttf → iconfont.1767605241010.ttf} +0 -0
  201. /package/lib/{iconfont.1767491587367.woff → iconfont.1767605241010.woff} +0 -0
  202. /package/lib/{iconfont.1767491587367.woff2 → iconfont.1767605241010.woff2} +0 -0
@@ -1,4 +1,4 @@
1
- import { ref, h, reactive, watch, onMounted, nextTick, computed, onBeforeUnmount, onUnmounted } from 'vue';
1
+ import { ref, h, reactive, watch, onMounted, nextTick, computed, onBeforeUnmount } from 'vue';
2
2
  import { defineVxeComponent } from '../../ui/src/comp';
3
3
  import XEUtils from 'xe-utils';
4
4
  import { getConfig, getIcon, createEvent, useSize, renderEmptyElement } from '../../ui';
@@ -218,8 +218,6 @@ export default defineVxeComponent({
218
218
  onBeforeUnmount(() => {
219
219
  removeScrollEvent();
220
220
  XEUtils.assign(reactData, createReactData());
221
- });
222
- onUnmounted(() => {
223
221
  XEUtils.assign(internalData, createInternalData());
224
222
  });
225
223
  $xeBacktop.renderVN = renderVN;
@@ -89,6 +89,10 @@ const VxeButtonComponent = defineVxeComponent({
89
89
  prefixTooltip: Object,
90
90
  suffixTooltip: Object,
91
91
  options: Array,
92
+ showDropdownIcon: {
93
+ type: Boolean,
94
+ default: () => getConfig().button.showDropdownIcon
95
+ },
92
96
  /**
93
97
  * 在下拉面板关闭时销毁内容
94
98
  */
@@ -116,6 +120,7 @@ const VxeButtonComponent = defineVxeComponent({
116
120
  const $xeModal = inject('$xeModal', null);
117
121
  const $xeDrawer = inject('$xeDrawer', null);
118
122
  const $xeTable = inject('$xeTable', null);
123
+ const $xeTree = inject('$xeTree', null);
119
124
  const $xeForm = inject('$xeForm', null);
120
125
  const $xeButtonGroup = inject('$xeButtonGroup', null);
121
126
  const xID = XEUtils.uniqueId();
@@ -156,7 +161,7 @@ const VxeButtonComponent = defineVxeComponent({
156
161
  if (XEUtils.isBoolean(globalTransfer)) {
157
162
  return globalTransfer;
158
163
  }
159
- if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
164
+ if ($xeTable || $xeTree || $xeModal || $xeDrawer || $xeForm) {
160
165
  return true;
161
166
  }
162
167
  }
@@ -529,7 +534,7 @@ const VxeButtonComponent = defineVxeComponent({
529
534
  };
530
535
  Object.assign($xeButton, buttonMethods);
531
536
  const renderVN = () => {
532
- const { className, popupClassName, trigger, title, routerLink, type, destroyOnClose, name, loading } = props;
537
+ const { className, popupClassName, trigger, title, routerLink, type, destroyOnClose, name, loading, showDropdownIcon } = props;
533
538
  const { initialized, isAniVisible, visiblePanel } = reactData;
534
539
  const isFormBtn = computeIsFormBtn.value;
535
540
  const btnMode = computeBtnMode.value;
@@ -574,11 +579,13 @@ const VxeButtonComponent = defineVxeComponent({
574
579
  }], title,
575
580
  name, type: isFormBtn ? type : 'button', disabled: btnDisabled || loading, to: routerLink, onClick: clickTargetEvent }, btnOns), {
576
581
  default() {
577
- return renderContent().concat([
578
- h('i', {
579
- class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
580
- })
581
- ]);
582
+ return renderContent().concat(showDropdownIcon
583
+ ? [
584
+ h('i', {
585
+ class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
586
+ })
587
+ ]
588
+ : []);
582
589
  }
583
590
  })
584
591
  : h('button', Object.assign({ ref: refButton, class: ['vxe-button', `type--${btnMode}`, btnAlign ? `align--${btnAlign}` : '', className ? (XEUtils.isFunction(className) ? className({ $button: $xeButton }) : className) : '', {
@@ -589,11 +596,13 @@ const VxeButtonComponent = defineVxeComponent({
589
596
  'is--disabled': btnDisabled || loading,
590
597
  'is--loading': loading
591
598
  }], title,
592
- name, type: isFormBtn ? type : 'button', disabled: btnDisabled || loading, onClick: clickTargetEvent }, btnOns), renderContent().concat([
593
- h('i', {
594
- class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
595
- })
596
- ])),
599
+ name, type: isFormBtn ? type : 'button', disabled: btnDisabled || loading, onClick: clickTargetEvent }, btnOns), renderContent().concat(showDropdownIcon
600
+ ? [
601
+ h('i', {
602
+ class: `vxe-button--dropdown-arrow ${getIcon().BUTTON_DROPDOWN}`
603
+ })
604
+ ]
605
+ : [])),
597
606
  h(Teleport, {
598
607
  to: 'body',
599
608
  disabled: btnTransfer ? !initialized : true
package/es/components.js CHANGED
@@ -22,6 +22,7 @@ import VxeCol from './col';
22
22
  import VxeCollapse from './collapse';
23
23
  import VxeCollapsePane from './collapse-pane';
24
24
  import VxeColorPicker from './color-picker';
25
+ import VxeContextMenu from './context-menu';
25
26
  import VxeCountdown from './countdown';
26
27
  import VxeDatePanel from './date-panel';
27
28
  import VxeDatePicker from './date-picker';
@@ -114,6 +115,7 @@ const components = [
114
115
  VxeCollapse,
115
116
  VxeCollapsePane,
116
117
  VxeColorPicker,
118
+ VxeContextMenu,
117
119
  VxeCountdown,
118
120
  VxeDatePanel,
119
121
  VxeDatePicker,
@@ -222,6 +224,7 @@ export * from './col';
222
224
  export * from './collapse';
223
225
  export * from './collapse-pane';
224
226
  export * from './color-picker';
227
+ export * from './context-menu';
225
228
  export * from './countdown';
226
229
  export * from './date-panel';
227
230
  export * from './date-picker';
@@ -0,0 +1,46 @@
1
+ import { VxeUI } from '@vxe-ui/core';
2
+ import VxeContextMenuComponent from './src/context-menu';
3
+ import { dynamicApp, dynamicStore, checkDynamic } from '../dynamics';
4
+ export const VxeContextMenu = Object.assign({}, VxeContextMenuComponent, {
5
+ install(app) {
6
+ app.component(VxeContextMenuComponent.name, VxeContextMenuComponent);
7
+ }
8
+ });
9
+ function openMenu(opts, x, y) {
10
+ dynamicStore.globalContextMenu = {
11
+ modelValue: true,
12
+ options: opts.options,
13
+ className: opts.className,
14
+ size: opts.size,
15
+ zIndex: opts.zIndex,
16
+ x,
17
+ y,
18
+ position: 'fixed',
19
+ destroyOnClose: true,
20
+ transfer: false,
21
+ events: opts.events
22
+ };
23
+ checkDynamic();
24
+ }
25
+ export const ContextMenuController = {
26
+ open(options) {
27
+ const opts = Object.assign({ x: 0, y: 0 }, options);
28
+ openMenu(opts, opts.x, opts.y);
29
+ },
30
+ openByEvent(evnt, options) {
31
+ evnt.preventDefault();
32
+ evnt.stopPropagation();
33
+ const opts = Object.assign({}, options);
34
+ const x = evnt.clientX;
35
+ const y = evnt.clientY;
36
+ openMenu(opts, x, y);
37
+ },
38
+ close() {
39
+ dynamicStore.globalContextMenu = null;
40
+ }
41
+ };
42
+ dynamicApp.use(VxeContextMenu);
43
+ VxeUI.component(VxeContextMenuComponent);
44
+ VxeUI.contextMenu = ContextMenuController;
45
+ export const ContextMenu = VxeContextMenu;
46
+ export default VxeContextMenu;
@@ -0,0 +1,344 @@
1
+ import { ref, h, reactive, computed, watch, onMounted, onBeforeUnmount, nextTick } from 'vue';
2
+ import { defineVxeComponent } from '../../ui/src/comp';
3
+ import XEUtils from 'xe-utils';
4
+ import { getConfig, getIcon, getI18n, createEvent, useSize, globalEvents, renderEmptyElement } from '../../ui';
5
+ import { getLastZIndex, nextSubZIndex, nextZIndex, getFuncText } from '../../ui/src/utils';
6
+ import { getEventTargetNode, toCssUnit } from '../../ui/src/dom';
7
+ import { getSlotVNs } from '../../ui/src/vn';
8
+ function createInternalData() {
9
+ return {};
10
+ }
11
+ function createReactData() {
12
+ return {
13
+ visible: false,
14
+ activeOption: null,
15
+ activeChildOption: null,
16
+ popupStyle: {
17
+ top: '',
18
+ left: '',
19
+ zIndex: 0
20
+ },
21
+ childPos: ''
22
+ };
23
+ }
24
+ export default defineVxeComponent({
25
+ name: 'VxeContextMenu',
26
+ props: {
27
+ modelValue: Boolean,
28
+ className: String,
29
+ size: {
30
+ type: String,
31
+ default: () => getConfig().contextMenu.size || getConfig().size
32
+ },
33
+ options: Array,
34
+ x: [Number, String],
35
+ y: [Number, String],
36
+ zIndex: [Number, String],
37
+ position: {
38
+ type: String,
39
+ default: () => getConfig().contextMenu.position
40
+ },
41
+ destroyOnClose: {
42
+ type: Boolean,
43
+ default: () => getConfig().contextMenu.destroyOnClose
44
+ },
45
+ transfer: {
46
+ type: Boolean,
47
+ default: () => getConfig().contextMenu.transfer
48
+ }
49
+ },
50
+ emits: [
51
+ 'update:modelValue',
52
+ 'option-click',
53
+ 'change',
54
+ 'show',
55
+ 'hide'
56
+ ],
57
+ setup(props, context) {
58
+ const { emit } = context;
59
+ const xID = XEUtils.uniqueId();
60
+ const refElem = ref();
61
+ const { computeSize } = useSize(props);
62
+ const internalData = createInternalData();
63
+ const reactData = reactive(createReactData());
64
+ const refMaps = {
65
+ refElem
66
+ };
67
+ const computeMenuGroups = computed(() => {
68
+ const { options } = props;
69
+ return options || [];
70
+ });
71
+ const computeTopAndLeft = computed(() => {
72
+ const { x, y } = props;
73
+ return `${x}${y}`;
74
+ });
75
+ const computeMaps = {};
76
+ const $xeContextMenu = {
77
+ xID,
78
+ props,
79
+ context,
80
+ reactData,
81
+ getRefMaps: () => refMaps,
82
+ getComputeMaps: () => computeMaps
83
+ };
84
+ const dispatchEvent = (type, params, evnt) => {
85
+ emit(type, createEvent(evnt, { $contextMenu: $xeContextMenu }, params));
86
+ };
87
+ const emitModel = (value) => {
88
+ emit('update:modelValue', value);
89
+ };
90
+ const open = () => {
91
+ const { modelValue } = props;
92
+ const { visible } = reactData;
93
+ const value = true;
94
+ reactData.visible = value;
95
+ updateLocate();
96
+ updateZindex();
97
+ if (modelValue !== value) {
98
+ emitModel(value);
99
+ dispatchEvent('change', { value }, null);
100
+ }
101
+ if (visible !== value) {
102
+ dispatchEvent('show', { visible: value }, null);
103
+ }
104
+ return nextTick();
105
+ };
106
+ const close = () => {
107
+ const { modelValue } = props;
108
+ const { visible } = reactData;
109
+ const value = false;
110
+ reactData.visible = value;
111
+ if (modelValue !== value) {
112
+ emitModel(value);
113
+ dispatchEvent('change', { value }, null);
114
+ }
115
+ if (visible !== value) {
116
+ dispatchEvent('hide', { visible: value }, null);
117
+ }
118
+ return nextTick();
119
+ };
120
+ const updateLocate = () => {
121
+ const { x, y } = props;
122
+ const { popupStyle } = reactData;
123
+ popupStyle.left = toCssUnit(x || 0);
124
+ popupStyle.top = toCssUnit(y || 0);
125
+ };
126
+ const updateZindex = () => {
127
+ const { zIndex, transfer } = props;
128
+ const { popupStyle } = reactData;
129
+ const menuZIndex = popupStyle.zIndex;
130
+ if (zIndex) {
131
+ popupStyle.zIndex = XEUtils.toNumber(zIndex);
132
+ }
133
+ else {
134
+ if (menuZIndex < getLastZIndex()) {
135
+ popupStyle.zIndex = transfer ? nextSubZIndex() : nextZIndex();
136
+ }
137
+ }
138
+ };
139
+ const handleVisible = () => {
140
+ const { modelValue } = props;
141
+ if (modelValue) {
142
+ open();
143
+ }
144
+ else {
145
+ close();
146
+ }
147
+ };
148
+ const tagMethods = {
149
+ dispatchEvent,
150
+ open,
151
+ close
152
+ };
153
+ const handleItemClickEvent = (evnt, item) => {
154
+ dispatchEvent('option-click', { option: item }, evnt);
155
+ close();
156
+ };
157
+ const handleItemMouseenterEvent = (evnt, item, parentitem) => {
158
+ reactData.activeOption = parentitem || item;
159
+ reactData.activeChildOption = parentitem ? item : null;
160
+ };
161
+ const handleItemMouseleaveEvent = () => {
162
+ reactData.activeOption = null;
163
+ reactData.activeChildOption = null;
164
+ };
165
+ const handleGlobalMousedownEvent = (evnt) => {
166
+ const { visible } = reactData;
167
+ if (visible) {
168
+ const el = refElem.value;
169
+ if (!getEventTargetNode(evnt, el, '').flag) {
170
+ close();
171
+ }
172
+ }
173
+ };
174
+ const tagPrivateMethods = {};
175
+ Object.assign($xeContextMenu, tagMethods, tagPrivateMethods);
176
+ const renderMenuItem = (item, hasChildMenus) => {
177
+ const { visible, disabled, loading } = item;
178
+ if (visible === false) {
179
+ return renderEmptyElement($xeContextMenu);
180
+ }
181
+ const prefixOpts = Object.assign({}, item.prefixConfig);
182
+ const prefixIcon = prefixOpts.icon || item.prefixIcon;
183
+ const suffixOpts = Object.assign({}, item.suffixConfig);
184
+ const suffixIcon = suffixOpts.icon || item.suffixIcon;
185
+ const menuContent = loading ? getI18n('vxe.contextMenu.loadingText') : getFuncText(item.name);
186
+ return h('div', {
187
+ class: ['vxe-context-menu--item-inner', {
188
+ 'is--disabled': disabled,
189
+ 'is--loading': loading
190
+ }]
191
+ }, [
192
+ h('div', {
193
+ class: ['vxe-context-menu--item-prefix', prefixOpts.className || '']
194
+ }, loading
195
+ ? [
196
+ h('span', {
197
+ key: '1'
198
+ }, [
199
+ h('i', {
200
+ class: getIcon().CONTEXT_MENU_OPTION_LOADING
201
+ })
202
+ ])
203
+ ]
204
+ : [
205
+ prefixIcon && XEUtils.isFunction(prefixIcon)
206
+ ? h('span', {
207
+ key: '2'
208
+ }, getSlotVNs(prefixIcon({})))
209
+ : h('span', {
210
+ key: '3'
211
+ }, [
212
+ h('i', {
213
+ class: prefixIcon
214
+ })
215
+ ]),
216
+ prefixOpts.content
217
+ ? h('span', {
218
+ key: '4'
219
+ }, `${prefixOpts.content || ''}`)
220
+ : renderEmptyElement($xeContextMenu)
221
+ ]),
222
+ h('div', {
223
+ class: 'vxe-context-menu--item-label'
224
+ }, menuContent),
225
+ !loading && (suffixIcon || suffixOpts.content)
226
+ ? h('div', {
227
+ class: ['vxe-context-menu--item-suffix', suffixOpts.className || '']
228
+ }, [
229
+ suffixIcon && XEUtils.isFunction(suffixIcon)
230
+ ? h('span', {
231
+ key: '2'
232
+ }, getSlotVNs(suffixIcon({})))
233
+ : h('span', {
234
+ key: '3'
235
+ }, [
236
+ h('i', {
237
+ class: suffixIcon
238
+ })
239
+ ]),
240
+ suffixOpts.content
241
+ ? h('span', {
242
+ key: '4'
243
+ }, `${suffixOpts.content || ''}`)
244
+ : renderEmptyElement($xeContextMenu)
245
+ ])
246
+ : renderEmptyElement($xeContextMenu),
247
+ hasChildMenus
248
+ ? h('div', {
249
+ class: 'vxe-context-menu--item-subicon'
250
+ }, [
251
+ h('i', {
252
+ class: getIcon().CONTEXT_MENU_CHILDREN
253
+ })
254
+ ])
255
+ : renderEmptyElement($xeContextMenu)
256
+ ]);
257
+ };
258
+ const renderMenus = () => {
259
+ const { activeOption, activeChildOption } = reactData;
260
+ const menuGroups = computeMenuGroups.value;
261
+ const mgVNs = [];
262
+ menuGroups.forEach((menuList, gIndex) => {
263
+ const moVNs = [];
264
+ menuList.forEach((firstItem, i) => {
265
+ const { children } = firstItem;
266
+ const hasChildMenus = children && children.some((child) => child.visible !== false);
267
+ moVNs.push(h('div', {
268
+ key: `${gIndex}_${i}`,
269
+ class: ['vxe-context-menu--item-wrapper vxe-context-menu--first-item', {
270
+ 'is--active': activeOption === firstItem
271
+ }],
272
+ onClick(evnt) {
273
+ handleItemClickEvent(evnt, firstItem);
274
+ },
275
+ onMouseenter(evnt) {
276
+ handleItemMouseenterEvent(evnt, firstItem);
277
+ },
278
+ onMouseleave: handleItemMouseleaveEvent
279
+ }, [
280
+ hasChildMenus
281
+ ? h('div', {
282
+ class: 'vxe-context-menu--children-wrapper'
283
+ }, children.map(twoItem => {
284
+ return h('div', {
285
+ class: ['vxe-context-menu--item-wrapper vxe-context-menu--child-item', {
286
+ 'is--active': activeChildOption === twoItem
287
+ }],
288
+ onClick(evnt) {
289
+ handleItemClickEvent(evnt, twoItem);
290
+ },
291
+ onMouseenter(evnt) {
292
+ handleItemMouseenterEvent(evnt, twoItem, firstItem);
293
+ },
294
+ onMouseleave: handleItemMouseleaveEvent
295
+ }, [
296
+ renderMenuItem(twoItem)
297
+ ]);
298
+ }))
299
+ : renderEmptyElement($xeContextMenu),
300
+ renderMenuItem(firstItem, hasChildMenus)
301
+ ]));
302
+ });
303
+ mgVNs.push(h('div', {
304
+ key: gIndex,
305
+ class: 'vxe-context-menu--group-wrapper'
306
+ }, moVNs));
307
+ });
308
+ return mgVNs;
309
+ };
310
+ const renderVN = () => {
311
+ const { className, position, destroyOnClose } = props;
312
+ const { visible, popupStyle, childPos } = reactData;
313
+ const vSize = computeSize.value;
314
+ return h('div', {
315
+ ref: refElem,
316
+ class: ['vxe-context-menu vxe-context-menu--wrapper', position === 'fixed' ? ('is--' + position) : 'is--absolute', `cp--${childPos === 'left' ? childPos : 'right'}`, className || '', {
317
+ [`size--${vSize}`]: vSize,
318
+ 'is--visible': visible
319
+ }],
320
+ style: popupStyle
321
+ }, (destroyOnClose ? visible : true) ? renderMenus() : []);
322
+ };
323
+ watch(computeTopAndLeft, () => {
324
+ updateLocate();
325
+ });
326
+ watch(() => props.modelValue, () => {
327
+ handleVisible();
328
+ });
329
+ handleVisible();
330
+ onMounted(() => {
331
+ globalEvents.on($xeContextMenu, 'mousedown', handleGlobalMousedownEvent);
332
+ });
333
+ onBeforeUnmount(() => {
334
+ globalEvents.off($xeContextMenu, 'mousedown');
335
+ XEUtils.assign(reactData, createReactData());
336
+ XEUtils.assign(internalData, createInternalData());
337
+ });
338
+ $xeContextMenu.renderVN = renderVN;
339
+ return $xeContextMenu;
340
+ },
341
+ render() {
342
+ return this.renderVN();
343
+ }
344
+ });
@@ -0,0 +1,104 @@
1
+ .vxe-context-menu {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ -webkit-user-select: none;
6
+ -moz-user-select: none;
7
+ user-select: none;
8
+ }
9
+ .vxe-context-menu.is--fixed {
10
+ position: fixed;
11
+ }
12
+ .vxe-context-menu.cp--left .vxe-context-menu--children-wrapper {
13
+ left: -100%;
14
+ }
15
+ .vxe-context-menu.cp--right .vxe-context-menu--children-wrapper {
16
+ left: 100%;
17
+ }
18
+
19
+ .vxe-context-menu--group-wrapper {
20
+ border-top: 1px solid var(--vxe-ui-base-popup-border-color);
21
+ }
22
+ .vxe-context-menu--group-wrapper:first-child {
23
+ border: 0;
24
+ }
25
+
26
+ .vxe-context-menu--wrapper,
27
+ .vxe-context-menu--children-wrapper {
28
+ padding: 0;
29
+ color: var(--vxe-ui-font-color);
30
+ font-family: var(--vxe-ui-font-family);
31
+ border: 1px solid var(--vxe-ui-base-popup-border-color);
32
+ background-color: var(--vxe-ui-layout-background-color);
33
+ border-radius: var(--vxe-ui-base-border-radius);
34
+ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.3);
35
+ }
36
+
37
+ .vxe-context-menu--children-wrapper {
38
+ display: none;
39
+ position: absolute;
40
+ }
41
+
42
+ .vxe-context-menu--item-wrapper {
43
+ position: relative;
44
+ min-width: 12em;
45
+ max-width: 20em;
46
+ -webkit-user-select: none;
47
+ -moz-user-select: none;
48
+ user-select: none;
49
+ }
50
+ .vxe-context-menu--item-wrapper.is--active {
51
+ background-color: rgba(0, 0, 0, 0.1);
52
+ }
53
+
54
+ .vxe-context-menu--first-item.is--active .vxe-context-menu--children-wrapper {
55
+ display: block;
56
+ }
57
+
58
+ .vxe-context-menu--item-inner {
59
+ height: var(--vxe-ui-context-menu-option-height);
60
+ display: flex;
61
+ align-items: center;
62
+ padding: 0 0.5em;
63
+ cursor: pointer;
64
+ }
65
+ .vxe-context-menu--item-inner.is--loading {
66
+ opacity: 0.5;
67
+ cursor: progress;
68
+ }
69
+ .vxe-context-menu--item-inner.is--disabled {
70
+ color: var(--vxe-ui-font-disabled-color);
71
+ cursor: no-drop;
72
+ }
73
+
74
+ .vxe-context-menu--item-prefix {
75
+ width: 1em;
76
+ text-align: center;
77
+ }
78
+
79
+ .vxe-context-menu--item-prefix,
80
+ .vxe-context-menu--item-suffix {
81
+ flex-shrink: 0;
82
+ }
83
+
84
+ .vxe-context-menu--item-label {
85
+ font-size: 0.9em;
86
+ padding: 0 0.5em;
87
+ flex-grow: 1;
88
+ overflow: hidden;
89
+ text-overflow: ellipsis;
90
+ white-space: nowrap;
91
+ }
92
+
93
+ .vxe-context-menu {
94
+ font-size: var(--vxe-ui-font-size-default);
95
+ }
96
+ .vxe-context-menu.size--medium {
97
+ font-size: var(--vxe-ui-font-size-medium);
98
+ }
99
+ .vxe-context-menu.size--small {
100
+ font-size: var(--vxe-ui-font-size-small);
101
+ }
102
+ .vxe-context-menu.size--mini {
103
+ font-size: var(--vxe-ui-font-size-mini);
104
+ }
@@ -0,0 +1 @@
1
+ .vxe-context-menu{position:absolute;top:0;left:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-context-menu.is--fixed{position:fixed}.vxe-context-menu.cp--left .vxe-context-menu--children-wrapper{left:-100%}.vxe-context-menu.cp--right .vxe-context-menu--children-wrapper{left:100%}.vxe-context-menu--group-wrapper{border-top:1px solid var(--vxe-ui-base-popup-border-color)}.vxe-context-menu--group-wrapper:first-child{border:0}.vxe-context-menu--children-wrapper,.vxe-context-menu--wrapper{padding:0;color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family);border:1px solid var(--vxe-ui-base-popup-border-color);background-color:var(--vxe-ui-layout-background-color);border-radius:var(--vxe-ui-base-border-radius);box-shadow:0 0 12px 0 rgba(0,0,0,.3)}.vxe-context-menu--children-wrapper{display:none;position:absolute}.vxe-context-menu--item-wrapper{position:relative;min-width:12em;max-width:20em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-context-menu--item-wrapper.is--active{background-color:rgba(0,0,0,.1)}.vxe-context-menu--first-item.is--active .vxe-context-menu--children-wrapper{display:block}.vxe-context-menu--item-inner{height:var(--vxe-ui-context-menu-option-height);display:flex;align-items:center;padding:0 .5em;cursor:pointer}.vxe-context-menu--item-inner.is--loading{opacity:.5;cursor:progress}.vxe-context-menu--item-inner.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:no-drop}.vxe-context-menu--item-prefix{width:1em;text-align:center}.vxe-context-menu--item-prefix,.vxe-context-menu--item-suffix{flex-shrink:0}.vxe-context-menu--item-label{font-size:.9em;padding:0 .5em;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-context-menu{font-size:var(--vxe-ui-font-size-default)}.vxe-context-menu.size--medium{font-size:var(--vxe-ui-font-size-medium)}.vxe-context-menu.size--small{font-size:var(--vxe-ui-font-size-small)}.vxe-context-menu.size--mini{font-size:var(--vxe-ui-font-size-mini)}
@@ -6,7 +6,8 @@ export const dynamicStore = reactive({
6
6
  modals: [],
7
7
  drawers: [],
8
8
  globalLoading: null,
9
- globalWatermark: null
9
+ globalWatermark: null,
10
+ globalContextMenu: null
10
11
  });
11
12
  /**
12
13
  * 动态组件
@@ -17,8 +18,32 @@ const VxeDynamics = defineVxeComponent({
17
18
  const VxeUIDrawerComponent = VxeUI.getComponent('vxe-drawer');
18
19
  const VxeUILoadingComponent = VxeUI.getComponent('vxe-loading');
19
20
  const VxeUIWatermarkComponent = VxeUI.getComponent('vxe-watermark');
21
+ const VxeUIContextMenuComponent = VxeUI.getComponent('vxe-context-menu');
20
22
  return () => {
21
- const { modals, drawers, globalWatermark, globalLoading } = dynamicStore;
23
+ const { modals, drawers, globalWatermark, globalLoading, globalContextMenu } = dynamicStore;
24
+ let cmOpts = globalContextMenu;
25
+ if (globalContextMenu) {
26
+ const events = globalContextMenu.events || {};
27
+ const { optionClick, show, hide } = events;
28
+ cmOpts = Object.assign({}, globalContextMenu, {
29
+ onShow(params) {
30
+ if (show) {
31
+ show(params);
32
+ }
33
+ },
34
+ onHide(params) {
35
+ if (hide) {
36
+ hide(params);
37
+ }
38
+ dynamicStore.globalContextMenu = null;
39
+ },
40
+ onOptionClick(params) {
41
+ if (optionClick) {
42
+ optionClick(params);
43
+ }
44
+ }
45
+ });
46
+ }
22
47
  return [
23
48
  modals.length
24
49
  ? h('div', {
@@ -33,7 +58,8 @@ const VxeDynamics = defineVxeComponent({
33
58
  }, drawers.map((item) => h(VxeUIDrawerComponent, item)))
34
59
  : createCommentVNode(),
35
60
  globalWatermark ? h(VxeUIWatermarkComponent, globalWatermark) : createCommentVNode(),
36
- globalLoading ? h(VxeUILoadingComponent, globalLoading) : createCommentVNode()
61
+ globalLoading ? h(VxeUILoadingComponent, globalLoading) : createCommentVNode(),
62
+ globalContextMenu ? h(VxeUIContextMenuComponent, cmOpts) : createCommentVNode()
37
63
  ];
38
64
  };
39
65
  }