vxe-pc-ui 4.16.6 → 4.16.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/all.esm.js +236 -132
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/cascader/src/cascader.js +66 -26
  5. package/es/cascader/style.css +9 -9
  6. package/es/cascader/style.min.css +1 -1
  7. package/es/date-range-picker/src/date-range-picker.js +25 -9
  8. package/es/icon/style.css +1 -1
  9. package/es/menu/src/menu.js +65 -17
  10. package/es/menu/style.css +15 -8
  11. package/es/menu/style.min.css +1 -1
  12. package/es/style.css +1 -1
  13. package/es/style.min.css +1 -1
  14. package/es/ui/index.js +3 -3
  15. package/es/ui/src/log.js +1 -1
  16. package/es/vxe-cascader/style.css +9 -9
  17. package/es/vxe-cascader/style.min.css +1 -1
  18. package/es/vxe-menu/style.css +15 -8
  19. package/es/vxe-menu/style.min.css +1 -1
  20. package/lib/cascader/src/cascader.js +73 -27
  21. package/lib/cascader/src/cascader.min.js +1 -1
  22. package/lib/cascader/style/style.css +9 -9
  23. package/lib/cascader/style/style.min.css +1 -1
  24. package/lib/date-range-picker/src/date-range-picker.js +27 -9
  25. package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
  26. package/lib/icon/style/style.css +1 -1
  27. package/lib/icon/style/style.min.css +1 -1
  28. package/lib/index.umd.js +171 -53
  29. package/lib/index.umd.min.js +1 -1
  30. package/lib/menu/src/menu.js +66 -13
  31. package/lib/menu/src/menu.min.js +1 -1
  32. package/lib/menu/style/style.css +15 -8
  33. package/lib/menu/style/style.min.css +1 -1
  34. package/lib/style.css +1 -1
  35. package/lib/style.min.css +1 -1
  36. package/lib/ui/index.js +3 -3
  37. package/lib/ui/index.min.js +1 -1
  38. package/lib/ui/src/log.js +1 -1
  39. package/lib/ui/src/log.min.js +1 -1
  40. package/lib/vxe-cascader/style/style.css +9 -9
  41. package/lib/vxe-cascader/style/style.min.css +1 -1
  42. package/lib/vxe-menu/style/style.css +15 -8
  43. package/lib/vxe-menu/style/style.min.css +1 -1
  44. package/package.json +1 -1
  45. package/packages/cascader/src/cascader.ts +66 -25
  46. package/packages/date-range-picker/src/date-range-picker.ts +23 -9
  47. package/packages/menu/src/menu.ts +71 -17
  48. package/packages/ui/index.ts +2 -2
  49. package/styles/components/cascader.scss +9 -9
  50. package/styles/components/menu.scss +9 -5
  51. package/types/components/cascader.d.ts +1 -0
  52. package/types/components/menu.d.ts +6 -0
  53. /package/es/icon/{iconfont.1783838735018.ttf → iconfont.1783923662673.ttf} +0 -0
  54. /package/es/icon/{iconfont.1783838735018.woff → iconfont.1783923662673.woff} +0 -0
  55. /package/es/icon/{iconfont.1783838735018.woff2 → iconfont.1783923662673.woff2} +0 -0
  56. /package/es/{iconfont.1783838735018.ttf → iconfont.1783923662673.ttf} +0 -0
  57. /package/es/{iconfont.1783838735018.woff → iconfont.1783923662673.woff} +0 -0
  58. /package/es/{iconfont.1783838735018.woff2 → iconfont.1783923662673.woff2} +0 -0
  59. /package/lib/icon/style/{iconfont.1783838735018.ttf → iconfont.1783923662673.ttf} +0 -0
  60. /package/lib/icon/style/{iconfont.1783838735018.woff → iconfont.1783923662673.woff} +0 -0
  61. /package/lib/icon/style/{iconfont.1783838735018.woff2 → iconfont.1783923662673.woff2} +0 -0
  62. /package/lib/{iconfont.1783838735018.ttf → iconfont.1783923662673.ttf} +0 -0
  63. /package/lib/{iconfont.1783838735018.woff → iconfont.1783923662673.woff} +0 -0
  64. /package/lib/{iconfont.1783838735018.woff2 → iconfont.1783923662673.woff2} +0 -0
