vxe-pc-ui 4.16.9 → 4.16.11

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 (125) hide show
  1. package/dist/all.esm.js +284 -147
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/checkbox/style.css +1 -0
  5. package/es/checkbox/style.min.css +1 -1
  6. package/es/icon/{iconfont.1783939831164.ttf → iconfont.1784122303243.ttf} +0 -0
  7. package/es/icon/iconfont.1784122303243.woff +0 -0
  8. package/es/icon/iconfont.1784122303243.woff2 +0 -0
  9. package/es/icon/style.css +33 -2
  10. package/es/icon/style.min.css +1 -1
  11. package/{lib/icon/style/iconfont.1783939831164.ttf → es/iconfont.1784122303243.ttf} +0 -0
  12. package/es/iconfont.1784122303243.woff +0 -0
  13. package/es/iconfont.1784122303243.woff2 +0 -0
  14. package/es/language/en-US.js +3 -3
  15. package/es/language/hy-AM.js +3 -3
  16. package/es/language/zh-CN.js +3 -3
  17. package/es/layout-aside/src/layout-aside.js +13 -20
  18. package/es/layout-aside/style.css +1 -3
  19. package/es/layout-aside/style.min.css +1 -1
  20. package/es/menu/src/menu.js +265 -121
  21. package/es/menu/style.css +51 -3
  22. package/es/menu/style.min.css +1 -1
  23. package/es/modal/src/modal.js +2 -2
  24. package/es/radio/style.css +1 -0
  25. package/es/radio/style.min.css +1 -1
  26. package/es/style.css +1 -1
  27. package/es/style.min.css +1 -1
  28. package/es/tree-select/src/tree-select.js +1 -1
  29. package/es/ui/index.js +1 -1
  30. package/es/ui/src/log.js +1 -1
  31. package/es/vxe-checkbox/style.css +1 -0
  32. package/es/vxe-checkbox/style.min.css +1 -1
  33. package/es/vxe-icon/style.css +33 -2
  34. package/es/vxe-icon/style.min.css +1 -1
  35. package/es/vxe-layout-aside/style.css +1 -3
  36. package/es/vxe-layout-aside/style.min.css +1 -1
  37. package/es/vxe-menu/style.css +51 -3
  38. package/es/vxe-menu/style.min.css +1 -1
  39. package/es/vxe-radio/style.css +1 -0
  40. package/es/vxe-radio/style.min.css +1 -1
  41. package/lib/checkbox/style/style.css +1 -0
  42. package/lib/checkbox/style/style.min.css +1 -1
  43. package/lib/{iconfont.1783939831164.ttf → icon/style/iconfont.1784122303243.ttf} +0 -0
  44. package/lib/icon/style/iconfont.1784122303243.woff +0 -0
  45. package/lib/icon/style/iconfont.1784122303243.woff2 +0 -0
  46. package/lib/icon/style/style.css +33 -2
  47. package/lib/icon/style/style.min.css +33 -2
  48. package/{es/iconfont.1783939831164.ttf → lib/iconfont.1784122303243.ttf} +0 -0
  49. package/lib/iconfont.1784122303243.woff +0 -0
  50. package/lib/iconfont.1784122303243.woff2 +0 -0
  51. package/lib/index.umd.js +302 -136
  52. package/lib/index.umd.min.js +1 -1
  53. package/lib/language/en-US.js +3 -3
  54. package/lib/language/en-US.min.js +1 -1
  55. package/lib/language/en-US.umd.js +3 -3
  56. package/lib/language/hy-AM.js +3 -3
  57. package/lib/language/hy-AM.min.js +1 -1
  58. package/lib/language/hy-AM.umd.js +3 -3
  59. package/lib/language/zh-CN.js +3 -3
  60. package/lib/language/zh-CN.min.js +1 -1
  61. package/lib/language/zh-CN.umd.js +3 -3
  62. package/lib/layout-aside/src/layout-aside.js +12 -18
  63. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  64. package/lib/layout-aside/style/style.css +1 -3
  65. package/lib/layout-aside/style/style.min.css +1 -1
  66. package/lib/menu/src/menu.js +283 -116
  67. package/lib/menu/src/menu.min.js +1 -1
  68. package/lib/menu/style/style.css +51 -3
  69. package/lib/menu/style/style.min.css +1 -1
  70. package/lib/modal/src/modal.js +2 -2
  71. package/lib/modal/src/modal.min.js +1 -1
  72. package/lib/radio/style/style.css +1 -0
  73. package/lib/radio/style/style.min.css +1 -1
  74. package/lib/style.css +1 -1
  75. package/lib/style.min.css +1 -1
  76. package/lib/tree-select/src/tree-select.js +1 -1
  77. package/lib/tree-select/src/tree-select.min.js +1 -1
  78. package/lib/ui/index.js +1 -1
  79. package/lib/ui/index.min.js +1 -1
  80. package/lib/ui/src/log.js +1 -1
  81. package/lib/ui/src/log.min.js +1 -1
  82. package/lib/vxe-checkbox/style/style.css +1 -0
  83. package/lib/vxe-checkbox/style/style.min.css +1 -1
  84. package/lib/vxe-icon/style/style.css +33 -2
  85. package/lib/vxe-icon/style/style.min.css +1 -1
  86. package/lib/vxe-layout-aside/style/style.css +1 -3
  87. package/lib/vxe-layout-aside/style/style.min.css +1 -1
  88. package/lib/vxe-menu/style/style.css +51 -3
  89. package/lib/vxe-menu/style/style.min.css +1 -1
  90. package/lib/vxe-radio/style/style.css +1 -0
  91. package/lib/vxe-radio/style/style.min.css +1 -1
  92. package/package.json +2 -2
  93. package/packages/language/en-US.ts +3 -3
  94. package/packages/language/hy-AM.ts +3 -3
  95. package/packages/language/zh-CN.ts +3 -3
  96. package/packages/layout-aside/src/layout-aside.ts +15 -21
  97. package/packages/menu/src/menu.ts +302 -132
  98. package/packages/modal/src/modal.ts +3 -3
  99. package/packages/tree-select/src/tree-select.ts +1 -1
  100. package/styles/components/checkbox.scss +1 -0
  101. package/styles/components/icon.scss +33 -4
  102. package/styles/components/layout-aside.scss +1 -3
  103. package/styles/components/menu.scss +64 -1
  104. package/styles/components/radio.scss +1 -0
  105. package/styles/icon/iconfont.ttf +0 -0
  106. package/styles/icon/iconfont.woff +0 -0
  107. package/styles/icon/iconfont.woff2 +0 -0
  108. package/styles/theme/base.scss +1 -1
  109. package/styles/theme/dark.scss +1 -0
  110. package/styles/theme/light.scss +1 -0
  111. package/styles/variable.scss +2 -1
  112. package/types/components/icon.d.ts +1 -1
  113. package/types/components/layout-aside.d.ts +5 -4
  114. package/types/components/menu.d.ts +65 -17
  115. package/types/components/modal.d.ts +2 -2
  116. package/types/components/table.d.ts +11 -11
  117. package/types/components/toolbar.d.ts +1 -1
  118. package/es/icon/iconfont.1783939831164.woff +0 -0
  119. package/es/icon/iconfont.1783939831164.woff2 +0 -0
  120. package/es/iconfont.1783939831164.woff +0 -0
  121. package/es/iconfont.1783939831164.woff2 +0 -0
  122. package/lib/icon/style/iconfont.1783939831164.woff +0 -0
  123. package/lib/icon/style/iconfont.1783939831164.woff2 +0 -0
  124. package/lib/iconfont.1783939831164.woff +0 -0
  125. package/lib/iconfont.1783939831164.woff2 +0 -0
