|
@@ -1,45 +1,95 @@
|
|
-import { Form, Input, message, Modal } from 'antd'
|
|
|
|
-import React, { useEffect } from 'react'
|
|
|
|
|
|
+import { iModalProps, TenderTree } from '@/types/tender'
|
|
|
|
+import { Form, Input, message, Modal, TreeSelect } from 'antd'
|
|
|
|
+import React, { useEffect, useState } from 'react'
|
|
|
|
|
|
interface Option {
|
|
interface Option {
|
|
value: string | number;
|
|
value: string | number;
|
|
- label?: React.ReactNode;
|
|
|
|
- disabled?: boolean;
|
|
|
|
|
|
+ title: React.ReactNode;
|
|
|
|
+ disabled: boolean;
|
|
children?: Option[];
|
|
children?: Option[];
|
|
}
|
|
}
|
|
-interface iModalObj {
|
|
|
|
- visible: boolean
|
|
|
|
- type: 'folder' | 'tender' | 'root'
|
|
|
|
- confirmLoading: boolean
|
|
|
|
- pid: string
|
|
|
|
-}
|
|
|
|
|
|
+
|
|
interface iModalFormProps {
|
|
interface iModalFormProps {
|
|
- modalObj:iModalObj
|
|
|
|
|
|
+ treeObj: TenderTree
|
|
|
|
+ modalObj: iModalProps
|
|
onCreate: (values, type ) => void
|
|
onCreate: (values, type ) => void
|
|
onCancel: () => void
|
|
onCancel: () => void
|
|
}
|
|
}
|
|
|
|
|
|
const ModalForm: React.FC<iModalFormProps> = ({
|
|
const ModalForm: React.FC<iModalFormProps> = ({
|
|
|
|
+ treeObj,
|
|
onCreate,
|
|
onCreate,
|
|
onCancel,
|
|
onCancel,
|
|
- modalObj: { visible, confirmLoading, type, pid }
|
|
|
|
|
|
+ modalObj: { visible, confirmLoading, type, id, name, isFolder }
|
|
}) => {
|
|
}) => {
|
|
const [ form ] = Form.useForm()
|
|
const [ form ] = Form.useForm()
|
|
const modalObj = {
|
|
const modalObj = {
|
|
- title: type === 'tender' ? '添加新标段' : '新建文件夹',
|
|
|
|
- nameTitle: type === 'tender' ? '标段名称' : '文件夹名称',
|
|
|
|
- namePlaceholder: type === 'tender' ? '输入标段名称' : '输入文件夹名称'
|
|
|
|
|
|
+ tender: {
|
|
|
|
+ title: '添加新标段',
|
|
|
|
+ nameTitle: '标段名称',
|
|
|
|
+ namePlaceholder: '输入标段名称',
|
|
|
|
+ okText: '确认添加'
|
|
|
|
+ },
|
|
|
|
+ folder: {
|
|
|
|
+ title: '新建文件夹',
|
|
|
|
+ nameTitle: '文件夹名称',
|
|
|
|
+ namePlaceholder: '输入文件夹名称',
|
|
|
|
+ okText: '确认添加'
|
|
|
|
+ },
|
|
|
|
+ root: {
|
|
|
|
+ title: '新建文件夹',
|
|
|
|
+ nameTitle: '文件夹名称',
|
|
|
|
+ namePlaceholder: '输入文件夹名称',
|
|
|
|
+ okText: '确认添加'
|
|
|
|
+ },
|
|
|
|
+ rename: {
|
|
|
|
+ title: '重命名',
|
|
|
|
+ nameTitle: '名称',
|
|
|
|
+ namePlaceholder: '输入新的名称',
|
|
|
|
+ okText: '确认修改'
|
|
|
|
+ },
|
|
|
|
+ delFolder: {
|
|
|
|
+ title: '删除文件夹',
|
|
|
|
+ okText: '确认删除'
|
|
|
|
+ },
|
|
|
|
+ delTender: {
|
|
|
|
+ title: '删除标段',
|
|
|
|
+ okText: '确认删除'
|
|
|
|
+ },
|
|
|
|
+ move: {
|
|
|
|
+ title: '移动',
|
|
|
|
+ nameTitle: '移动至',
|
|
|
|
+ namePlaceholder: '选择文件夹父级目录',
|
|
|
|
+ okText: '确认修改'
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ const [ cascader, setCascader ] = useState<Option[]>([])
|
|
|
|
+ const [ showNameInput, setShowNameInput ] = useState(true)
|
|
|
|
+
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
- form.resetFields()
|
|
|
|
- }, [ modalObj ])
|
|
|
|
|
|
+ form.setFieldsValue({ [type === 'tender' ? 'folderId' : 'id']: id })
|
|
|
|
+ if (type === 'move') {
|
|
|
|
+ console.log('iiiid', id)
|
|
|
|
+
|
|
|
|
+ setCascader(mapTree([ treeObj ], id, isFolder))
|
|
|
|
+ }
|
|
|
|
+ if (type === 'move' || type.indexOf('del') !== -1) {
|
|
|
|
+ setShowNameInput(false)
|
|
|
|
+ } else {
|
|
|
|
+ setShowNameInput(true)
|
|
|
|
+ showNameInput && form.setFieldsValue({ depth: type === 'root' ? -1 : 0 })
|
|
|
|
+ }
|
|
|
|
+ }, [ type, id ])
|
|
return (
|
|
return (
|
|
<Modal
|
|
<Modal
|
|
getContainer={false}
|
|
getContainer={false}
|
|
visible={visible}
|
|
visible={visible}
|
|
confirmLoading={confirmLoading}
|
|
confirmLoading={confirmLoading}
|
|
- title={modalObj.title}
|
|
|
|
- okText="确认添加"
|
|
|
|
|
|
+ title={modalObj[type].title}
|
|
|
|
+ okText={modalObj[type].okText}
|
|
|
|
+ okButtonProps={{ size: 'small', danger: type.indexOf('del') !== -1 ? true : false }}
|
|
|
|
+ cancelButtonProps={{ size: "small" }}
|
|
cancelText="取消"
|
|
cancelText="取消"
|
|
onCancel={onCancel}
|
|
onCancel={onCancel}
|
|
closable={false}
|
|
closable={false}
|
|
@@ -52,40 +102,60 @@ const ModalForm: React.FC<iModalFormProps> = ({
|
|
})
|
|
})
|
|
}}>
|
|
}}>
|
|
<Form form={form} layout="vertical">
|
|
<Form form={form} layout="vertical">
|
|
- <Form.Item name={type === 'tender' ? 'folderId' : 'id'} initialValue={pid} hidden>
|
|
|
|
- <Input></Input>
|
|
|
|
- {/* <TreeSelect treeData={cascaderArrOption} placeholder={modalObj.seletePlaceholder} disabled={type === 'root'} allowClear ></TreeSelect> */}
|
|
|
|
- </Form.Item>
|
|
|
|
- <Form.Item name="name" label={modalObj.nameTitle} rules={[ { required: true, message: '请输入文件夹名称!' },{
|
|
|
|
- validator: async (_, names) => {
|
|
|
|
- if (names && names.length > 30) {
|
|
|
|
- return Promise.reject(new Error('名称超过30个字,请缩减名称。'))
|
|
|
|
|
|
+ <Form.Item name={type === 'tender' ? 'folderId' : 'id'} hidden ><Input></Input></Form.Item>
|
|
|
|
+ {
|
|
|
|
+ showNameInput ? <Form.Item name="name" label={modalObj[type].nameTitle} rules={[ { required: true, message: '请输入文件夹名称!' },{
|
|
|
|
+ validator: async (_, names) => {
|
|
|
|
+ if (names && names.length > 30) {
|
|
|
|
+ return Promise.reject(new Error('名称超过30个字,请缩减名称。'))
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- } ]}>
|
|
|
|
- <Input allowClear size="small" autoComplete="off"></Input>
|
|
|
|
- </Form.Item>
|
|
|
|
- <Form.Item name="depth" initialValue={type === 'root' ? -1 : 0} hidden>
|
|
|
|
- <Input></Input>
|
|
|
|
- </Form.Item>
|
|
|
|
|
|
+ } ]}>
|
|
|
|
+ <Input allowClear size="small" autoComplete="off"></Input>
|
|
|
|
+ </Form.Item> : ''
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ showNameInput ? <Form.Item name="depth" hidden><Input></Input></Form.Item> : ''
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ type === 'move' ? <Form.Item name="targetFolderId"><TreeSelect treeData={cascader} placeholder={modalObj[type].namePlaceholder} allowClear ></TreeSelect></Form.Item> : ''
|
|
|
|
+ }
|
|
|
|
+ {
|
|
|
|
+ type.indexOf('del') !== -1 ? <div><p>确认删除「{name}」?</p><p>删除后,数据无法恢复,请谨慎操作。</p></div> : ''
|
|
|
|
+ }
|
|
</Form>
|
|
</Form>
|
|
</Modal>
|
|
</Modal>
|
|
)
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
-// function mapTree(treeObj:TenderTree, type: 'folder' | 'tender' | 'root') {
|
|
|
|
-// if (type === 'root') {
|
|
|
|
-// return [ { value: treeObj.id, title: treeObj.name } ]
|
|
|
|
-// }
|
|
|
|
-// return treeObj.children?.map((tree:TenderTree) => {
|
|
|
|
-// const newTree = { value: tree.id, title: tree.name }
|
|
|
|
-// if ((type === 'folder' && !tree.isBid) || (type === 'tender' && tree.leaf)) {
|
|
|
|
-// if (tree.children?.length) {
|
|
|
|
-// newTree.children = mapTree(tree.children, type)
|
|
|
|
-// }
|
|
|
|
-// return newTree
|
|
|
|
-// }
|
|
|
|
-// }).filter(item => item) // filter的作用是过滤掉map最终可能产生的underfined的item(map的数组有多少个item就会返回多少个item,没有返回就是underfined)
|
|
|
|
-// }
|
|
|
|
|
|
+function mapTree(treeArr:TenderTree[], id: string, isFolder: boolean) {
|
|
|
|
+ console.log(treeArr)
|
|
|
|
+ console.log('id', id)
|
|
|
|
+ console.log('isFolder', isFolder)
|
|
|
|
+
|
|
|
|
+ const arr = treeArr.map((tree:TenderTree) => {
|
|
|
|
+ const newTree = { value: tree.id, title: tree.name, disabled: tree.id === id }
|
|
|
|
+ // 要移动的是文件夹
|
|
|
|
+ if (isFolder && tree.isBid) {
|
|
|
|
+ // 该目录下已有标段不可移动文件夹至此目录
|
|
|
|
+ newTree.disabled = true
|
|
|
|
+ console.log(newTree)
|
|
|
|
+
|
|
|
|
+ return newTree
|
|
|
|
+ }
|
|
|
|
+ if (tree.isfolder || tree.hasFolder) {
|
|
|
|
+ if (tree.childsTotal > 0) {
|
|
|
|
+ if (tree.children.findIndex(item => item.id === id) !== -1) {
|
|
|
|
+ newTree.disabled = true
|
|
|
|
+ }
|
|
|
|
+ newTree.children = mapTree(tree.children, tree.id, Boolean(tree.isfolder))
|
|
|
|
+ }
|
|
|
|
+ return newTree
|
|
|
|
+ }
|
|
|
|
+ }).filter(item => item) // filter过滤滤掉map可能产生的underfined item
|
|
|
|
+ console.log('arr', arr)
|
|
|
|
+
|
|
|
|
+ return arr
|
|
|
|
+}
|
|
|
|
|
|
export default ModalForm
|
|
export default ModalForm
|