import React, { useEffect, useState, useMemo } from 'react'; import { connect } from 'react-redux'; import { Input, Button, Tree, Modal, Table, Upload, Pagination, Popconfirm } from '@douyinfe/semi-ui'; import { IconDeleteStroked, IconEditStroked, IconUpload, IconAlertCircle, IconSearch } from '@douyinfe/semi-icons'; import SimpleBar from 'simplebar-react'; import FileModal from '../components/fileModal'; import moment from 'moment'; import './style.less' const Rest = (props) => { const { dispatch, actions, user, qiniu, loading, clientHeight, overallProjectId } = props const { install, means } = actions const [pomsList, setPomsList] = useState([]); //项目 const [showPomsList, setShowPomsList] = useState([]); //项目 const [pepProjectId, setPepProjectId] = useState() //项目id const [projectSearch, setProjectSearch] = useState() //项目搜索 const [isFileModal, setIsFileModal] = useState(false) //添加文件弹窗 const [editData, setEditData] = useState({}) //编辑参数 const [treeData, settreeData] = useState([]); //文件夹列表 const [higherFile, setHigherFile] = useState([]); //上级文件夹 const [fileId, setFileId] = useState(); //文件夹id const [uploadModal, setUploadModal] = useState(false) //上传弹窗 const [uploadData, setUploadData] = useState({}) const [dataSource, setDataSource] = useState([]) //表格数据 const [query, setQuery] = useState({ limit: 10, page: 0 }) const [count, setCount] = useState(0) const [videoModalV, setVideoModalV] = useState(false); const [videoUrl, setvideoUrl] = useState(null); const [hint, setHint] = useState(false); const [fileSearch, setFileSearch] = useState([]) //文件搜索 useEffect(() => { dispatch(install.getProjectPoms({ global: 1 })).then((res => { if (res.success) { let data = res.payload.data?.rows?.filter(v => v.pepProjectIsDelete !== 1)?.map(v => ({ pepProjectId: v.id, pepProjectName: v.pepProjectName || v.name })) setPomsList(data) setShowPomsList(data) setPepProjectId(data[0]?.pepProjectId) fileList(data[0]?.pepProjectId) } })) }, []) useEffect(() => { let data if (overallProjectId) { data = pomsList?.filter(v => (v.pepProjectName?.indexOf(projectSearch) != -1 && v.pepProjectId == overallProjectId)) } else { data = pomsList?.filter(v => v.pepProjectName?.indexOf(projectSearch) != -1) } setShowPomsList(data) setPepProjectId(data[0]?.pepProjectId) fileList(data[0]?.pepProjectId) setDataSource([]) setFileId('') setFileSearch('') }, [projectSearch]) useEffect(() => { setProjectSearch('') let data if (overallProjectId) { data = pomsList?.filter(v => v.pepProjectId == overallProjectId) } else { data = pomsList } setShowPomsList(data) setPepProjectId(data[0]?.pepProjectId) fileList(data[0]?.pepProjectId) setDataSource([]) setFileId('') setFileSearch('') }, [overallProjectId]) useEffect(() => { if (fileId) { filfolderFileListe() setQuery({ limit: 10, page: 0 }) setFileSearch('') } }, [fileId]) const fileList = (id) => { dispatch(means.fileList({ projectId: id, type: 1 })).then((res => { if (res.success) { let data = res.payload.data let oneLevel = res.payload.data?.filter(f => !f.higherFileId) || [] setHigherFile(data?.map(d => ({ name: d.fileName, value: d.id }))) dispatch(means.folderFileList({ fileId: JSON.stringify(data?.map(d => d.id)) })).then((s => { if (s.success) { // setFileLists(s.payload.data?.rows) settreeData(listErgodic(oneLevel, data, s.payload.data?.rows)) } })) } })) } const filfolderFileListe = (params) => { let fileIds = [] const treeDataList = (data, value) => { data?.map(c => { if (c.key == fileId || value) { fileIds.push(c.key) if (c.children?.length) { treeDataList(c.children, true) } } else if (c.children?.length) { treeDataList(c.children) } }) } treeDataList(treeData) let datas = params || query dispatch(means.folderFileList({ keyword: fileSearch, fileId: JSON.stringify(fileIds), ...datas, })).then((res => { if (res.success) { setDataSource(res.payload.data?.rows || []) setCount(res.payload.data?.count) } })) } const listErgodic = (level, datas, lists) => { let data = [] level.map(async v => { let list = { value: v.id, key: v.id, } let childrenList = datas?.filter(c => c.higherFileId == list.value) if (childrenList?.length) { list.children = listErgodic(childrenList, datas, lists) } let fileData = lists?.filter(d => d.fileId == v.id)?.length list.label =
{v.fileName}
{ setIsFileModal(true) setEditData({ id: v.id, fileName: v.fileName, higherFileId: v.higherFileId }) }} /> { if (!fileData && !list?.children?.length) { dispatch(means.delFile(v.id)).then((res => { if (res.success) { fileList(v.projectId) } })) } }} // onCancel={onCancel} >
data.push(list) }) return data } const column = [ { title: '文件名', dataIndex: 'name', key: 'name', render: (text) => text?.length > 30 ?
{text.slice(0, 30)}...
: text }, { title: '文件大小', dataIndex: 'size', key: 'size', render: (text) => { let show = '--' if (text < 1048576) { show = (text / 1024).toFixed(1) + ' KB' } else { show = (text / 1048576).toFixed(1) + ' MB' } return show } }, { title: '上传时间', dataIndex: 'uploadTime', key: 'uploadTime', render: (text) => text ? moment(text).format("YYYY-MM-DD HH:mm:ss") : '--' }, { title: '操作', key: 'operation', dataIndex: 'operation', render: (_, r) => { return
{(r.url?.indexOf("txt") !== -1 || r.url?.indexOf("rar") !== -1 || r.url?.indexOf("zip") !== -1) ? "" : }
} }, ] const data = [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park', tags: ['nice', 'developer'], }, { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park', tags: ['loser'], }, { key: '3', name: 'Joe Black', age: 32, address: 'Sydney No. 1 Lake Park', tags: ['cool', 'teacher'], }, ]; const preview = (url) => { let link = encodeURI(`${qiniu}/${url}`) if (url.indexOf("pdf") !== -1) { window.open(link) } else if (url.indexOf("png") !== -1 || url.indexOf("jpg") !== -1) { setVideoModalV(true) setvideoUrl(link) } else { window.open(`https://view.officeapps.live.com/op/view.aspx?src=${link}`) } } return ( //
setProjectSearch(v)} /> {showPomsList?.map(v => { return
{ setPepProjectId(v.pepProjectId) fileList(v.pepProjectId) setDataSource([]) setFileId('') }}>
{v.pepProjectName}
})}
{/* 文件夹———树 */}
{/* 添加文件弹窗 */} {isFileModal ? { setIsFileModal(false) setEditData({}) }} success={() => { fileList(pepProjectId) }} /> : "" } { setFileId(selectedKey) setFileSearch('') }} />
{/* 表格 */}
当前文件夹:{higherFile?.filter(c => c.value == fileId)[0]?.name ||
请选择文件夹
}
} value={fileSearch} onChange={v => { setFileSearch(v) filfolderFileListe({ keyword: v, limit: 10, page: 0 }) setQuery({ limit: 10, page: 0 }) }} />
{uploadModal ? { if (uploadData?.name) { dispatch(means.addFile({ ...uploadData, fileId: fileId })).then(v => { if (v.success) { setUploadModal(false) filfolderFileListe({ limit: 10, page: 0 }) setQuery({ limit: 10, page: 0 }) setUploadData({}) setHint(false) } }) } else { setHint(true) } }} width={607} onCancel={() => { setUploadModal(false) setHint(false) setUploadData({}) }} >
文件*
{ setUploadData({}) }} onSuccess={(responseBody, file) => { setUploadData({ name: file.name, size: file.size, url: responseBody?.uploaded, uploadTime: moment().format("YYYY-MM-DD HH:mm:ss") }) }} >
{hint && !uploadData?.name &&
请上传文件
}
: "" }
暂无文件 } onRow={(record, index) => { if (index % 1 === 0) { return { style: { background: '#FAFCFF' } } } }} // rowSelection={{ // // selectedRowKeys: selected || [], // getCheckboxProps: record => ({ // // disabled: record.confirmTime ? true : false, // // name: record.name, // }), // onSelect: (record, selected) => { // // console.log(`select row: ${selected}`, record); // }, // // onSelectAll: (selected, selectedRows) => { // // console.log(`select all rows: ${selected}`, selectedRows); // // }, // onChange: (selectedRowKeys, selectedRows) => { // // console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows); // // setSelected(selectedRows?.map(v => v.id)) // }, // }} /> {count > 0 ?
共{count}个文件 { setQuery({ limit: pageSize, page: currentPage - 1 }); filfolderFileListe({ limit: pageSize, page: currentPage - 1 }) }} />
: ""} {/*
勾选{selected.length}条问题
{count > 0 ?
共{count}个问题 { setQuery({ limit: pageSize, page: currentPage - 1 }); }} />
: ""}
*/} { videoModalV ? { setVideoModalV(false) setvideoUrl('') }} width={400} footer={null}>
: '' } // ) } function mapStateToProps (state) { const { auth, global, members, webSocket } = state; return { // loading: members.isRequesting, user: auth.user, actions: global.actions, overallProjectId: global.pepProjectId, // socket: webSocket.socket clientHeight: global.clientHeight, qiniu: global.qiniu?.domain }; } export default connect(mapStateToProps)(Rest);