@veltra/desktop 1.2.3 → 1.2.5

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 (140) hide show
  1. package/dist/components/action/action-group.vue.d.ts +3 -3
  2. package/dist/components/action/action.vue.d.ts +2 -2
  3. package/dist/components/auto-complete/auto-complete.js +25 -13
  4. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  5. package/dist/components/auto-complete/auto-complete.vue.d.ts +3 -2
  6. package/dist/components/batch-edit/batch-edit-form.js +33 -26
  7. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  8. package/dist/components/batch-edit/batch-edit-list.js +4 -1
  9. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  10. package/dist/components/batch-edit/batch-edit.js +29 -50
  11. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  12. package/dist/components/batch-edit/batch-edit.vue.d.ts +3 -3
  13. package/dist/components/batch-edit/di.js.map +1 -1
  14. package/dist/components/batch-edit/style2.css +3 -0
  15. package/dist/components/batch-edit/use-edit.js +39 -71
  16. package/dist/components/batch-edit/use-edit.js.map +1 -1
  17. package/dist/components/batch-edit/use-features.js +38 -0
  18. package/dist/components/batch-edit/use-features.js.map +1 -0
  19. package/dist/components/checkbox/checkbox-button.vue.d.ts +1 -1
  20. package/dist/components/contextmenu/style2.css +7 -7
  21. package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
  22. package/dist/components/date-picker/date-picker.vue.d.ts +1 -1
  23. package/dist/components/date-range-picker/date-range-picker.vue.d.ts +1 -1
  24. package/dist/components/dual-nav/dual-nav-app.js +49 -0
  25. package/dist/components/dual-nav/dual-nav-app.js.map +1 -0
  26. package/dist/components/dual-nav/dual-nav.js +125 -0
  27. package/dist/components/dual-nav/dual-nav.js.map +1 -0
  28. package/dist/components/dual-nav/dual-nav.vue.d.ts +13 -0
  29. package/dist/components/dual-nav/helper.js +21 -0
  30. package/dist/components/dual-nav/helper.js.map +1 -0
  31. package/dist/components/dual-nav/index.d.ts +1 -0
  32. package/dist/components/dual-nav/style.js +4 -0
  33. package/dist/components/dual-nav/style2.css +145 -0
  34. package/dist/components/empty/empty.vue.d.ts +1 -1
  35. package/dist/components/index.d.ts +23 -22
  36. package/dist/components/index.js +28 -26
  37. package/dist/components/index.js.map +1 -1
  38. package/dist/components/nav/di.js +7 -0
  39. package/dist/components/nav/di.js.map +1 -0
  40. package/dist/components/nav/helper.js +18 -0
  41. package/dist/components/nav/helper.js.map +1 -0
  42. package/dist/components/nav/index.d.ts +3 -0
  43. package/dist/components/{menu/menu-icon.js → nav/nav-icon.js} +4 -4
  44. package/dist/components/nav/nav-icon.js.map +1 -0
  45. package/dist/components/{menu/menu-item-collapsed.js → nav/nav-item-collapsed.js} +23 -23
  46. package/dist/components/nav/nav-item-collapsed.js.map +1 -0
  47. package/dist/components/{menu/menu-item.js → nav/nav-item.js} +13 -13
  48. package/dist/components/nav/nav-item.js.map +1 -0
  49. package/dist/components/{menu/menu-item.vue.d.ts → nav/nav-item.vue.d.ts} +4 -4
  50. package/dist/components/{menu/menu-sub-collapsed.js → nav/nav-sub-collapsed.js} +19 -19
  51. package/dist/components/nav/nav-sub-collapsed.js.map +1 -0
  52. package/dist/components/{menu/menu-sub.js → nav/nav-sub.js} +24 -24
  53. package/dist/components/nav/nav-sub.js.map +1 -0
  54. package/dist/components/{menu/menu-sub.vue.d.ts → nav/nav-sub.vue.d.ts} +4 -4
  55. package/dist/components/{menu/menu.js → nav/nav.js} +45 -36
  56. package/dist/components/nav/nav.js.map +1 -0
  57. package/dist/components/nav/nav.vue.d.ts +18 -0
  58. package/dist/components/nav/style.d.ts +1 -0
  59. package/dist/components/{menu → nav}/style2.css +105 -105
  60. package/dist/components/{menu/use-menu-item.js → nav/use-nav-item.js} +11 -11
  61. package/dist/components/nav/use-nav-item.js.map +1 -0
  62. package/dist/components/{menu/walk-menu-path.js → nav/walk-nav-path.js} +5 -5
  63. package/dist/components/nav/walk-nav-path.js.map +1 -0
  64. package/dist/components/number/number.vue.d.ts +1 -1
  65. package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
  66. package/dist/components/select/style2.css +4 -4
  67. package/dist/components/table/use-columns.js +14 -12
  68. package/dist/components/table/use-columns.js.map +1 -1
  69. package/dist/components/tip/tip.vue.d.ts +1 -1
  70. package/dist/components/watermark/watermark.vue.d.ts +1 -1
  71. package/dist/index.d.ts +63 -61
  72. package/dist/index.js +56 -55
  73. package/dist/style.js +2 -1
  74. package/dist/types/auto-complete.d.ts +6 -1
  75. package/dist/types/batch-edit.d.ts +15 -2
  76. package/dist/types/dual-nav.d.ts +27 -0
  77. package/dist/types/index.d.ts +4 -3
  78. package/dist/types/nav.d.ts +48 -0
  79. package/package.json +6 -6
  80. package/src/components/auto-complete/auto-complete.vue +24 -13
  81. package/src/components/batch-edit/batch-edit-form.vue +29 -18
  82. package/src/components/batch-edit/batch-edit-list.vue +6 -1
  83. package/src/components/batch-edit/batch-edit.vue +36 -73
  84. package/src/components/batch-edit/di.ts +3 -1
  85. package/src/components/batch-edit/style.scss +5 -0
  86. package/src/components/batch-edit/use-edit.ts +63 -116
  87. package/src/components/batch-edit/use-features.ts +58 -0
  88. package/src/components/contextmenu/style.scss +5 -5
  89. package/src/components/dual-nav/dual-nav-app.vue +33 -0
  90. package/src/components/dual-nav/dual-nav.vue +150 -0
  91. package/src/components/dual-nav/helper.ts +25 -0
  92. package/src/components/dual-nav/index.ts +1 -0
  93. package/src/components/dual-nav/style.scss +153 -0
  94. package/src/components/dual-nav/style.ts +4 -0
  95. package/src/components/index.ts +3 -1
  96. package/src/components/nav/di.ts +17 -0
  97. package/src/components/nav/helper.ts +22 -0
  98. package/src/components/nav/index.ts +3 -0
  99. package/src/components/{menu/menu-icon.vue → nav/nav-icon.vue} +1 -1
  100. package/src/components/nav/nav-item-collapsed.vue +66 -0
  101. package/src/components/nav/nav-item.vue +36 -0
  102. package/src/components/{menu/menu-sub-collapsed.vue → nav/nav-sub-collapsed.vue} +15 -15
  103. package/src/components/{menu/menu-sub.vue → nav/nav-sub.vue} +19 -19
  104. package/src/components/{menu/menu.vue → nav/nav.vue} +42 -42
  105. package/src/components/{menu → nav}/style.scss +16 -14
  106. package/src/components/{menu/use-menu-item.ts → nav/use-nav-item.ts} +14 -14
  107. package/src/components/{menu/walk-menu-path.ts → nav/walk-nav-path.ts} +2 -2
  108. package/src/components/select/style.scss +4 -4
  109. package/src/components/table/use-columns.ts +23 -20
  110. package/src/style.ts +2 -1
  111. package/src/types/auto-complete.ts +6 -1
  112. package/src/types/batch-edit.ts +18 -1
  113. package/src/types/dual-nav.ts +28 -0
  114. package/src/types/index.ts +2 -1
  115. package/src/types/nav.ts +49 -0
  116. package/dist/components/menu/di.js +0 -7
  117. package/dist/components/menu/di.js.map +0 -1
  118. package/dist/components/menu/helper.js +0 -8
  119. package/dist/components/menu/helper.js.map +0 -1
  120. package/dist/components/menu/index.d.ts +0 -3
  121. package/dist/components/menu/menu-icon.js.map +0 -1
  122. package/dist/components/menu/menu-item-collapsed.js.map +0 -1
  123. package/dist/components/menu/menu-item.js.map +0 -1
  124. package/dist/components/menu/menu-sub-collapsed.js.map +0 -1
  125. package/dist/components/menu/menu-sub.js.map +0 -1
  126. package/dist/components/menu/menu.js.map +0 -1
  127. package/dist/components/menu/menu.vue.d.ts +0 -14
  128. package/dist/components/menu/use-menu-item.js.map +0 -1
  129. package/dist/components/menu/walk-menu-path.js.map +0 -1
  130. package/dist/types/menu.d.ts +0 -40
  131. package/src/components/menu/di.ts +0 -17
  132. package/src/components/menu/helper.ts +0 -3
  133. package/src/components/menu/index.ts +0 -3
  134. package/src/components/menu/menu-item-collapsed.vue +0 -66
  135. package/src/components/menu/menu-item.vue +0 -36
  136. package/src/components/menu/menu-node.ts +0 -6
  137. package/src/types/menu.ts +0 -41
  138. /package/dist/components/{menu → dual-nav}/style.d.ts +0 -0
  139. /package/dist/components/{menu → nav}/style.js +0 -0
  140. /package/src/components/{menu → nav}/style.ts +0 -0
