import React, { useEffect, useReducer } from "react"; import { Tree, Input, Card, Tooltip } from "antd"; import styles from "./index.less"; import { doFetch } from "@/utils/doFetch"; import Schedule from "./Schedule"; import getPrem from "@/utils/getPrem"; //权限判断fn import { MenuFoldOutlined, MenuUnfoldOutlined } from "@ant-design/icons"; import { useRequest } from "umi"; const { Search } = Input; const initState = { searchValue: "", expandedKeys: [], autoExpandParent: false, treeData: [], checkedNode: {}, show: false, }; function reducer(state, action) { if (action.type == "changeSearch") { return { ...state, autoExpandParent: true, expandedKeys: action.expandedKeys, searchValue: action.searchValue, }; } else if (action.type == "expand") { return { ...state, autoExpandParent: false, expandedKeys: action.expandedKeys, }; } else if (action.type == "getData") { return { ...state, treeData: action.treeData, }; } else if (action.type == "checked") { return { ...state, checkedNode: action.checkedNode, }; } else if (action.type == "flod") { return { ...state, show: action.value, }; } } const getParentKey = (key, system) => { let parentKey; for (let i = 0; i < system.length; i++) { const node = system[i]; if (node.children) { if (node.children.some((item) => item.key === key)) { parentKey = node.key; } else if (getParentKey(key, node.children)) { parentKey = getParentKey(key, node.children); } } } return parentKey; }; const Calendar = (props) => { const [state, dispatch] = useReducer(reducer, initState); const { searchValue, expandedKeys, autoExpandParent, treeData, checkedNode, show, } = state; useEffect(() => { reload(); }, []); function reload() { doFetch({ url: "/ngic-auth/sysFactory/queryTreeList", params: {} }).then( (res) => { if (res.code == "0000") { let treeData = res?.data?.dataList || []; dispatch({ type: "getData", treeData }); if (checkedNode.key) { findChecknode(treeData, checkedNode, (res) => { dispatch({ type: "checked", checkedNode: res }); }); } else { dispatch({ type: "checked", checkedNode: treeData?.length > 0 ? treeData[0] : {}, }); } } } ); } const loop = (data) => { return 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 ? ( <span> {beforeStr} <span style={{ color: "#f50" }}>{searchValue}</span> {afterStr} <span style={{ color: `${item.isOpen ? "#1890ff" : "#ccc"}` }}> {item.isOpen ? "(已开启)" : "(未开启)"} </span> </span> ) : ( <span> {item.title} <span style={{ color: `${item.isOpen ? "#1890ff" : "#ccc"}` }}> {item.isOpen ? "(已开启)" : "(未开启)"} </span> </span> ); if (item.children) { return { title, key: item.key, children: loop(item.children) }; } return { title, key: item.key, }; }); }; const onExpand = (expandedKeys) => { dispatch({ type: "expand", expandedKeys }); }; const searchTree = (e) => { let value; if (e) { value = e.target.value; } else { value = val; } const dataLists = getAllList(); const expandedKeys = 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); dispatch({ type: "changeSearch", expandedKeys, searchValue: value }); }; const selectTree = (selectedKeys, selectedNodes) => { const dataLists = getAllList(); let checkedNode = dataLists.filter((it) => it.key == selectedKeys[0])[0]; dispatch({ type: "checked", checkedNode }); }; function findChecknode(data, check, callback) { let newCheckdata; for (let i = 0; i < data.length; i++) { let it = data[i]; if (it.key == check?.key) { newCheckdata = { key: it.key, title: it.title, type: it.type, isOpen: it.isOpen, parentKey: it.parentKey, }; callback(newCheckdata); } else if (it.children) { findChecknode(it.children, check, callback); } } } 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, type: node.type, isOpen: node.isOpen, parentKey: node.parentKey, }); if (node.children) { generateLists(node.children, node.key); } } }; generateLists(treeData); return dataLists; } return ( <div style={{ width: "100%", height: "100%", backgroundColor: "#fff", minHeight: 300, }} > <div style={{ width: "100%", border: "1px solid rgba(0, 0, 0, 0.06)" }}> <div style={{ padding: "16px 20px", fontSize: 16 }}> {props.route.name} </div> </div> <div style={{ display: "flex" }}> <div className={styles.leftTree} style={{ width: `${show ? 200 : 18}` }} > {show ? ( <Tooltip title="收起"> <div onClick={() => { dispatch({ type: "flod", value: false }); }} > <MenuFoldOutlined style={{ color: "#f50", fontSize: 18 }} /> </div> </Tooltip> ) : ( <Tooltip title="展开"> <div onClick={() => { dispatch({ type: "flod", value: true }); }} > <MenuUnfoldOutlined style={{ color: "#f50", fontSize: 18 }} /> </div> </Tooltip> )} {show ? ( <> <Search style={{ marginBottom: 8 }} placeholder="请输入" onChange={searchTree} /> <Tree onExpand={onExpand} expandedKeys={expandedKeys} autoExpandParent={autoExpandParent} treeData={loop(treeData)} onSelect={selectTree} /> </> ) : null} </div> <div className={`${styles.rightTable} specialpropertiesCard`}> <Schedule checkedNode={checkedNode} reloadTree={reload} /> </div> </div> </div> ); }; export default Calendar;