irc_web/src/views/trials/trials-workbench/components/auditDocument/index.vue

1303 lines
46 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="auditDocument">
<el-row>
<el-col :span="12">
<h3>{{ isManage ? $t('trials:tab:updateAuditDocument') : $t('trials:tab:viewAuditDocument') }}</h3>
</el-col>
<el-col :span="12" style="text-align:right;">
<h3>
<Pagination class="page" :total="total" :page.sync="searchData.pageIndex"
:limit.sync="searchData.pageSize" layout="total, sizes, prev, pager, next" :background="false"
style="display: inline-block;" @pagination="getList" />
<el-button icon="el-icon-refresh-left" size="small" circle :title="$t('common:button:reset')"
@click="handleReset" />
</h3>
</el-col>
</el-row>
<el-form :inline="true" class="base-search-form">
<el-form-item>
<el-input v-model="searchData.Name" clearable
:placeholder="$t('trials:trials-workbench:auditDocument:placeholder:search')"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
<el-form-item v-if="isManage">
<el-button type="primary" @click.stop="addFolder">
{{ $t('trials:trials-workbench:auditDocument:button:addFolder') }}
</el-button>
<el-button type="primary" @click.stop="openFile(false)">
{{ $t('trials:trials-workbench:auditDocument:button:uploadFile') }}
</el-button>
<el-button type="primary" @click.stop="openFile(true)">
{{ $t('trials:trials-workbench:auditDocument:button:uploadFolder') }}
</el-button>
<el-button type="primary" :disabled="checkList.length <= 0" @click.stop="auth(true)">
{{ $t('trials:trials-workbench:auditDocument:button:auth') }}
</el-button>
<el-button type="primary" :disabled="checkList.length <= 0" @click.stop="downLoad(checkList)">
{{ $t('trials:trials-workbench:auditDocument:button:download') }}
</el-button>
<el-button type="primary" :disabled="checkList.length <= 0" @click.stop="delData(checkList)">
{{ $t('trials:trials-workbench:auditDocument:button:del') }}
</el-button>
</el-form-item>
</el-form>
<div class="catalogue">
<span>{{ $t('trials:trials-workbench:auditDocument:catalogue:title') }}</span>
<el-button icon="el-icon-top" class="last_catalogue" :disabled="!Id" @click.stop="toCatalogue(false)"
:title="$t('trials:trials-workbench:auditDocument:catalogue:lastCatalogue')"></el-button>
<el-breadcrumb separator-class="el-icon-arrow-right" class="catalogue_name_box">
<el-breadcrumb-item v-for="item of catalogueData" :key="item.Id">
<span class="catalogue_name" @click.stop="toCatalogue(item)">{{ item.Name }}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<el-table id="auditDocumentTable" ref="auditDocumentTable" :data="tableData" style="width: 99%" row-key="Id"
:loading="loading" :row-style="setRowStyle" v-adaptive="{ bottomOffset: 75 }" height="100" :border="true"
:expand-row-keys="expandedRows" :tree-props="{ children: 'Children', hasChildren: 'hasChildren' }"
@expand-change="handleExpandChange" @row-click="handleRowClick" @cell-mouse-enter="handleCellMouseEnter"
@cell-mouse-leave="handleCellMouseLeave" @row-contextmenu="handleRowContextmenu"
@row-dblclick="handleRowDblclick">
<el-table-column prop="date" :label="$t('trials:trials-workbench:auditDocument:table:name')" sortable
min-width="300" class-name="catalogue_box">
<template slot-scope="scope">
<div class="name_layout_box">
<div class="name_layout" v-if="renameId !== scope.row.Id">
<span class="name_box">
<i class="icon icon_folder" v-if="!scope.row.AuditDocumentTypeEnum" />
<img v-else-if="['png', 'jpg', 'jpeg'].includes(scope.row.FileFormat.toLowerCase())"
:src="OSSclientConfig.basePath + scope.row.FilePath" alt="" class="icon_image">
<i v-else :class="`icon icon_file icon_${scope.row.FileFormat}`" />
<span class="name" :title="scope.row.Name">{{ scope.row.Name }}</span>
<i class="el-icon-edit icon_edit" v-if="(hoverId === scope.row.Id) && isManage"
@click="addRenameId(scope.row)"
:title="$t('trials:trials-workbench:auditDocument:icon:rename')" />
</span>
<i :class="{ 'el-icon-circle-check': true, 'icon_check': true, isCheck: checkList.includes(scope.row.Id) }"
@click.stop="addCheck(scope.row)"
v-if="(hoverId === scope.row.Id || checkList.includes(scope.row.Id)) && isManage" />
</div>
<el-input v-model="scope.row.Name" :ref="`renameInp_${scope.row.Id}`" :autofocus="true"
class="renameInp" @blur="rename(scope.row)" v-else />
</div>
</template>
</el-table-column>
<el-table-column prop="FileFormat" :label="$t('trials:trials-workbench:auditDocument:table:fileType')">
<template slot-scope="scope">
<span>{{ formatFileType(scope.row) }}</span>
</template>
</el-table-column>
<el-table-column prop="FileSize" :label="$t('trials:trials-workbench:auditDocument:table:fileSize')">
<template slot-scope="scope">
<span>{{ formatFileSize(scope.row) }}</span>
</template>
</el-table-column>
<el-table-column prop="IsAuthorization"
:label="$t('trials:trials-workbench:auditDocument:table:IsAuthorization')" show-overflow-tooltip
sortable="custom" v-if="isManage">
<template slot-scope="scope">
<el-switch v-model="scope.row.IsAuthorization" @change="(val) => auth(false, scope.row, val)"
:active-value="true" :inactive-value="false" :active-text="$fd('YesOrNo', true)"
:inactive-text="$fd('YesOrNo', false)">
</el-switch>
</template>
</el-table-column>
<el-table-column prop="UpdateTime" show-overflow-tooltip
:label="$t('trials:trials-workbench:auditDocument:table:updateTime')">
</el-table-column>
<el-table-column prop="CreateTime" show-overflow-tooltip
:label="$t('trials:trials-workbench:auditDocument:table:createTime')">
</el-table-column>
</el-table>
<contextmenu ref="contextmenu" :isCopy="isCopy" :checkList="checkList" @handleMenu="handleMenu" />
<upload-files :config="config" :faccept="faccept" :uploadPath="uploadPath" :limitLength="limitLength"
v-if="config.visible" @close="close" @uplaodFile="uplaodFile" />
<detail ref="versionDetail" v-if="visible" :visible.sync="visible" :rowData="rowData"
@openContextmenu="openContextmenu" @openFileNewVersion="openFileNewVersion" @delData="delData" />
<viewer ref="picture_perview" style="margin: 0 10px"
v-if="rowData.FileFormat && ['png', 'jpg', 'jpeg'].includes(rowData.FileFormat.toLowerCase())"
:images="[`${OSSclientConfig.basePath}${rowData.FilePath}`]">
<img v-show="false" crossorigin="anonymous" :src="`${OSSclientConfig.basePath}${rowData.FilePath}`"
alt="Image" />
</viewer>
</div>
</template>
<script>
import { getAuditDocumentData, addAuditDocument, getBreadcrumbData, updateAuditDocument, deleteAuditDocument, setCurrentVersion, movieFileOrFolder, copyFileOrFolder, setIsAuthorization } from '@/api/trials'
import Pagination from '@/components/Pagination'
import contextmenu from './contextmenu.vue'
import uploadFiles from '@/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue'
import detail from './detail.vue'
import { downLoadFile } from '@/utils/stream.js'
const searchDataDefault = () => {
return {
Name: null,
pageIndex: 1,
pageSize: 20,
asc: false,
sortField: ''
}
}
export default {
name: "auditDocument",
components: { Pagination, contextmenu, uploadFiles, detail },
props: {
isManage: {
type: Boolean,
default: false
}
},
computed: {
isCopy() {
return (this.copyList && this.copyList.length > 0) || this.shearList && this.shearList.length > 0
}
},
data() {
return {
searchData: searchDataDefault(),
total: 0,
Id: null,
loading: false,
expandedRows: [],
tableData: [],
catalogueData: [], // 目录层级
visible: false, // 属性详情弹框
rowData: {}, // 属性详情数据
config: {
visible: false,
showClose: true,
width: '800px',
title: '',
appendToBody: false,
isFolder: false,
isVersion: false
},
uploadPath: '/System/AuditDocument',
faccept: ['.pdf'],
limitLength: 0,
checkList: [], // 选中的数据
hoverId: null, // hover中的数据
renameId: null, // 选中重命名的数据
copyList: [], // 选中复制的数据
shearList: [], // 选中剪切的数据
type: null, // 操作类型(右键菜单、键盘操作)
ctrlKey: false, // 键盘ctrl键是否按下
}
},
watch: {
isManage() {
this.Id = null;
this.resetOpt()
this.getBreadcrumbData()
this.getList()
}
},
methods: {
async auth(isArray = true, row, IsAuthorization) {
if (!this.isManage) return false
try {
let data = {}
if (isArray) {
data = {
Ids: this.checkList,
IsAuthorization: true,
}
} else {
data = {
Ids: [row.Id],
IsAuthorization,
}
}
this.loading = true
let res = await setIsAuthorization(data)
this.loading = false
if (res.IsSuccess) {
this.$t('trials:trials-workbench:auditDocument:message:authSuccessfully')
if (isArray) {
this.getList()
}
}
} catch (err) {
this.loading = false
if (!isArray) {
row.IsAuthorizedView = !row.IsAuthorizedView
}
console.log(err)
}
},
// 新建文件夹
addFolder() {
if (!this.isManage) return false
let parentData = {}, data = {
ParentId: null,
repeat: 0,
Type: "addFolder",
Name: this.$t("trials:trials-workbench:auditDocument:opt:addFloder"),
IsAuthorization: false,
AuditDocumentTypeEnum: 0,
Id: `addFolder_${Date.now()}`,
Children: []
}
if (!this.rowData || !this.rowData.Id) {
data.ParentId = this.Id
this.tableData.forEach(item => {
if (item.Name === data.Name) {
data.repeat++;
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
}
})
this.tableData.unshift(data)
this.addRenameId(data)
} else {
if (!this.rowData.AuditDocumentTypeEnum) {
parentData = this.getData(this.tableData, this.rowData.Id)
data.ParentId = parentData.Id
parentData.Children.forEach(item => {
if (item.Name === data.Name) {
data.repeat++;
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
}
})
if (!this.expandedRows.includes(parentData.Id)) {
this.expandedRows.push(parentData.Id)
this.$refs.auditDocumentTable.toggleRowExpansion(parentData, true)
}
parentData.Children.unshift(data)
this.addRenameId(data)
} else {
let fileData = this.getData(this.tableData, this.rowData.Id)
if (fileData.ParentId === this.Id) {
data.ParentId = this.Id
this.tableData.forEach(item => {
if (item.Name === data.Name) {
data.repeat++;
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
}
})
this.tableData.unshift(data)
this.addRenameId(data)
} else {
parentData = this.getData(this.tableData, this.fileData.ParentId)
data.ParentId = parentData.Id
parentData.Children.forEach(item => {
if (item.Name === data.Name) {
data.repeat++;
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
}
})
parentData.Children.unshift(data)
this.addRenameId(data)
}
}
}
},
// 获取当前目录层级
async getBreadcrumbData() {
if (!this.Id) return this.catalogueData = []
try {
let data = {
Id: this.Id
}
let res = await getBreadcrumbData(data)
if (res.IsSuccess) {
this.catalogueData = res.Result
}
} catch (err) { console.log(err) }
},
async getList(id) {
try {
this.searchData.Id = this.Id
this.loading = true
if (!this.isManage) {
this.searchData.IsAuthorization = true
} else {
this.searchData.IsAuthorization = null
}
let res = await getAuditDocumentData(this.searchData)
this.loading = false
if (res.IsSuccess) {
this.tableData = res.Result.CurrentPageData
this.total = res.Result.TotalCount
if (this.$refs.versionDetail) {
this.checkList = [id]
this.rowData = this.getData(this.tableData, id)
}
}
} catch (err) {
this.loading = false
console.log(err)
}
},
// 下载
async downLoad(list) {
if (!this.isManage) return false
try {
let arr = this.filterExternalIds(this.tableData, list)
if (arr && arr.length === 1) {
let data = this.getData(this.tableData, arr[0])
if (data.AuditDocumentTypeEnum) {
return await downLoadFile(
this.OSSclientConfig.basePath + data.FilePath,
data.Name
)
} else {
let dataArray = this.getDataPath([data])
let files = this.formatDownloadFile(dataArray)
console.log(files, 'files')
let name = `${data.Name}_${new Date().getTime()}.zip`
return await downLoadFile(files, name, 'zip')
}
} else {
let name = null
let id = this.findDeepestCommonParent(this.tableData, arr)
if (id) {
let d = this.getData(this.tableData, id)
name = `${d.Name}_${new Date().getTime()}.zip`
} else {
name = `AuditDocument_${new Date().getTime()}.zip`
}
let data = arr.map(id => this.getData(this.tableData, id))
let dataArray = this.getDataPath(data)
let files = this.formatDownloadFile(dataArray)
return await downLoadFile(files, name, 'zip')
}
} catch (err) {
console.log(err)
}
},
formatDownloadFile(list) {
let files = []
for (const item of list) {
let obj = {
name: item.Name.split('.')[1] ? item.Path : `${item.Path}.${item.FileFormat}`,
url: this.OSSclientConfig.basePath + item.FilePath
}
files.push(obj)
}
return files
},
findDeepestCommonParent(rootNodes, ids) {
// 构建节点ID到节点的映射
const nodeMap = new Map();
function buildMap(nodes) {
for (const node of nodes) {
nodeMap.set(node.Id, node);
if (node.Children && node.Children.length > 0) {
buildMap(node.Children);
}
}
}
buildMap(rootNodes);
// 生成每个ID的路径数组从根到当前节点
const paths = [];
for (const id of ids) {
const path = [];
let currentNode = nodeMap.get(id);
if (!currentNode) continue; // 忽略无效ID
// 向上遍历直到根节点
while (currentNode) {
path.unshift(currentNode.Id); // 插入到前面以形成根到当前路径
const parentId = currentNode.ParentId;
if (parentId === null) break; // 根节点无父节点
currentNode = nodeMap.get(parentId);
}
paths.push(path);
}
if (paths.length === 0) return null; // 无有效ID
// 寻找最长公共前缀
const findLongestCommonPrefix = (paths) => {
if (paths.length === 0) return [];
let common = paths[0];
for (let i = 1; i < paths.length; i++) {
const currentPath = paths[i];
let j = 0;
while (j < common.length && j < currentPath.length && common[j] === currentPath[j]) {
j++;
}
common = common.slice(0, j);
if (common.length === 0) break;
}
return common;
};
const lcp = findLongestCommonPrefix(paths);
return lcp.length > 0 ? lcp[lcp.length - 1] : null;
},
getDataPath(list, str = '', ARRAY = []) {
for (const item of list) {
console.log(item.AuditDocumentTypeEnum, str)
if (!str) {
item.Path = item.Name
} else {
item.Path = str + '/' + item.Name
}
if (item.AuditDocumentTypeEnum) {
ARRAY.push(item)
continue
} else {
if (item.Children && item.Children.length > 0) {
this.getDataPath(item.Children, item.Path, ARRAY)
}
}
}
return ARRAY
},
getData(list, Id, data = {}) {
for (const item of list) {
if (item.Id === Id) {
data = item
break
} else {
if (item.Children && item.Children.length > 0) {
data = this.getData(item.Children, Id, data)
}
}
}
return data
},
filterExternalIds(tree, ids) {
if (!tree || tree.length === 0 || !ids || ids.length === 0) return [];
const parentMap = this.buildParentMap(tree);
const idSet = new Set(ids);
const externalIds = new Set();
for (const id of ids) {
let currentId = parentMap.get(id);
while (currentId !== null) {
if (idSet.has(currentId)) {
externalIds.add(currentId);
}
currentId = parentMap.get(currentId);
}
}
return ids.filter(id => !externalIds.has(id));
},
buildParentMap(tree) {
const parentMap = new Map();
const traverse = (node, parentId) => {
parentMap.set(node.Id, parentId);
for (const child of node.Children) {
traverse(child, node.Id);
}
};
for (const root of tree) {
traverse(root, null);
}
return parentMap;
},
handleSearch() {
this.getList()
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
addCheck(row) {
if (!this.isManage) return false
let index = this.checkList.indexOf(row.Id)
if (!!~index) {
this.checkList.splice(index, 1)
} else {
this.checkList.push(row.Id)
}
},
addRenameId(row) {
if (!this.isManage) return false
this.renameId = row.Id
this.$nextTick(() => {
if (this.$refs[`renameInp_${row.Id}`]) {
this.$refs[`renameInp_${row.Id}`].focus()
}
})
},
async rename(row) {
if (!this.isManage) return false
try {
this.renameId = null
if (row.Type === 'addFolder') {
delete row.Id
let data = [row]
let res = await addAuditDocument(JSON.stringify(data))
if (res.IsSuccess) {
this.getList()
}
} else {
this.updateData(row)
}
} catch (err) {
console.log(rtt)
}
},
handleExpandChange(row, expanded) {
if (expanded && !this.expandedRows.find(Id => Id === row.Id)) {
this.expandedRows.push(row.Id)
}
if (!expanded) {
let index = this.expandedRows.indexOf(row.Id)
if (!!~index) {
this.expandedRows.splice(index, 1)
}
}
},
// 重置所有操作
resetOpt() {
this.expandedRows = []
this.checkList = []
this.hoverId = null
this.renameId = null
this.copyList = []
this.shearList = []
this.rowData = {}
},
// 跳转至目录
toCatalogue(row) {
if (!row) {
let data = this.catalogueData[this.catalogueData.length - 2]
if (data) {
return this.toCatalogue(data)
} else {
row = {}
}
}
this.Id = row.Id
this.resetOpt()
this.getList()
this.getBreadcrumbData()
},
// 设置当前版本
async setCurrentVersion(Id) {
if (!this.isManage) return false
try {
let data = {
Id
}
let res = await setCurrentVersion(data)
if (res.IsSuccess) {
this.getList(Id)
}
} catch (err) {
console.log(err)
}
},
// 复制数据
async copyData(list) {
if (!this.isManage) return false
try {
let DATA = this.getData(this.tableData, this.checkList[0])
let Ids = this.filterExternalIds(this.tableData, list)
let data = {
Ids: Ids,
ParentId: DATA.AuditDocumentTypeEnum ? DATA.ParentId : DATA.Id
}
let res = await copyFileOrFolder(data)
if (res.IsSuccess) {
this.getList()
this.copyList = []
}
} catch (err) {
console.log(err)
}
},
// 移动数据
async moveData(list) {
if (!this.isManage) return false
try {
let DATA = this.getData(this.tableData, this.checkList[0])
let Ids = this.filterExternalIds(this.tableData, list)
let data = {
Ids: Ids,
ParentId: DATA.AuditDocumentTypeEnum ? DATA.ParentId : DATA.Id
}
let res = await movieFileOrFolder(data)
if (res.IsSuccess) {
this.getList()
this.shearList = []
}
} catch (err) {
console.log(err)
}
},
// 删除数据
async delData(Ids) {
if (!this.isManage) return false
try {
let data = { Ids }
let res = await deleteAuditDocument(data)
if (res.IsSuccess) {
this.checkList = []
this.rowData = {}
this.getList(this.rowData.Id)
if (this.$refs.versionDetail) {
// this.$refs.versionDetail.getHistoricalVersion()
this.checkList = [this.rowData.Id]
}
}
} catch (err) {
console.log(err)
}
},
// 修改数据
async updateData(row) {
if (!this.isManage) return false
try {
let data = {
AuditDocumentTypeEnum: row.AuditDocumentTypeEnum,
FileFormat: row.FileFormat,
FilePath: row.FilePath,
FileSize: row.FileSize,
Id: row.Id,
IsAuthorization: row.IsAuthorization,
Name: row.Name,
ParentId: row.ParentId
}
let res = await updateAuditDocument(data);
} catch (err) {
this.getList()
console.log(err)
}
},
// 新增列表数据
async uplaodFile(list) {
if (!this.isManage) return false
console.log(list, 'list')
let data = []
if (this.config.isVersion) {
data.push({
ParentId: this.rowData.ParentId,
Name: this.rowData.Name,
IsAuthorization: this.rowData.IsAuthorization,
FileSize: list[0].FileSize,
filePath: list[0].FilePath,
FileFormat: list[0].FileFormat,
AuditDocumentTypeEnum: 1
})
} else {
data = this.formatData(list)
let ParentId = this.Id
if (this.rowData && this.rowData.Id) {
if (this.rowData.AuditDocumentTypeEnum) {
ParentId = this.rowData.ParentId
} else {
ParentId = this.rowData.Id
}
}
data.forEach(item => {
item.ParentId = ParentId
})
}
try {
let res = await addAuditDocument(JSON.stringify(data))
if (res.IsSuccess) {
let id = res.Result ? res.Result[0] : null
this.getList(id)
// if (this.$refs.versionDetail) {
// this.$refs.versionDetail.getHistoricalVersion()
// }
}
} catch (err) {
console.log(err)
}
},
// 格式化上传数据
formatData(arr) {
let list = [], strObj = {}
arr.forEach(item => {
if (item.catalogue) {
let catalogueStr = item.catalogue.split("/")
catalogueStr.pop()
let obj = {}, strKey = []
catalogueStr.forEach((str, index) => {
strKey.forEach((key, i) => {
if (i === 0) {
obj = strObj[key]
} else {
obj = obj[key]
}
})
if (index === 0) {
if (!strObj[str]) {
strObj[str] = {
children: []
}
}
} else {
if (!obj[str]) {
obj[str] = {
children: []
}
}
}
obj = obj[str] || strObj[str]
strKey.push(str)
})
console.log(obj, 'obj')
obj.children.push({
ParentId: null,
Name: item.FileName,
IsAuthorization: false,
FileSize: item.FileSize,
filePath: item.FilePath,
FileFormat: item.FileFormat,
AuditDocumentTypeEnum: 1
})
} else {
list.push({
ParentId: null,
Name: item.FileName,
IsAuthorization: false,
FileSize: item.FileSize,
filePath: item.FilePath,
FileFormat: item.FileFormat,
AuditDocumentTypeEnum: 1
})
}
})
let ARRAY = this.objToArr(strObj)
list = list.concat(ARRAY)
return list
},
objToArr(obj, list = []) {
Object.keys(obj).forEach(key => {
if (key !== 'children') {
let item = list.find(d => d.Name === key)
if (!item) {
let data = {
ParentId: null,
Name: key,
IsAuthorization: false,
AuditDocumentTypeEnum: 0,
children: obj[key].children
}
list.push(data)
}
this.objToArr(obj[key], obj[key].children)
}
})
return list;
},
// 格式化文件类型
formatFileType(row) {
if (!row.AuditDocumentTypeEnum) {
return this.$t('trials:trials-workbench:auditDocument:fileType:folder')
} else {
return row.FileFormat
// return `${row.FileFormat}${this.$t('trials:trials-workbench:auditDocument:fileType:file')}`
}
},
// 格式化文件大小
formatFileSize(row) {
if (!row.FileSize) return ''
if (row.FileSize < 1000) {
return row.FileSize + "B"
}
if (row.FileSize < 1000 * 1024) {
return (row.FileSize / 1024).toFixed(2) + "KB"
}
if (row.FileSize < 1000 * 1000 * 1024) {
return (row.FileSize / 1000 / 1024).toFixed(2) + "MB"
}
if (row.FileSize < 1000 * 1000 * 1000 * 1024) {
return (row.FileSize / 1000 / 1000 / 1024).toFixed(2) + "GB"
}
},
openFileNewVersion(faccept) {
if (!this.isManage) return false
this.faccept = [faccept]
this.limitLength = 1
this.config.title = this.$t(
'trials:trials-workbench:auditDocument:form:title:uploadFile'
)
this.config.visible = true
this.config.isVersion = true
this.config.isFolder = false
},
openFile(isFolder = false) {
if (!this.isManage) return false
this.faccept = [
'.jpg',
'.jpeg',
'.png',
'.pdf',
'.ppt',
'.pptx',
'.zip',
'.doc',
'.docx',
'.xls',
'.xlsx',
]
this.limitLength = 0
this.config.title = this.$t(
'trials:trials-workbench:auditDocument:form:title:uploadFile'
)
this.config.visible = true
this.config.isVersion = false
this.config.isFolder = isFolder
},
close() {
this.config.visible = false
this.faccept = ['.pdf']
this.limitLength = 0
},
// 预览文件
perview(data) {
if (['.pdf',
'.ppt',
'.pptx',
'.doc',
'.docx',
'.xls',
'.xlsx'].includes(`.${data.FileFormat.toLowerCase()}`)) {
this.$onlyOffice({
path: data.FilePath,
type: data.FileFormat,
title: data.Name
})
}
if (['.jpg',
'.jpeg',
'.png'].includes(`.${data.FileFormat.toLowerCase()}`)) {
this.$refs['picture_perview'].$viewer.show()
}
},
// 版本记录(右键菜单)
openContextmenu(data) {
if (!this.isManage) return false
let { e, row, type, zIndex } = data
this.$refs.contextmenu.init(e, row, type, zIndex)
},
// 单行右键单击(右键菜单)
handleRowContextmenu(row, column, e) {
if (!this.isManage) return false
e.preventDefault();
if (!this.checkList.includes(row.Id)) this.handleRowClick(row, {}, e)
if (this.checkList.length > 1) return this.$refs.contextmenu.init(e, row, 'files')
if (!row.AuditDocumentTypeEnum) return this.$refs.contextmenu.init(e, row, 'folder')
this.$refs.contextmenu.init(e, row, 'file')
},
// 单行左键双击(进入文件夹或者预览文件)
handleRowDblclick(row) {
if (!row.AuditDocumentTypeEnum) {
this.Id = row.Id
this.resetOpt()
this.getList()
this.getBreadcrumbData()
} else {
this.perview(this.rowData)
}
},
// 单行左键单击
handleRowClick(row, column, e) {
e.stopPropagation();
this.rowData = row
// let index = this.checkList.indexOf(row.Id)
if (this.ctrlKey) {
this.checkList.push(row.Id)
} else {
this.checkList = [row.Id]
}
// if (this.ctrlKey) {
// if (!!~index) {
// this.checkList.splice(index, 1)
// } else {
// this.checkList.push(row.Id)
// }
// } else {
// if (this.checkList.length > 1 || this.checkList.length <= 0) {
// this.checkList = [row.Id]
// } else {
// if (!!~index) {
// this.checkList.splice(index, 1)
// } else {
// this.checkList = [row.Id]
// }
// }
// }
},
// 单行hover移入
handleCellMouseEnter(row) {
this.hoverId = row.Id
},
// 单行hover移出
handleCellMouseLeave() { this.hoverId = null },
// 右键菜单操作
handleMenu(data) {
if (!this.isManage) return false
let { key, row } = data
console.log(key, row)
this.type = key;
if (key === 'rename') {
// this.renameId = this.checkList[0]
this.addRenameId(row)
}
if (key === 'version') {
this.visible = true
}
if (key === 'open') {
if (!this.rowData.AuditDocumentTypeEnum) {
this.Id = this.rowData.Id
this.resetOpt()
this.getList()
this.getBreadcrumbData()
} else {
this.perview(this.rowData)
}
}
if (key === 'del') {
this.delData(this.checkList)
}
if (key === 'delVersion') {
this.delData([row.Id])
}
if (key === 'delAllVersion') {
if (this.$refs.versionDetail) {
this.$refs.versionDetail.delAll()
}
}
if (key === 'setVersion') {
this.setCurrentVersion(row.Id)
}
if (key === 'copy') {
this.copy()
}
if (key === 'shear') {
this.shear()
}
if (key === 'stickup') {
this.stickup()
}
if (key === 'downLoad') {
this.downLoad(this.checkList)
}
},
setRowStyle({ row, rowIndex }) {
if (this.checkList.includes(row.Id)) {
return {
backgroundColor: '#cce8ff', // 错误行红色背景
}
}
},
// 复制
copy() {
if (!this.checkList || this.checkList.length <= 0) return this.$message.warning(this.$t("trials:trials-workbench:auditDocument:message:nothingCopy"))
this.copyList = [...this.checkList]
this.shearList = []
this.$message.success(this.$t("trials:trials-workbench:auditDocument:message:copySuccess"))
},
// 剪切
shear() {
if (!this.checkList || this.checkList.length <= 0) return this.$message.warning(this.$t("trials:trials-workbench:auditDocument:message:nothingShear"))
this.shearList = [...this.checkList]
this.copyList = []
this.$message.success(this.$t("trials:trials-workbench:auditDocument:message:shearSuccess"))
},
// 粘贴
stickup() {
if (this.checkList.length > 1) return this.$message.warning(this.$t("trials:trials-workbench:auditDocument:message:stickupCheckDataMore"))
if (this.shearList && this.shearList.length > 0) return this.moveData(this.shearList)
if (this.copyList && this.copyList.length > 0) return this.copyData(this.copyList)
},
// 键盘事件(按下)
keydown(e) {
if (!this.isManage) return false
this.ctrlKey = e.ctrlKey
if (e.key === 'Control') {
e.preventDefault();
}
if (e.ctrlKey && e.key === 'c') {
e.preventDefault();
this.type = 'copy'
this.copy()
}
if (e.ctrlKey && e.key === 'v') {
e.preventDefault();
this.type = 'stickup'
this.stickup()
}
if (e.ctrlKey && e.key === 'x') {
e.preventDefault();
this.type = 'shear'
this.shear()
}
},
// 键盘事件(松开)
keyup(e) {
if (!this.isManage) return false
this.ctrlKey = e.ctrlKey
},
docClick() {
this.checkList = []
}
},
mounted() {
document.addEventListener('keydown', this.keydown);
document.addEventListener('keyup', this.keyup);
let table = document.getElementById("auditDocumentTable")
table.addEventListener('click', this.docClick);
this.getList()
this.getBreadcrumbData()
},
destroyed() {
document.removeEventListener('keydown', this.keydown);
document.removeEventListener('keyup', this.keyup);
}
}
</script>
<style lang="scss" scoped>
.base-search-form .el-form-item {
margin-bottom: 22px;
}
.auditDocument {
// position: relative;
::v-deep .catalogue_box.el-table__cell {
.cell {
display: flex;
align-items: center;
}
}
}
.renameInp {
::v-deep .el-input__inner {
line-height: 23px;
height: 23px;
}
}
.name_layout_box {
display: inline-block;
flex: 1 1 0%;
min-width: 0;
}
.catalogue {
width: 99%;
display: flex;
align-items: center;
margin: 0 0 22px;
span {
font-size: 16px;
}
.last_catalogue {
width: 24px;
height: 24px;
line-height: 24px;
text-align: center;
border: 1px solid #ddd;
// cursor: pointer;
padding: 0;
border-radius: 4px 0 0 4px;
// &:hover {
// background-color: #e4f8ff;
// border-color: #aedaff;
// }
}
.catalogue_name_box {
flex: 1 0 0%;
box-sizing: border-box;
border: 1px solid #ddd;
border-left: none;
padding: 0 10px;
border-radius: 0 4px 4px 0;
height: 24px;
line-height: 24px;
}
.catalogue_name {
cursor: pointer;
font-size: 14px;
&:hover {
color: #3b8cff;
}
}
}
.name_layout {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.name_box {
display: flex;
align-items: center;
width: calc(100% - 20px);
.name {
max-width: calc(100% - 60px);
white-space: nowrap;
/* 文本不换行 */
overflow: hidden;
/* 超出部分隐藏 */
text-overflow: ellipsis;
}
}
}
.icon_edit {
cursor: pointer;
color: rgba(0, 0, 0, 0.3);
margin-left: 2px;
&:hover {
color: rgba(0, 0, 0, 0.5);
}
}
.icon_check {
font-size: 18px;
cursor: pointer;
color: rgba(0, 0, 0, 0.3);
&:hover {
color: rgba(0, 0, 0, 0.5);
}
}
.isCheck {
color: #3b8cff;
}
::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell {
background-color: #e5f3ff
}
.icon_image {
max-height: 20px;
max-width: 20px;
padding: 0px;
line-height: 20px;
margin-right: 6px;
// margin-top: 6px;
}
.icon {
height: 20px;
width: 20px;
padding: 0px;
line-height: 20px;
margin-right: 6px;
margin-top: 6px;
}
/*文件*/
.icon_file {
width: 16px !important;
height: 16px !important;
margin-right: 6px;
background-size: inherit;
background-image: url(@/assets/0.file-16.png);
background-position: 0 0;
margin-top: -2px;
background-repeat: no-repeat;
font-style: normal;
display: inline-block;
pointer-events: none;
font-size: 85%;
}
/*文件夹*/
.icon_folder {
background-image: url(@/assets/folder_win11_small.png);
margin-top: -6px;
margin-left: 2px;
margin-right: 6px;
background-repeat: no-repeat;
}
/*docx*/
.icon_docx {
background-position: -81px -560px !important;
margin-top: 0;
margin-left: 2px;
}
/*doc*/
.icon_doc {
background-position: -81px -592px !important;
margin-top: 0;
margin-left: 2px;
}
/*xlsx*/
.icon_xlsx {
background-position: -81px -48px !important;
margin-top: 0;
margin-left: 2px;
}
/*pdf*/
.icon_pdf {
background-position: -81px -352px !important;
margin-top: 0;
margin-left: 2px;
}
/*pptx*/
.icon_pptx {
background-position: -81px -288px !important;
margin-top: 0;
margin-left: 2px;
}
/*zip*/
.icon_zip {
background-position: 0 0 !important;
margin-top: -2px;
margin-left: 2px;
}
/*ppt*/
.icon_ppt {
background-position: -81px -304px !important;
margin-top: 0;
margin-left: 2px;
}
/*xls*/
.icon_xls {
background-position: -81px -96px !important;
margin-top: 0;
margin-left: 2px;
}
</style>