@@ -0,0 +1,153 @@
1
+ @use 'pkg:@veltra/styles/mixins' as m;
2
+ @use 'pkg:@veltra/styles/functions' as fn;
3
+ @use 'pkg:@veltra/styles/vars';
4
+
5
+ @include m.b(dual-nav) {
6
+ display: flex;
7
+ height: 100%;
8
+ min-height: 0;
9
+ background-color: var(--u-nav-bg-color);
10
+ border: 1px solid fn.use-var(border, color);
11
+ border-radius: calc(fn.use-var(radius, large) + 6px);
12
+ overflow: hidden;
13
+
14
+ @include m.e(rail) {
15
+ flex-shrink: 0;
16
+ width: var(--u-nav-rail-width);
17
+ display: flex;
18
+ flex-direction: column;
19
+ align-items: center;
20
+ gap: 4px;
21
+ padding: 8px 6px;
22
+ background-color: fn.use-var(bg-color, middle);
23
+ }
24
+
25
+ @include m.e(divider) {
26
+ flex-shrink: 0;
27
+ width: 1px;
28
+ background-color: fn.use-var(border, color);
29
+ }
30
+
31
+ @include m.e(panel) {
32
+ flex: 1;
33
+ min-width: 0;
34
+ min-height: 0;
35
+ display: flex;
36
+ flex-direction: column;
37
+ }
38
+
39
+ @include m.e(panel-header) {
40
+ flex-shrink: 0;
41
+ display: flex;
42
+ align-items: flex-start;
43
+ justify-content: space-between;
44
+ gap: 8px;
45
+ padding: 12px 12px 10px;
46
+ border-bottom: 1px solid fn.use-var(border, color);
47
+ }
48
+
49
+ @include m.e(panel-header-main) {
50
+ flex: 1;
51
+ min-width: 0;
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 4px;
55
+ }
56
+
57
+ @include m.e(panel-title) {
58
+ margin: 0;
59
+ font-size: fn.use-var(font-size, default);
60
+ font-weight: 600;
61
+ line-height: 1.4;
62
+ color: fn.use-var(text-color, title);
63
+ }
64
+
65
+ @include m.e(description) {
66
+ margin: 0;
67
+ font-size: fn.use-var(font-size-assist, default);
68
+ line-height: 1.5;
69
+ color: fn.use-var(text-color, second);
70
+ }
71
+
72
+ @include m.e(toggle-expand) {
73
+ flex-shrink: 0;
74
+ display: inline-flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ width: 28px;
78
+ height: 28px;
79
+ padding: 0;
80
+ border: none;
81
+ border-radius: fn.use-var(radius, default);
82
+ background: transparent;
83
+ color: fn.use-var(text-color, second);
84
+ cursor: pointer;
85
+ transition:
86
+ background-color 0.15s ease,
87
+ color 0.15s ease;
88
+
89
+ &:hover {
90
+ background-color: var(--u-nav-hover-bg);
91
+ color: var(--u-nav-hover-color);
92
+ }
93
+ }
94
+
95
+ @include m.e(panel-body) {
96
+ flex: 1;
97
+ min-height: 0;
98
+
99
+ .u-nav {
100
+ height: 100%;
101
+ border: none;
102
+ border-radius: 0;
103
+ box-shadow: none;
104
+ background-color: transparent;
105
+ }
106
+ }
107
+
108
+ @include m.e(app) {
109
+ width: 100%;
110
+ aspect-ratio: 1;
111
+ max-width: calc(var(--u-nav-rail-width) - 12px);
112
+ display: inline-flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ padding: 0;
116
+ border: none;
117
+ border-radius: calc(fn.use-var(radius, default) + 2px);
118
+ background: transparent;
119
+ color: fn.use-var(text-color, second);
120
+ cursor: pointer;
121
+ transition:
122
+ background-color 0.15s ease,
123
+ color 0.15s ease;
124
+
125
+ &:hover:not(:disabled) {
126
+ background-color: var(--u-nav-hover-bg);
127
+ color: var(--u-nav-hover-color);
128
+ }
129
+
130
+ @include m.is(active) {
131
+ background-color: var(--u-nav-active-bg);
132
+ color: var(--u-nav-active-color);
133
+ }
134
+
135
+ @include m.is(disabled) {
136
+ opacity: 0.55;
137
+ cursor: not-allowed;
138
+ }
139
+ }
140
+
141
+ @include m.e(app-icon) {
142
+ width: 20px;
143
+ height: 20px;
144
+ font-size: 20px;
145
+ object-fit: contain;
146
+ }
147
+
148
+ @include m.e(app-fallback) {
149
+ font-size: 14px;
150
+ font-weight: 600;
151
+ line-height: 1;
152
+ }
153
+ }
@@ -0,0 +1,4 @@
1
+ import '../icon/style'
2
+ import '../nav/style'
3
+ import '../tip/style'
4
+ import './style.scss'
@@ -108,7 +108,9 @@ export * from './list'
108
108
 
