@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
@@ -15,14 +15,14 @@
15
15
  * --u-height-small: 24px;
16
16
  */
17
17
  /** 暗色:data-theme 与系统偏好,与 UITheme.injectBuiltInThemes 选择器策略一致 */
18
- .u-menu {
18
+ .u-nav {
19
19
  user-select: none;
20
- color: var(--u-menu-color);
20
+ color: var(--u-nav-color);
21
21
  }
22
- .u-menu__item, .u-menu__sub, .u-menu__sub-list {
22
+ .u-nav__item, .u-nav__sub, .u-nav__sub-list {
23
23
  list-style: none;
24
24
  }
25
- .u-menu__item, .u-menu__sub-content {
25
+ .u-nav__item, .u-nav__sub-content {
26
26
  width: 100%;
27
27
  cursor: pointer;
28
28
  gap: 8px;
@@ -35,22 +35,22 @@
35
35
  align-items: center;
36
36
  flex-wrap: nowrap;
37
37
  }
38
- .u-menu__item:hover, .u-menu__sub-content:hover {
39
- background-color: var(--u-menu-hover-bg);
40
- color: var(--u-menu-hover-color);
38
+ .u-nav__item:hover, .u-nav__sub-content:hover {
39
+ background-color: var(--u-nav-hover-bg);
40
+ color: var(--u-nav-hover-color);
41
41
  }
42
- .u-menu__item.is-expanded, .u-menu__sub-content.is-expanded {
42
+ .u-nav__item.is-expanded, .u-nav__sub-content.is-expanded {
43
43
  color: var(--u-text-color-title);
44
44
  }
45
- .u-menu__item.is-branch-active, .u-menu__sub-content.is-branch-active {
45
+ .u-nav__item.is-branch-active, .u-nav__sub-content.is-branch-active {
46
46
  color: var(--u-text-color-title);
47
47
  }
48
- .u-menu__item.is-active, .u-menu__sub-content.is-active {
48
+ .u-nav__item.is-active, .u-nav__sub-content.is-active {
49
49
  position: relative;
50
- background-color: var(--u-menu-active-bg);
51
- color: var(--u-menu-active-color);
50
+ background-color: var(--u-nav-active-bg);
51
+ color: var(--u-nav-active-color);
52
52
  }
53
- .u-menu__item.is-active::before, .u-menu__sub-content.is-active::before {
53
+ .u-nav__item.is-active::before, .u-nav__sub-content.is-active::before {
54
54
  content: "";
55
55
  position: absolute;
56
56
  left: 0;
@@ -63,11 +63,11 @@
63
63
  transform: translateY(-50%);
64
64
  pointer-events: none;
65
65
  }
66
- .u-menu__item.is-disabled, .u-menu__sub-content.is-disabled {
66
+ .u-nav__item.is-disabled {
67
67
  opacity: 0.55;
68
68
  cursor: not-allowed;
69
69
  }
70
- .u-menu__item-title, .u-menu__sub-title {
70
+ .u-nav__item-title, .u-nav__sub-title {
71
71
  flex: 1;
72
72
  min-width: 0;
73
73
  font-weight: 500;
@@ -76,72 +76,72 @@
76
76
  text-overflow: ellipsis;
77
77
  white-space: nowrap;
78
78
  }
79
- .u-menu .u-menu__item + .u-menu__item,
80
- .u-menu .u-menu__item + .u-menu__sub,
81
- .u-menu .u-menu__sub + .u-menu__item,
82
- .u-menu .u-menu__sub + .u-menu__sub {
79
+ .u-nav .u-nav__item + .u-nav__item,
80
+ .u-nav .u-nav__item + .u-nav__sub,
81
+ .u-nav .u-nav__sub + .u-nav__item,
82
+ .u-nav .u-nav__sub + .u-nav__sub {
83
83
  margin-top: 3px;
84
84
  }
85
- .u-menu--small {
85
+ .u-nav--small {
86
86
  font-size: var(--u-font-size-main-small);
87
87
  }
88
- .u-menu--small .u-menu__item,
89
- .u-menu--small .u-menu__sub-content {
90
- min-height: var(--u-menu-height-small);
88
+ .u-nav--small .u-nav__item,
89
+ .u-nav--small .u-nav__sub-content {
90
+ min-height: var(--u-nav-height-small);
91
91
  border-radius: calc(var(--u-radius-small) + 4px);
92
92
  }
93
- .u-menu--small .u-menu__icon {
93
+ .u-nav--small .u-nav__icon {
94
94
  width: 16px;
95
95
  height: 16px;
96
96
  font-size: 16px;
97
97
  }
98
- .u-menu--small .u-menu__sub-expand,
99
- .u-menu--small .u-menu__icon {
98
+ .u-nav--small .u-nav__sub-expand,
99
+ .u-nav--small .u-nav__icon {
100
100
  flex-shrink: 0;
101
101
  }
102
- .u-menu--default {
102
+ .u-nav--default {
103
103
  font-size: var(--u-font-size-main-default);
104
104
  }
105
- .u-menu--default .u-menu__item,
106
- .u-menu--default .u-menu__sub-content {
107
- min-height: var(--u-menu-height-default);
105
+ .u-nav--default .u-nav__item,
106
+ .u-nav--default .u-nav__sub-content {
107
+ min-height: var(--u-nav-height-default);
108
108
  border-radius: calc(var(--u-radius-default) + 4px);
109
109
  }
110
- .u-menu--default .u-menu__icon {
110
+ .u-nav--default .u-nav__icon {
111
111
  width: 16px;
112
112
  height: 16px;
113
113
  font-size: 16px;
114
114
  }
115
- .u-menu--default .u-menu__sub-expand,
116
- .u-menu--default .u-menu__icon {
115
+ .u-nav--default .u-nav__sub-expand,
116
+ .u-nav--default .u-nav__icon {
117
117
  flex-shrink: 0;
118
118
  }
119
- .u-menu--large {
119
+ .u-nav--large {
120
120
  font-size: var(--u-font-size-main-large);
121
121
  }
122
- .u-menu--large .u-menu__item,
123
- .u-menu--large .u-menu__sub-content {
124
- min-height: var(--u-menu-height-large);
122
+ .u-nav--large .u-nav__item,
123
+ .u-nav--large .u-nav__sub-content {
124
+ min-height: var(--u-nav-height-large);
125
125
  border-radius: calc(var(--u-radius-large) + 4px);
126
126
  }
127
- .u-menu--large .u-menu__icon {
127
+ .u-nav--large .u-nav__icon {
128
128
  width: 16px;
129
129
  height: 16px;
130
130
  font-size: 16px;
131
131
  }
132
- .u-menu--large .u-menu__sub-expand,
133
- .u-menu--large .u-menu__icon {
132
+ .u-nav--large .u-nav__sub-expand,
133
+ .u-nav--large .u-nav__icon {
134
134
  flex-shrink: 0;
135
135
  }
136
136
 
137
- .u-collapsed-menu {
137
+ .u-collapsed-nav {
138
138
  user-select: none;
139
- color: var(--u-menu-color);
139
+ color: var(--u-nav-color);
140
140
  }
141
- .u-collapsed-menu__item, .u-collapsed-menu__sub, .u-collapsed-menu__sub-list {
141
+ .u-collapsed-nav__item, .u-collapsed-nav__sub, .u-collapsed-nav__sub-list {
142
142
  list-style: none;
143
143
  }
144
- .u-collapsed-menu__item, .u-collapsed-menu__sub-content {
144
+ .u-collapsed-nav__item, .u-collapsed-nav__sub-content {
145
145
  width: 100%;
146
146
  cursor: pointer;
147
147
  gap: 8px;
@@ -154,22 +154,22 @@
154
154
  align-items: center;
155
155
  flex-wrap: nowrap;
156
156
  }
157
- .u-collapsed-menu__item:hover, .u-collapsed-menu__sub-content:hover {
158
- background-color: var(--u-menu-hover-bg);
159
- color: var(--u-menu-hover-color);
157
+ .u-collapsed-nav__item:hover, .u-collapsed-nav__sub-content:hover {
158
+ background-color: var(--u-nav-hover-bg);
159
+ color: var(--u-nav-hover-color);
160
160
  }
161
- .u-collapsed-menu__item.is-expanded, .u-collapsed-menu__sub-content.is-expanded {
161
+ .u-collapsed-nav__item.is-expanded, .u-collapsed-nav__sub-content.is-expanded {
162
162
  color: var(--u-text-color-title);
163
163
  }
164
- .u-collapsed-menu__item.is-branch-active, .u-collapsed-menu__sub-content.is-branch-active {
164
+ .u-collapsed-nav__item.is-branch-active, .u-collapsed-nav__sub-content.is-branch-active {
165
165
  color: var(--u-text-color-title);
166
166
  }
167
- .u-collapsed-menu__item.is-active, .u-collapsed-menu__sub-content.is-active {
167
+ .u-collapsed-nav__item.is-active, .u-collapsed-nav__sub-content.is-active {
168
168
  position: relative;
169
- background-color: var(--u-menu-active-bg);
170
- color: var(--u-menu-active-color);
169
+ background-color: var(--u-nav-active-bg);
170
+ color: var(--u-nav-active-color);
171
171
  }
172
- .u-collapsed-menu__item.is-active::before, .u-collapsed-menu__sub-content.is-active::before {
172
+ .u-collapsed-nav__item.is-active::before, .u-collapsed-nav__sub-content.is-active::before {
173
173
  content: "";
174
174
  position: absolute;
175
175
  left: 0;
@@ -182,11 +182,11 @@
182
182
  transform: translateY(-50%);
183
183
  pointer-events: none;
184
184
  }
185
- .u-collapsed-menu__item.is-disabled, .u-collapsed-menu__sub-content.is-disabled {
185
+ .u-collapsed-nav__item.is-disabled {
186
186
  opacity: 0.55;
187
187
  cursor: not-allowed;
188
188
  }
189
- .u-collapsed-menu__item-title, .u-collapsed-menu__sub-title {
189
+ .u-collapsed-nav__item-title, .u-collapsed-nav__sub-title {
190
190
  flex: 1;
191
191
  min-width: 0;
192
192
  font-weight: 500;
@@ -195,162 +195,162 @@
195
195
  text-overflow: ellipsis;
196
196
  white-space: nowrap;
197
197
  }
198
- .u-collapsed-menu .u-collapsed-menu__item + .u-collapsed-menu__item,
199
- .u-collapsed-menu .u-collapsed-menu__item + .u-collapsed-menu__sub,
200
- .u-collapsed-menu .u-collapsed-menu__sub + .u-collapsed-menu__item,
201
- .u-collapsed-menu .u-collapsed-menu__sub + .u-collapsed-menu__sub {
198
+ .u-collapsed-nav .u-collapsed-nav__item + .u-collapsed-nav__item,
199
+ .u-collapsed-nav .u-collapsed-nav__item + .u-collapsed-nav__sub,
200
+ .u-collapsed-nav .u-collapsed-nav__sub + .u-collapsed-nav__item,
201
+ .u-collapsed-nav .u-collapsed-nav__sub + .u-collapsed-nav__sub {
202
202
  margin-top: 3px;
203
203
  }
204
- .u-collapsed-menu--small {
204
+ .u-collapsed-nav--small {
205
205
  font-size: var(--u-font-size-main-small);
206
206
  }
207
- .u-collapsed-menu--small .u-collapsed-menu__item,
208
- .u-collapsed-menu--small .u-collapsed-menu__sub-content {
209
- min-height: var(--u-menu-height-small);
207
+ .u-collapsed-nav--small .u-collapsed-nav__item,
208
+ .u-collapsed-nav--small .u-collapsed-nav__sub-content {
209
+ min-height: var(--u-nav-height-small);
210
210
  border-radius: calc(var(--u-radius-small) + 4px);
211
211
  }
212
- .u-collapsed-menu--small .u-collapsed-menu__icon {
212
+ .u-collapsed-nav--small .u-collapsed-nav__icon {
213
213
  width: 16px;
214
214
  height: 16px;
215
215
  font-size: 16px;
216
216
  }
217
- .u-collapsed-menu--small .u-collapsed-menu__sub-expand,
218
- .u-collapsed-menu--small .u-collapsed-menu__icon {
217
+ .u-collapsed-nav--small .u-collapsed-nav__sub-expand,
218
+ .u-collapsed-nav--small .u-collapsed-nav__icon {
219
219
  flex-shrink: 0;
220
220
  }
221
- .u-collapsed-menu--default {
221
+ .u-collapsed-nav--default {
222
222
  font-size: var(--u-font-size-main-default);
223
223
  }
224
- .u-collapsed-menu--default .u-collapsed-menu__item,
225
- .u-collapsed-menu--default .u-collapsed-menu__sub-content {
226
- min-height: var(--u-menu-height-default);
224
+ .u-collapsed-nav--default .u-collapsed-nav__item,
225
+ .u-collapsed-nav--default .u-collapsed-nav__sub-content {
226
+ min-height: var(--u-nav-height-default);
227
227
  border-radius: calc(var(--u-radius-default) + 4px);
228
228
  }
229
- .u-collapsed-menu--default .u-collapsed-menu__icon {
229
+ .u-collapsed-nav--default .u-collapsed-nav__icon {
230
230
  width: 16px;
231
231
  height: 16px;
232
232
  font-size: 16px;
233
233
  }
234
- .u-collapsed-menu--default .u-collapsed-menu__sub-expand,
235
- .u-collapsed-menu--default .u-collapsed-menu__icon {
234
+ .u-collapsed-nav--default .u-collapsed-nav__sub-expand,
235
+ .u-collapsed-nav--default .u-collapsed-nav__icon {
236
236
  flex-shrink: 0;
237
237
  }
238
- .u-collapsed-menu--large {
238
+ .u-collapsed-nav--large {
239
239
  font-size: var(--u-font-size-main-large);
240
240
  }
241
- .u-collapsed-menu--large .u-collapsed-menu__item,
242
- .u-collapsed-menu--large .u-collapsed-menu__sub-content {
243
- min-height: var(--u-menu-height-large);
241
+ .u-collapsed-nav--large .u-collapsed-nav__item,
242
+ .u-collapsed-nav--large .u-collapsed-nav__sub-content {
243
+ min-height: var(--u-nav-height-large);
244
244
  border-radius: calc(var(--u-radius-large) + 4px);
245
245
  }
246
- .u-collapsed-menu--large .u-collapsed-menu__icon {
246
+ .u-collapsed-nav--large .u-collapsed-nav__icon {
247
247
  width: 16px;
248
248
  height: 16px;
249
249
  font-size: 16px;
250
250
  }
251
- .u-collapsed-menu--large .u-collapsed-menu__sub-expand,
252
- .u-collapsed-menu--large .u-collapsed-menu__icon {
251
+ .u-collapsed-nav--large .u-collapsed-nav__sub-expand,
252
+ .u-collapsed-nav--large .u-collapsed-nav__icon {
253
253
  flex-shrink: 0;
254
254
  }
255
255
 
256
- .u-menu {
256
+ .u-nav {
257
257
  margin: 0;
258
258
  padding: 0;
259
- background-color: var(--u-menu-bg-color);
259
+ background-color: var(--u-nav-bg-color);
260
260
  backdrop-filter: var(--u-bg-filter);
261
261
  -webkit-backdrop-filter: var(--u-bg-filter);
262
- background-image: var(--u-menu-bg-image);
262
+ background-image: var(--u-nav-bg-image);
263
263
  background-size: cover;
264
264
  background-repeat: no-repeat;
265
265
  border: 1px solid var(--u-border-color);
266
266
  border-radius: calc(var(--u-radius-large) + 6px);
267
267
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05), 0 12px 28px rgba(15, 23, 42, 0.08);
268
268
  }
269
- .u-menu__container {
269
+ .u-nav__container {
270
270
  padding: 8px;
271
271
  }
272
- .u-menu__sub-expand, .u-menu__icon {
272
+ .u-nav__sub-expand, .u-nav__icon {
273
273
  color: var(--u-text-color-second);
274
274
  display: inline-flex;
275
275
  justify-content: center;
276
276
  align-items: center;
277
277
  flex-shrink: 0;
278
278
  }
279
- .u-menu__icon {
279
+ .u-nav__icon {
280
280
  border-radius: calc(var(--u-radius-small) + 2px);
281
281
  color: inherit;
282
282
  object-fit: contain;
283
283
  }
284
- .u-menu__item {
284
+ .u-nav__item {
285
285
  margin: 0;
286
286
  }
287
- .u-menu__sub {
287
+ .u-nav__sub {
288
288
  margin: 0;
289
289
  }
290
- .u-menu__sub-list {
290
+ .u-nav__sub-list {
291
291
  overflow: hidden;
292
292
  margin: 2px 0 0 12px;
293
293
  padding: 2px 0 2px 8px;
294
294
  border-left: 1px solid color-mix(in srgb, var(--u-border-color) 52%, transparent);
295
295
  }
296
296
  @supports selector(:has(*)) {
297
- .u-menu__sub-list:has(.u-menu__item.is-active) {
297
+ .u-nav__sub-list:has(.u-nav__item.is-active) {
298
298
  border-left-color: var(--u-color-primary);
299
299
  }
300
300
  }
301
- .u-menu__sub-expand {
301
+ .u-nav__sub-expand {
302
302
  transition: transform 0.2s cubic-bezier(0.4, 0, 1, 1), color 0.18s ease;
303
303
  }
304
- .u-menu__sub-expand.is-expanded {
304
+ .u-nav__sub-expand.is-expanded {
305
305
  transform: rotate(90deg);
306
306
  color: var(--u-text-color-title);
307
307
  transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), color 0.18s ease;
308
308
  }
309
309
 
310
- .u-collapsed-menu {
310
+ .u-collapsed-nav {
311
311
  margin: 0;
312
312
  padding: 0;
313
313
  }
314
- .u-collapsed-menu__container {
314
+ .u-collapsed-nav__container {
315
315
  padding: 6px;
316
316
  }
317
- .u-collapsed-menu__item, .u-collapsed-menu__sub-content {
317
+ .u-collapsed-nav__item, .u-collapsed-nav__sub-content {
318
318
  width: 100%;
319
319
  }
320
- .u-collapsed-menu__item.is-first-level, .u-collapsed-menu__sub-content.is-first-level {
320
+ .u-collapsed-nav__item.is-first-level, .u-collapsed-nav__sub-content.is-first-level {
321
321
  justify-content: center;
322
322
  }
323
- .u-collapsed-menu__item.is-first-level .u-collapsed-menu__icon, .u-collapsed-menu__sub-content.is-first-level .u-collapsed-menu__icon {
323
+ .u-collapsed-nav__item.is-first-level .u-collapsed-nav__icon, .u-collapsed-nav__sub-content.is-first-level .u-collapsed-nav__icon {
324
324
  margin-right: 0;
325
325
  }
326
- .u-collapsed-menu__item {
326
+ .u-collapsed-nav__item {
327
327
  margin: 0;
328
328
  }
329
- .u-collapsed-menu__icon {
329
+ .u-collapsed-nav__icon {
330
330
  color: var(--u-text-color-second);
331
331
  object-fit: contain;
332
332
  }
333
- .u-collapsed-menu__item-title, .u-collapsed-menu__sub-title {
333
+ .u-collapsed-nav__item-title, .u-collapsed-nav__sub-title {
334
334
  font-weight: 500;
335
335
  }
336
- .u-collapsed-menu__sub-list {
336
+ .u-collapsed-nav__sub-list {
337
337
  margin: 0;
338
338
  max-height: min(320px, 60vh);
339
339
  padding: 0;
340
340
  }
341
- .u-collapsed-menu__panel {
341
+ .u-collapsed-nav__panel {
342
342
  min-width: 240px;
343
343
  padding: 8px !important;
344
- background-color: var(--u-menu-bg-color);
344
+ background-color: var(--u-nav-bg-color);
345
345
  backdrop-filter: var(--u-bg-filter);
346
346
  -webkit-backdrop-filter: var(--u-bg-filter);
347
347
  border: 1px solid var(--u-border-color);
348
348
  border-radius: calc(var(--u-radius-large) + 4px);
349
349
  box-shadow: 0 16px 40px rgba(15, 23, 42, 0.14), 0 2px 8px rgba(15, 23, 42, 0.08);
350
350
  }
351
- .u-collapsed-menu__panel .u-tip__arrow {
351
+ .u-collapsed-nav__panel .u-tip__arrow {
352
352
  display: none;
353
353
  }
354
- .u-collapsed-menu__panel .u-scroll__content {
354
+ .u-collapsed-nav__panel .u-scroll__content {
355
355
  padding: 0;
356
356
  }
@@ -1,12 +1,12 @@
1
- import { MenuDIKey } from "./di.js";
1
+ import { NavDIKey } from "./di.js";
2
2
  import { computed, inject, watch } from "vue";
3
3
  import { scrollIntoContainerView } from "@veltra/utils";
4
- //#region src/components/menu/use-menu-item.ts
5
- function useMenuItem(options) {
4
+ //#region src/components/nav/use-nav-item.ts
5
+ function useNavItem(options) {
6
6
  const { itemProps, itemRef } = options;
7
- const { cls, collapsedCls, menuProps, menuEmit } = inject(MenuDIKey);
7
+ const { cls, collapsedCls, navProps, navEmit } = inject(NavDIKey);
8
8
  const active = computed(() => {
9
- return menuProps.currentPath === itemProps.menu.path;
9
+ return navProps.currentPath === itemProps.item.path;
10
10
  });
11
11
  let changedByClick = false;
12
12
  watch([active, itemRef], ([active, itemEl]) => {
@@ -17,19 +17,19 @@ function useMenuItem(options) {
17
17
  if (!active || !itemEl) return;
18
18
  scrollIntoContainerView(itemEl, null);
19
19
  });
20
- function handleClickMenu() {
21
- if (itemProps.menu.disabled) return;
20
+ function handleClickItem() {
21
+ if (itemProps.item.disabled) return;
22
22
  changedByClick = true;
23
- menuEmit("item-click", itemProps.menu);
23
+ navEmit("item-click", itemProps.item);
24
24
  }
25
25
  return {
26
26
  cls,
27
27
  collapsedCls,
28
28
  active,
29
- handleClickMenu
29
+ handleClickItem
30
30
  };
31
31
  }
32
32
  //#endregion
33
- export { useMenuItem };
33
+ export { useNavItem };
34
34
 
35
- //# sourceMappingURL=use-menu-item.js.map
35
+ //# sourceMappingURL=use-nav-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-nav-item.js","names":[],"sources":["../../../src/components/nav/use-nav-item.ts"],"sourcesContent":["import { scrollIntoContainerView, type BEM } from '@veltra/utils'\nimport { computed, inject, watch, type ShallowRef, type ComputedRef } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { NavDIKey } from './di'\n\ninterface Options {\n itemProps: { item: NavItem; depth: number }\n itemRef: ShallowRef<HTMLElement | null>\n}\n\ninterface UseNavItemReturned {\n cls: BEM<'nav'>\n collapsedCls: BEM<'collapsed-nav'>\n\n active: ComputedRef<boolean>\n handleClickItem: () => void\n}\n\nexport function useNavItem(options: Options): UseNavItemReturned {\n const { itemProps, itemRef } = options\n const { cls, collapsedCls, navProps, navEmit } = inject(NavDIKey)!\n\n const active = computed(() => {\n return navProps.currentPath === itemProps.item.path\n })\n\n let changedByClick = false\n watch([active, itemRef], ([active, itemEl]) => {\n if (changedByClick) {\n changedByClick = false\n return\n }\n if (!active || !itemEl) return\n scrollIntoContainerView(itemEl, null)\n })\n\n function handleClickItem() {\n if (itemProps.item.disabled) return\n changedByClick = true\n navEmit('item-click', itemProps.item)\n }\n\n return {\n cls,\n collapsedCls,\n\n active,\n handleClickItem\n }\n}\n"],"mappings":";;;;AAmBA,SAAgB,WAAW,SAAsC;CAC/D,MAAM,EAAE,WAAW,YAAY;CAC/B,MAAM,EAAE,KAAK,cAAc,UAAU,YAAY,OAAO,QAAQ;CAEhE,MAAM,SAAS,eAAe;EAC5B,OAAO,SAAS,gBAAgB,UAAU,KAAK;CACjD,CAAC;CAED,IAAI,iBAAiB;CACrB,MAAM,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,YAAY;EAC7C,IAAI,gBAAgB;GAClB,iBAAiB;GACjB;EACF;EACA,IAAI,CAAC,UAAU,CAAC,QAAQ;EACxB,wBAAwB,QAAQ,IAAI;CACtC,CAAC;CAED,SAAS,kBAAkB;EACzB,IAAI,UAAU,KAAK,UAAU;EAC7B,iBAAiB;EACjB,QAAQ,cAAc,UAAU,IAAI;CACtC;CAEA,OAAO;EACL;EACA;EAEA;EACA;CACF;AACF"}
@@ -1,16 +1,16 @@
1
- //#region src/components/menu/walk-menu-path.ts
1
+ //#region src/components/nav/walk-nav-path.ts
2
2
  /**
3
3
  * 深度优先 + 路径;回调返回 `false` 时剪枝当前节点子树(不中断兄弟)。
4
4
  * `@cat-kit/core` 的 `dfs` 在返回 `true` 时会终止整段遍历,语义不同,故保留此辅助。
5
5
  */
6
- function walkMenuWithPath(data, cb, childrenKey = "children", prefix = []) {
6
+ function walkNavWithPath(data, cb, childrenKey = "children", prefix = []) {
7
7
  const path = [...prefix, data];
8
8
  if (cb(data, path) === false) return;
9
9
  const raw = data[childrenKey];
10
10
  if (!Array.isArray(raw)) return;
11
- for (let i = 0; i < raw.length; i++) walkMenuWithPath(raw[i], cb, childrenKey, path);
11
+ for (let i = 0; i < raw.length; i++) walkNavWithPath(raw[i], cb, childrenKey, path);
12
12
  }
13
13
  //#endregion
14
- export { walkMenuWithPath };
14
+ export { walkNavWithPath };
15
15
 
16
- //# sourceMappingURL=walk-menu-path.js.map
16
+ //# sourceMappingURL=walk-nav-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-nav-path.js","names":[],"sources":["../../../src/components/nav/walk-nav-path.ts"],"sourcesContent":["/**\n * 深度优先 + 路径;回调返回 `false` 时剪枝当前节点子树(不中断兄弟)。\n * `@cat-kit/core` 的 `dfs` 在返回 `true` 时会终止整段遍历,语义不同,故保留此辅助。\n */\nexport function walkNavWithPath<T extends Record<string, unknown>>(\n data: T,\n cb: (node: T, path: T[]) => void | false,\n childrenKey = 'children',\n prefix: T[] = []\n): void {\n const path = [...prefix, data]\n if (cb(data, path) === false) return\n const raw = data[childrenKey]\n if (!Array.isArray(raw)) return\n for (let i = 0; i < raw.length; i++) {\n walkNavWithPath(raw[i] as T, cb, childrenKey, path)\n }\n}\n"],"mappings":";;;;;AAIA,SAAgB,gBACd,MACA,IACA,cAAc,YACd,SAAc,CAAC,GACT;CACN,MAAM,OAAO,CAAC,GAAG,QAAQ,IAAI;CAC7B,IAAI,GAAG,MAAM,IAAI,MAAM,OAAO;CAC9B,MAAM,MAAM,KAAK;CACjB,IAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAC9B,gBAAgB,IAAI,IAAS,IAAI,aAAa,IAAI;AAEtD"}
@@ -1,8 +1,8 @@
1
1
  import { NumberProps } from "../../types/number.js";
2
2
  //#region src/components/number/number.vue.d.ts
3
3
  declare const __VLS_export: import("vue").DefineComponent<NumberProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<NumberProps> & Readonly<{}>, {
4
- format: "currency" | "percent" | "decimal";
5
4
  duration: number;
5
+ format: "currency" | "percent" | "decimal";
6
6
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
7
  declare const _default: typeof __VLS_export;
8
8
  //#endregion
@@ -12,8 +12,8 @@ declare const __VLS_base: import("vue").DefineComponent<PopConfirmProps, {}, {},
12
12
  onConfirm?: (() => any) | undefined;
13
13
  onCancel?: (() => any) | undefined;
14
14
  }>, {
15
- direction: TipDirection;
16
15
  trigger: "hover" | "click";
16
+ direction: TipDirection;
17
17
  icon: import("vue").Component;
18
18
  iconColor: string;
19
19
  confirmText: string;
@@ -67,13 +67,13 @@
67
67
  white-space: nowrap;
68
68
  }
69
69
  .u-select__option:hover {
70
- background-color: var(--u-menu-hover-bg);
71
- color: var(--u-menu-hover-color);
70
+ background-color: var(--u-nav-hover-bg);
71
+ color: var(--u-nav-hover-color);
72
72
  }
73
73
  .u-select__option.is-selected {
74
74
  position: relative;
75
- background-color: var(--u-menu-active-bg);
76
- color: var(--u-menu-active-color);
75
+ background-color: var(--u-nav-active-bg);
76
+ color: var(--u-nav-active-color);
77
77
  font-weight: 600;
78
78
  }
79
79
  .u-select__option.is-selected::before {
@@ -83,18 +83,20 @@ function useColumns(options) {
83
83
  ...unfixed,
84
84
  ...fixedOnRight
85
85
  ];
86
- const firstColumn = { ...sortedColumns[0] };
87
- sortedColumns[0] = firstColumn;
88
- if ((!!tree || expandable) && firstColumn) {
89
- firstColumn.align = "left";
90
- firstColumn.width = firstColumn.width ? firstColumn.width + 60 : void 0;
91
- const oldNameRender = firstColumn.nameRender;
92
- firstColumn.nameRender = oldNameRender ? (ctx) => {
93
- const oldNodes = oldNameRender(ctx);
94
- return [renderExpandAll(), ...Array.isArray(oldNodes) ? oldNodes : [oldNodes]];
95
- } : () => {
96
- return [renderExpandAll(), firstColumn.name];
97
- };
86
+ if (sortedColumns.length > 0) {
87
+ const firstColumn = { ...sortedColumns[0] };
88
+ sortedColumns[0] = firstColumn;
89
+ if (tree || expandable) {
90
+ firstColumn.align = "left";
91
+ firstColumn.width = firstColumn.width ? firstColumn.width + 60 : void 0;
92
+ const oldNameRender = firstColumn.nameRender;
93
+ firstColumn.nameRender = oldNameRender ? (ctx) => {
94
+ const oldNodes = oldNameRender(ctx);
95
+ return [renderExpandAll(), ...Array.isArray(oldNodes) ? oldNodes : [oldNodes]];
96
+ } : () => {
97
+ return [renderExpandAll(), firstColumn.name];
98
+ };
99
+ }
98
100
  }
99
101
  columnForest.value = new Forest({
100
102
  data: sortedColumns,
@@ -1 +1 @@
1
- {"version":3,"file":"use-columns.js","names":["UButton","UIcon"],"sources":["../../../src/components/table/use-columns.ts"],"sourcesContent":["import { Forest, dfs, last } from '@cat-kit/core'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { type BEM } from '@veltra/utils'\nimport { computed, createVNode, shallowRef, watch, type ComputedRef, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableProps } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { ColumnNode } from './node/col'\n\n/**\n * 定义表格列\n * @param columns 表格列\n */\nexport function defineTableColumns(\n columns: TableColumn[],\n commonProps?: Partial<Pick<TableColumn, 'align' | 'minWidth'>>\n): TableColumn[] {\n columns.forEach((col) => {\n dfs(col, (node) => {\n for (const key in commonProps) {\n if (node[key] !== undefined) continue\n node[key] = commonProps[key]\n }\n })\n })\n return columns\n}\n\nexport interface ColumnConfig {\n /** 表头 */\n headers: ComputedRef<ColumnNode[][]>\n\n /**\n * body列, 在body中使用\n */\n columns: ShallowRef<ColumnNode[]>\n\n /** 所有叶子列 */\n leafColumns: ShallowRef<ColumnNode[]>\n\n /** 第一列 */\n expandColumn: ShallowRef<ColumnNode | undefined>\n}\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n /** 创建复选框 */\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n toggleAllTreeRowExpand: () => void\n}\n\nexport function useColumns(options: Options): ColumnConfig {\n const { props, createCheckColumn, createSelectColumn, toggleAllTreeRowExpand, cls } = options\n\n /** 前置列 */\n const preColumns = computed<TableColumn[]>(() => {\n const { selectable, checkable, showIndex } = props\n\n const columns: TableColumn[] = []\n\n if (selectable) {\n columns.push(createSelectColumn())\n } else if (checkable) {\n columns.push(createCheckColumn())\n }\n if (showIndex) {\n columns.push({\n key: '__index__',\n name: '#',\n resizable: false,\n width: 60,\n minWidth: 60,\n align: 'center',\n fixed: 'left',\n render({ row }) {\n return row.index + 1\n }\n })\n }\n\n return columns\n })\n\n const columnForest = shallowRef<Forest<TableColumn, any>>()\n\n const renderExpandAll = () =>\n createVNode(\n UButton,\n {\n text: true,\n title: '展开或收起全部',\n class: cls.e('expand-all'),\n type: 'primary',\n size: 'small',\n circle: true,\n onClick: (e) => {\n e.stopPropagation()\n toggleAllTreeRowExpand()\n }\n },\n () => [createVNode(UIcon, undefined, () => [createVNode(ArrowRight)])]\n )\n\n watch(\n [preColumns, () => props.columns, () => props.tree, () => props.expandable],\n ([preColumns, columns, tree, expandable]) => {\n /** 固定到左侧的列 */\n const fixedOnLeft: TableColumn[] = [...preColumns]\n /** 未固定的列 */\n const unfixed: TableColumn[] = []\n /** 固定到右侧的列 */\n const fixedOnRight: TableColumn[] = []\n\n columns?.forEach((column) => {\n if (!column.fixed || column.children) {\n column.fixed = undefined\n return unfixed.push(column)\n }\n if (column.fixed === 'left') {\n fixedOnLeft.push(column)\n } else {\n fixedOnRight.push(column)\n }\n })\n\n if (last(fixedOnLeft)) {\n last(fixedOnLeft)!.isLastFixed = true\n }\n if (fixedOnRight[0]) {\n fixedOnRight[0].isFirstFixed = true\n }\n\n const sortedColumns = [...fixedOnLeft, ...unfixed, ...fixedOnRight]\n // 操作时避免改变原数据\n const firstColumn = { ...sortedColumns[0] } as TableColumn\n sortedColumns[0] = firstColumn\n\n // 树形表格需要给第一列添加展开按钮\n // 因此要重新设置第一列的宽度和对齐方式\n if ((!!tree || expandable) && firstColumn) {\n firstColumn.align = 'left'\n firstColumn.width = firstColumn.width ? firstColumn.width + 60 : undefined\n\n const oldNameRender = firstColumn.nameRender\n\n firstColumn.nameRender = oldNameRender\n ? (ctx) => {\n const oldNodes = oldNameRender!(ctx)\n return [renderExpandAll(), ...(Array.isArray(oldNodes) ? oldNodes : [oldNodes])]\n }\n : () => {\n return [renderExpandAll(), firstColumn.name]\n }\n }\n\n const result = new Forest<TableColumn, any>({\n data: sortedColumns,\n createNode(data, index, depth, _f, parent) {\n return new ColumnNode(data, index, depth, parent)\n }\n })\n\n columnForest.value = result\n },\n { immediate: true }\n )\n\n const headers = computed(() => {\n const headers: ColumnNode[][] = []\n const forest = columnForest.value\n if (!forest) return headers\n\n // Forest.bfs 对每个根单独 BFS,按 depth 拼行会把后续根节点错放到深层,且根节点无 parent,\n // 回溯 leafs 时会读到 undefined。这里从所有根一次性层序遍历,与多列表头布局一致。\n const queue: ColumnNode[] = [...forest.roots]\n while (queue.length > 0) {\n const size = queue.length\n const layer: ColumnNode[] = []\n for (let i = 0; i < size; i++) {\n const node = queue.shift()!\n layer.push(node)\n const ch = node.children\n if (ch?.length) {\n for (const c of ch) {\n queue.push(c)\n }\n }\n }\n headers.push(layer)\n }\n\n // 从叶子节点开始回溯计算每个节点的累计叶子节点数量,叶子节点数量代表表头的宽度\n for (let i = headers.length - 1; i > 0; i--) {\n const header = headers[i]!\n\n header.forEach((node) => {\n const parent = node.parent\n if (!parent) return\n if (parent.leafs !== undefined) return\n parent.leafs = parent.children!.reduce((sum, node) => {\n return sum + (node.leafs ?? 1)\n }, 0)\n })\n }\n\n return headers\n })\n\n /** 除展开按钮之外的列 */\n const columns = shallowRef<ColumnNode[]>([])\n\n /** 所有叶子节点 */\n const leafColumns = shallowRef<ColumnNode[]>([])\n\n const expandColumn = shallowRef<ColumnNode>()\n\n // 监听列的变化\n watch(\n [columnForest, () => props.tree, () => props.expandable],\n ([forest, tree, expandable]) => {\n const _columns: ColumnNode[] = []\n\n forest?.dfs((node) => {\n if (node.isLeaf) {\n _columns.push(node)\n }\n })\n\n leafColumns.value = _columns\n\n if (tree || expandable) {\n expandColumn.value = _columns[0]\n columns.value = _columns.slice(1)\n } else {\n columns.value = _columns\n expandColumn.value = undefined\n }\n },\n { immediate: true }\n )\n\n return {\n /** 第一列 */\n expandColumn,\n /** 所有列 */\n leafColumns,\n /** 列 */\n columns,\n /** 表格头的分层展示 */\n headers\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-columns.js","names":["UButton","UIcon"],"sources":["../../../src/components/table/use-columns.ts"],"sourcesContent":["import { Forest, dfs, last } from '@cat-kit/core'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { type BEM } from '@veltra/utils'\nimport { computed, createVNode, shallowRef, watch, type ComputedRef, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableProps } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { ColumnNode } from './node/col'\n\n/**\n * 定义表格列\n * @param columns 表格列\n */\nexport function defineTableColumns(\n columns: TableColumn[],\n commonProps?: Partial<Pick<TableColumn, 'align' | 'minWidth'>>\n): TableColumn[] {\n columns.forEach((col) => {\n dfs(col, (node) => {\n for (const key in commonProps) {\n if (node[key] !== undefined) continue\n node[key] = commonProps[key]\n }\n })\n })\n return columns\n}\n\nexport interface ColumnConfig {\n /** 表头 */\n headers: ComputedRef<ColumnNode[][]>\n\n /**\n * body列, 在body中使用\n */\n columns: ShallowRef<ColumnNode[]>\n\n /** 所有叶子列 */\n leafColumns: ShallowRef<ColumnNode[]>\n\n /** 第一列 */\n expandColumn: ShallowRef<ColumnNode | undefined>\n}\n\ninterface Options {\n props: TableProps\n cls: BEM<'table'>\n /** 创建复选框 */\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n toggleAllTreeRowExpand: () => void\n}\n\nexport function useColumns(options: Options): ColumnConfig {\n const { props, createCheckColumn, createSelectColumn, toggleAllTreeRowExpand, cls } = options\n\n /** 前置列 */\n const preColumns = computed<TableColumn[]>(() => {\n const { selectable, checkable, showIndex } = props\n\n const columns: TableColumn[] = []\n\n if (selectable) {\n columns.push(createSelectColumn())\n } else if (checkable) {\n columns.push(createCheckColumn())\n }\n if (showIndex) {\n columns.push({\n key: '__index__',\n name: '#',\n resizable: false,\n width: 60,\n minWidth: 60,\n align: 'center',\n fixed: 'left',\n render({ row }) {\n return row.index + 1\n }\n })\n }\n\n return columns\n })\n\n const columnForest = shallowRef<Forest<TableColumn, any>>()\n\n const renderExpandAll = () =>\n createVNode(\n UButton,\n {\n text: true,\n title: '展开或收起全部',\n class: cls.e('expand-all'),\n type: 'primary',\n size: 'small',\n circle: true,\n onClick: (e) => {\n e.stopPropagation()\n toggleAllTreeRowExpand()\n }\n },\n () => [createVNode(UIcon, undefined, () => [createVNode(ArrowRight)])]\n )\n\n watch(\n [preColumns, () => props.columns, () => props.tree, () => props.expandable],\n ([preColumns, columns, tree, expandable]) => {\n /** 固定到左侧的列 */\n const fixedOnLeft: TableColumn[] = [...preColumns]\n /** 未固定的列 */\n const unfixed: TableColumn[] = []\n /** 固定到右侧的列 */\n const fixedOnRight: TableColumn[] = []\n\n columns?.forEach((column) => {\n if (!column.fixed || column.children) {\n column.fixed = undefined\n return unfixed.push(column)\n }\n if (column.fixed === 'left') {\n fixedOnLeft.push(column)\n } else {\n fixedOnRight.push(column)\n }\n })\n\n if (last(fixedOnLeft)) {\n last(fixedOnLeft)!.isLastFixed = true\n }\n if (fixedOnRight[0]) {\n fixedOnRight[0].isFirstFixed = true\n }\n\n const sortedColumns = [...fixedOnLeft, ...unfixed, ...fixedOnRight]\n\n if (sortedColumns.length > 0) {\n // 操作时避免改变原数据\n const firstColumn = { ...sortedColumns[0] } as TableColumn\n sortedColumns[0] = firstColumn\n\n // 树形表格需要给第一列添加展开按钮\n // 因此要重新设置第一列的宽度和对齐方式\n if (tree || expandable) {\n firstColumn.align = 'left'\n firstColumn.width = firstColumn.width ? firstColumn.width + 60 : undefined\n\n const oldNameRender = firstColumn.nameRender\n\n firstColumn.nameRender = oldNameRender\n ? (ctx) => {\n const oldNodes = oldNameRender!(ctx)\n return [renderExpandAll(), ...(Array.isArray(oldNodes) ? oldNodes : [oldNodes])]\n }\n : () => {\n return [renderExpandAll(), firstColumn.name]\n }\n }\n }\n\n const result = new Forest<TableColumn, any>({\n data: sortedColumns,\n createNode(data, index, depth, _f, parent) {\n return new ColumnNode(data, index, depth, parent)\n }\n })\n\n columnForest.value = result\n },\n { immediate: true }\n )\n\n const headers = computed(() => {\n const headers: ColumnNode[][] = []\n const forest = columnForest.value\n if (!forest) return headers\n\n // Forest.bfs 对每个根单独 BFS,按 depth 拼行会把后续根节点错放到深层,且根节点无 parent,\n // 回溯 leafs 时会读到 undefined。这里从所有根一次性层序遍历,与多列表头布局一致。\n const queue: ColumnNode[] = [...forest.roots]\n while (queue.length > 0) {\n const size = queue.length\n const layer: ColumnNode[] = []\n for (let i = 0; i < size; i++) {\n const node = queue.shift()!\n layer.push(node)\n const ch = node.children\n if (ch?.length) {\n for (const c of ch) {\n queue.push(c)\n }\n }\n }\n headers.push(layer)\n }\n\n // 从叶子节点开始回溯计算每个节点的累计叶子节点数量,叶子节点数量代表表头的宽度\n for (let i = headers.length - 1; i > 0; i--) {\n const header = headers[i]!\n\n header.forEach((node) => {\n const parent = node.parent\n if (!parent) return\n if (parent.leafs !== undefined) return\n parent.leafs = parent.children!.reduce((sum, node) => {\n return sum + (node.leafs ?? 1)\n }, 0)\n })\n }\n\n return headers\n })\n\n /** 除展开按钮之外的列 */\n const columns = shallowRef<ColumnNode[]>([])\n\n /** 所有叶子节点 */\n const leafColumns = shallowRef<ColumnNode[]>([])\n\n const expandColumn = shallowRef<ColumnNode>()\n\n // 监听列的变化\n watch(\n [columnForest, () => props.tree, () => props.expandable],\n ([forest, tree, expandable]) => {\n const _columns: ColumnNode[] = []\n\n forest?.dfs((node) => {\n if (node.isLeaf) {\n _columns.push(node)\n }\n })\n\n leafColumns.value = _columns\n\n if (tree || expandable) {\n expandColumn.value = _columns[0]\n columns.value = _columns.slice(1)\n } else {\n columns.value = _columns\n expandColumn.value = undefined\n }\n },\n { immediate: true }\n )\n\n return {\n /** 第一列 */\n expandColumn,\n /** 所有列 */\n leafColumns,\n /** 列 */\n columns,\n /** 表格头的分层展示 */\n headers\n }\n}\n"],"mappings":"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"}
@@ -9,10 +9,10 @@ declare const __VLS_base: import("vue").DefineComponent<TipProps, {}, {}, {}, {}
9
9
  }, string, import("vue").PublicProps, Readonly<TipProps> & Readonly<{
10
10
  "onUpdate:visible"?: ((value: boolean) => any) | undefined;
11
11
  }>, {
12
- direction: TipDirection;
13
12
  trigger: "hover" | "click";
14
13
  contentTag: string;
15
14
  visible: boolean;
15
+ direction: TipDirection;
16
16
  content: string;
17
17
  alignment: TipAlign;
18
18
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;