vxe-pc-ui 3.16.10 → 3.16.12

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 (102) hide show
  1. package/es/icon/{iconfont.1783944544969.ttf → iconfont.1784124324909.ttf} +0 -0
  2. package/es/icon/iconfont.1784124324909.woff +0 -0
  3. package/es/icon/iconfont.1784124324909.woff2 +0 -0
  4. package/es/icon/style.css +33 -2
  5. package/es/icon/style.min.css +1 -1
  6. package/{lib/icon/style/iconfont.1783944544969.ttf → es/iconfont.1784124324909.ttf} +0 -0
  7. package/es/iconfont.1784124324909.woff +0 -0
  8. package/es/iconfont.1784124324909.woff2 +0 -0
  9. package/es/language/en-US.js +3 -3
  10. package/es/language/hy-AM.js +3 -3
  11. package/es/language/zh-CN.js +3 -3
  12. package/es/layout-aside/src/layout-aside.js +11 -19
  13. package/es/layout-aside/style.css +1 -3
  14. package/es/layout-aside/style.min.css +1 -1
  15. package/es/menu/src/menu.js +308 -101
  16. package/es/menu/style.css +52 -4
  17. package/es/menu/style.min.css +1 -1
  18. package/es/modal/src/modal.js +2 -2
  19. package/es/style.css +1 -1
  20. package/es/style.min.css +1 -1
  21. package/es/tree-select/src/tree-select.js +1 -1
  22. package/es/ui/index.js +1 -1
  23. package/es/ui/src/log.js +1 -1
  24. package/es/vxe-icon/style.css +33 -2
  25. package/es/vxe-icon/style.min.css +1 -1
  26. package/es/vxe-layout-aside/style.css +1 -3
  27. package/es/vxe-layout-aside/style.min.css +1 -1
  28. package/es/vxe-menu/style.css +52 -4
  29. package/es/vxe-menu/style.min.css +1 -1
  30. package/lib/{iconfont.1783944544969.ttf → icon/style/iconfont.1784124324909.ttf} +0 -0
  31. package/lib/icon/style/iconfont.1784124324909.woff +0 -0
  32. package/lib/icon/style/iconfont.1784124324909.woff2 +0 -0
  33. package/lib/icon/style/style.css +33 -2
  34. package/lib/icon/style/style.min.css +33 -2
  35. package/{es/iconfont.1783944544969.ttf → lib/iconfont.1784124324909.ttf} +0 -0
  36. package/lib/iconfont.1784124324909.woff +0 -0
  37. package/lib/iconfont.1784124324909.woff2 +0 -0
  38. package/lib/index.umd.js +314 -121
  39. package/lib/index.umd.min.js +1 -1
  40. package/lib/language/en-US.js +3 -3
  41. package/lib/language/en-US.min.js +1 -1
  42. package/lib/language/en-US.umd.js +3 -3
  43. package/lib/language/hy-AM.js +3 -3
  44. package/lib/language/hy-AM.min.js +1 -1
  45. package/lib/language/hy-AM.umd.js +3 -3
  46. package/lib/language/zh-CN.js +3 -3
  47. package/lib/language/zh-CN.min.js +1 -1
  48. package/lib/language/zh-CN.umd.js +3 -3
  49. package/lib/layout-aside/src/layout-aside.js +12 -18
  50. package/lib/layout-aside/src/layout-aside.min.js +1 -1
  51. package/lib/layout-aside/style/style.css +1 -3
  52. package/lib/layout-aside/style/style.min.css +1 -1
  53. package/lib/menu/src/menu.js +292 -93
  54. package/lib/menu/src/menu.min.js +1 -1
  55. package/lib/menu/style/style.css +52 -4
  56. package/lib/menu/style/style.min.css +1 -1
  57. package/lib/modal/src/modal.js +2 -2
  58. package/lib/modal/src/modal.min.js +1 -1
  59. package/lib/style.css +1 -1
  60. package/lib/style.min.css +1 -1
  61. package/lib/tree-select/src/tree-select.js +1 -1
  62. package/lib/tree-select/src/tree-select.min.js +1 -1
  63. package/lib/ui/index.js +1 -1
  64. package/lib/ui/index.min.js +1 -1
  65. package/lib/ui/src/log.js +1 -1
  66. package/lib/ui/src/log.min.js +1 -1
  67. package/lib/vxe-icon/style/style.css +33 -2
  68. package/lib/vxe-icon/style/style.min.css +1 -1
  69. package/lib/vxe-layout-aside/style/style.css +1 -3
  70. package/lib/vxe-layout-aside/style/style.min.css +1 -1
  71. package/lib/vxe-menu/style/style.css +52 -4
  72. package/lib/vxe-menu/style/style.min.css +1 -1
  73. package/package.json +2 -2
  74. package/packages/language/en-US.ts +3 -3
  75. package/packages/language/hy-AM.ts +3 -3
  76. package/packages/language/zh-CN.ts +3 -3
  77. package/packages/layout-aside/src/layout-aside.ts +13 -20
  78. package/packages/menu/src/menu.ts +323 -111
  79. package/packages/modal/src/modal.ts +2 -2
  80. package/packages/tree-select/src/tree-select.ts +1 -1
  81. package/styles/components/icon.scss +33 -4
  82. package/styles/components/layout-aside.scss +1 -3
  83. package/styles/components/menu.scss +64 -1
  84. package/styles/icon/iconfont.ttf +0 -0
  85. package/styles/icon/iconfont.woff +0 -0
  86. package/styles/icon/iconfont.woff2 +0 -0
  87. package/styles/theme/dark.scss +1 -0
  88. package/styles/theme/light.scss +1 -0
  89. package/styles/variable.scss +2 -1
  90. package/types/components/icon.d.ts +1 -1
  91. package/types/components/layout-aside.d.ts +3 -1
  92. package/types/components/menu.d.ts +65 -12
  93. package/types/components/table.d.ts +13 -11
  94. package/types/components/toolbar.d.ts +1 -1
  95. package/es/icon/iconfont.1783944544969.woff +0 -0
  96. package/es/icon/iconfont.1783944544969.woff2 +0 -0
  97. package/es/iconfont.1783944544969.woff +0 -0
  98. package/es/iconfont.1783944544969.woff2 +0 -0
  99. package/lib/icon/style/iconfont.1783944544969.woff +0 -0
  100. package/lib/icon/style/iconfont.1783944544969.woff2 +0 -0
  101. package/lib/iconfont.1783944544969.woff +0 -0
  102. package/lib/iconfont.1783944544969.woff2 +0 -0