109
109
  export * from './rich-text-editor'
110
110
 
111
- export * from './menu'
111
+ export * from './nav'
112
+
113
+ export * from './dual-nav'
112
114
 
113
115
  export * from './grid-input'
114
116
 
@@ -0,0 +1,17 @@
1
+ import { type BEM, ExpandTransition } from '@veltra/utils'
2
+ import type { ComputedRef, InjectionKey } from 'vue'
3
+
4
+ import type { NavProps, NavEmits } from '../../types'
5
+ import type { ComponentSize } from '../../types'
6
+
7
+ export interface NavContext {
8
+ cls: BEM<'nav', 'u-'>
9
+ collapsedCls: BEM<'collapsed-nav', 'u-'>
10
+ navProps: NavProps
11
+ navEmit: NavEmits
12
+ expandedPath: Set<string>
13
+ size: ComputedRef<ComponentSize>
14
+ expandTransition: ExpandTransition
15
+ }
16
+
17
+ export const NavDIKey: InjectionKey<NavContext> = Symbol('NavDIKey')
@@ -0,0 +1,22 @@
1
+ import type { NavItem } from '../../types'
2
+ import { walkNavWithPath } from './walk-nav-path'
3
+
4
+ export function getKey(index: number, parentKey: string): string {
5
+ return `${parentKey}-${index}`
6
+ }
7
+
8
+ /** 收集导航树中所有含子级的节点 path */
9
+ export function collectNavBranchPaths(menus?: NavItem[]): string[] {
10
+ const paths: string[] = []
11
+ if (!menus?.length) return paths
12
+
13
+ for (const menu of menus) {
14
+ walkNavWithPath(menu, (node) => {
15
+ if (node.children?.length) {
16
+ paths.push(node.path)
17
+ }
18
+ })
19
+ }
20
+
21
+ return paths
22
+ }
@@ -0,0 +1,3 @@
1
+ export { default as UNav } from './nav.vue'
2
+ export { default as UNavSub } from './nav-sub.vue'
3
+ export { default as UNavItem } from './nav-item.vue'
@@ -11,7 +11,7 @@ import type { DefineComponent } from 'vue'
11
11
 
