|  | @@ -1,37 +1,33 @@
 | 
	
		
			
				|  |  |  import Header from '@/components/Header'
 | 
	
		
			
				|  |  |  import Slot from '@/components/Header/slot'
 | 
	
		
			
				|  |  |  import SvgIcon from '@/components/SvgIcon'
 | 
	
		
			
				|  |  | -import { TenderTree } from '@/types/tender'
 | 
	
		
			
				|  |  | +import { iModalProps, iTenderFormValue, TenderTree } from '@/types/tender'
 | 
	
		
			
				|  |  |  import consts from '@/utils/consts'
 | 
	
		
			
				|  |  | -import { FolderAddFilled } from '@ant-design/icons'
 | 
	
		
			
				|  |  | -import { Button, Table } from 'antd'
 | 
	
		
			
				|  |  | +import { CaretDownOutlined, FolderAddFilled } from '@ant-design/icons'
 | 
	
		
			
				|  |  | +import { Button, Dropdown, Menu, Table, Tooltip } from 'antd'
 | 
	
		
			
				|  |  |  import { ColumnsType } from 'antd/lib/table'
 | 
	
		
			
				|  |  |  import React, { useEffect, useState } from 'react'
 | 
	
		
			
				|  |  |  import { Link } from 'react-router-dom'
 | 
	
		
			
				|  |  | -import { apiTree } from './api'
 | 
	
		
			
				|  |  | +import { apiNewFolder, apiNewTender, apiTree } from './api'
 | 
	
		
			
				|  |  | +import ModalForm from './components/ModalForm'
 | 
	
		
			
				|  |  |  import styles from './index.module.scss'
 | 
	
		
			
				|  |  |  import './index.scss'
 | 
	
		
			
				|  |  |  const Tender: React.FC<{}> = () =>{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  return (
 | 
	
		
			
				|  |  | -    <div className="content-wrap">
 | 
	
		
			
				|  |  | -      <Header title="标段管理">
 | 
	
		
			
				|  |  | -        <Slot position="right">
 | 
	
		
			
				|  |  | -          <Button type="primary" size="small" icon={<FolderAddFilled />}>新建文件夹</Button>
 | 
	
		
			
				|  |  | -        </Slot>
 | 
	
		
			
				|  |  | -      </Header>
 | 
	
		
			
				|  |  | -      <Content/>
 | 
	
		
			
				|  |  | -    </div>
 | 
	
		
			
				|  |  | -  )
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -const Content: React.FC<{}> = () => {
 | 
	
		
			
				|  |  | -  const [ tree, setTree ] = useState<TenderTree[]>([])
 | 
	
		
			
				|  |  | -  // const column_name_render = (text: string, record: any, index: number) => {
 | 
	
		
			
				|  |  | -  //   console.log(1)
 | 
	
		
			
				|  |  | -  //   return (<span>{text}</span>)
 | 
	
		
			
				|  |  | -  // }
 | 
	
		
			
				|  |  | +  const [ tree, setTree ] = useState<TenderTree>({})
 | 
	
		
			
				|  |  | +  const [ modal, setModal ] = useState<iModalProps>({
 | 
	
		
			
				|  |  | +    type: '',
 | 
	
		
			
				|  |  | +    visible: false,
 | 
	
		
			
				|  |  | +    confirmLoading: false,
 | 
	
		
			
				|  |  | +    pid: ''
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +  const addBtnClick = (type: 'folder' | 'tender' | 'root', pid: string) => {
 | 
	
		
			
				|  |  | +    setModal({
 | 
	
		
			
				|  |  | +      ...modal,
 | 
	
		
			
				|  |  | +      type,
 | 
	
		
			
				|  |  | +      visible: true,
 | 
	
		
			
				|  |  | +      pid
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    const columns: ColumnsType<TenderTree>  = [
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        title: '名称',
 | 
	
	
		
			
				|  | @@ -52,7 +48,7 @@ const Content: React.FC<{}> = () => {
 | 
	
		
			
				|  |  |        key: 'member',
 | 
	
		
			
				|  |  |        width: 200,
 | 
	
		
			
				|  |  |        // eslint-disable-next-line react/display-name
 | 
	
		
			
				|  |  | -      render: (text:string, record: TenderTree, index: number) => {
 | 
	
		
			
				|  |  | +      render: (text:string, record: TenderTree) => {
 | 
	
		
			
				|  |  |          if (record.leaf) {
 | 
	
		
			
				|  |  |            return <div><span className="pi-mg-right-5">{record.ancounts} 成员</span><Link className={styles.treeBtn} to="/">成员管理</Link></div>
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -62,46 +58,118 @@ const Content: React.FC<{}> = () => {
 | 
	
		
			
				|  |  |        title: '操作',
 | 
	
		
			
				|  |  |        dataIndex: 'opreate',
 | 
	
		
			
				|  |  |        key: 'opreate',
 | 
	
		
			
				|  |  | -      width: 80
 | 
	
		
			
				|  |  | +      width: 80,
 | 
	
		
			
				|  |  |        // eslint-disable-next-line react/display-name
 | 
	
		
			
				|  |  | -      // render: (text:string, record: TenderTree, index: number) => {
 | 
	
		
			
				|  |  | -      //   return <Dropdown overlay={(record: TenderTree, index: number) => {
 | 
	
		
			
				|  |  | -      //     return (
 | 
	
		
			
				|  |  | -      //       <Menu>
 | 
	
		
			
				|  |  | -      //         <Menu.Item key="0"></Menu.Item>
 | 
	
		
			
				|  |  | -      //         <Menu.Item key="1"></Menu.Item>
 | 
	
		
			
				|  |  | -      //         <Menu.Item key="2"></Menu.Item>
 | 
	
		
			
				|  |  | -      //         <Menu.Item key="3"></Menu.Item>
 | 
	
		
			
				|  |  | -      //       </Menu>
 | 
	
		
			
				|  |  | -      //     )
 | 
	
		
			
				|  |  | -      //   }} trigger={['click']}>
 | 
	
		
			
				|  |  | -      //     <span>
 | 
	
		
			
				|  |  | -      //       <SvgIcon iconClass="align-center" fill="#007bff" fontSize="12"></SvgIcon>
 | 
	
		
			
				|  |  | -      //       <CaretDownOutlined style={{ fontSize: "12px", color: "#007bff" }}/>
 | 
	
		
			
				|  |  | -      //     </span>
 | 
	
		
			
				|  |  | -      //   </Dropdown>
 | 
	
		
			
				|  |  | -      // }
 | 
	
		
			
				|  |  | +      render: (text:string, record: TenderTree) => {
 | 
	
		
			
				|  |  | +        return <Dropdown overlay={() => {
 | 
	
		
			
				|  |  | +          return (
 | 
	
		
			
				|  |  | +            <Menu>
 | 
	
		
			
				|  |  | +              <Menu.Item key="0"><div className="menu-item"><SvgIcon iconClass="edit" fontSize="12"></SvgIcon><span>重命名</span></div></Menu.Item>
 | 
	
		
			
				|  |  | +              <Menu.Item key="1"><div className="menu-item"><SvgIcon iconClass="exchange-alt" fontSize="12"></SvgIcon><span>移动</span></div></Menu.Item>
 | 
	
		
			
				|  |  | +              {
 | 
	
		
			
				|  |  | +                record.children?.length ?
 | 
	
		
			
				|  |  | +                  <Menu.Item key="2">
 | 
	
		
			
				|  |  | +                    <Tooltip placement="left" title="请先移除所有数据">
 | 
	
		
			
				|  |  | +                      <div className="menu-item text-muted">
 | 
	
		
			
				|  |  | +                        <SvgIcon iconClass="times" fontSize="12"></SvgIcon><span>删除</span>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    </Tooltip>
 | 
	
		
			
				|  |  | +                  </Menu.Item>
 | 
	
		
			
				|  |  | +                :
 | 
	
		
			
				|  |  | +                <Menu.Item key="2"><div className="menu-item"><SvgIcon iconClass="times" fontSize="12"></SvgIcon><span>删除</span></div></Menu.Item>
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              {
 | 
	
		
			
				|  |  | +                record.isfolder ? <Menu.Divider /> : ''
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              {
 | 
	
		
			
				|  |  | +                record.isfolder ? record.leaf ?
 | 
	
		
			
				|  |  | +                <Menu.Item key="3"><div className= "menu-item" onClick={() => addBtnClick('tender', record.id)}><SvgIcon iconClass="plus" fontSize="12"></SvgIcon><span>新建标段</span></div></Menu.Item>
 | 
	
		
			
				|  |  | +                :
 | 
	
		
			
				|  |  | +                <Menu.Item key="3">
 | 
	
		
			
				|  |  | +                  <Tooltip placement="left" title="标段无法与文件夹同层">
 | 
	
		
			
				|  |  | +                    <div className= "menu-item text-muted"><SvgIcon iconClass="plus" fontSize="12"></SvgIcon><span>新建标段</span></div>
 | 
	
		
			
				|  |  | +                  </Tooltip></Menu.Item>
 | 
	
		
			
				|  |  | +                : ''
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              {
 | 
	
		
			
				|  |  | +                record.isfolder ? !record.isBid ?
 | 
	
		
			
				|  |  | +                <Menu.Item key="4"><div className="menu-item" onClick={() => addBtnClick('folder', record.id)}><SvgIcon iconClass="folder" fontSize="12"></SvgIcon><span>新建子文件夹</span></div></Menu.Item>
 | 
	
		
			
				|  |  | +                :
 | 
	
		
			
				|  |  | +                <Menu.Item key="4">
 | 
	
		
			
				|  |  | +                  <Tooltip placement="left" title="文件夹无法与标段同层">
 | 
	
		
			
				|  |  | +                    <div className="menu-item text-muted"><SvgIcon iconClass="folder" fontSize="12"></SvgIcon><span>新建子文件夹</span></div>
 | 
	
		
			
				|  |  | +                  </Tooltip>
 | 
	
		
			
				|  |  | +                </Menu.Item>
 | 
	
		
			
				|  |  | +                : ''
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            </Menu>
 | 
	
		
			
				|  |  | +          )
 | 
	
		
			
				|  |  | +        }} trigger={[ 'click' ]}>
 | 
	
		
			
				|  |  | +          <span>
 | 
	
		
			
				|  |  | +            <SvgIcon iconClass="align-center" fill="#007bff" fontSize="12"></SvgIcon>
 | 
	
		
			
				|  |  | +            <CaretDownOutlined style={{ fontSize: "12px", color: "#007bff" }}/>
 | 
	
		
			
				|  |  | +          </span>
 | 
	
		
			
				|  |  | +        </Dropdown>
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    ]
 | 
	
		
			
				|  |  | +  const onCreate = async (values: iTenderFormValue, type: 'folder' | 'tender' | 'root') => {
 | 
	
		
			
				|  |  | +    console.log('Received values of form: ', values, type)
 | 
	
		
			
				|  |  | +    setModal({
 | 
	
		
			
				|  |  | +      ...modal,
 | 
	
		
			
				|  |  | +      confirmLoading: true
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +    if (type === 'tender') {
 | 
	
		
			
				|  |  | +      const { code = -1 } = await apiNewTender(values)
 | 
	
		
			
				|  |  | +      if (code === consts.RET_CODE.SUCCESS) {
 | 
	
		
			
				|  |  | +        getTree()
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      const { code = -1 } = await apiNewFolder(values)
 | 
	
		
			
				|  |  | +      if (code === consts.RET_CODE.SUCCESS) {
 | 
	
		
			
				|  |  | +        getTree()
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    setModal({
 | 
	
		
			
				|  |  | +      ...modal,
 | 
	
		
			
				|  |  | +      confirmLoading: false,
 | 
	
		
			
				|  |  | +      visible: false,
 | 
	
		
			
				|  |  | +      pid: ''
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    useEffect(() => {
 | 
	
		
			
				|  |  |      getTree()
 | 
	
		
			
				|  |  |    }, [])
 | 
	
		
			
				|  |  |    const getTree = async () => {
 | 
	
		
			
				|  |  | -    const { data: { children = [] } = [], code = -1 } = await apiTree()
 | 
	
		
			
				|  |  | +    const { data = {}, code = -1 } = await apiTree()
 | 
	
		
			
				|  |  |      if (code === consts.RET_CODE.SUCCESS) {
 | 
	
		
			
				|  |  | -      setTree(children)
 | 
	
		
			
				|  |  | +      setTree(data)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    return (
 | 
	
		
			
				|  |  | -    <div className="pi-flex-column">
 | 
	
		
			
				|  |  | -      <div className="pi-mg-16 pi-pd-tb-64 pi-pd-lr-32 jumbotron">
 | 
	
		
			
				|  |  | -        <h3>没有标段数据</h3>
 | 
	
		
			
				|  |  | -      </div>
 | 
	
		
			
				|  |  | -      <div className={styles.tableContent}>
 | 
	
		
			
				|  |  | -        <Table<TenderTree> columns={columns} dataSource={tree} pagination={false} rowKey={record => record.id} bordered></Table>
 | 
	
		
			
				|  |  | +    <div className="content-wrap">
 | 
	
		
			
				|  |  | +      <Header title="标段管理">
 | 
	
		
			
				|  |  | +        <Slot position="right">
 | 
	
		
			
				|  |  | +          <Button type="primary" size="small" icon={<FolderAddFilled />} onClick={() => addBtnClick('root', tree.id)}>新建文件夹</Button>
 | 
	
		
			
				|  |  | +        </Slot>
 | 
	
		
			
				|  |  | +      </Header>
 | 
	
		
			
				|  |  | +      <div className="pi-flex-column">
 | 
	
		
			
				|  |  | +        <div className="pi-mg-16 pi-pd-tb-64 pi-pd-lr-32 jumbotron">
 | 
	
		
			
				|  |  | +          <h3>没有标段数据</h3>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +        <div className={styles.tableContent}>
 | 
	
		
			
				|  |  | +          <Table<TenderTree> columns={columns} dataSource={tree.children} pagination={false} rowKey={record => record.id} bordered></Table>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +        <ModalForm modalObj={modal}  treeObj={tree} onCreate={onCreate} onCancel={() => setModal({
 | 
	
		
			
				|  |  | +          ...modal,
 | 
	
		
			
				|  |  | +          visible: false
 | 
	
		
			
				|  |  | +        })} ></ModalForm>
 | 
	
		
			
				|  |  |        </div>
 | 
	
		
			
				|  |  |      </div>
 | 
	
		
			
				|  |  |    )
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -export default  Tender
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default Tender
 |