|
@@ -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
|