@@ -8,12 +8,32 @@ import { getSlotVNs } from '../../ui/src/vn'
8
8
  import { createComponentLog } from '../../ui/src/log'
9
9
  import VxeLoadingComponent from '../../loading'
10
10
 
11
- import type { VxeMenuDefines, VxeMenuPropTypes, MenuReactData, VxeMenuEmits, MenuMethods, VxeComponentSlotType, VxeLayoutAsidePropTypes, MenuPrivateMethods, MenuPrivateRef, VxeMenuPrivateComputed, VxeMenuConstructor, VxeMenuPrivateMethods, ValueOf, VxeLayoutAsideConstructor, VxeLayoutAsidePrivateMethods } from '../../../types'
11
+ import type { VxeMenuDefines, VxeMenuPropTypes, MenuInternalData, MenuReactData, VxeMenuEmits, MenuMethods, VxeComponentSlotType, VxeLayoutAsidePropTypes, MenuPrivateMethods, MenuPrivateRef, VxeMenuPrivateComputed, VxeMenuConstructor, VxeMenuPrivateMethods, ValueOf, VxeLayoutAsideConstructor, VxeLayoutAsidePrivateMethods } from '../../../types'
12
12
 
13
13
  const { errLog } = createComponentLog('menu')
14
14
 
15
15
  const { menus, getConfig, getIcon } = VxeUI
16
16
 
