import React, { useState,useMemo,useEffect } from 'react'; import { Input, Transfer, Button,Tree } from "antd" import {RedoOutlined } from '@ant-design/icons'; const { Search } = Input; export default function PersonForm({treeList,deptList,callback,onCancel,selectPerson}) { const [searchValue, setSearchValue] = useState(''); const [expandedKeys, setExpandedKeys] = useState([treeList[0].key]); const [autoExpandParent, setAutoExpandParent] = useState(true); const [treeData, setTreeData] = useState(treeList) // 处理搜索时树形数据高亮 const loop = (data) => data.map((item) => { const index = item.title.indexOf(searchValue); const beforeStr = item.title.substr(0, index); const afterStr = item.title.substr(index + searchValue.length); const title = index > -1 ? ( {beforeStr} {searchValue} {afterStr} ) : ( {item.title} ); if (item.children) { return { title, key: item.key || item.value, children: loop(item.children) }; } return { title, key: item.key || item.value, }; }) const getParentKey =(key, tree) => { let parentKey for (let i = 0; i < tree.length; i++) { const node = tree[i]; if (node.children) { if (node.children.some((item) => item.value === key)) { parentKey = node.value; } else if (getParentKey(key, node.children)) { parentKey = getParentKey(key, node.children); } } } return parentKey; } // 将树形节点改为一维数组 const generateList = (data, dataList) => { for (let i = 0; i < data.length; i++) { const node = data[i]; const { key, title,value } = node; dataList.push({ key:key||value, title, }); if (node.children) { generateList(node.children, dataList); } } return dataList } // 树节点展开/收缩 const onExpand = (expandedKeys) => { setExpandedKeys(expandedKeys) setAutoExpandParent(false) } // 搜索框回调 const onInputChange = (e) => { let { value } = e.target value = String(value).trim() const dataList = generateList(treeData, []) let expandedKeys = dataList .map((item) => { if (item.title.indexOf(value) > -1) { return getParentKey(item.key, treeData) } return null; }) .filter((item, i, self) => item && self.indexOf(item) === i) setExpandedKeys(expandedKeys) setAutoExpandParent(true) setSearchValue(value) } const customRender = (record) => { let name; if (record?.dept?.deptName) { name = record.dept.deptName } else { name = deptList.find(item => item.deptId == record.parentId)?.deptName } return {record.title}{ name ? `【${name}】` :''}; } // 穿梭框处理 const isChecked = (selectedKeys, eventKey) => selectedKeys.includes(eventKey); const generateTree = (treeNodes = [], checkedKeys = []) => treeNodes.map(({ children, ...props }) => ({ ...props, disabled: checkedKeys.includes(props.key), children: generateTree(children, checkedKeys), })); const TreeTransfer = ({ dataSource, targetKeys, ...restProps }) => { const transferDataSource = []; function flatten(list = []) { list.forEach((item) => { item.key = item.key ||item.value transferDataSource.push(item); flatten(item.children); }); } flatten(dataSource); return ( {({ direction, onItemSelect, selectedKeys }) => { if (direction === 'left') { const checkedKeys = [...selectedKeys, ...targetKeys]; return ( { onItemSelect(key, !isChecked(checkedKeys, key)); }} onSelect={(_, { node: { key } }) => { onItemSelect(key, !isChecked(checkedKeys, key)); }} /> ); } }} ); }; const [targetKeys, setTargetKeys] = useState([]); const onChange = (keys,direction) => { setTargetKeys(keys); }; useEffect(() => { setTargetKeys(selectPerson) }, [selectPerson]) return ( <>
) }