import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import { Spin, Table, Popconfirm, Button, Input, Row, Col } from 'antd';
import { ButtonGroup } from '$components';
import moment from 'moment';
import FileSaver from 'file-saver';
import MetadataFileModal from '../components/metadataFileModal';
import MetadataTagModal from '../components/metadataTagModal';
import MetadataResourceModal from '../components/metadataResourceModal';
import { RouteRequest } from '@peace/utils';
import { RouteTable } from '$utils'
const FilesTable = (props) => {
const { user, dispatch, actions, clientHeight, resourceCatalogId, resourceCatalogKey,
isRequesting, metadataModels, tagList, metadataResourceApplications, params } = props;
const { metadataManagement } = actions;
const SortValues = { 'ascend': 'asc', 'descend': 'desc' };
const [tableData, setTableData] = useState([]);
const [tableDataCount, setTableDataCount] = useState(0);//Table数据
const [updateAtSort, setUpdateAtSort] = useState('descend');
const [keywords, setKeywords] = useState('');
const [limit, setLimit] = useState(10);
const [currentPage, setCurrentPage] = useState(1);
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [selectedRows, setSelectedRows] = useState([]);
const [modalVisible, setModalVisible] = useState(false);
const [editData, setEditData] = useState({});
const [tagModalVisible, setTagModalVisible] = useState(false);
const [editTagData, setEditTagData] = useState({});
const [resourceModalVisible, setResourceModalVisible] = useState(false);
const [editResourceData, setEditResourceData] = useState({});
useEffect(() => {
dispatch(metadataManagement.getTagList());
setUpdateAtSort('descend');
initData({ limit, offset: currentPage - 1, orderDirection: SortValues[updateAtSort] });
}, []);
const initData = (query = {}) => {
dispatch(metadataManagement.getMetadataFiles({ resourceId: params?.type == 'files' ? params?.resourceId : null, catalog: resourceCatalogId, keywords, orderBy: 'updateAt', ...query })).then(res => {
if (res.success) {
setTableData(res.payload.data.rows);
setTableDataCount(res.payload.data.count);
let resourceNames = [];
res.payload.data.rows.map(r => {
resourceNames.push(r.name);
})
if (resourceNames.length)
dispatch(metadataManagement.getMetadataResourceApplications({ resourceNames: resourceNames.join(','), type: '文件' }))
}
})
}
const onEdit = (record) => {
dispatch(metadataManagement.getMetadataModels({ modelTypes: '文件' })).then(res => {
if (res.success) {
setEditData({
title: '修改文件元数据', record: {
...record, ...record.attributesParam,
files: record.fileName ? [{
url: "\\assets\\files\\common\\" + record.fileName, name: record.fileName.split('_').pop()
}] : []
}
});
setModalVisible(true);
}
})
}
const confirmDelete = (record) => {
dispatch(metadataManagement.delMetadataFiles(record.id)).then(res => {
if (res.success) {
onSearch(); setModalVisible(false);
deleteFile({ url: "\\assets\\files\\common\\" + record.fileName })
}
});
}
//删除文件
const deleteFile = (file) => {
if (file.url) {
RouteRequest.delete(RouteTable.cleanUpUploadTrash, { url: file.url });
};
}
const marking = (id) => {
dispatch(metadataManagement.getTagMetadata(id, 'file')).then(res => {
if (res.success) {
const obj = { tagSet: [], tags: [], id: id };
if (res.payload.data.length) {
const tagSetIds = res.payload.data.map(d => d.tagSet)
obj.tagSet = [...new Set(tagSetIds)];
obj.tags = res.payload.data.map(d => d.id);
}
setEditTagData({ record: obj });
setTagModalVisible(true);
}
})
}
const onConfirmTag = (values) => {
dispatch(metadataManagement.postTagMetadata({ file: editTagData.record.id, ...values })).then(res => {
if (res.success) {
onSearch(); setTagModalVisible(false);
}
});
}
const applyResources = (record) => {
setEditResourceData({ record: { resourceId: record.id, resourceName: record.name, applyBy: user.id, applyByName: user.name, resourceType: '文件' } });
setResourceModalVisible(true);
}
const onConfirmResource = (values) => {
dispatch(metadataManagement.postMetadataResourceApplications(values)).then(res => {
if (res.success) {
onSearch(); setResourceModalVisible(false);
}
});
}
const onTableChange = (pagination, filters, sorter) => {
let limit = Number.parseInt(pagination.pageSize);
let offset = Number.parseInt(pagination.current) - 1;
setCurrentPage(pagination.current);
setLimit(limit);
let query = { offset, limit, orderDirection: SortValues[updateAtSort] };
if (sorter.columnKey === 'updateAt') {
query.orderDirection = SortValues[sorter.order];
setUpdateAtSort(sorter.order);
}
setSelectedRowKeys([]);
setSelectedRows([]);
initData(query);
}
const getfilesize = (size) => {
if (!size)
return "0K";
var num = 1024.00; //byte
if (size < num)
return size + "B";
if (size < Math.pow(num, 2))
return (size / num).toFixed(2) + "KB"; //kb
if (size < Math.pow(num, 3))
return (size / Math.pow(num, 2)).toFixed(2) + "M"; //M
if (size < Math.pow(num, 4))
return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
}
const columns = [
{
title: '文件名称',
dataIndex: 'name',
key: 'name',
width: '16%',
ellipsis: true
}, {
title: '文件描述',
dataIndex: 'description',
key: 'description',
width: '29%',
ellipsis: true
}, {
title: '文件类型',
dataIndex: 'type',
key: 'type',
width: '10%',
render: (text, record) => {
if (record.fileName)
return {text}
else
return ''
}
}, {
title: '标签',
dataIndex: 'tags',
key: 'tags',
width: '18%',
ellipsis: true,
render: (text, record, index) => {
let tagName = record.tagFiles.map(tagSet => tagSet.tag.name);
return tagName.join(',');
}
}, {
title: '大小',
dataIndex: 'size',
key: 'size',
width: '10%',
render: (text, record) => {
if (record.fileName)
return {getfilesize(text)}
else
return ''
}
}, {
title: '修改时间',
dataIndex: 'updateAt',
key: 'updateAt',
width: '18%',
sortOrder: updateAtSort,
sorter: (a, b) => moment(a.updateAt).valueOf() - moment(b.updateAt).valueOf(),
sortDirections: ['descend', 'ascend', 'descend'],
render: (text, record, index) => {
return text && moment(text).format('YYYY-MM-DD HH:mm:ss') || ''
}
}, {
title: '操作',
dataIndex: 'action',
width: '8%',
render: (text, record) => {
let resourceApplicationsRecords = metadataResourceApplications.filter(ra =>
ra.applyBy == user.id && ra.resourceName === record.name && ra.resourceId == record.id && !!record.token);
return