12
12
  import { UIcon } from '../icon'
13
13
 
14
- defineOptions({ name: 'MenuIcon' })
14
+ defineOptions({ name: 'NavIcon' })
15
15
 
16
16
  defineProps<{ icon: string | DefineComponent }>()
17
17
  </script>
@@ -0,0 +1,66 @@
1
+ <template>
2
+ <!-- 一级导航 -->
3
+ <u-tip v-if="depth === 0" direction="right" hide-arrow>
4
+ <li
5
+ :class="[
6
+ collapsedCls.e('item'),
7
+ bem.is('active', active),
8
+ bem.is('first-level'),
9
+ bem.is('disabled', item.disabled ?? false)
10
+ ]"
11
+ ref="item"
12
+ @click="handleClickItem"
13
+ >
14
+ <UNavIcon v-if="item.icon" :icon="item.icon" :class="collapsedCls.e('icon')" />
15
+ <span v-else>{{ item.title[0] }}</span>
16
+ </li>
17
+
18
+ <template #content>
19
+ {{ item.title }}
20
+ </template>
21
+ </u-tip>
22
+
23
+ <!-- 二级以及二级以下导航 -->
24
+ <li
25
+ v-else
26
+ :class="[
27
+ collapsedCls.e('item'),
28
+ bem.is('active', active),
29
+ bem.is('disabled', item.disabled ?? false)
30
+ ]"
31
+ ref="item"
32
+ @click="_handleClickItem"
33
+ >
34
+ <UNavIcon v-if="item.icon" :icon="item.icon" :class="collapsedCls.e('icon')" />
35
+
36
+ <!-- 文本 -->
37
+ <span :class="collapsedCls.e('item-title')">
38
+ {{ item.title }}
39
+ </span>
40
+ </li>
41
+ </template>
42
+
43
+ <script setup lang="ts">
44
+ import { bem } from '@veltra/utils'
45
+ import { useTemplateRef } from 'vue'
46
+
47
+ import type { NavItem } from '../../types'
48
+ import { UTip } from '../tip'
49
+ import UNavIcon from './nav-icon.vue'
50
+ import { useNavItem } from './use-nav-item'
51
+
52
+ defineOptions({ name: 'NavItemCollapsed' })
53
+
54
+ const props = defineProps<{ item: NavItem; depth: number }>()
55
+
56
+ const itemRef = useTemplateRef('item')
57
+
58
+ const emit = defineEmits(['click'])
59
+
60
+ const { collapsedCls, active, handleClickItem } = useNavItem({ itemProps: props, itemRef })
61
+
62
+ function _handleClickItem() {
63
+ handleClickItem()
64
+ emit('click')
65
+ }
66
+ </script>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <li
3
+ :class="[
4
+ cls.e('item'),
5
+ bem.is('first-level', depth === 0),
6
+ bem.is('active', active),
7
+ bem.is('disabled', item.disabled ?? false)
8
+ ]"
9
+ ref="item"
10
+ @click="handleClickItem"
11
+ >
12
+ <NavIcon v-if="item.icon" :icon="item.icon" :class="cls.e('icon')" />
13
+
14
+ <!-- 文本 -->
15
+ <span :class="cls.e('item-title')">
16
+ {{ item.title }}
17
+ </span>
18
+ </li>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import { bem } from '@veltra/utils'
23
+ import { useTemplateRef } from 'vue'
24
+
25
+ import type { NavItem } from '../../types'
26
+ import NavIcon from './nav-icon.vue'
27
+ import { useNavItem } from './use-nav-item'
28
+
29
+ defineOptions({ name: 'NavItem' })
30
+
31
+ const props = defineProps<{ item: NavItem; depth: number }>()
32
+
33
+ const itemRef = useTemplateRef('item')
34
+
35
+ const { cls, active, handleClickItem } = useNavItem({ itemProps: props, itemRef })
36
+ </script>
@@ -8,13 +8,13 @@
8
8
  v-model:visible="visible"
