@jetlinks-web/components 2.0.1 → 2.0.2-2
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.
- package/package.json +3 -3
- package/src/ConfigProvider/context.ts +17 -17
- package/src/ConfigProvider/index.tsx +40 -42
- package/src/ProLayout/Basic/BasicLayout.tsx +395 -392
- package/src/ProLayout/Basic/Header.tsx +115 -115
- package/src/ProLayout/PageContainer/index.tsx +441 -441
- package/src/ProLayout/SiderMenu/BaseMenu.tsx +296 -296
- package/src/ProLayout/SiderMenu/SiderMenu.tsx +320 -320
- package/src/ProLayout/SiderMenu/typings.ts +49 -49
- package/src/ProLayout/TopHeader/index.tsx +210 -210
- package/src/ProLayout/typings.ts +87 -87
- package/src/ProTable/index.tsx +551 -551
- package/src/ProTable/proTableTypes.ts +70 -70
- package/src/ProTable/style/index.less +92 -92
- package/src/Search/typing.ts +76 -76
- package/src/style/variable.less +4 -4
|
@@ -1,296 +1,296 @@
|
|
|
1
|
-
import { defaultSettingProps } from '../defaultSettings';
|
|
2
|
-
import {
|
|
3
|
-
defineComponent,
|
|
4
|
-
getCurrentInstance,
|
|
5
|
-
isVNode,
|
|
6
|
-
resolveComponent,
|
|
7
|
-
watchEffect,
|
|
8
|
-
withCtx,
|
|
9
|
-
} from 'vue';
|
|
10
|
-
import type {
|
|
11
|
-
ExtractPropTypes,
|
|
12
|
-
FunctionalComponent,
|
|
13
|
-
PropType,
|
|
14
|
-
VNodeChild,
|
|
15
|
-
ComponentInternalInstance,
|
|
16
|
-
ConcreteComponent,
|
|
17
|
-
VNode,
|
|
18
|
-
} from 'vue';
|
|
19
|
-
import type {
|
|
20
|
-
SelectEventHandler,
|
|
21
|
-
MenuClickEventHandler,
|
|
22
|
-
SelectInfo,
|
|
23
|
-
MenuInfo,
|
|
24
|
-
} from 'ant-design-vue/
|
|
25
|
-
import type {
|
|
26
|
-
FormatMessage,
|
|
27
|
-
MenuDataItem,
|
|
28
|
-
WithFalse,
|
|
29
|
-
Theme,
|
|
30
|
-
MenuItemRender,
|
|
31
|
-
SubMenuItemRender,
|
|
32
|
-
} from '../typings';
|
|
33
|
-
import type { MenuMode } from 'ant-design-vue';
|
|
34
|
-
import type { Key } from 'ant-design-vue/
|
|
35
|
-
import { defaultPrefixCls } from '../RouteContext';
|
|
36
|
-
import { AIcon as IconFont } from '../../../';
|
|
37
|
-
import { regular } from '@jetlinks-web/utils';
|
|
38
|
-
import { Menu } from 'ant-design-vue';
|
|
39
|
-
import { createFromIconfontCN } from '@ant-design/icons-vue';
|
|
40
|
-
|
|
41
|
-
export const baseMenuProps = {
|
|
42
|
-
...defaultSettingProps,
|
|
43
|
-
prefixCls: {
|
|
44
|
-
type: String as PropType<string | undefined>,
|
|
45
|
-
default: () => defaultPrefixCls,
|
|
46
|
-
},
|
|
47
|
-
locale: {
|
|
48
|
-
type: [Function, Boolean] as PropType<WithFalse<FormatMessage>>,
|
|
49
|
-
default: (t: string): string => t,
|
|
50
|
-
},
|
|
51
|
-
menuData: {
|
|
52
|
-
type: Array as PropType<MenuDataItem[]>,
|
|
53
|
-
default: () => [],
|
|
54
|
-
},
|
|
55
|
-
mode: {
|
|
56
|
-
type: String as PropType<MenuMode>,
|
|
57
|
-
default: 'inline',
|
|
58
|
-
},
|
|
59
|
-
theme: {
|
|
60
|
-
type: String as PropType<Theme>,
|
|
61
|
-
default: 'dark',
|
|
62
|
-
},
|
|
63
|
-
collapsed: {
|
|
64
|
-
type: Boolean as PropType<boolean | undefined>,
|
|
65
|
-
default: () => false,
|
|
66
|
-
},
|
|
67
|
-
openKeys: {
|
|
68
|
-
type: Array as PropType<WithFalse<string[]>>,
|
|
69
|
-
default: () => undefined,
|
|
70
|
-
},
|
|
71
|
-
selectedKeys: {
|
|
72
|
-
type: Array as PropType<WithFalse<string[]>>,
|
|
73
|
-
default: () => undefined,
|
|
74
|
-
},
|
|
75
|
-
menuProps: {
|
|
76
|
-
type: Object as PropType<Record<string, any>>,
|
|
77
|
-
default: () => null,
|
|
78
|
-
},
|
|
79
|
-
menuItemRender: {
|
|
80
|
-
type: [Object, Function, Boolean] as PropType<MenuItemRender>,
|
|
81
|
-
default: () => undefined,
|
|
82
|
-
},
|
|
83
|
-
subMenuItemRender: {
|
|
84
|
-
type: [Object, Function, Boolean] as PropType<SubMenuItemRender>,
|
|
85
|
-
default: () => undefined,
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
onClick: [Function, Object] as PropType<(...args: any) => void>,
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
export type BaseMenuProps = ExtractPropTypes<typeof baseMenuProps>;
|
|
92
|
-
|
|
93
|
-
type IconFontProps = {
|
|
94
|
-
icon: VNodeChild | string;
|
|
95
|
-
iconUrl: string;
|
|
96
|
-
prefixCls?: string;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
let AntdIconFont = createFromIconfontCN({
|
|
100
|
-
scriptUrl: '',
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
const LazyIcon: FunctionalComponent<IconFontProps> = (props) => {
|
|
104
|
-
const {icon, iconUrl, prefixCls = defaultPrefixCls} = props;
|
|
105
|
-
if (!icon) return null;
|
|
106
|
-
if (isVNode(icon)) {
|
|
107
|
-
return icon;
|
|
108
|
-
}
|
|
109
|
-
if (typeof icon === 'string' && icon !== '') {
|
|
110
|
-
if (regular.isUrl(icon) || regular.isImg(icon)) {
|
|
111
|
-
return (
|
|
112
|
-
<img
|
|
113
|
-
src={icon}
|
|
114
|
-
alt="icon"
|
|
115
|
-
class={`${prefixCls}-sider-menu-icon`}
|
|
116
|
-
/>
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
return iconUrl ? (
|
|
120
|
-
<AntdIconFont type={icon}/>
|
|
121
|
-
) : (
|
|
122
|
-
<IconFont type={icon}/>
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
class MenuUtil {
|
|
128
|
-
props: BaseMenuProps;
|
|
129
|
-
|
|
130
|
-
ctx: ComponentInternalInstance | null;
|
|
131
|
-
|
|
132
|
-
RouterLink: ConcreteComponent;
|
|
133
|
-
|
|
134
|
-
constructor(props: BaseMenuProps, ctx: ComponentInternalInstance | null) {
|
|
135
|
-
this.props = props;
|
|
136
|
-
this.ctx = ctx;
|
|
137
|
-
this.RouterLink = resolveComponent('router-link') as ConcreteComponent;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
getNavMenuItems = (menusData: MenuDataItem[] = []) => {
|
|
141
|
-
return menusData
|
|
142
|
-
.map((item) => this.getSubMenuOrItem(item))
|
|
143
|
-
.filter((item) => item);
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
getSubMenuOrItem = (item: MenuDataItem): VNode => {
|
|
147
|
-
if (
|
|
148
|
-
Array.isArray(item.children) &&
|
|
149
|
-
item.children.length > 0 &&
|
|
150
|
-
!item?.meta?.hideInMenu &&
|
|
151
|
-
!item?.meta?.hideChildrenInMenu
|
|
152
|
-
) {
|
|
153
|
-
if (this.props.subMenuItemRender) {
|
|
154
|
-
const subMenuItemRender = withCtx(
|
|
155
|
-
this.props.subMenuItemRender,
|
|
156
|
-
this.ctx,
|
|
157
|
-
);
|
|
158
|
-
return subMenuItemRender({
|
|
159
|
-
item,
|
|
160
|
-
children: this.getNavMenuItems(item.children),
|
|
161
|
-
}) as VNode;
|
|
162
|
-
}
|
|
163
|
-
const {prefixCls, locale} = this.props;
|
|
164
|
-
const menuTitle =
|
|
165
|
-
(locale && locale(item.meta?.title)) || item.meta?.title;
|
|
166
|
-
const defaultTitle = item.meta?.icon ? (
|
|
167
|
-
<span class={`${prefixCls}-menu-item`}>
|
|
168
|
-
<span class={`${prefixCls}-menu-item-title`}>
|
|
169
|
-
{menuTitle}
|
|
170
|
-
</span>
|
|
171
|
-
</span>
|
|
172
|
-
) : (
|
|
173
|
-
<span class={`${prefixCls}-menu-item`}>{menuTitle}</span>
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
return (
|
|
177
|
-
<Menu.SubMenu
|
|
178
|
-
title={defaultTitle}
|
|
179
|
-
key={item.path}
|
|
180
|
-
popupClassName={`${prefixCls}-menu-popup`}
|
|
181
|
-
icon={
|
|
182
|
-
<LazyIcon
|
|
183
|
-
iconUrl={this.props.iconfontUrl}
|
|
184
|
-
icon={item.meta?.icon}
|
|
185
|
-
/>
|
|
186
|
-
}
|
|
187
|
-
>
|
|
188
|
-
{this.getNavMenuItems(item.children)}
|
|
189
|
-
</Menu.SubMenu>
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const menuItemRender =
|
|
194
|
-
this.props.menuItemRender &&
|
|
195
|
-
withCtx(this.props.menuItemRender, this.ctx);
|
|
196
|
-
|
|
197
|
-
const [title, icon] = this.getMenuItem(item);
|
|
198
|
-
|
|
199
|
-
return (
|
|
200
|
-
(menuItemRender &&
|
|
201
|
-
(menuItemRender({item, title, icon}) as VNode)) || (
|
|
202
|
-
<Menu.Item
|
|
203
|
-
disabled={item.meta?.disabled}
|
|
204
|
-
danger={item.meta?.danger}
|
|
205
|
-
key={item.path}
|
|
206
|
-
>
|
|
207
|
-
{title}
|
|
208
|
-
</Menu.Item>
|
|
209
|
-
)
|
|
210
|
-
);
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
getMenuItem = (item: MenuDataItem) => {
|
|
214
|
-
const meta = {...item.meta};
|
|
215
|
-
const target = (meta.target || null) as string | null;
|
|
216
|
-
const hasUrl = regular.isUrl(item.path);
|
|
217
|
-
const CustomTag: any = (target && 'a') || this.RouterLink;
|
|
218
|
-
const props = {to: {name: item.name, ...item.meta}};
|
|
219
|
-
const attrs =
|
|
220
|
-
hasUrl || target ? {...item.meta, href: item.path, target} : {};
|
|
221
|
-
|
|
222
|
-
const {prefixCls, locale} = this.props;
|
|
223
|
-
const icon =
|
|
224
|
-
(item.meta?.icon && (
|
|
225
|
-
<LazyIcon
|
|
226
|
-
iconUrl={this.props.iconfontUrl}
|
|
227
|
-
icon={item.meta?.icon}
|
|
228
|
-
/>
|
|
229
|
-
)) ||
|
|
230
|
-
undefined;
|
|
231
|
-
const menuTitle =
|
|
232
|
-
(locale && locale(item.meta?.title)) || item.meta?.title;
|
|
233
|
-
|
|
234
|
-
const defaultTitle = item.meta?.icon ? (
|
|
235
|
-
<CustomTag {...attrs} {...props} class={`${prefixCls}-menu-item`}>
|
|
236
|
-
{icon}
|
|
237
|
-
<span class={`${prefixCls}-menu-item-title`}>{menuTitle}</span>
|
|
238
|
-
</CustomTag>
|
|
239
|
-
) : (
|
|
240
|
-
<CustomTag {...attrs} {...props} class={`${prefixCls}-menu-item`}>
|
|
241
|
-
<span>{menuTitle}</span>
|
|
242
|
-
</CustomTag>
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
return [defaultTitle, icon];
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export default defineComponent({
|
|
250
|
-
name: 'BaseMenu',
|
|
251
|
-
props: baseMenuProps,
|
|
252
|
-
emits: ['update:openKeys', 'update:selectedKeys', 'click'],
|
|
253
|
-
setup(props, {emit}) {
|
|
254
|
-
const ctx = getCurrentInstance();
|
|
255
|
-
const menuUtil = new MenuUtil(props, ctx);
|
|
256
|
-
|
|
257
|
-
watchEffect(() => {
|
|
258
|
-
if (props.iconfontUrl) {
|
|
259
|
-
AntdIconFont = createFromIconfontCN({
|
|
260
|
-
scriptUrl: props.iconfontUrl,
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
const handleOpenChange = (openKeys: Key[]): void => {
|
|
266
|
-
emit('update:openKeys', openKeys);
|
|
267
|
-
};
|
|
268
|
-
const handleSelect: SelectEventHandler = (args: SelectInfo): void => {
|
|
269
|
-
// ignore https? link handle selectkeys
|
|
270
|
-
if (regular.isUrl(args.key as string)) {
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
emit('update:selectedKeys', args.selectedKeys);
|
|
274
|
-
};
|
|
275
|
-
const handleClick: MenuClickEventHandler = (args: MenuInfo) => {
|
|
276
|
-
emit('click', args);
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
return () => (
|
|
280
|
-
<Menu
|
|
281
|
-
key="Menu"
|
|
282
|
-
inlineIndent={16}
|
|
283
|
-
mode={props.mode}
|
|
284
|
-
theme={props.theme}
|
|
285
|
-
openKeys={props.openKeys === false ? [] : props.openKeys}
|
|
286
|
-
selectedKeys={props.selectedKeys || []}
|
|
287
|
-
onOpenChange={handleOpenChange}
|
|
288
|
-
onSelect={handleSelect}
|
|
289
|
-
onClick={handleClick}
|
|
290
|
-
{...props.menuProps}
|
|
291
|
-
>
|
|
292
|
-
{menuUtil.getNavMenuItems(props.menuData)}
|
|
293
|
-
</Menu>
|
|
294
|
-
);
|
|
295
|
-
},
|
|
296
|
-
});
|
|
1
|
+
import { defaultSettingProps } from '../defaultSettings';
|
|
2
|
+
import {
|
|
3
|
+
defineComponent,
|
|
4
|
+
getCurrentInstance,
|
|
5
|
+
isVNode,
|
|
6
|
+
resolveComponent,
|
|
7
|
+
watchEffect,
|
|
8
|
+
withCtx,
|
|
9
|
+
} from 'vue';
|
|
10
|
+
import type {
|
|
11
|
+
ExtractPropTypes,
|
|
12
|
+
FunctionalComponent,
|
|
13
|
+
PropType,
|
|
14
|
+
VNodeChild,
|
|
15
|
+
ComponentInternalInstance,
|
|
16
|
+
ConcreteComponent,
|
|
17
|
+
VNode,
|
|
18
|
+
} from 'vue';
|
|
19
|
+
import type {
|
|
20
|
+
SelectEventHandler,
|
|
21
|
+
MenuClickEventHandler,
|
|
22
|
+
SelectInfo,
|
|
23
|
+
MenuInfo,
|
|
24
|
+
} from 'ant-design-vue/es/menu/src/interface';
|
|
25
|
+
import type {
|
|
26
|
+
FormatMessage,
|
|
27
|
+
MenuDataItem,
|
|
28
|
+
WithFalse,
|
|
29
|
+
Theme,
|
|
30
|
+
MenuItemRender,
|
|
31
|
+
SubMenuItemRender,
|
|
32
|
+
} from '../typings';
|
|
33
|
+
import type { MenuMode } from 'ant-design-vue';
|
|
34
|
+
import type { Key } from 'ant-design-vue/es/_util/type';
|
|
35
|
+
import { defaultPrefixCls } from '../RouteContext';
|
|
36
|
+
import { AIcon as IconFont } from '../../../';
|
|
37
|
+
import { regular } from '@jetlinks-web/utils';
|
|
38
|
+
import { Menu } from 'ant-design-vue';
|
|
39
|
+
import { createFromIconfontCN } from '@ant-design/icons-vue';
|
|
40
|
+
|
|
41
|
+
export const baseMenuProps = {
|
|
42
|
+
...defaultSettingProps,
|
|
43
|
+
prefixCls: {
|
|
44
|
+
type: String as PropType<string | undefined>,
|
|
45
|
+
default: () => defaultPrefixCls,
|
|
46
|
+
},
|
|
47
|
+
locale: {
|
|
48
|
+
type: [Function, Boolean] as PropType<WithFalse<FormatMessage>>,
|
|
49
|
+
default: (t: string): string => t,
|
|
50
|
+
},
|
|
51
|
+
menuData: {
|
|
52
|
+
type: Array as PropType<MenuDataItem[]>,
|
|
53
|
+
default: () => [],
|
|
54
|
+
},
|
|
55
|
+
mode: {
|
|
56
|
+
type: String as PropType<MenuMode>,
|
|
57
|
+
default: 'inline',
|
|
58
|
+
},
|
|
59
|
+
theme: {
|
|
60
|
+
type: String as PropType<Theme>,
|
|
61
|
+
default: 'dark',
|
|
62
|
+
},
|
|
63
|
+
collapsed: {
|
|
64
|
+
type: Boolean as PropType<boolean | undefined>,
|
|
65
|
+
default: () => false,
|
|
66
|
+
},
|
|
67
|
+
openKeys: {
|
|
68
|
+
type: Array as PropType<WithFalse<string[]>>,
|
|
69
|
+
default: () => undefined,
|
|
70
|
+
},
|
|
71
|
+
selectedKeys: {
|
|
72
|
+
type: Array as PropType<WithFalse<string[]>>,
|
|
73
|
+
default: () => undefined,
|
|
74
|
+
},
|
|
75
|
+
menuProps: {
|
|
76
|
+
type: Object as PropType<Record<string, any>>,
|
|
77
|
+
default: () => null,
|
|
78
|
+
},
|
|
79
|
+
menuItemRender: {
|
|
80
|
+
type: [Object, Function, Boolean] as PropType<MenuItemRender>,
|
|
81
|
+
default: () => undefined,
|
|
82
|
+
},
|
|
83
|
+
subMenuItemRender: {
|
|
84
|
+
type: [Object, Function, Boolean] as PropType<SubMenuItemRender>,
|
|
85
|
+
default: () => undefined,
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
onClick: [Function, Object] as PropType<(...args: any) => void>,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export type BaseMenuProps = ExtractPropTypes<typeof baseMenuProps>;
|
|
92
|
+
|
|
93
|
+
type IconFontProps = {
|
|
94
|
+
icon: VNodeChild | string;
|
|
95
|
+
iconUrl: string;
|
|
96
|
+
prefixCls?: string;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
let AntdIconFont = createFromIconfontCN({
|
|
100
|
+
scriptUrl: '',
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const LazyIcon: FunctionalComponent<IconFontProps> = (props) => {
|
|
104
|
+
const {icon, iconUrl, prefixCls = defaultPrefixCls} = props;
|
|
105
|
+
if (!icon) return null;
|
|
106
|
+
if (isVNode(icon)) {
|
|
107
|
+
return icon;
|
|
108
|
+
}
|
|
109
|
+
if (typeof icon === 'string' && icon !== '') {
|
|
110
|
+
if (regular.isUrl(icon) || regular.isImg(icon)) {
|
|
111
|
+
return (
|
|
112
|
+
<img
|
|
113
|
+
src={icon}
|
|
114
|
+
alt="icon"
|
|
115
|
+
class={`${prefixCls}-sider-menu-icon`}
|
|
116
|
+
/>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
return iconUrl ? (
|
|
120
|
+
<AntdIconFont type={icon}/>
|
|
121
|
+
) : (
|
|
122
|
+
<IconFont type={icon}/>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
class MenuUtil {
|
|
128
|
+
props: BaseMenuProps;
|
|
129
|
+
|
|
130
|
+
ctx: ComponentInternalInstance | null;
|
|
131
|
+
|
|
132
|
+
RouterLink: ConcreteComponent;
|
|
133
|
+
|
|
134
|
+
constructor(props: BaseMenuProps, ctx: ComponentInternalInstance | null) {
|
|
135
|
+
this.props = props;
|
|
136
|
+
this.ctx = ctx;
|
|
137
|
+
this.RouterLink = resolveComponent('router-link') as ConcreteComponent;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
getNavMenuItems = (menusData: MenuDataItem[] = []) => {
|
|
141
|
+
return menusData
|
|
142
|
+
.map((item) => this.getSubMenuOrItem(item))
|
|
143
|
+
.filter((item) => item);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
getSubMenuOrItem = (item: MenuDataItem): VNode => {
|
|
147
|
+
if (
|
|
148
|
+
Array.isArray(item.children) &&
|
|
149
|
+
item.children.length > 0 &&
|
|
150
|
+
!item?.meta?.hideInMenu &&
|
|
151
|
+
!item?.meta?.hideChildrenInMenu
|
|
152
|
+
) {
|
|
153
|
+
if (this.props.subMenuItemRender) {
|
|
154
|
+
const subMenuItemRender = withCtx(
|
|
155
|
+
this.props.subMenuItemRender,
|
|
156
|
+
this.ctx,
|
|
157
|
+
);
|
|
158
|
+
return subMenuItemRender({
|
|
159
|
+
item,
|
|
160
|
+
children: this.getNavMenuItems(item.children),
|
|
161
|
+
}) as VNode;
|
|
162
|
+
}
|
|
163
|
+
const {prefixCls, locale} = this.props;
|
|
164
|
+
const menuTitle =
|
|
165
|
+
(locale && locale(item.meta?.title)) || item.meta?.title;
|
|
166
|
+
const defaultTitle = item.meta?.icon ? (
|
|
167
|
+
<span class={`${prefixCls}-menu-item`}>
|
|
168
|
+
<span class={`${prefixCls}-menu-item-title`}>
|
|
169
|
+
{menuTitle}
|
|
170
|
+
</span>
|
|
171
|
+
</span>
|
|
172
|
+
) : (
|
|
173
|
+
<span class={`${prefixCls}-menu-item`}>{menuTitle}</span>
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
return (
|
|
177
|
+
<Menu.SubMenu
|
|
178
|
+
title={defaultTitle}
|
|
179
|
+
key={item.path}
|
|
180
|
+
popupClassName={`${prefixCls}-menu-popup`}
|
|
181
|
+
icon={
|
|
182
|
+
<LazyIcon
|
|
183
|
+
iconUrl={this.props.iconfontUrl}
|
|
184
|
+
icon={item.meta?.icon}
|
|
185
|
+
/>
|
|
186
|
+
}
|
|
187
|
+
>
|
|
188
|
+
{this.getNavMenuItems(item.children)}
|
|
189
|
+
</Menu.SubMenu>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const menuItemRender =
|
|
194
|
+
this.props.menuItemRender &&
|
|
195
|
+
withCtx(this.props.menuItemRender, this.ctx);
|
|
196
|
+
|
|
197
|
+
const [title, icon] = this.getMenuItem(item);
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
(menuItemRender &&
|
|
201
|
+
(menuItemRender({item, title, icon}) as VNode)) || (
|
|
202
|
+
<Menu.Item
|
|
203
|
+
disabled={item.meta?.disabled}
|
|
204
|
+
danger={item.meta?.danger}
|
|
205
|
+
key={item.path}
|
|
206
|
+
>
|
|
207
|
+
{title}
|
|
208
|
+
</Menu.Item>
|
|
209
|
+
)
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
getMenuItem = (item: MenuDataItem) => {
|
|
214
|
+
const meta = {...item.meta};
|
|
215
|
+
const target = (meta.target || null) as string | null;
|
|
216
|
+
const hasUrl = regular.isUrl(item.path);
|
|
217
|
+
const CustomTag: any = (target && 'a') || this.RouterLink;
|
|
218
|
+
const props = {to: {name: item.name, ...item.meta}};
|
|
219
|
+
const attrs =
|
|
220
|
+
hasUrl || target ? {...item.meta, href: item.path, target} : {};
|
|
221
|
+
|
|
222
|
+
const {prefixCls, locale} = this.props;
|
|
223
|
+
const icon =
|
|
224
|
+
(item.meta?.icon && (
|
|
225
|
+
<LazyIcon
|
|
226
|
+
iconUrl={this.props.iconfontUrl}
|
|
227
|
+
icon={item.meta?.icon}
|
|
228
|
+
/>
|
|
229
|
+
)) ||
|
|
230
|
+
undefined;
|
|
231
|
+
const menuTitle =
|
|
232
|
+
(locale && locale(item.meta?.title)) || item.meta?.title;
|
|
233
|
+
|
|
234
|
+
const defaultTitle = item.meta?.icon ? (
|
|
235
|
+
<CustomTag {...attrs} {...props} class={`${prefixCls}-menu-item`}>
|
|
236
|
+
{icon}
|
|
237
|
+
<span class={`${prefixCls}-menu-item-title`}>{menuTitle}</span>
|
|
238
|
+
</CustomTag>
|
|
239
|
+
) : (
|
|
240
|
+
<CustomTag {...attrs} {...props} class={`${prefixCls}-menu-item`}>
|
|
241
|
+
<span>{menuTitle}</span>
|
|
242
|
+
</CustomTag>
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
return [defaultTitle, icon];
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export default defineComponent({
|
|
250
|
+
name: 'BaseMenu',
|
|
251
|
+
props: baseMenuProps,
|
|
252
|
+
emits: ['update:openKeys', 'update:selectedKeys', 'click'],
|
|
253
|
+
setup(props, {emit}) {
|
|
254
|
+
const ctx = getCurrentInstance();
|
|
255
|
+
const menuUtil = new MenuUtil(props, ctx);
|
|
256
|
+
|
|
257
|
+
watchEffect(() => {
|
|
258
|
+
if (props.iconfontUrl) {
|
|
259
|
+
AntdIconFont = createFromIconfontCN({
|
|
260
|
+
scriptUrl: props.iconfontUrl,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
const handleOpenChange = (openKeys: Key[]): void => {
|
|
266
|
+
emit('update:openKeys', openKeys);
|
|
267
|
+
};
|
|
268
|
+
const handleSelect: SelectEventHandler = (args: SelectInfo): void => {
|
|
269
|
+
// ignore https? link handle selectkeys
|
|
270
|
+
if (regular.isUrl(args.key as string)) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
emit('update:selectedKeys', args.selectedKeys);
|
|
274
|
+
};
|
|
275
|
+
const handleClick: MenuClickEventHandler = (args: MenuInfo) => {
|
|
276
|
+
emit('click', args);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
return () => (
|
|
280
|
+
<Menu
|
|
281
|
+
key="Menu"
|
|
282
|
+
inlineIndent={16}
|
|
283
|
+
mode={props.mode}
|
|
284
|
+
theme={props.theme}
|
|
285
|
+
openKeys={props.openKeys === false ? [] : props.openKeys}
|
|
286
|
+
selectedKeys={props.selectedKeys || []}
|
|
287
|
+
onOpenChange={handleOpenChange}
|
|
288
|
+
onSelect={handleSelect}
|
|
289
|
+
onClick={handleClick}
|
|
290
|
+
{...props.menuProps}
|
|
291
|
+
>
|
|
292
|
+
{menuUtil.getNavMenuItems(props.menuData)}
|
|
293
|
+
</Menu>
|
|
294
|
+
);
|
|
295
|
+
},
|
|
296
|
+
});
|