Skip to content

Commit 99e2000

Browse files
committed
feat(catalogue): change catalogue and add examples
1 parent 7584b49 commit 99e2000

File tree

10 files changed

+744
-25
lines changed

10 files changed

+744
-25
lines changed

src/catalogue/components/catalogue.tsx

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,21 @@ import { CatalogIcon, DeleteIcon, DragIcon, EditIcon, EllipsisIcon, PlusCircleIc
99
import CatalogueTree, { ICatalogueTree } from './tree';
1010

1111
interface ICatalogue
12-
extends Pick<IBlockHeaderProps, 'tooltip' | 'addonAfter'>,
13-
Partial<Pick<ReturnType<typeof useTreeData>, 'onChange'>>,
12+
extends Pick<IBlockHeaderProps, 'tooltip' | 'addonAfter' | 'addonBefore' | 'title'>,
13+
Pick<ReturnType<typeof useTreeData>, 'onChange'>,
1414
ICatalogueTree {
15-
icon?: React.ReactNode;
16-
title?: string;
1715
showSearch?: boolean;
1816
edit?: boolean;
1917
placeholder?: string;
2018
loading?: boolean;
2119
onSearch?: (value: string) => void;
22-
onSave?: (data: ITreeNode, value: string) => Promise<void>;
23-
onDelete?: (data: ITreeNode) => Promise<void>;
20+
onSave?: (data: ITreeNode, value: string) => void;
21+
onDelete?: (data: ITreeNode) => void;
2422
}
2523

2624
const Catalogue = ({
2725
title,
28-
icon = <CatalogIcon style={{ fontSize: 20 }} />,
26+
addonBefore = <CatalogIcon style={{ fontSize: 20 }} />,
2927
tooltip = false,
3028
showSearch = false,
3129
placeholder = '搜索目录名称',
@@ -43,18 +41,24 @@ const Catalogue = ({
4341
}: ICatalogue) => {
4442
const [form] = Form.useForm();
4543

46-
const loopTree = (data: DataNode[]): DataNode[] => {
44+
const loopTree = (data: ITreeNode[]): ITreeNode[] => {
4745
return data?.map((item) => {
46+
const reset: ITreeNode = {
47+
...item,
48+
editable: item?.editable === undefined ? true : item?.editable,
49+
addable: item?.addable === undefined ? true : item?.addable,
50+
deletable: item?.deletable === undefined ? true : item?.deletable,
51+
};
4852
if (item.children) {
4953
return {
50-
...item,
51-
title: renderTitle(item),
54+
...reset,
55+
title: renderTitle(reset),
5256
children: loopTree(item.children),
5357
};
5458
}
5559
return {
56-
...item,
57-
title: renderTitle(item),
60+
...reset,
61+
title: renderTitle(reset),
5862
children: undefined,
5963
};
6064
});
@@ -67,7 +71,7 @@ const Catalogue = ({
6771
title={title}
6872
tooltip={tooltip}
6973
background={false}
70-
addonBefore={icon}
74+
addonBefore={addonBefore}
7175
addonAfter={addonAfter}
7276
spaceBottom={12}
7377
/>
@@ -165,7 +169,7 @@ const Catalogue = ({
165169
);
166170
};
167171

168-
const renderNodeHover = (item: DataNode) => {
172+
const renderNodeHover = (item: ITreeNode) => {
169173
const menu = (
170174
<Menu
171175
className="tree__title--menu"
@@ -176,23 +180,26 @@ const Catalogue = ({
176180
<Menu.Item
177181
key="add"
178182
className="title__menu--item"
179-
onClick={() => onChange?.(item, InputStatus.Append)}
183+
disabled={!item.addable}
184+
onClick={() => item.addable && onChange?.(item, InputStatus.Append)}
180185
>
181186
<PlusCircleIcon />
182187
<span>新建目录</span>
183188
</Menu.Item>
184189
<Menu.Item
185190
key="edit"
186191
className="title__menu--item"
187-
onClick={() => onChange?.(item, InputStatus.Edit)}
192+
disabled={!item.editable}
193+
onClick={() => item.editable && onChange?.(item, InputStatus.Edit)}
188194
>
189195
<EditIcon />
190196
<span>编辑</span>
191197
</Menu.Item>
192198
<Menu.Item
193199
key="delete"
194200
className="title__menu--item"
195-
onClick={() => onDelete?.(item)}
201+
disabled={!item.deletable}
202+
onClick={() => item.deletable && onDelete?.(item)}
196203
>
197204
<DeleteIcon />
198205
<span>删除</span>
@@ -204,19 +211,19 @@ const Catalogue = ({
204211
className="tree__title--operation"
205212
onMouseDown={(e) => {
206213
e.stopPropagation();
207-
// this.setState({ isSelected: false, draggable: false });
208214
}}
209215
>
210216
<Dropdown
211217
overlay={menu}
212218
trigger={['click']}
213219
placement="bottomRight"
214220
arrow
215-
getPopupContainer={(triggerNode) => triggerNode.parentElement}
221+
destroyPopupOnHide
222+
getPopupContainer={(triggerNode) => triggerNode.parentElement as HTMLElement}
216223
>
217224
<EllipsisIcon onClick={(e) => e.stopPropagation()} />
218225
</Dropdown>
219-
<DragIcon />
226+
{draggable && <DragIcon />}
220227
</div>
221228
);
222229
};

src/catalogue/components/icon.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import classNames from 'classnames';
44
interface IIcon {
55
className?: string;
66
style?: React.CSSProperties;
7-
onClick?: (e) => void;
7+
onClick?: React.MouseEventHandler<HTMLSpanElement>;
88
}
99

1010
const FolderIcon = function ({ className, ...rest }: IIcon) {

src/catalogue/components/tree.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { Key, useMemo } from 'react';
1+
import React, { useMemo } from 'react';
22
import { Tree, TreeProps } from 'antd';
33

44
import { ITreeNode } from '../useTreeData';
@@ -10,10 +10,10 @@ export interface ICatalogueTree
1010
treeData: ITreeNode[];
1111
}
1212

13-
const CatalogueTree = ({ treeData, onExpand, ...rest }: ICatalogueTree) => {
13+
const CatalogueTree = ({ treeData = [], onExpand, ...rest }: ICatalogueTree) => {
1414
const renderTreeData = useMemo(() => loopTree(treeData), [treeData]);
1515

16-
const handleExpand = (expandedKeys: Key[], info) => {
16+
const handleExpand: TreeProps['onExpand'] = (expandedKeys, info) => {
1717
onExpand?.(expandedKeys, info);
1818
};
1919

src/catalogue/demos/basic.tsx

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import React, { useEffect } from 'react';
2+
3+
import { useTreeData } from '../useTreeData';
4+
import Catalogue from '..';
5+
6+
const DEFAULT_DATA = [
7+
{
8+
title: '0-0',
9+
key: '0-0',
10+
children: [
11+
{
12+
title: '0-0-0',
13+
key: '0-0-0',
14+
children: [
15+
{ title: '0-0-0-0', key: '0-0-0-0' },
16+
{ title: '0-0-0-1', key: '0-0-0-1' },
17+
{ title: '0-0-0-2', key: '0-0-0-2' },
18+
],
19+
},
20+
{
21+
title: '0-0-1',
22+
key: '0-0-1',
23+
children: [
24+
{ title: '0-0-1-0', key: '0-0-1-0' },
25+
{ title: '0-0-1-1', key: '0-0-1-1' },
26+
{ title: '0-0-1-2', key: '0-0-1-2' },
27+
],
28+
},
29+
{
30+
title: '0-0-2',
31+
key: '0-0-2',
32+
},
33+
],
34+
},
35+
{
36+
title: '0-1',
37+
key: '0-1',
38+
children: [
39+
{ title: '0-1-0-0', key: '0-1-0-0' },
40+
{ title: '0-1-0-1', key: '0-1-0-1' },
41+
{ title: '0-1-0-2', key: '0-1-0-2' },
42+
],
43+
},
44+
{
45+
title: '0-2',
46+
key: '0-2',
47+
},
48+
];
49+
50+
export default () => {
51+
const treeData = useTreeData();
52+
53+
useEffect(() => {
54+
treeData.initData(DEFAULT_DATA);
55+
}, []);
56+
57+
return (
58+
<div style={{ height: 300, width: 320 }}>
59+
<Catalogue
60+
tooltip="嘿嘿,这是tooltip"
61+
title="标签目录"
62+
showSearch
63+
treeData={treeData.data}
64+
edit={false}
65+
expandedKeys={treeData.expandedKeys}
66+
onExpand={treeData.setExpandedKeys}
67+
/>
68+
</div>
69+
);
70+
};

0 commit comments

Comments
 (0)