9
9
  >
10
10
  <li :class="[collapsedCls.e('sub-content'), bem.is('first-level', depth === 0)]">
11
- <MenuIcon v-if="menu.icon" :icon="menu.icon" :class="collapsedCls.e('icon')" />
11
+ <NavIcon v-if="item.icon" :icon="item.icon" :class="collapsedCls.e('icon')" />
12
12
 
13
- <span v-else>{{ menu.title[0] }}</span>
13
+ <span v-else>{{ item.title[0] }}</span>
14
14
 
15
15
  <template v-if="depth !== 0">
16
16
  <span :class="collapsedCls.e('sub-title')">
17
- {{ menu.title }}
17
+ {{ item.title }}
18
18
  </span>
19
19
 
20
20
  <!-- 展开图标 -->
@@ -26,17 +26,17 @@
26
26
 
27
27
  <template #content>
28
28
  <u-scroll tag="ul" :class="collapsedCls.e('sub-list')">
29
- <template v-for="(child, index) of menu.children!" :key="getKey(index, parentKey)">
30
- <UMenuItemCollapsed
29
+ <template v-for="(child, index) of item.children!" :key="getKey(index, parentKey)">
30
+ <UNavItemCollapsed
31
31
  v-if="!child.children?.length"
32
- :menu="child"
32
+ :item="child"
33
33
  :depth="depth + 1"
