import { Transfer, Tree, Badge, Spin } from 'antd' import { useEffect, useState, useContext, useRef } from 'react' import PropTypes from 'prop-types' import axios from 'axios' import { AuthContext } from '../../Auth/AuthContext' // const propertyOrder = ['products'] const PartTransfer = ({ onChange, filter, useFilter, selectedKeys: initialSelectedKeys }) => { const [partsTreeData, setPartsTreeData] = useState([]) const [targetKeys, setTargetKeys] = useState(initialSelectedKeys || []) const { token } = useContext(AuthContext) const tokenRef = useRef(token) const [loading, setLoading] = useState(true) const fetchPartsData = async (property, filter) => { setLoading(true) try { const response = await axios.get(`${config.backendUrl}/parts', { params: { ...filter, property }, headers: { Authorization: `Bearer ${tokenRef.current}` } }) setLoading(false) return response.data } catch (err) { console.error(err) console.error(err) setLoading(false) return [] } } const getFilter = (node) => { let filter = {} let currentId = node.id while (currentId !== 0) { const currentNode = partsTreeData.find( (treeData) => treeData.id === currentId ) if (currentNode) { filter[propertyOrder[currentNode.propertyId]] = currentNode.value.split('-')[0] currentId = currentNode.pId } else { break } } return filter } const generatePartTreeNodes = async (node = null, filter = null) => { if (!node) return const actualFilter = filter === null ? getFilter(node) : filter const partData = await fetchPartsData(null, actualFilter) const newNodeList = partData.map((part) => ({ id: part._id, pId: node.id, value: part._id, key: part._id, title: , isLeaf: true })) setPartsTreeData((prev) => [...prev, ...newNodeList]) } const generatePartCategoryTreeNodes = async (node = null) => { let filter = {} let propertyId = 0 if (node) { filter = getFilter(node) propertyId = node.propertyId + 1 } const propertyName = propertyOrder[propertyId] const propertyData = await fetchPartsData(propertyName, filter) const newNodeList = propertyData.map((data) => { const property = data[propertyName] const random = Math.random().toString(36).substring(2, 6) return { id: random, pId: node ? node.id : '0', value: `${property}-${random}`, key: `${property}-${random}`, propertyId: propertyId, title: property, isLeaf: false, selectable: false } }) setPartsTreeData((prev) => [...prev, ...newNodeList]) } const handleTreeLoad = async (node) => { if (node) { if (node.propertyId !== propertyOrder.length - 1) { await generatePartCategoryTreeNodes(node) } else { await generatePartTreeNodes(node) } } else { await generatePartCategoryTreeNodes(null) } } useEffect(() => { setPartsTreeData([]) }, [token, filter, useFilter]) useEffect(() => { if (partsTreeData.length === 0) { if (useFilter) { generatePartTreeNodes({ id: '0' }, filter) } else { handleTreeLoad(null) } } }, [partsTreeData.length]) const transferDataSource = partsTreeData.filter((node) => node.isLeaf) const renderTransferItem = (item) => item.title const handleTransferChange = (newTargetKeys) => { setTargetKeys(newTargetKeys) onChange(newTargetKeys) } const renderSourceList = ({ onItemSelect }) => { const treeData = partsTreeData .map((node) => ({ ...node, children: partsTreeData .filter((child) => child.pId === node.id) .map((child) => ({ ...child, children: partsTreeData.filter( (grandChild) => grandChild.pId === child.id ) })) })) .filter((node) => !node.pId) return ( handleTreeLoad(node)} treeData={treeData} onSelect={(selectedKeys, { node }) => { if (node.isLeaf) { onItemSelect(node.key, !selectedKeys.includes(node.key)) } }} /> ) } if (loading && partsTreeData.length === 0) { return } return ( {renderSourceList} ) } PartTransfer.propTypes = { onChange: PropTypes.func.isRequired, filter: PropTypes.object, useFilter: PropTypes.bool, selectedKeys: PropTypes.arrayOf(PropTypes.string) } PartTransfer.defaultProps = { filter: {}, useFilter: false, selectedKeys: [] } export default PartTransfer