17
+ function createInternalData (): MenuInternalData {
18
+ return {
19
+ menuEffectMaps: {}
20
+ }
21
+ }
22
+
23
+ function createReactData (): MenuReactData {
24
+ return {
25
+ initialized: false,
26
+ isEnterCollapse: false,
27
+ collapseStyle: {},
28
+ collapseZindex: 0,
29
+ activeName: '',
30
+ menuList: [],
31
+ itemHeight: 1
32
+ }
33
+ }
34
+
35
+ let nemuUniqueKey = 100000000
36
+
17
37
  export default defineVxeComponent({
18
38
  name: 'VxeMenu',
19
39
  props: {
@@ -57,15 +77,8 @@ export default defineVxeComponent({
57
77
 
58
78
  const { computeSize } = useSize(props)
59
79
 
60
- const reactData = reactive<MenuReactData>({
61
- initialized: !!props.collapsed,
62
- isEnterCollapse: false,
63
- collapseStyle: {},
64
- collapseZindex: 0,
65
- activeName: props.modelValue,
66
- menuList: [],
67
- itemHeight: 1
68
- })
80
+ const reactData = reactive(createReactData())
81
+ const internalData = createInternalData()
69
82
 
70
83
  const refMaps: MenuPrivateRef = {
71
84
  refElem
@@ -151,6 +164,7 @@ export default defineVxeComponent({
151
164
  ...item,
152
165
  parentKey: parent ? (parent.name || path.slice(0, path.length - 1).join(',')) : '',
153
166
  level: path.length,
167
+ itemId: ++nemuUniqueKey,
154
168
  itemKey: item.name || path.join(','),
155
169
  isExactActive: false,
156
170
  isActive: false,
@@ -211,10 +225,18 @@ export default defineVxeComponent({
211
225
 
212
226
  const handleClickIconCollapse = (evnt: MouseEvent, item: VxeMenuDefines.MenuItem, itemList: VxeMenuDefines.MenuItem[]) => {
213
227
  const { accordion } = props
214
- const { hasChild, isExpand } = item
228
+ const { menuEffectMaps } = internalData
229
+ const { itemId, hasChild, isExpand } = item
230
+ const isCollapsed = computeIsCollapsed.value
231
+ const expanded = !isExpand
215
232
  if (hasChild) {
216
233
  evnt.stopPropagation()
217
234
  evnt.preventDefault()
235
+
236
+ if (menuEffectMaps[itemId]) {
237
+ clearTimeout(menuEffectMaps[itemId])
238
+ }
239
+
218
240
  if (accordion) {
219
241
  itemList.forEach(obj => {
220
242
  if (obj !== item) {
@@ -222,7 +244,33 @@ export default defineVxeComponent({
222
244
  }
223
245
  })
224
246
  }
225
- item.isExpand = !isExpand
247
+ item.isExpand = expanded
248
+
249
+ const wrapperEl = isCollapsed ? refCollapseElem.value : refElem.value
250
+ if (wrapperEl) {
251
+ const nemuEl = wrapperEl.querySelector<HTMLDivElement>(`.vxe-menu--item-wrapper[data-menu-id="${itemId}"]`)
252
+ const groupEl = nemuEl ? nemuEl.querySelector<HTMLDivElement>('.vxe-menu--item-group') : null
253
+ if (groupEl) {
254
+ if (expanded) {
255
+ groupEl.style.height = '0'
256
+ groupEl.setAttribute('data-effect', 'y')
257
+ requestAnimationFrame(() => {
258
+ groupEl.style.height = `${groupEl.scrollHeight}px`
259
+ })
260
+ } else {
261
+ groupEl.style.height = `${groupEl.scrollHeight}px`
262
+ groupEl.setAttribute('data-effect', 'y')
263
+ requestAnimationFrame(() => {
264
+ groupEl.style.height = '0'
265
+ })
266
+ }
267
+ menuEffectMaps[itemId] = setTimeout(() => {
268
+ delete menuEffectMaps[itemId]
269
+ groupEl.removeAttribute('data-effect')
270
+ groupEl.style.height = ''
271
+ }, 350)
272
+ }
273
+ }
226
274
  }
227
275
  }
228
276
 
@@ -382,7 +430,7 @@ export default defineVxeComponent({
382
430
  }
383
431
 
384
432
  const renderDefaultChildren = (item: VxeMenuDefines.MenuItem, itemList: VxeMenuDefines.MenuItem[]): VNode => {
385
- const { itemKey, level, hasChild, isActive, isExactActive, isExpand, routerLink, childList } = item
433
+ const { itemId, itemKey, level, hasChild, isActive, isExactActive, isExpand, routerLink, childList } = item
386
434
  const { isEnterCollapse } = reactData
387
435
  const isCollapsed = computeIsCollapsed.value
388
436
  if (item.permissionCode) {
@@ -396,7 +444,8 @@ export default defineVxeComponent({
396
444
  'is--exact-active': isExactActive,
397
445
  'is--active': isActive,
398
446
  'is--expand': (!isCollapsed || isEnterCollapse) && isExpand
399
- }]
447
+ }],
448
+ 'data-menu-id': itemId
400
449
  }, [
401
450
  routerLink
402
451
  ? h(resolveComponent('router-link'), {
@@ -429,7 +478,7 @@ export default defineVxeComponent({
429
478
  }
430
479
 
431
480
  const renderCollapseChildren = (item: VxeMenuDefines.MenuItem, itemList: VxeMenuDefines.MenuItem[]): VNode => {
432
- const { itemKey, level, hasChild, isActive, isExactActive, routerLink, childList } = item
481
+ const { itemId, itemKey, level, hasChild, isActive, isExactActive, routerLink, childList } = item
433
482
  if (item.permissionCode) {
434
483
  if (!permission.checkVisible(item.permissionCode)) {
435
484
  return renderEmptyElement($xeMenu)
@@ -440,7 +489,8 @@ export default defineVxeComponent({
440
489
  class: ['vxe-menu--item-wrapper', `vxe-menu--item-level${level}`, {
441
490
  'is--exact-active': isExactActive,
442
491
  'is--active': isActive
443
- }]
492
+ }],
493
+ 'data-menu-id': itemId
444
494
  }, [
445
495
  routerLink
446
496
  ? h(resolveComponent('router-link'), {
@@ -560,7 +610,6 @@ export default defineVxeComponent({
560
610
  })
561
611
 
562
612
  onBeforeUnmount(() => {
563
- globalEvents.off($xeMenu, 'resize')
564
613
  const collapseEl = refCollapseElem.value
565
614
  if (collapseEl) {
566
615
  const parentNode = collapseEl.parentNode
@@ -568,8 +617,13 @@ export default defineVxeComponent({
568
617
  parentNode.removeChild(collapseEl)
569
618
  }
570
619
  }
620
+ globalEvents.off($xeMenu, 'resize')
621
+ XEUtils.assign(reactData, createReactData())
622
+ XEUtils.assign(internalData, createInternalData())
571
623
  })
572
624
 
625
+ reactData.initialized = !!props.collapsed
626
+ reactData.activeName = props.modelValue
573
627
  updateMenuConfig()
574
628
  updateActiveMenu(true)
575
629
 
@@ -513,8 +513,8 @@ setIcon({
513
513
  BUTTON_TOOLTIP_ICON: iconPrefix + 'question-circle-fill',
514
514
 
515
515
  // menu
516
- MENU_ITEM_EXPAND_OPEN: iconPrefix + 'arrow-down rotate180',
517
- MENU_ITEM_EXPAND_CLOSE: iconPrefix + 'arrow-down',
516
+ MENU_ITEM_EXPAND_OPEN: iconPrefix + 'arrow-right rotate90',
517
+ MENU_ITEM_EXPAND_CLOSE: iconPrefix + 'arrow-right',
518
518
 
519
519
  // select
520
520
  SELECT_LOADED: iconPrefix + 'spinner roll',
@@ -5,18 +5,18 @@
5
5
  .vxe-cascader,
6
6
  .vxe-cascader--panel {
7
7
  --vxe-ui-cascader-current-font-size: var(--vxe-ui-font-size-default);
8
- --vxe-ui-cascader-current-font-size: var(--vxe-ui-layout-padding-default);
8
+ --vxe-ui-cascader-current-padding: var(--vxe-ui-layout-padding-default);
9
9
  &.size--medium {
10
10
  --vxe-ui-cascader-current-font-size: var(--vxe-ui-font-size-medium);
11
- --vxe-ui-cascader-current-font-size: var(--vxe-ui-layout-padding-medium);
11
+ --vxe-ui-cascader-current-padding: var(--vxe-ui-layout-padding-medium);
12
12
  }
13
13
  &.size--small {
14
14
  --vxe-ui-cascader-current-font-size: var(--vxe-ui-font-size-small);
15
- --vxe-ui-cascader-current-font-size: var(--vxe-ui-layout-padding-small);
15
+ --vxe-ui-cascader-current-padding: var(--vxe-ui-layout-padding-small);
16
16
  }
17
17
  &.size--mini {
18
18
  --vxe-ui-cascader-current-font-size: var(--vxe-ui-font-size-mini);
19
- --vxe-ui-cascader-current-font-size: var(--vxe-ui-layout-padding-mini);
19
+ --vxe-ui-cascader-current-padding: var(--vxe-ui-layout-padding-mini);
20
20
  }
21
21
  }
22
22
 
@@ -83,8 +83,8 @@
83
83
 
84
84
  .vxe-cascader--panel-search {
85
85
  display: block;
86
- padding: var(--vxe-ui-cascader-current-font-size);
87
- width: calc(var(--vxe-ui-cascader-node-width) * var(--vxe-ui-cascader-chunk-size));
86
+ padding: var(--vxe-ui-cascader-current-padding);
87
+ width: 100%;
88
88
  .vxe-cascader-search--input {
89
89
  width: 100%;
90
90
  }
@@ -99,7 +99,7 @@
99
99
  min-height: 2em;
100
100
  }
101
101
  .vxe-cascader--total-btns {
102
- padding-left: var(--vxe-ui-cascader-current-font-size);
102
+ padding-left: var(--vxe-ui-cascader-current-padding);
103
103
  flex-grow: 1;
104
104
  }
105
105
  .vxe-cascader--total-btns,
@@ -166,7 +166,7 @@
166
166
  .vxe-cascader-chunk--item-wrapper {
167
167
  flex-shrink: 0;
168
168
  border-left: 1px solid var(--vxe-ui-base-popup-border-color);
169
- padding: var(--vxe-ui-cascader-current-font-size) 0;
169
+ padding: var(--vxe-ui-cascader-current-padding) 0;
170
170
  &:first-child {
171
171
  border-left: 0;
172
172
  }
@@ -190,7 +190,7 @@
190
190
  flex-direction: row;
191
191
  height: var(--vxe-ui-cascader-node-height);
192
192
  line-height: var(--vxe-ui-cascader-node-height);
193
- padding: 0 calc(var(--vxe-ui-cascader-current-font-size) + 18px) 0 var(--vxe-ui-cascader-current-font-size);
193
+ padding: 0 calc(var(--vxe-ui-cascader-current-padding) + 18px) 0 var(--vxe-ui-cascader-current-padding);
194
194
  cursor: pointer;
195
195
  &:hover {
196
196
  background-color: var(--vxe-ui-cascader-node-hover-background-color);
@@ -1,7 +1,8 @@
1
1
  @use '../helpers/baseMixin.scss';
2
2
 
3
3
  // 局部变量
4
- .vxe-menu {
4
+ .vxe-menu,
5
+ .vxe-menu--collapse-wrapper {
5
6
  --vxe-ui-menu-current-font-size: var(--vxe-ui-font-size-default);
6
7
  --vxe-ui-menu-current-item-height: var(--vxe-ui-menu-item-height-default);
7
8
  &.size--medium {
@@ -31,7 +32,8 @@
31
32
  min-height: 4em;
32
33
  }
33
34
  }
34
- .vxe-menu {
35
+ .vxe-menu,
36
+ .vxe-menu--collapse-wrapper {
35
37
  font-size: var(--vxe-ui-menu-current-font-size);
36
38
  color: var(--vxe-ui-font-color);
37
39
  font-family: var(--vxe-ui-font-family);
@@ -114,9 +116,11 @@
114
116
  }
115
117
 
116
118
  .vxe-menu--item-group {
117
- max-height: 0;
119
+ height: 0;
118
120
  overflow: hidden;
119
- transition: max-height 0.3s ease-in-out;
121
+ &[data-effect] {
122
+ transition: height 0.3s ease-in-out;
123
+ }
120
124
  }
121
125
  .vxe-menu--item-wrapper {
122
126
  &.is--active {
@@ -132,7 +136,7 @@
132
136
  }
133
137
  &.is--expand {
134
138
  & > .vxe-menu--item-group {
135
- max-height: 1000px;
139
+ height: auto;
136
140
  }
137
141
  }
138
142
  }
@@ -257,6 +257,7 @@ export interface CascaderInternalData {
257
257
  selectCheckboxMaps: Record<string, any>
258
258
  treeExpandedMaps: Record<string, boolean>
259
259
  treeExpandLazyLoadedMaps: Record<string, boolean>
260
+ isUpdateMode?: boolean
260
261
  }
261
262
 
262
263
  export interface CascaderMethods {
@@ -13,6 +13,7 @@ export type VxeMenuInstance = DefineVxeComponentInstance<VxeMenuProps, VxeMenuCo
13
13
  export interface VxeMenuConstructor extends VxeComponentBaseOptions, VxeMenuMethods {
14
14
  props: VxeMenuProps
15
15
  context: SetupContext<VxeMenuEmits>
16
+ internalData: MenuInternalData
16
17
  reactData: MenuReactData
17
18
  getRefMaps(): MenuPrivateRef
18
19
  getComputeMaps(): MenuPrivateComputed
@@ -85,6 +86,10 @@ export interface MenuPrivateComputed {
85
86
  }
86
87
  export interface VxeMenuPrivateComputed extends MenuPrivateComputed { }
87
88
 
89
+ export interface MenuInternalData {
90
+ menuEffectMaps: Record<number, number>
91
+ }
92
+
88
93
  export interface MenuReactData {
89
94
  initialized: boolean
90
95
  collapseStyle: VxeComponentStyleType
@@ -116,6 +121,7 @@ export namespace VxeMenuDefines {
116
121
  }
117
122
 
118
123
  export interface MenuItem extends VxeMenuPropTypes.MenuOption {
124
+ itemId: number
119
125
  itemKey: string | number
120
126
  level: number,
121
127
  parentKey: string | number