34
34
  @click="closeSubMenu"
35
35
  />
36
36
 
37
- <MenuSubCollapsed
37
+ <NavSubCollapsed
38
38
  v-else
39
- :menu="child"
39
+ :item="child"
40
40
  :parent-key="getKey(index, parentKey)"
41
41
  :depth="depth + 1"
42
42
  />
@@ -51,18 +51,18 @@ import { ArrowRight } from '@veltra/icons/normal'
51
51
  import { bem } from '@veltra/utils'
52
52
  import { inject, ref } from 'vue'
53
53
 
54
- import type { MenuItem } from '../../types'
54
+ import type { NavItem } from '../../types'
55
55
  import { UIcon } from '../icon'
56
56
  import { UScroll } from '../scroll'
57
57
  import { UTip } from '../tip'
58
- import { MenuDIKey } from './di'
58
+ import { NavDIKey } from './di'
59
59
  import { getKey } from './helper'
60
- import MenuIcon from './menu-icon.vue'
61
- import UMenuItemCollapsed from './menu-item-collapsed.vue'
60
+ import NavIcon from './nav-icon.vue'
61
+ import UNavItemCollapsed from './nav-item-collapsed.vue'
62
62
 
63
- defineOptions({ name: 'MenuSubCollapsed' })
63
+ defineOptions({ name: 'NavSubCollapsed' })
64
64
 
65
- defineProps<{ menu: MenuItem; parentKey: string; depth: number }>()
65
+ defineProps<{ item: NavItem; parentKey: string; depth: number }>()
66
66
 
67
67
  const visible = ref(false)
68
68
 
@@ -70,5 +70,5 @@ function closeSubMenu() {
70
70
  visible.value = false
71
71
  }
72
72
 
73
- const { collapsedCls, size } = inject(MenuDIKey)!
73
+ const { collapsedCls, size } = inject(NavDIKey)!
74
74
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <li :class="[cls.e('sub'), bem.is('expanded', expanded)]">
2
+ <li :class="cls.e('sub')">
3
3
  <div
4
4
  :class="[
5
5
  cls.e('sub-content'),
@@ -9,11 +9,11 @@
9
9
  ]"
10
10
  @click="handleToggleExpand"
11
11
  >
12
- <UMenuIcon v-if="menu.icon" :icon="menu.icon" :class="cls.e('icon')" />
12
+ <UNavIcon v-if="item.icon" :icon="item.icon" :class="cls.e('icon')" />
13
13
 
14
14
  <!-- 文本 -->
15
15
  <span :class="cls.e('sub-title')">
16
- {{ menu.title }}
16
+ {{ item.title }}
17
17
  </span>
18
18
 
19
19
  <!-- 展开图标 -->
@@ -31,9 +31,9 @@
31
31
  @after-leave="(el: Element) => expandTransition.afterLeave(el as HTMLElement)"
32
32
  >
33
33
  <ul :class="cls.e('sub-list')" v-show="expanded">
