-
-
Notifications
You must be signed in to change notification settings - Fork 262
Expand file tree
/
Copy pathnodeUtil.tsx
More file actions
87 lines (76 loc) · 2.27 KB
/
nodeUtil.tsx
File metadata and controls
87 lines (76 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import * as React from 'react';
import Divider from '../Divider';
import type { Components, ItemType } from '../interface';
import MenuItem from '../MenuItem';
import MenuItemGroup from '../MenuItemGroup';
import SubMenu from '../SubMenu';
import { parseChildren } from './commonUtil';
function convertItemsToNodes(
list: ItemType[],
components: Required<Components>,
prefixCls?: string,
) {
const {
item: MergedMenuItem,
group: MergedMenuItemGroup,
submenu: MergedSubMenu,
divider: MergedDivider,
} = components;
return (list || [])
.map((opt, index) => {
if (opt && typeof opt === 'object') {
const { label, children, key, type, extra, ...restProps } = opt as any;
const mergedKey = key ?? `tmp-${index}`;
// MenuItemGroup & SubMenuItem
if (children || type === 'group') {
if (type === 'group') {
// Group
return (
<MergedMenuItemGroup key={mergedKey} {...restProps} title={label}>
{convertItemsToNodes(children, components, prefixCls)}
</MergedMenuItemGroup>
);
}
// Sub Menu
return (
<MergedSubMenu key={mergedKey} {...restProps} title={label}>
{convertItemsToNodes(children, components, prefixCls)}
</MergedSubMenu>
);
}
// MenuItem & Divider
if (type === 'divider') {
return <MergedDivider key={mergedKey} {...restProps} />;
}
return (
<MergedMenuItem key={mergedKey} {...restProps} extra={extra}>
{label}
{(!!extra || extra === 0) && (
<span className={`${prefixCls}-item-extra`}>{extra}</span>
)}
</MergedMenuItem>
);
}
return null;
})
.filter(opt => opt);
}
export function parseItems(
items: ItemType[] | undefined,
keyPath: string[],
components: Components,
prefixCls?: string,
) {
let childNodes;
const mergedComponents: Required<Components> = {
divider: Divider,
item: MenuItem,
group: MenuItemGroup,
submenu: SubMenu,
...components,
};
if (items) {
childNodes = convertItemsToNodes(items, mergedComponents, prefixCls);
}
return parseChildren(childNodes, keyPath);
}