@@ -3,14 +3,12 @@
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
  flex-shrink: 0;
6
+ width: var(--vxe-ui-layout-aside-default-width);
6
7
  overflow: hidden;
7
8
  }
8
9
  .vxe-layout-aside.is--animat {
9
10
  transition: width 0.3s;
10
11
  }
11
- .vxe-layout-aside.is--default-width {
12
- width: var(--vxe-ui-layout-aside-default-width);
13
- }
14
12
  .vxe-layout-aside.is--collapse {
15
13
  width: var(--vxe-ui-layout-aside-collapse-width);
16
14
  }
@@ -1 +1 @@
1
- .vxe-layout-aside{position:relative;display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.vxe-layout-aside.is--animat{transition:width .3s}.vxe-layout-aside.is--default-width{width:var(--vxe-ui-layout-aside-default-width)}.vxe-layout-aside.is--collapse{width:var(--vxe-ui-layout-aside-collapse-width)}.vxe-layout-aside.is--padding{padding:var(--vxe-ui-layout-padding-default)}.vxe-layout-aside--inner{flex-grow:1;overflow-y:auto;overflow-x:hidden;outline:0}
1
+ .vxe-layout-aside{position:relative;display:flex;flex-direction:column;flex-shrink:0;width:var(--vxe-ui-layout-aside-default-width);overflow:hidden}.vxe-layout-aside.is--animat{transition:width .3s}.vxe-layout-aside.is--collapse{width:var(--vxe-ui-layout-aside-collapse-width)}.vxe-layout-aside.is--padding{padding:var(--vxe-ui-layout-padding-default)}.vxe-layout-aside--inner{flex-grow:1;overflow-y:auto;overflow-x:hidden;outline:0}
@@ -1,7 +1,7 @@
1
1
  import { defineVxeComponent } from '../../ui/src/comp';
2
2
  import XEUtils from 'xe-utils';
3
3
  import { VxeUI, createEvent, permission, globalMixins, globalEvents, renderEmptyElement } from '../../ui';
4
- import { toCssUnit } from '../../ui/src/dom';
4
+ import { scrollToView, toCssUnit } from '../../ui/src/dom';
5
5
  import { getLastZIndex, nextZIndex, isEnableConf } from '../../ui/src/utils';
6
6
  import { getSlotVNs } from '../../ui/src/vn';
7
7
  import { createComponentLog } from '../../ui/src/log';
@@ -10,6 +10,10 @@ const { errLog } = createComponentLog('menu');
10
10
  const { menus, getConfig, getIcon } = VxeUI;
11
11
  function createInternalData() {
12
12
  return {
13
+ lastActiveTime: 0,
14
+ menuInitMaps: {},
15
+ menuCacheMaps: {},
16
+ menuKeyMaps: {},
13
17
  menuEffectMaps: {}
14
18
  };
15
19
  }
@@ -34,10 +38,19 @@ export default {
34
38
  props: {
35
39
  value: [String, Number],
36
40
  expandAll: Boolean,
41
+ expandKeys: Array,
37
42
  accordion: {
38
43
  type: Boolean,
39
44
  default: () => getConfig().menu.accordion
40
45
  },
46
+ border: {
47
+ type: [Boolean, String],
48
+ default: () => getConfig().menu.border
49
+ },
50
+ optionProps: {
51
+ type: Object,
52
+ default: () => getConfig().menu.optionProps
53
+ },
41
54
  collapsed: {
42
55
  type: Boolean,
43
56
  default: null
@@ -63,7 +76,46 @@ export default {
63
76
  const reactData = createReactData();
64
77
  return Object.assign(Object.assign({}, {}), { xID: XEUtils.uniqueId(), reactData });
65
78
  },
66
- computed: Object.assign(Object.assign({}, {}), { computeMenuOpts() {
79
+ computed: Object.assign(Object.assign({}, {}), { computePropsOpts() {
80
+ const $xeMenu = this;
81
+ const props = $xeMenu;
82
+ return Object.assign({}, getConfig().menu.optionProps, props.optionProps);
83
+ },
84
+ computeTitleField() {
85
+ const $xeMenu = this;
86
+ const propsOpts = $xeMenu.computePropsOpts;
87
+ return propsOpts.title || 'title';
88
+ },
89
+ computeKeyField() {
90
+ const $xeMenu = this;
91
+ const propsOpts = $xeMenu.computePropsOpts;
92
+ return propsOpts.name || 'name';
93
+ },
94
+ computeChildrenField() {
95
+ const $xeMenu = this;
96
+ const propsOpts = $xeMenu.computePropsOpts;
97
+ return propsOpts.children || 'children';
98
+ },
99
+ computeLinkUrlField() {
100
+ const $xeMenu = this;
101
+ const propsOpts = $xeMenu.computePropsOpts;
102
+ return propsOpts.linkUrl || 'href';
103
+ },
104
+ computeRouterLinkField() {
105
+ const $xeMenu = this;
106
+ const propsOpts = $xeMenu.computePropsOpts;
107
+ return propsOpts.routerLink || 'routerLink';
108
+ },
109
+ computeCurrBorder() {
110
+ const $xeMenu = this;
111
+ const props = $xeMenu;
112
+ const { border } = props;
113
+ if (border) {
114
+ return border === true ? 'first-group' : border;
115
+ }
116
+ return '';
117
+ },
118
+ computeMenuOpts() {
67
119
  const $xeMenu = this;
68
120
  const props = $xeMenu;
69
121
  return Object.assign({}, getConfig().tree.menuConfig, props.menuConfig);
@@ -80,14 +132,14 @@ export default {
80
132
  }
81
133
  return false;
82
134
  },
83
- computeCollapseWidth() {
135
+ computeVarStyle() {
84
136
  const $xeMenu = this;
85
137
  const $xeLayoutAside = $xeMenu.$xeLayoutAside;
86
- let collapseWidth = '';
87
138
  if ($xeLayoutAside) {
88
- collapseWidth = $xeLayoutAside.collapseWidth || '';
139
+ const asideVarStyle = $xeLayoutAside.computeVarStyle;
140
+ return asideVarStyle;
89
141
  }
90
- return collapseWidth;
142
+ return {};
91
143
  },
92
144
  computeCollapseEnterWidth() {
93
145
  const $xeMenu = this;
@@ -132,6 +184,77 @@ export default {
132
184
  }
133
185
  return [];
134
186
  },
187
+ setExpandByMenuKey(menuKeys, expanded) {
188
+ const $xeMenu = this;
189
+ const internalData = $xeMenu.internalData;
190
+ const { menuKeyMaps, menuInitMaps } = internalData;
191
+ if (menuKeys) {
192
+ if (!XEUtils.isArray(menuKeys)) {
193
+ menuKeys = [menuKeys];
194
+ }
195
+ menuKeys.forEach((mKey) => {
196
+ const menuItem = menuKeyMaps[mKey];
197
+ if (menuItem) {
198
+ if (expanded) {
199
+ menuInitMaps[menuItem.itemId] = true;
200
+ }
201
+ menuItem.isExpand = !!expanded;
202
+ }
203
+ });
204
+ }
205
+ return $xeMenu.$nextTick();
206
+ },
207
+ clearAllExpandMenu() {
208
+ const $xeMenu = this;
209
+ const reactData = $xeMenu.reactData;
210
+ const internalData = $xeMenu.internalData;
211
+ const { menuList } = reactData;
212
+ XEUtils.eachTree(menuList, (item) => {
213
+ item.isExpand = false;
214
+ }, { children: 'childList' });
215
+ internalData.menuInitMaps = {};
216
+ return $xeMenu.$nextTick();
217
+ },
218
+ handleScrollToView(itemId) {
219
+ const $xeMenu = this;
220
+ const el = $xeMenu.$refs.refElem;
221
+ const nemuEl = el ? el.querySelector(`.vxe-menu--item-wrapper[data-menu-id="${itemId}"]`) : null;
222
+ if (nemuEl) {
223
+ scrollToView(nemuEl);
224
+ return true;
225
+ }
226
+ return false;
227
+ },
228
+ scrollToMenuKey(menuKey) {
229
+ const $xeMenu = this;
230
+ const internalData = $xeMenu.internalData;
231
+ const { menuKeyMaps } = internalData;
232
+ const menuItem = menuKeyMaps[menuKey];
233
+ if (!menuItem) {
234
+ return $xeMenu.$nextTick();
235
+ }
236
+ const { itemId } = menuItem;
237
+ if ($xeMenu.handleScrollToView(itemId)) {
238
+ return $xeMenu.$nextTick();
239
+ }
240
+ return $xeMenu.$nextTick().then(() => {
241
+ $xeMenu.handleScrollToView(itemId);
242
+ });
243
+ },
244
+ scrollToActiveMenu() {
245
+ const $xeMenu = this;
246
+ const reactData = $xeMenu.reactData;
247
+ const { activeName } = reactData;
248
+ if (activeName) {
249
+ return $xeMenu.scrollToMenuKey(activeName);
250
+ }
251
+ return $xeMenu.$nextTick().then(() => {
252
+ const { activeName } = reactData;
253
+ if (activeName) {
254
+ return $xeMenu.scrollToMenuKey(activeName);
255
+ }
256
+ });
257
+ },
135
258
  getMenuTitle(item) {
136
259
  return `${item.title || item.name}`;
137
260
  },
@@ -145,13 +268,16 @@ export default {
145
268
  updateActiveMenu(isDefExpand) {
146
269
  const $xeMenu = this;
147
270
  const reactData = $xeMenu.reactData;
271
+ const internalData = $xeMenu.internalData;
148
272
  const { activeName } = reactData;
273
+ const { menuInitMaps } = internalData;
149
274
  XEUtils.eachTree(reactData.menuList, (item, index, items, path, parent, nodes) => {
150
275
  if (item.itemKey === activeName) {
151
276
  nodes.forEach(obj => {
152
277
  obj.isActive = true;
153
278
  if (isDefExpand) {
154
279
  obj.isExpand = true;
280
+ menuInitMaps[obj.itemId] = true;
155
281
  }
156
282
  });
157
283
  item.isExactActive = true;
@@ -166,11 +292,62 @@ export default {
166
292
  const $xeMenu = this;
167
293
  const props = $xeMenu;
168
294
  const reactData = $xeMenu.reactData;
169
- const { options, expandAll } = props;
170
- reactData.menuList = XEUtils.mapTree(options, (item, index, items, path, parent) => {
171
- const objItem = Object.assign(Object.assign({}, item), { parentKey: parent ? (parent.name || path.slice(0, path.length - 1).join(',')) : '', level: path.length, itemId: ++nemuUniqueKey, itemKey: item.name || path.join(','), isExactActive: false, isActive: false, isExpand: XEUtils.isBoolean(item.expanded) ? item.expanded : !!expandAll, hasChild: item.children && item.children.length > 0 });
295
+ const internalData = $xeMenu.internalData;
296
+ const { options, expandAll, expandKeys } = props;
297
+ const muInitMaps = {};
298
+ const titleField = $xeMenu.computeTitleField;
299
+ const keyField = $xeMenu.computeKeyField;
300
+ const childrenField = $xeMenu.computeChildrenField;
301
+ const linkUrlField = $xeMenu.computeLinkUrlField;
302
+ const routerLinkField = $xeMenu.computeRouterLinkField;
303
+ const defaultExpandMaps = {};
304
+ if (expandKeys) {
305
+ expandKeys.forEach(key => {
306
+ defaultExpandMaps[key] = true;
307
+ });
308
+ }
309
+ const muCacheMaps = {};
310
+ const muKeyMaps = {};
311
+ reactData.menuList = XEUtils.mapTree(options, (item, index, items, path, parentItem) => {
312
+ const itemId = ++nemuUniqueKey;
313
+ const itemKey = item[keyField] || path.join(',');
314
+ const childList = item[childrenField];
315
+ const hasChild = childList && childList.length > 0;
316
+ const isExpand = hasChild ? (XEUtils.isBoolean(item.expanded) ? item.expanded : (defaultExpandMaps[itemKey] || !!expandAll)) : false;
317
+ if (isExpand) {
318
+ muInitMaps[itemId] = true;
319
+ }
320
+ const objItem = {
321
+ itemConf: item,
322
+ title: item[titleField],
323
+ name: item[keyField],
324
+ icon: item.icon,
325
+ linkUrl: item[linkUrlField],
326
+ linkTarget: item.linkTarget,
327
+ routerLink: item[routerLinkField],
328
+ permissionCode: item.permissionCode,
329
+ children: childList,
330
+ slots: item.slots,
331
+ parentKey: parentItem ? (parentItem.name || path.slice(0, path.length - 1).join(',')) : '',
332
+ level: path.length,
333
+ itemId,
334
+ itemKey,
335
+ isExactActive: false,
336
+ isActive: false,
337
+ isExpand,
338
+ hasChild,
339
+ childList: []
340
+ };
341
+ if (muKeyMaps[itemKey]) {
342
+ errLog('vxe.error.repeatKey', [keyField, item[keyField]]);
343
+ }
344
+ muCacheMaps[itemId] = objItem;
345
+ muKeyMaps[itemKey] = objItem;
172
346
  return objItem;
173
347
  }, { children: 'children', mapChildren: 'childList' });
348
+ internalData.menuInitMaps = muInitMaps;
349
+ internalData.menuCacheMaps = muCacheMaps;
350
+ internalData.menuKeyMaps = muKeyMaps;
174
351
  },
175
352
  updateCollapseStyle() {
176
353
  const $xeMenu = this;
@@ -179,10 +356,7 @@ export default {
179
356
  const { collapseFixed } = props;
180
357
  if (collapseFixed) {
181
358
  $xeMenu.$nextTick(() => {
182
- const { isEnterCollapse } = reactData;
183
359
  const isCollapsed = $xeMenu.computeIsCollapsed;
184
- const collapseEnterWidth = $xeMenu.computeCollapseEnterWidth;
185
- const collapseWidth = $xeMenu.computeCollapseWidth;
186
360
  const el = $xeMenu.$refs.refElem;
187
361
  if (el) {
188
362
  const clientRect = el.getBoundingClientRect();
@@ -192,7 +366,6 @@ export default {
192
366
  top: toCssUnit(clientRect.top),
193
367
  left: toCssUnit(clientRect.left),
194
368
  height: toCssUnit(parentNode.clientHeight),
195
- width: isEnterCollapse ? (collapseEnterWidth ? toCssUnit(collapseEnterWidth) : '') : (collapseWidth ? toCssUnit(collapseWidth) : ''),
196
369
  zIndex: reactData.collapseZindex
197
370
  }
198
371
  : {};
@@ -229,7 +402,7 @@ export default {
229
402
  const props = $xeMenu;
230
403
  const internalData = $xeMenu.internalData;
231
404
  const { accordion } = props;
232
- const { menuEffectMaps } = internalData;
405
+ const { menuEffectMaps, menuInitMaps } = internalData;
233
406
  const { itemId, hasChild, isExpand } = item;
234
407
  const isCollapsed = $xeMenu.computeIsCollapsed;
235
408
  const expanded = !isExpand;
@@ -247,6 +420,7 @@ export default {
247
420
  });
248
421
  }
249
422
  item.isExpand = expanded;
423
+ menuInitMaps[itemId] = true;
250
424
  const wrapperEl = isCollapsed ? $xeMenu.$refs.refCollapseElem : $xeMenu.$refs.refElem;
251
425
  if (wrapperEl) {
252
426
  const nemuEl = wrapperEl.querySelector(`.vxe-menu--item-wrapper[data-menu-id="${itemId}"]`);
@@ -282,7 +456,7 @@ export default {
282
456
  const menuOpts = $xeMenu.computeMenuOpts;
283
457
  if (menuConfig ? isEnableConf(menuOpts) : menuOpts.enabled) {
284
458
  const { options, visibleMethod } = menuOpts;
285
- if (!visibleMethod || visibleMethod({ $menu: $xeMenu, options, currentMenu: item })) {
459
+ if (!visibleMethod || visibleMethod({ $menu: $xeMenu, options, currentMenu: item, currentOption: item.itemConf })) {
286
460
  if (VxeUI.contextMenu) {
287
461
  VxeUI.contextMenu.openByEvent(evnt, {
288
462
  options,
@@ -291,7 +465,7 @@ export default {
291
465
  const { option } = eventParams;
292
466
  const gMenuOpts = menus.get(option.code);
293
467
  const mmMethod = gMenuOpts ? gMenuOpts.menuMenuMethod : null;
294
- const params = { menu: option, currentMenu: item, $event: evnt, $menu: $xeMenu };
468
+ const params = { menu: option, currentMenu: item, currentOption: item.itemConf, $event: evnt, $menu: $xeMenu };
295
469
  if (mmMethod) {
296
470
  mmMethod(params, evnt);
297
471
  }
@@ -306,9 +480,13 @@ export default {
306
480
  },
307
481
  handleClickMenu(evnt, item, itemList) {
308
482
  const $xeMenu = this;
309
- const { itemKey, routerLink, hasChild } = item;
310
- if (routerLink) {
483
+ const reactData = $xeMenu.reactData;
484
+ const internalData = $xeMenu.internalData;
485
+ const { itemKey, linkUrl, routerLink, hasChild } = item;
486
+ if (linkUrl || routerLink) {
311
487
  $xeMenu.emitModel(itemKey);
488
+ reactData.isEnterCollapse = false;
489
+ internalData.lastActiveTime = Date.now();
312
490
  }
313
491
  else {
314
492
  if (hasChild) {
@@ -316,10 +494,14 @@ export default {
316
494
  }
317
495
  else {
318
496
  $xeMenu.emitModel(itemKey);
497
+ reactData.isEnterCollapse = false;
498
+ internalData.lastActiveTime = Date.now();
319
499
  }
320
500
  }
321
501
  const params = {
322
502
  currentMenu: item,
503
+ currentOption: item.itemConf,
504
+ option: item.itemConf,
323
505
  // 已废弃
324
506
  menu: item
325
507
  };
@@ -328,29 +510,15 @@ export default {
328
510
  handleMenuMouseenter() {
329
511
  const $xeMenu = this;
330
512
  const reactData = $xeMenu.reactData;
331
- const { collapseStyle } = reactData;
332
- const collapseEnterWidth = $xeMenu.computeCollapseEnterWidth;
333
- reactData.collapseStyle = Object.assign({}, collapseStyle, {
334
- width: collapseEnterWidth ? toCssUnit(collapseEnterWidth) : ''
335
- });
336
- reactData.isEnterCollapse = true;
337
- },
338
- handleMenuMouseover() {
339
- const $xeMenu = this;
340
- const reactData = $xeMenu.reactData;
341
- const { isEnterCollapse } = reactData;
342
- if (!isEnterCollapse) {
343
- $xeMenu.handleMenuMouseenter();
513
+ const internalData = $xeMenu.internalData;
514
+ const { lastActiveTime } = internalData;
515
+ if (lastActiveTime < Date.now() - 500) {
516
+ reactData.isEnterCollapse = true;
344
517
  }
345
518
  },
346
519
  handleMenuMouseleave() {
347
520
  const $xeMenu = this;
348
521
  const reactData = $xeMenu.reactData;
349
- const { collapseStyle } = reactData;
350
- const el = $xeMenu.$refs.refElem;
351
- reactData.collapseStyle = Object.assign({}, collapseStyle, {
352
- width: el ? toCssUnit(el.offsetWidth) : ''
353
- });
354
522
  reactData.isEnterCollapse = false;
355
523
  },
356
524
  //
@@ -369,9 +537,9 @@ export default {
369
537
  const isCollapsed = $xeMenu.computeIsCollapsed;
370
538
  const params = {
371
539
  currentMenu: item,
372
- collapsed: isCollapsed,
373
- // 已废弃
374
- option: item
540
+ currentOption: item.itemConf,
541
+ option: item.itemConf,
542
+ collapsed: isCollapsed
375
543
  };
376
544
  return [
377
545
  optionSlot
@@ -414,70 +582,87 @@ export default {
414
582
  renderDefaultChildren(h, item, itemList) {
415
583
  const $xeMenu = this;
416
584
  const reactData = $xeMenu.reactData;
417
- const { itemId, itemKey, level, hasChild, isActive, isExactActive, isExpand, routerLink, childList } = item;
585
+ const internalData = $xeMenu.internalData;
586
+ const { itemId, itemKey, level, hasChild, isActive, isExactActive, isExpand, linkUrl, routerLink, linkTarget, childList } = item;
418
587
  const { isEnterCollapse } = reactData;
588
+ const { menuInitMaps } = internalData;
419
589
  const isCollapsed = $xeMenu.computeIsCollapsed;
420
590
  if (item.permissionCode) {
421
591
  if (!permission.checkVisible(item.permissionCode)) {
422
592
  return renderEmptyElement($xeMenu);
423
593
  }
424
594
  }
595
+ const isExpandChild = (!isCollapsed || isEnterCollapse) && isExpand;
596
+ const linkOns = {
597
+ contextmenu(evnt) {
598
+ $xeMenu.handleContextmenuEvent(evnt, item);
599
+ },
600
+ click(evnt) {
601
+ $xeMenu.handleClickMenu(evnt, item, itemList);
602
+ }
603
+ };
425
604
  return h('div', {
426
605
  key: itemKey,
427
606
  class: ['vxe-menu--item-wrapper', `vxe-menu--item-level${level}`, {
607
+ 'has--child': hasChild,
428
608
  'is--exact-active': isExactActive,
429
609
  'is--active': isActive,
430
- 'is--expand': (!isCollapsed || isEnterCollapse) && isExpand
610
+ 'is--expand': isExpandChild
431
611
  }],
432
612
  attrs: {
433
613
  'data-menu-id': itemId
434
614
  }
435
615
  }, [
436
- routerLink
437
- ? h('router-link', {
438
- class: 'vxe-menu--item-link',
439
- props: {
440
- custom: true,
441
- to: routerLink
616
+ linkUrl
617
+ ? h('a', {
618
+ class: 'vxe-menu--item-link is--link',
619
+ attrs: {
620
+ href: linkUrl,
621
+ target: linkTarget
442
622
  },
443
- on: {
444
- contextmenu(evnt) {
445
- $xeMenu.handleContextmenuEvent(evnt, item);
446
- },
447
- click(evnt) {
448
- $xeMenu.handleClickMenu(evnt, item, itemList);
449
- }
450
- }
623
+ on: linkOns
451
624
  }, $xeMenu.renderMenuTitle(h, item, itemList))
452
- : h('div', {
453
- class: 'vxe-menu--item-link',
454
- on: {
455
- contextmenu(evnt) {
456
- $xeMenu.handleContextmenuEvent(evnt, item);
625
+ : (routerLink
626
+ ? h('router-link', {
627
+ class: 'vxe-menu--item-link is--router',
628
+ props: {
629
+ custom: true,
630
+ to: routerLink,
631
+ target: linkTarget
457
632
  },
458
- click(evnt) {
459
- $xeMenu.handleClickMenu(evnt, item, itemList);
460
- }
461
- }
462
- }, $xeMenu.renderMenuTitle(h, item, itemList)),
633
+ on: linkOns
634
+ }, $xeMenu.renderMenuTitle(h, item, itemList))
635
+ : h('div', {
636
+ class: 'vxe-menu--item-link is--default',
637
+ on: linkOns
638
+ }, $xeMenu.renderMenuTitle(h, item, itemList))),
463
639
  hasChild
464
640
  ? h('div', {
465
641
  class: 'vxe-menu--item-group'
466
- }, childList.map(child => $xeMenu.renderDefaultChildren(h, child, childList)))
642
+ }, isExpandChild || menuInitMaps[itemId] ? childList.map(child => $xeMenu.renderDefaultChildren(h, child, childList)) : [])
467
643
  : renderEmptyElement($xeMenu)
468
644
  ]);
469
645
  },
470
646
  renderCollapseChildren(h, item, itemList) {
471
647
  const $xeMenu = this;
472
- const { itemId, itemKey, level, hasChild, isActive, isExactActive, routerLink, childList } = item;
648
+ const { itemId, itemKey, level, hasChild, isActive, isExactActive, routerLink, linkUrl, linkTarget, childList } = item;
473
649
  if (item.permissionCode) {
474
650
  if (!permission.checkVisible(item.permissionCode)) {
475
651
  return renderEmptyElement($xeMenu);
476
652
  }
477
653
  }
654
+ const linkOns = {
655
+ contextmenu(evnt) {
656
+ $xeMenu.handleContextmenuEvent(evnt, item);
657
+ },
658
+ click(evnt) {
659
+ $xeMenu.handleClickMenu(evnt, item, itemList);
660
+ }
661
+ };
478
662
  return h('div', {
479
663
  key: itemKey,
480
664
  class: ['vxe-menu--item-wrapper', `vxe-menu--item-level${level}`, {
665
+ 'has--child': hasChild,
481
666
  'is--exact-active': isExactActive,
482
667
  'is--active': isActive
483
668
  }],
@@ -485,33 +670,29 @@ export default {
485
670
  'data-menu-id': itemId
486
671
  }
487
672
  }, [
488
- routerLink
489
- ? h('router-link', {
490
- class: 'vxe-menu--item-link',
491
- props: {
492
- custom: true,
493
- to: routerLink
673
+ linkUrl
674
+ ? h('a', {
675
+ class: 'vxe-menu--item-link is--link',
676
+ attrs: {
677
+ href: linkUrl,
678
+ target: linkTarget
494
679
  },
495
- on: {
496
- contextmenu(evnt) {
497
- $xeMenu.handleContextmenuEvent(evnt, item);
498
- },
499
- click(evnt) {
500
- $xeMenu.handleClickMenu(evnt, item, itemList);
501
- }
502
- }
680
+ on: linkOns
503
681
  }, $xeMenu.renderMenuTitle(h, item, itemList))
504
- : h('div', {
505
- class: 'vxe-menu--item-link',
506
- on: {
507
- contextmenu(evnt) {
508
- $xeMenu.handleContextmenuEvent(evnt, item);
682
+ : (routerLink
683
+ ? h('router-link', {
684
+ class: 'vxe-menu--item-link is--router',
685
+ props: {
686
+ custom: true,
687
+ to: routerLink,
688
+ target: linkTarget
509
689
  },
510
- click(evnt) {
511
- $xeMenu.handleClickMenu(evnt, item, itemList);
512
- }
513
- }
514
- }, $xeMenu.renderMenuTitle(h, item, itemList)),
690
+ on: linkOns
691
+ }, $xeMenu.renderMenuTitle(h, item, itemList))
692
+ : h('div', {
693
+ class: 'vxe-menu--item-link is--default',
694
+ on: linkOns
695
+ }, $xeMenu.renderMenuTitle(h, item, itemList))),
515
696
  hasChild
516
697
  ? h('div', {
517
698
  class: 'vxe-menu--item-group'
@@ -522,30 +703,46 @@ export default {
522
703
  renderVN(h) {
523
704
  const $xeMenu = this;
524
705
  const props = $xeMenu;
706
+ const slots = $xeMenu.$scopedSlots;
525
707
  const reactData = $xeMenu.reactData;
526
708
  const { loading, collapseFixed } = props;
527
709
  const { initialized, menuList, collapseStyle, isEnterCollapse } = reactData;
528
710
  const vSize = $xeMenu.computeSize;
529
711
  const isCollapsed = $xeMenu.computeIsCollapsed;
712
+ const currBorder = $xeMenu.computeCurrBorder;
713
+ const varStyle = $xeMenu.computeVarStyle;
714
+ const headerSlot = slots.header;
715
+ const footerSlot = slots.footer;
530
716
  let ons = {};
531
717
  if (collapseFixed) {
532
718
  ons = {
533
719
  mouseenter: $xeMenu.handleMenuMouseenter,
534
- mouseover: $xeMenu.handleMenuMouseover,
535
720
  mouseleave: $xeMenu.handleMenuMouseleave
536
721
  };
537
722
  }
723
+ const stParams = { collapsed: isCollapsed };
538
724
  return h('div', {
539
725
  ref: 'refElem',
540
726
  class: ['vxe-menu', {
727
+ [`border--${currBorder}`]: currBorder,
541
728
  [`size--${vSize}`]: vSize,
542
729
  'is--collapsed': isCollapsed,
543
730
  'is--loading': loading
544
731
  }]
545
732
  }, [
733
+ headerSlot
734
+ ? h('div', {
735
+ class: 'vxe-menu--header'
736
+ }, headerSlot(stParams))
737
+ : renderEmptyElement($xeMenu),
546
738
  h('div', {
547
- class: 'vxe-menu--item-list'
739
+ class: 'vxe-menu--body'
548
740
  }, menuList.map(child => isCollapsed ? $xeMenu.renderCollapseChildren(h, child, menuList) : $xeMenu.renderDefaultChildren(h, child, menuList))),
741
+ footerSlot
742
+ ? h('div', {
743
+ class: 'vxe-menu--footer'
744
+ }, footerSlot(stParams))
745
+ : renderEmptyElement($xeMenu),
549
746
  initialized
550
747
  ? h('div', {
551
748
  ref: 'refCollapseElem',
@@ -555,15 +752,25 @@ export default {
555
752
  'is--enter': isEnterCollapse,
556
753
  'is--loading': loading
557
754
  }],
558
- style: collapseStyle,
755
+ style: Object.assign({}, varStyle, collapseStyle),
559
756
  on: ons
560
- }, [
561
- isCollapsed
562
- ? h('div', {
563
- class: 'vxe-menu--item-list'
564
- }, menuList.map(child => $xeMenu.renderDefaultChildren(h, child, menuList)))
565
- : renderEmptyElement($xeMenu)
566
- ])
757
+ }, isCollapsed
758
+ ? [
759
+ headerSlot
760
+ ? h('div', {
761
+ class: 'vxe-menu--header'
762
+ }, headerSlot(stParams))
763
+ : renderEmptyElement($xeMenu),
764
+ h('div', {
765
+ class: 'vxe-menu--body'
766
+ }, menuList.map(child => $xeMenu.renderDefaultChildren(h, child, menuList))),
767
+ footerSlot
768
+ ? h('div', {
769
+ class: 'vxe-menu--footer'
770
+ }, footerSlot(stParams))
771
+ : renderEmptyElement($xeMenu)
772
+ ]
773
+ : [])
567
774
  : renderEmptyElement($xeMenu),
568
775
  /**
569
776
  * 加载中