34
- <template v-for="(child, index) of menu.children!" :key="getKey(index, parentKey)">
35
- <UMenuItem v-if="!child.children?.length" :menu="child" :depth="depth + 1" />
36
- <MenuSub v-else :menu="child" :parent-key="getKey(index, parentKey)" :depth="depth + 1" />
34
+ <template v-for="(child, index) of item.children!" :key="getKey(index, parentKey)">
35
+ <UNavItem v-if="!child.children?.length" :item="child" :depth="depth + 1" />
36
+ <NavSub v-else :item="child" :parent-key="getKey(index, parentKey)" :depth="depth + 1" />
37
37
  </template>
38
38
  </ul>
39
39
  </transition>
@@ -45,34 +45,34 @@ import { ArrowRight } from '@veltra/icons/normal'
45
45
  import { bem } from '@veltra/utils'
46
46
  import { computed, inject } from 'vue'
47
47
 
48
- import type { MenuItem } from '../../types'
48
+ import type { NavItem } from '../../types'
49
49
  import { UIcon } from '../icon'
50
- import { MenuDIKey } from './di'
50
+ import { NavDIKey } from './di'
51
51
  import { getKey } from './helper'
52
- import UMenuIcon from './menu-icon.vue'
53
- import UMenuItem from './menu-item.vue'
52
+ import UNavIcon from './nav-icon.vue'
53
+ import UNavItem from './nav-item.vue'
54
54
 
55
- defineOptions({ name: 'MenuSub' })
55
+ defineOptions({ name: 'NavSub' })
56
56
 
57
- const props = defineProps<{ menu: MenuItem; parentKey: string; depth: number }>()
57
+ const props = defineProps<{ item: NavItem; parentKey: string; depth: number }>()
58
58
 
59
- const { cls, expandedPath, menuProps, expandTransition } = inject(MenuDIKey)!
59
+ const { cls, expandedPath, navProps, expandTransition } = inject(NavDIKey)!
60
60
 
61
- const expanded = computed(() => expandedPath.has(props.menu.path))
61
+ const expanded = computed(() => expandedPath.has(props.item.path))
62
62
 
