import React, { useState } from 'react'; import { theme, Transfer, Tree } from 'antd'; import type { GetProp, TransferProps, TreeDataNode } from 'antd'; type TransferItem = GetProp[number]; interface TreeTransferProps { dataSource: TreeDataNode[]; targetKeys: TransferProps['targetKeys']; onChange: TransferProps['onChange']; } // Customize Table Transfer const isChecked = (selectedKeys: React.Key[], eventKey: React.Key) => selectedKeys.includes(eventKey); const generateTree = ( treeNodes: TreeDataNode[] = [], checkedKeys: TreeTransferProps['targetKeys'] = [], ): TreeDataNode[] => treeNodes.map(({ children, ...props }) => ({ ...props, disabled: checkedKeys.includes(props.key as string), children: generateTree(children, checkedKeys), })); const TreeTransfer: React.FC = ({ dataSource, targetKeys = [], ...restProps }) => { const { token } = theme.useToken(); const transferDataSource: TransferItem[] = []; function flatten(list: TreeDataNode[] = []) { list.forEach((item) => { transferDataSource.push(item as TransferItem); flatten(item.children); }); } flatten(dataSource); return ( item.title!} showSelectAll={false} > {({ direction, onItemSelect, selectedKeys }) => { if (direction === 'left') { const checkedKeys = [...selectedKeys, ...targetKeys]; return (
{ onItemSelect(key as string, !isChecked(checkedKeys, key)); }} onSelect={(_, { node: { key } }) => { onItemSelect(key as string, !isChecked(checkedKeys, key)); }} />
); } }}
); }; const treeData: TreeDataNode[] = [ { key: '0-0', title: '0-0' }, { key: '0-1', title: '0-1', children: [ { key: '0-1-0', title: '0-1-0' }, { key: '0-1-1', title: '0-1-1' }, ], }, { key: '0-2', title: '0-2' }, { key: '0-3', title: '0-3' }, { key: '0-4', title: '0-4' }, ]; const App: React.FC = () => { const [targetKeys, setTargetKeys] = useState([]); const onChange: TreeTransferProps['onChange'] = (keys) => { setTargetKeys(keys); }; return ; }; export default App;