import React, { useState, useMemo, useRef, createContext } from "react"; import { Tree, Input, Popconfirm, Tooltip, Divider, Modal, message, } from "antd"; import { MinusSquareOutlined, FormOutlined, PlusSquareOutlined, ArrowDownOutlined, ArrowRightOutlined, } from "@ant-design/icons"; import getPrem from "@/utils/getPrem"; import { useRequest } from "ahooks"; import { doFetch } from "@/utils/doFetch"; import { useEffect } from "react"; import Login from "@/pages/user/Login"; const ReachableContext = createContext(null); let { Search } = Input, { TreeNode } = Tree; 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) => { return item.key === key; }) ) { parentKey = node.key; } else if (getParentKey(key, node.children)) { parentKey = getParentKey(key, node.children); } } } return parentKey; }; function TreeRender({ url, deleteurl, saveurl, onselected, params, noaction, maxWidth, hasTool = false, }) { const [search, setsearch] = useState(""); const [savetitle, setsavetitle] = useState(null); const [modal, setModal] = useState({ visible: false, }); const [expandall, setexpandall] = useState(false); const [expandedKeys, onExpand] = useState(); const { data, loading, refresh } = useRequest(() => { return doFetch({ url, params: params ?? {} }); }); const [autoExpandParent, setAutoExpandParent] = useState(true); const allkeys = useMemo(() => { let res = []; const fn = (source) => { source.map((el) => { res.push(el); el.children && el.children.length > 0 ? fn(el.children) : ""; // 子级递归 }); }; fn(data?.data?.dataList ?? []); return res.filter((it) => it.children).map((it) => it.key); }, [data]); const alldata = useMemo(() => { let res = []; const fn = (source) => { source.map((el) => { res.push(el); el.children && el.children.length > 0 ? fn(el.children) : ""; // 子级递归 }); }; fn(data?.data?.dataList ?? []); return res; }, [data]); const treeData = useMemo(() => { let res = data?.data?.dataList ?? []; return [ { title: "全部", key: "00000000", children: res, }, ]; }, [data]); const onChange = (e) => { const { value } = e.target; const dataLists = getAllList(); const newExpandedKeys = dataLists .map((item) => { if (item.title.indexOf(value) > -1) { return getParentKey(item.key, treeData); } return null; }) .filter((item, i, self) => item && self.indexOf(item) === i); setsearch(value); if (newExpandedKeys.length > 0) { setexpandall(true); setAutoExpandParent(true); } else { setexpandall(false); setAutoExpandParent(false); } onExpand(newExpandedKeys); }; const loop = (data) => data.map((item) => { const index = item.title.indexOf(search); const beforeStr = item.title.substr(0, index); const afterStr = item.title.substr(index + search.length); let title = index > -1 ? ( {beforeStr} {search} {afterStr} ) : ( {item.title} ); const actiontitle = (
{title} {hasTool && (
{item.key && item.key != "00000000" && ( { e.stopPropagation(); setsavetitle(null); if (getPrem("enElectricityMeterType_save", "ifs")) { setModal({ visible: true, closable: true, title: "修改节点名称", okText: "修改", cancelText: "取消", placeholder: item.title, key: item.key, }); } }} > )} {item.key && item.key != "00000000" && ( )} { e.stopPropagation(); setsavetitle(null); if (getPrem("enElectricityMeterType_save", "ifs")) { setModal({ visible: true, closable: true, title: "新增子结构", okText: "新增", cancelText: "取消", placeholder: item.title, key: item.key, }); } }} style={{ color: `${ getPrem("enElectricityMeterType_save", "ifs") ? "green" : "" }`, }} /> {(!item.children || item.children.length == 0) && ( )} {(!item.children || item.children.length == 0) && item.key != "0" && ( { doFetch({ url: deleteurl, params: { id: item.key }, }).then((res) => { if (res.code == "0000") { message.success("操作成功"); refresh(); } }); }} disabled={ !getPrem("enElectricityMeterType_deleteById", "ifs") } > { e.stopPropagation(); }} style={{ color: "red" }} /> )} {item.key === "00000000" && ( )} {item.key === "00000000" && ( { e.stopPropagation(); setexpandall(!expandall); onExpand(expandall ? [] : allkeys); }} > {expandall ? : } )}
)}
); if (item.key === "00000000") { title = (
{title} { e.stopPropagation(); setexpandall(!expandall); onExpand(expandall ? [] : allkeys); setAutoExpandParent(!expandall); }} > {expandall ? : }
); } // if (item.children) { // return ( // // {loop(item.children)} // // ); // } // return ; // return ( // // {item.children && loop(item.children)} // // ); if (item.children) { return { title: noaction ? title : actiontitle, key: item.key, children: loop(item.children), level: item.level, }; } return { title: noaction ? title : actiontitle, key: item.key, level: item.level, }; }); useEffect(() => { setexpandall(true); onExpand(allkeys); }, [allkeys]); function getAllList() { const dataLists = []; const generateLists = (data) => { for (let i = 0; i < data.length; i++) { const node = data[i]; const key = node.key; dataLists.push({ key, title: node.title, level: node.level }); if (node.children) { generateLists(node.children, node.key); } } }; generateLists(treeData); return dataLists; } return (
{ setModal((s) => ({ ...s, visible: false, })); }} onOk={() => { if (modal.okText == "修改") { return new Promise((resolve, reject) => { if (savetitle) { doFetch({ url: saveurl, params: { materieTypeName: savetitle, id: modal.key, }, }).then((res) => { if (res.code == "0000") { message.success("操作成功"); refresh(); setModal({ visible: false, }); } }); resolve(); } else { message.warn("请输入修改的名称"); reject(); } }); } else { return new Promise((resolve, reject) => { if (savetitle) { doFetch({ url: saveurl, params: { materieTypeName: savetitle, parentId: modal.key, }, }).then((res) => { if (res.code == "0000") { message.success("操作成功"); refresh(); setModal({ visible: false, }); } }); resolve(); } else { message.warn("请输入修改的名称"); reject(); } }); } }} > {modal.okText == "修改" ? (
{ setsavetitle(e.target.value); }} >
) : (
当前结构:{modal.placeholder}
{ setsavetitle(e.target.value); }} >
)}
{ onselected?.(selectedKeys, e, alldata); }} autoExpandParent={autoExpandParent} defaultExpandAll={true} expandedKeys={expandedKeys} onExpand={(expandedKeys, { expanded: bool, node }) => { onExpand(expandedKeys); setAutoExpandParent(false); if (!bool && node.key == "00000000") { setexpandall(false); } else { setexpandall(true); } }} treeData={loop(treeData ?? [])} > {/* {loop(treeData ? treeData : [])} */}
); } export default TreeRender;