63
63
  const branchActive = computed(() => {
64
- const currentPath = menuProps.currentPath
64
+ const currentPath = navProps.currentPath
65
65
  if (!currentPath) return false
66
66
 
67
- const check = (items?: MenuItem[]) => {
67
+ const check = (items?: NavItem[]) => {
68
68
  return items?.some((item) => item.path === currentPath || check(item.children)) ?? false
69
69
  }
70
70
 
71
- return check(props.menu.children)
71
+ return check(props.item.children)
72
72
  })
73
73
 
74
74
  function handleToggleExpand() {
75
- const { menu } = props
76
- expandedPath.has(menu.path) ? expandedPath.delete(menu.path) : expandedPath.add(menu.path)
75
+ const { item } = props
76
+ expandedPath.has(item.path) ? expandedPath.delete(item.path) : expandedPath.add(item.path)
77
77
  }
78
78
  </script>
@@ -1,32 +1,23 @@
1
1
  <template>
2
- <u-scroll
3
- tag="ul"
4
- :class="[menuCls.b, menuCls.m(size)]"
5
- :container-class="menuCls.e('container')"
6
- >
2
+ <u-scroll tag="ul" :class="[navCls.b, navCls.m(size)]" :container-class="navCls.e('container')">
7
3
  <!-- 常规 -->
8
4
  <template v-if="!collapsed">
9
- <template v-for="(menu, index) of menus" :key="index">
10
- <UMenuSub
11
- v-if="menu.children?.length"
12
- :menu="menu"
13
- :parent-key="String(index)"
14
- :depth="0"
15
- />
16
- <UMenuItem v-else :menu="menu" :key="index" :depth="0" />
5
+ <template v-for="(item, index) of menus" :key="index">
6
+ <UNavSub v-if="item.children?.length" :item="item" :parent-key="String(index)" :depth="0" />
7
+ <UNavItem v-else :item="item" :key="index" :depth="0" />
17
8
  </template>
18
9
  </template>
19
10
 
20
11
  <!-- 折叠 -->
21
12
  <template v-else>
22
- <template v-for="(menu, index) of menus" :key="index">
23
- <UMenuSubCollapsed
24
- v-if="menu.children?.length"
25
- :menu="menu"
13
+ <template v-for="(item, index) of menus" :key="index">
14
+ <UNavSubCollapsed
15
+ v-if="item.children?.length"
16
+ :item="item"
26
17
  :parent-key="String(index)"
27
18
  :depth="0"
28
19
  />
29
- <UMenuItemCollapsed v-else :menu="menu" :key="index" :depth="0" />
20
+ <UNavItemCollapsed v-else :item="item" :key="index" :depth="0" />
30
21
  </template>
31
22
  </template>
32
23
  </u-scroll>
@@ -35,32 +26,29 @@
35
26
  <script lang="ts" setup>
36
27
  import { useFallbackProps } from '@veltra/compositions'
37
28
  import { bem, ExpandTransition } from '@veltra/utils'
29
+ import type { ComponentSize } from '@veltra/utils'
38
30
  import { computed, provide, shallowReactive, watch } from 'vue'
39
31
 
40
- import type { MenuEmits, MenuProps, ComponentSize } from '../../types'
32
+ import type { NavEmits, NavProps } from '../../types/nav'
41
33
  import { UScroll } from '../scroll'
42
- import { MenuDIKey } from './di'
43
- import UMenuItemCollapsed from './menu-item-collapsed.vue'
44
- import UMenuItem from './menu-item.vue'
45
- import UMenuSubCollapsed from './menu-sub-collapsed.vue'
46
- import UMenuSub from './menu-sub.vue'
47
- import { walkMenuWithPath } from './walk-menu-path'
48
-
49
- defineOptions({ name: 'Menu' })
50
-
51
- const props = withDefaults(defineProps<MenuProps>(), {
52
- expand: false,
53
- activeIndex: '',
54
- collapsed: false,
55
- uniqueOpened: false
56
- })
34
+ import { NavDIKey } from './di'
35
+ import { collectNavBranchPaths } from './helper'
36
+ import UNavItemCollapsed from './nav-item-collapsed.vue'
37
+ import UNavItem from './nav-item.vue'
38
+ import UNavSubCollapsed from './nav-sub-collapsed.vue'
39
+ import UNavSub from './nav-sub.vue'
40
+ import { walkNavWithPath } from './walk-nav-path'
41
+
42
+ defineOptions({ name: 'Nav' })
57
43
 
58
- const emit = defineEmits<MenuEmits>()
44
+ const props = withDefaults(defineProps<NavProps>(), { collapsed: false })
59
45
 
60
- const cls = bem('menu')
61
- const collapsedCls = bem('collapsed-menu')
46
+ const emit = defineEmits<NavEmits>()
62
47
 
63
- const menuCls = computed(() => {
48
+ const cls = bem('nav')
49
+ const collapsedCls = bem('collapsed-nav')
50
+
51
+ const navCls = computed(() => {
64
52
  return props.collapsed ? collapsedCls : cls
65
53
  })
66
54
 
@@ -81,7 +69,7 @@ watch(
81
69
  ([currentPath, menus]) => {
82
70
  if (!currentPath || !menus) return
83
71
  menus.forEach((menu) => {
84
- walkMenuWithPath(menu, (node, nodePath) => {
72
+ walkNavWithPath(menu, (node, nodePath) => {
85
73
  if (node.path === currentPath) {
86
74
  nodePath.slice(0, -1).forEach((path) => {
87
75
  expandedPath.add(path.path)
@@ -94,13 +82,25 @@ watch(
94
82
  { immediate: true }
95
83
  )
96
84
 
97
- provide(MenuDIKey, {
85
+ provide(NavDIKey, {
98
86
  cls,
99
87
  collapsedCls,
100
- menuProps: props,
101
- menuEmit: emit,
88
+ navProps: props,
89
+ navEmit: emit,
102
90
  expandedPath,
103
91
  size,
104
92
  expandTransition
105
93
  })
94
+
95
+ function expandAll() {
96
+ collectNavBranchPaths(props.menus).forEach((path) => {
97
+ expandedPath.add(path)
98
+ })
99
+ }
100
+
101
+ function collapseAll() {
102
+ expandedPath.clear()
103
+ }
104
+
105
+ defineExpose({ expandAll, collapseAll })
106
106
  </script>