@@ -24,6 +24,10 @@ const {
24
24
  } = _ui.VxeUI;
25
25
  function createInternalData() {
26
26
  return {
27
+ lastActiveTime: 0,
28
+ menuInitMaps: {},
29
+ menuCacheMaps: {},
30
+ menuKeyMaps: {},
27
31
  menuEffectMaps: {}
28
32
  };
29
33
  }
@@ -44,10 +48,19 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
44
48
  props: {
45
49
  modelValue: [String, Number],
46
50
  expandAll: Boolean,
51
+ expandKeys: Array,
47
52
  accordion: {
48
53
  type: Boolean,
49
54
  default: () => getConfig().menu.accordion
50
55
  },
56
+ border: {
57
+ type: [Boolean, String],
58
+ default: () => getConfig().menu.border
59
+ },
60
+ optionProps: {
61
+ type: Object,
62
+ default: () => getConfig().menu.optionProps
63
+ },
51
64
  collapsed: {
52
65
  type: Boolean,
53
66
  default: null
@@ -85,6 +98,38 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
85
98
  const computeMenuOpts = (0, _vue.computed)(() => {
86
99
  return Object.assign({}, getConfig().menu.menuConfig, props.menuConfig);
87
100
  });
101
+ const computePropsOpts = (0, _vue.computed)(() => {
102
+ return Object.assign({}, getConfig().menu.optionProps, props.optionProps);
103
+ });
104
+ const computeTitleField = (0, _vue.computed)(() => {
105
+ const propsOpts = computePropsOpts.value;
106
+ return propsOpts.title || 'title';
107
+ });
108
+ const computeKeyField = (0, _vue.computed)(() => {
109
+ const propsOpts = computePropsOpts.value;
110
+ return propsOpts.name || 'name';
111
+ });
112
+ const computeChildrenField = (0, _vue.computed)(() => {
113
+ const propsOpts = computePropsOpts.value;
114
+ return propsOpts.children || 'children';
115
+ });
116
+ const computeLinkUrlField = (0, _vue.computed)(() => {
117
+ const propsOpts = computePropsOpts.value;
118
+ return propsOpts.linkUrl || 'href';
119
+ });
120
+ const computeRouterLinkField = (0, _vue.computed)(() => {
121
+ const propsOpts = computePropsOpts.value;
122
+ return propsOpts.routerLink || 'routerLink';
123
+ });
124
+ const computeCurrBorder = (0, _vue.computed)(() => {
125
+ const {
126
+ border
127
+ } = props;
128
+ if (border) {
129
+ return border === true ? 'first-group' : border;
130
+ }
131
+ return '';
132
+ });
88
133
  const computeIsCollapsed = (0, _vue.computed)(() => {
89
134
  const {
90
135
  collapsed
@@ -97,19 +142,15 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
97
142
  }
98
143
  return false;
99
144
  });
100
- const computeCollapseWidth = (0, _vue.computed)(() => {
101
- let collapseWidth = '';
102
- if ($xeLayoutAside) {
103
- collapseWidth = $xeLayoutAside.props.collapseWidth || '';
104
- }
105
- return collapseWidth;
106
- });
107
- const computeCollapseEnterWidth = (0, _vue.computed)(() => {
108
- let width = '';
145
+ const computeVarStyle = (0, _vue.computed)(() => {
109
146
  if ($xeLayoutAside) {
110
- width = $xeLayoutAside.props.width || '';
147
+ const {
148
+ computeVarStyle: asideComputeVarStyle
149
+ } = $xeLayoutAside.getComputeMaps();
150
+ const asideVarStyle = asideComputeVarStyle.value;
151
+ return asideVarStyle;
111
152
  }
112
- return width;
153
+ return {};
113
154
  });
114
155
  const computeMaps = {
115
156
  computeSize
@@ -119,6 +160,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
119
160
  props,
120
161
  context,
121
162
  reactData,
163
+ internalData,
122
164
  getRefMaps: () => refMaps,
123
165
  getComputeMaps: () => computeMaps
124
166
  };
@@ -134,12 +176,16 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
134
176
  const {
135
177
  activeName
136
178
  } = reactData;
137
- _xeUtils.default.eachTree(reactData.menuList, (item, index, items, path, parent, nodes) => {
179
+ const {
180
+ menuInitMaps
181
+ } = internalData;
182
+ _xeUtils.default.eachTree(reactData.menuList, (item, index, items, path, parentItem, nodes) => {
138
183
  if (item.itemKey === activeName) {
139
184
  nodes.forEach(obj => {
140
185
  obj.isActive = true;
141
186
  if (isDefExpand) {
142
187
  obj.isExpand = true;
188
+ menuInitMaps[obj.itemId] = true;
143
189
  }
144
190
  });
145
191
  item.isExactActive = true;
@@ -154,24 +200,66 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
154
200
  const updateMenuConfig = () => {
155
201
  const {
156
202
  options,
157
- expandAll
203
+ expandAll,
204
+ expandKeys
158
205
  } = props;
159
- reactData.menuList = _xeUtils.default.mapTree(options, (item, index, items, path, parent) => {
160
- const objItem = Object.assign(Object.assign({}, item), {
161
- parentKey: parent ? parent.name || path.slice(0, path.length - 1).join(',') : '',
206
+ const muInitMaps = {};
207
+ const titleField = computeTitleField.value;
208
+ const keyField = computeKeyField.value;
209
+ const childrenField = computeChildrenField.value;
210
+ const linkUrlField = computeLinkUrlField.value;
211
+ const routerLinkField = computeRouterLinkField.value;
212
+ const defaultExpandMaps = {};
213
+ if (expandKeys) {
214
+ expandKeys.forEach(key => {
215
+ defaultExpandMaps[key] = true;
216
+ });
217
+ }
218
+ const muCacheMaps = {};
219
+ const muKeyMaps = {};
220
+ reactData.menuList = _xeUtils.default.mapTree(options, (item, index, items, path, parentItem) => {
221
+ const itemId = ++nemuUniqueKey;
222
+ const itemKey = item[keyField] || path.join(',');
223
+ const childList = item[childrenField];
224
+ const hasChild = childList && childList.length > 0;
225
+ const isExpand = hasChild ? _xeUtils.default.isBoolean(item.expanded) ? item.expanded : defaultExpandMaps[itemKey] || !!expandAll : false;
226
+ if (isExpand) {
227
+ muInitMaps[itemId] = true;
228
+ }
229
+ const objItem = {
230
+ itemConf: item,
231
+ title: item[titleField],
232
+ name: item[keyField],
233
+ icon: item.icon,
234
+ linkUrl: item[linkUrlField],
235
+ linkTarget: item.linkTarget,
236
+ routerLink: item[routerLinkField],
237
+ permissionCode: item.permissionCode,
238
+ children: childList,
239
+ slots: item.slots,
240
+ parentKey: parentItem ? parentItem.name || path.slice(0, path.length - 1).join(',') : '',
162
241
  level: path.length,
163
- itemId: ++nemuUniqueKey,
164
- itemKey: item.name || path.join(','),
242
+ itemId,
243
+ itemKey,
165
244
  isExactActive: false,
166
245
  isActive: false,
167
- isExpand: _xeUtils.default.isBoolean(item.expanded) ? item.expanded : !!expandAll,
168
- hasChild: item.children && item.children.length > 0
169
- });
246
+ isExpand,
247
+ hasChild,
248
+ childList: []
249
+ };
250
+ if (muKeyMaps[itemKey]) {
251
+ errLog('vxe.error.repeatKey', [keyField, item[keyField]]);
252
+ }
253
+ muCacheMaps[itemId] = objItem;
254
+ muKeyMaps[itemKey] = objItem;
170
255
  return objItem;
171
256
  }, {
172
257
  children: 'children',
173
258
  mapChildren: 'childList'
174
259
  });
260
+ internalData.menuInitMaps = muInitMaps;
261
+ internalData.menuCacheMaps = muCacheMaps;
262
+ internalData.menuKeyMaps = muKeyMaps;
175
263
  };
176
264
  const updateCollapseStyle = () => {
177
265
  const {
@@ -179,12 +267,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
179
267
  } = props;
180
268
  if (collapseFixed) {
181
269
  (0, _vue.nextTick)(() => {
182
- const {
183
- isEnterCollapse
184
- } = reactData;
185
270
  const isCollapsed = computeIsCollapsed.value;
186
- const collapseEnterWidth = computeCollapseEnterWidth.value;
187
- const collapseWidth = computeCollapseWidth.value;
188
271
  const el = refElem.value;
189
272
  if (el) {
190
273
  const clientRect = el.getBoundingClientRect();
@@ -193,7 +276,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
193
276
  top: (0, _dom.toCssUnit)(clientRect.top),
194
277
  left: (0, _dom.toCssUnit)(clientRect.left),
195
278
  height: (0, _dom.toCssUnit)(parentNode.clientHeight),
196
- width: isEnterCollapse ? collapseEnterWidth ? (0, _dom.toCssUnit)(collapseEnterWidth) : '' : collapseWidth ? (0, _dom.toCssUnit)(collapseWidth) : '',
197
279
  zIndex: reactData.collapseZindex
198
280
  } : {};
199
281
  }
@@ -212,12 +294,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
212
294
  if (isCollapsed) {
213
295
  if (!initialized) {
214
296
  reactData.initialized = true;
215
- (0, _vue.nextTick)(() => {
216
- const collapseEl = refCollapseElem.value;
217
- if (collapseEl) {
218
- document.body.appendChild(collapseEl);
219
- }
220
- });
221
297
  }
222
298
  }
223
299
  reactData.isEnterCollapse = false;
@@ -230,7 +306,8 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
230
306
  accordion
231
307
  } = props;
232
308
  const {
233
- menuEffectMaps
309
+ menuEffectMaps,
310
+ menuInitMaps
234
311
  } = internalData;
235
312
  const {
236
313
  itemId,
@@ -253,6 +330,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
253
330
  });
254
331
  }
255
332
  item.isExpand = expanded;
333
+ menuInitMaps[itemId] = true;
256
334
  const wrapperEl = isCollapsed ? refCollapseElem.value : refElem.value;
257
335
  if (wrapperEl) {
258
336
  const nemuEl = wrapperEl.querySelector(`.vxe-menu--item-wrapper[data-menu-id="${itemId}"]`);
@@ -297,7 +375,8 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
297
375
  if (!visibleMethod || visibleMethod({
298
376
  $menu: $xeMenu,
299
377
  options,
300
- currentMenu: item
378
+ currentMenu: item,
379
+ currentOption: item.itemConf
301
380
  })) {
302
381
  if (_ui.VxeUI.contextMenu) {
303
382
  _ui.VxeUI.contextMenu.openByEvent(evnt, {
@@ -312,6 +391,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
312
391
  const params = {
313
392
  menu: option,
314
393
  currentMenu: item,
394
+ currentOption: item.itemConf,
315
395
  $event: evnt,
316
396
  $menu: $xeMenu
317
397
  };
@@ -332,22 +412,27 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
332
412
  const handleClickMenu = (evnt, item, itemList) => {
333
413
  const {
334
414
  itemKey,
415
+ linkUrl,
335
416
  routerLink,
336
417
  hasChild
337
418
  } = item;
338
- if (routerLink) {
419
+ if (linkUrl || routerLink) {
339
420
  emitModel(itemKey);
340
- handleMenuMouseleave();
421
+ reactData.isEnterCollapse = false;
422
+ internalData.lastActiveTime = Date.now();
341
423
  } else {
342
424
  if (hasChild) {
343
425
  handleClickIconCollapse(evnt, item, itemList);
344
426
  } else {
345
427
  emitModel(itemKey);
346
- handleMenuMouseleave();
428
+ reactData.isEnterCollapse = false;
429
+ internalData.lastActiveTime = Date.now();
347
430
  }
348
431
  }
349
432
  const params = {
350
433
  currentMenu: item,
434
+ currentOption: item.itemConf,
435
+ option: item.itemConf,
351
436
  // 已废弃
352
437
  menu: item
353
438
  };
@@ -355,30 +440,13 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
355
440
  };
356
441
  const handleMenuMouseenter = () => {
357
442
  const {
358
- collapseStyle
359
- } = reactData;
360
- const collapseEnterWidth = computeCollapseEnterWidth.value;
361
- reactData.collapseStyle = Object.assign({}, collapseStyle, {
362
- width: collapseEnterWidth ? (0, _dom.toCssUnit)(collapseEnterWidth) : ''
363
- });
364
- reactData.isEnterCollapse = true;
365
- };
366
- const handleMenuMouseover = () => {
367
- const {
368
- isEnterCollapse
369
- } = reactData;
370
- if (!isEnterCollapse) {
371
- handleMenuMouseenter();
443
+ lastActiveTime
444
+ } = internalData;
445
+ if (lastActiveTime < Date.now() - 500) {
446
+ reactData.isEnterCollapse = true;
372
447
  }
373
448
  };
374
449
  const handleMenuMouseleave = () => {
375
- const {
376
- collapseStyle
377
- } = reactData;
378
- const el = refElem.value;
379
- reactData.collapseStyle = Object.assign({}, collapseStyle, {
380
- width: el ? (0, _dom.toCssUnit)(el.offsetWidth) : ''
381
- });
382
450
  reactData.isEnterCollapse = false;
383
451
  };
384
452
  const callSlot = (slotFunc, params) => {
@@ -397,8 +465,84 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
397
465
  $menu: $xeMenu
398
466
  }, params));
399
467
  };
468
+ const handleScrollToView = itemId => {
469
+ const wrapperEl = refElem.value;
470
+ const nemuEl = wrapperEl ? wrapperEl.querySelector(`.vxe-menu--item-wrapper[data-menu-id="${itemId}"]`) : null;
471
+ if (nemuEl) {
472
+ (0, _dom.scrollToView)(nemuEl);
473
+ return true;
474
+ }
475
+ return false;
476
+ };
400
477
  const menuMethods = {
401
- dispatchEvent
478
+ dispatchEvent,
479
+ setExpandByMenuKey(menuKeys, expanded) {
480
+ const {
481
+ menuKeyMaps,
482
+ menuInitMaps
483
+ } = internalData;
484
+ if (menuKeys) {
485
+ if (!_xeUtils.default.isArray(menuKeys)) {
486
+ menuKeys = [menuKeys];
487
+ }
488
+ menuKeys.forEach(mKey => {
489
+ const menuItem = menuKeyMaps[mKey];
490
+ if (menuItem) {
491
+ if (expanded) {
492
+ menuInitMaps[menuItem.itemId] = true;
493
+ }
494
+ menuItem.isExpand = !!expanded;
495
+ }
496
+ });
497
+ }
498
+ return (0, _vue.nextTick)();
499
+ },
500
+ clearAllExpandMenu() {
501
+ const {
502
+ menuList
503
+ } = reactData;
504
+ _xeUtils.default.eachTree(menuList, item => {
505
+ item.isExpand = false;
506
+ }, {
507
+ children: 'childList'
508
+ });
509
+ internalData.menuInitMaps = {};
510
+ return (0, _vue.nextTick)();
511
+ },
512
+ scrollToMenuKey(menuKey) {
513
+ const {
514
+ menuKeyMaps
515
+ } = internalData;
516
+ const menuItem = menuKeyMaps[menuKey];
517
+ if (!menuItem) {
518
+ return (0, _vue.nextTick)();
519
+ }
520
+ const {
521
+ itemId
522
+ } = menuItem;
523
+ if (handleScrollToView(itemId)) {
524
+ return (0, _vue.nextTick)();
525
+ }
526
+ return (0, _vue.nextTick)().then(() => {
527
+ handleScrollToView(itemId);
528
+ });
529
+ },
530
+ scrollToActiveMenu() {
531
+ const {
532
+ activeName
533
+ } = reactData;
534
+ if (activeName) {
535
+ return $xeMenu.scrollToMenuKey(activeName);
536
+ }
537
+ return (0, _vue.nextTick)().then(() => {
538
+ const {
539
+ activeName
540
+ } = reactData;
541
+ if (activeName) {
542
+ return $xeMenu.scrollToMenuKey(activeName);
543
+ }
544
+ });
545
+ }
402
546
  };
403
547
  const menuPrivateMethods = {};
404
548
  Object.assign($xeMenu, menuMethods, menuPrivateMethods);
@@ -416,9 +560,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
416
560
  const isCollapsed = computeIsCollapsed.value;
417
561
  const params = {
418
562
  currentMenu: item,
419
- collapsed: isCollapsed,
420
- // 已废弃
421
- option: item
563
+ currentOption: item.itemConf,
564
+ option: item.itemConf,
565
+ collapsed: isCollapsed
422
566
  };
423
567
  return [optionSlot ? (0, _ui.renderEmptyElement)($xeMenu) : (0, _vue.h)('div', {
424
568
  class: 'vxe-menu--item-link-icon'
@@ -447,48 +591,56 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
447
591
  isActive,
448
592
  isExactActive,
449
593
  isExpand,
594
+ linkUrl,
450
595
  routerLink,
596
+ linkTarget,
451
597
  childList
452
598
  } = item;
453
599
  const {
454
600
  isEnterCollapse
455
601
  } = reactData;
602
+ const {
603
+ menuInitMaps
604
+ } = internalData;
456
605
  const isCollapsed = computeIsCollapsed.value;
457
606
  if (item.permissionCode) {
458
607
  if (!_ui.permission.checkVisible(item.permissionCode)) {
459
608
  return (0, _ui.renderEmptyElement)($xeMenu);
460
609
  }
461
610
  }
611
+ const isExpandChild = (!isCollapsed || isEnterCollapse) && isExpand;
612
+ const linkOns = {
613
+ onContextmenu(evnt) {
614
+ handleContextmenuEvent(evnt, item);
615
+ },
616
+ onClick(evnt) {
617
+ handleClickMenu(evnt, item, itemList);
618
+ }
619
+ };
462
620
  return (0, _vue.h)('div', {
463
621
  key: itemKey,
464
622
  class: ['vxe-menu--item-wrapper', `vxe-menu--item-level${level}`, {
623
+ 'has--child': hasChild,
465
624
  'is--exact-active': isExactActive,
466
625
  'is--active': isActive,
467
- 'is--expand': (!isCollapsed || isEnterCollapse) && isExpand
626
+ 'is--expand': isExpandChild
468
627
  }],
469
628
  'data-menu-id': itemId
470
- }, [routerLink ? (0, _vue.h)((0, _vue.resolveComponent)('router-link'), {
471
- class: 'vxe-menu--item-link',
629
+ }, [linkUrl ? (0, _vue.h)('a', Object.assign({
630
+ class: 'vxe-menu--item-link is--link',
631
+ href: linkUrl,
632
+ target: linkTarget
633
+ }, linkOns), renderMenuTitle(item, itemList)) : routerLink ? (0, _vue.h)((0, _vue.resolveComponent)('router-link'), Object.assign({
634
+ class: 'vxe-menu--item-link is--router',
472
635
  to: routerLink,
473
- onContextmenu(evnt) {
474
- handleContextmenuEvent(evnt, item);
475
- },
476
- onClick(evnt) {
477
- handleClickMenu(evnt, item, itemList);
478
- }
479
- }, {
636
+ target: linkTarget
637
+ }, linkOns), {
480
638
  default: () => renderMenuTitle(item, itemList)
481
- }) : (0, _vue.h)('div', {
482
- class: 'vxe-menu--item-link',
483
- onContextmenu(evnt) {
484
- handleContextmenuEvent(evnt, item);
485
- },
486
- onClick(evnt) {
487
- handleClickMenu(evnt, item, itemList);
488
- }
489
- }, renderMenuTitle(item, itemList)), hasChild ? (0, _vue.h)('div', {
639
+ }) : (0, _vue.h)('div', Object.assign({
640
+ class: 'vxe-menu--item-link is--default'
641
+ }, linkOns), renderMenuTitle(item, itemList)), hasChild ? (0, _vue.h)('div', {
490
642
  class: 'vxe-menu--item-group'
491
- }, childList.map(child => renderDefaultChildren(child, childList))) : (0, _ui.renderEmptyElement)($xeMenu)]);
643
+ }, isExpandChild || menuInitMaps[itemId] ? childList.map(child => renderDefaultChildren(child, childList)) : []) : (0, _ui.renderEmptyElement)($xeMenu)]);
492
644
  };
493
645
  const renderCollapseChildren = (item, itemList) => {
494
646
  const {
@@ -499,6 +651,8 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
499
651
  isActive,
500
652
  isExactActive,
501
653
  routerLink,
654
+ linkUrl,
655
+ linkTarget,
502
656
  childList
503
657
  } = item;
504
658
  if (item.permissionCode) {
@@ -506,33 +660,35 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
506
660
  return (0, _ui.renderEmptyElement)($xeMenu);
507
661
  }
508
662
  }
663
+ const linkOns = {
664
+ onContextmenu(evnt) {
665
+ handleContextmenuEvent(evnt, item);
666
+ },
667
+ onClick(evnt) {
668
+ handleClickMenu(evnt, item, itemList);
669
+ }
670
+ };
509
671
  return (0, _vue.h)('div', {
510
672
  key: itemKey,
511
673
  class: ['vxe-menu--item-wrapper', `vxe-menu--item-level${level}`, {
674
+ 'has--child': hasChild,
512
675
  'is--exact-active': isExactActive,
513
676
  'is--active': isActive
514
677
  }],
515
678
  'data-menu-id': itemId
516
- }, [routerLink ? (0, _vue.h)((0, _vue.resolveComponent)('router-link'), {
517
- class: 'vxe-menu--item-link',
679
+ }, [linkUrl ? (0, _vue.h)('a', Object.assign({
680
+ class: 'vxe-menu--item-link is--link',
681
+ href: linkUrl,
682
+ target: linkTarget
683
+ }, linkOns), renderMenuTitle(item, itemList)) : routerLink ? (0, _vue.h)((0, _vue.resolveComponent)('router-link'), Object.assign({
684
+ class: 'vxe-menu--item-link is--router',
518
685
  to: routerLink,
519
- onContextmenu(evnt) {
520
- handleContextmenuEvent(evnt, item);
521
- },
522
- onClick(evnt) {
523
- handleClickMenu(evnt, item, itemList);
524
- }
525
- }, {
686
+ target: linkTarget
687
+ }, linkOns), {
526
688
  default: () => renderMenuTitle(item, itemList)
527
- }) : (0, _vue.h)('div', {
528
- class: 'vxe-menu--item-link',
529
- onContextmenu(evnt) {
530
- handleContextmenuEvent(evnt, item);
531
- },
532
- onClick(evnt) {
533
- handleClickMenu(evnt, item, itemList);
534
- }
535
- }, renderMenuTitle(item, itemList)), hasChild ? (0, _vue.h)('div', {
689
+ }) : (0, _vue.h)('div', Object.assign({
690
+ class: 'vxe-menu--item-link is--default'
691
+ }, linkOns), renderMenuTitle(item, itemList)), hasChild ? (0, _vue.h)('div', {
536
692
  class: 'vxe-menu--item-group'
537
693
  }, childList.map(child => renderDefaultChildren(child, childList))) : (0, _ui.renderEmptyElement)($xeMenu)]);
538
694
  };
@@ -549,24 +705,38 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
549
705
  } = reactData;
550
706
  const vSize = computeSize.value;
551
707
  const isCollapsed = computeIsCollapsed.value;
708
+ const currBorder = computeCurrBorder.value;
709
+ const varStyle = computeVarStyle.value;
710
+ const headerSlot = slots.header;
711
+ const footerSlot = slots.footer;
552
712
  let ons = {};
553
713
  if (collapseFixed) {
554
714
  ons = {
555
715
  onMouseenter: handleMenuMouseenter,
556
- onMouseover: handleMenuMouseover,
557
716
  onMouseleave: handleMenuMouseleave
558
717
  };
559
718
  }
719
+ const stParams = {
720
+ collapsed: isCollapsed
721
+ };
560
722
  return (0, _vue.h)('div', {
561
723
  ref: refElem,
562
724
  class: ['vxe-menu', {
725
+ [`border--${currBorder}`]: currBorder,
563
726
  [`size--${vSize}`]: vSize,
564
727
  'is--collapsed': isCollapsed,
565
728
  'is--loading': loading
566
729
  }]
567
- }, [(0, _vue.h)('div', {
568
- class: 'vxe-menu--item-list'
569
- }, menuList.map(child => isCollapsed ? renderCollapseChildren(child, menuList) : renderDefaultChildren(child, menuList))), initialized ? (0, _vue.h)('div', Object.assign({
730
+ }, [headerSlot ? (0, _vue.h)('div', {
731
+ class: 'vxe-menu--header'
732
+ }, headerSlot(stParams)) : (0, _ui.renderEmptyElement)($xeMenu), (0, _vue.h)('div', {
733
+ class: 'vxe-menu--body'
734
+ }, menuList.map(child => isCollapsed ? renderCollapseChildren(child, menuList) : renderDefaultChildren(child, menuList))), footerSlot ? (0, _vue.h)('div', {
735
+ class: 'vxe-menu--footer'
736
+ }, footerSlot(stParams)) : (0, _ui.renderEmptyElement)($xeMenu), (0, _vue.h)(_vue.Teleport, {
737
+ to: 'body',
738
+ disabled: !initialized
739
+ }, [(0, _vue.h)('div', Object.assign({
570
740
  ref: refCollapseElem,
571
741
  class: ['vxe-menu--collapse-wrapper', {
572
742
  [`size--${vSize}`]: vSize,
@@ -574,10 +744,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
574
744
  'is--enter': isEnterCollapse,
575
745
  'is--loading': loading
576
746
  }],
577
- style: collapseStyle
578
- }, ons), [isCollapsed ? (0, _vue.h)('div', {
579
- class: 'vxe-menu--item-list'
580
- }, menuList.map(child => renderDefaultChildren(child, menuList))) : (0, _ui.renderEmptyElement)($xeMenu)]) : (0, _ui.renderEmptyElement)($xeMenu),
747
+ style: Object.assign({}, varStyle, collapseStyle)
748
+ }, ons), isCollapsed ? [headerSlot ? (0, _vue.h)('div', {
749
+ class: 'vxe-menu--header'
750
+ }, headerSlot(stParams)) : (0, _ui.renderEmptyElement)($xeMenu), (0, _vue.h)('div', {
751
+ class: 'vxe-menu--body'
752
+ }, menuList.map(child => renderDefaultChildren(child, menuList))), footerSlot ? (0, _vue.h)('div', {
753
+ class: 'vxe-menu--footer'
754
+ }, footerSlot(stParams)) : (0, _ui.renderEmptyElement)($xeMenu)] : [])]),
581
755
  /**
582
756
  * 加载中
583
757
  */
@@ -618,13 +792,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
618
792
  updateCollapseStyle();
619
793
  });
620
794
  (0, _vue.onBeforeUnmount)(() => {
621
- const collapseEl = refCollapseElem.value;
622
- if (collapseEl) {
623
- const parentNode = collapseEl.parentNode;
624
- if (parentNode) {
625
- parentNode.removeChild(collapseEl);
626
- }
627
- }
628
795
  _ui.globalEvents.off($xeMenu, 'resize');
629
796
  _xeUtils.default.assign(reactData, createReactData());
630
797
  _xeUtils.default.assign(internalData, createInternalData());