Commit de659319 authored by zhengke's avatar zhengke

回收站

parent 9b1785dc
......@@ -3,6 +3,13 @@ import Api,{ HttpResponse, Result } from './../utils/request';
class FolderService{
/**
* 恢复文件
*/
static async UpdateTripOtherStatus(params : any):Promise<HttpResponse>{
return Api.Post("triptemplate_UpdateTripOtherStatus",params)
}
/**
* 我的回收站
*/
......
......@@ -80,6 +80,7 @@
<StarTarget :current-menu="currentMenu" v-if="currentMenu==1"></StarTarget>
<journeyAds :position="position" :current-menu="currentMenu" v-if="currentMenu==3||currentMenu==4" @destroy-position="()=>position=null"></journeyAds>
<ShareList v-if="currentMenu==2"></ShareList>
<RecycleBin :current-menu="currentMenu" v-if="currentMenu==-1"></RecycleBin>
</div>
</div>
</div>
......@@ -94,6 +95,7 @@ import BrowsingHistory from './components/BrowsingHistory.vue'
import StarTarget from './components/StarTarget.vue'
import ShareList from './Share.vue';
import journeyAds from './components/journeyAds.vue'
import RecycleBin from './components/RecycleBin.vue'
import { Plus,ArrowDown,Clock,Star,Share,Picture,Management,Delete,RefreshRight,Refresh,Loading } from '@element-plus/icons-vue';
import { injectKeyTemplate } from '@/types/injectKey'
......
<template>
<div class="q-px-md q-pt-lg">
<div class="q-pl-lg row q-mb-lg">
<div class="col row items-center q-pl-md">
<h5 class="row items-center">
<span
class="pointer"
@click="BackInquire"
><el-icon class="q-pt-md" v-if="queryObj.FileId > 0" size="20"
><ArrowLeft /></el-icon
></span>
<span class="q-pl-md"
:class="[queryObj.FileId == 0?'':'row items-center']">
<span class="pointer" @click="queryObj.FileId=0,refreshHandler()">
回收站
</span>
</span>
</h5>
<div class="select-btn q-pl-lg pointer q-mt-sm">
<el-icon>
<RefreshRight
v-if="!datas.journeyAds.RefreshLoading"
@click="() => refreshHandler()"
/>
<Refresh v-else />
</el-icon>
</div>
</div>
<div>
</div>
</div>
</div>
<div
ref="SellTemplateRef"
class="journeyAds-container"
style="height: 100%; overflow: auto"
>
<el-scrollbar @scroll="scrollingHandler" class="q-px-md" style="height: 100%;">
<journeyAdsList
:current-menu="currentMenu"
:position="position"
:set-file-list="datas.setFileList"
:list="dataList"
:msg="queryObj"
:navigations="Navigations"
:selected-datas="datas.selectedDatas"
@UpdateData="UpdateData"
@success="success"
@refreshHandler="refreshHandler"></journeyAdsList>
<div
v-if="dataList.length == 0 && !loading"
class="q-mt-lg bg-white rounded"
style="padding: 30px 10px 30px 10px"
>
<el-empty description="暂无数据" />
</div>
<el-divider
class="no-bg q-mt-lg"
v-if="queryObj.pageCount == queryObj.pageIndex && !loading && queryObj.pageCount != 1"
>
<span
class="text-small bg-white"
style="padding: 0 10px; color: #a3a3a3"
>已加载完成所有数据</span
>
</el-divider>
<div
style="height: 40px"
class="q-mt-md no-bg"
background="transparent"
v-loading="loading"
element-loading-text="正在加载中"
></div>
</el-scrollbar>
</div>
<Folder
:folder-id="folderObj?.id"
:folder-name="folderObj?.name"
:parent-id="folderObj.parentId"
:folder-type="folderObj?.type"
v-if="folderObj.id > -1"
@close="() => (folderObj.id = -1)"
@success="refreshHandler()"
></Folder>
</template>
<script setup lang="ts">
import { ref, reactive, provide, watch, inject, onMounted, PropType } from "vue";
import { ElLoading, ElMessage, ElMessageBox } from "element-plus";
import { MoreFilled, Edit, ArrowLeft,CopyDocument,DCaret,CaretTop,CaretBottom,Position } from "@element-plus/icons-vue";
import ConfigService from "@/services/ConfigService";
import FolderService from "@/services/FolderService";
import { injectKeyTemplate } from "@/types/injectKey";
import { getDaysBetween,formatDateTimeToRead } from "@/utils/common";
import { useSellTemplateStore, useScreenStore, useSlidesStore } from "@/store";
import ShareForm from "./ShareForm.vue";
import Folder from "./Folder.vue";
import HistoricalVersion from "./HistoricalVersion.vue";
import TreeFileRecover from "./TreeFileRecover.vue";
import breadPeeling from "./breadPeeling.vue";
import { ApiResult } from "@/configs/axios";
import journeyAdsList from "./journeyAdsList.vue";
const SalesEditorStore = useSellTemplateStore();
const marketStore = useScreenStore();
const props = defineProps({
currentMenu: {
type: Number,
default: 3,
},
position:{
type:Object as PropType<{FileId:number,FileType:1|2,Position:{FileId:number,FileName:string}[]}|null>,
default:null
}
});
const PopoverVisibleControls = ref(false);
const journeyAdsDetails = ref('');
const isTreeFile = ref(false)
const Navigations = ref([] as Array<any>);
const dataList = ref([] as Array<any>);
const NewDataList = ref([] as Array<any>);
const searchData = ref({} as any);
searchData.value = inject(injectKeyTemplate);
const datas = reactive({
selectedDatas: [] as Array,
selectAll: false as any,
journeyAds: { RefreshLoading: false } as any,
fileList: [] as any,
setFileList: [] as any,
});
const folderObj = ref<{
id: number;
name: string;
parentId: number;
type: number;
}>({ id: -1, name: "", parentId: 0, number: 1 });
let TemplateType = 0;
if (searchData.value.SellTemplateType)
TemplateType = searchData.value.SellTemplateType;
const emit = defineEmits<{
(event: 'destroy-position'): void
}>()
const queryObj = reactive({
pageIndex: 1,
pageSize: 50,
pageCount: 0, //总页数
FileName: '',
FileType: 0
});
const loading = ref(false as any);
const SellTemplateRef = ref<any>();
// 已选数据
const UpdateData = (obj:any) =>{
if(obj){
if(obj.list) dataList.value = obj.list
if(obj.selectedDatas) datas.selectedDatas = obj.selectedDatas
}
}
const success = () => {
isTreeFile.value = false;
datas.selectedDatas = [];
for (let index = 0; index < dataList.value.length; index++) {
const element = dataList.value[index]
element.singleChoice = false;
}
refreshHandler()
}
// 导航
const BackInquire = () => {
datas.selectedDatas = [];
let Navigation = Navigations.value[Navigations.value.length-2]
if(Navigation&&Navigation.FileId){
breadPeelingInquire(Navigation.FileId,Navigations.value.length-2)
}else breadPeelingInquire(0,0)
}
const breadPeelingInquire = (FileId:number,index:number)=> {
datas.selectedDatas = [];
Navigations.value.splice(index+1, Navigations.value.length-1)
queryObj.FileId = FileId
refreshHandler()
}
const querySearchHandler = async () => {
if(loading.value) return
loading.value = true;
try {
if (queryObj.pageIndex == 1) dataList.value = [];
let pageRes = await FolderService.GetTripOtherRecycleBinPage(queryObj);
if (pageRes.data.resultCode == 1) {
let arrList = function (list) {
list.forEach((x) => {
x.show = false;
x.singleChoice = false;
x.Id = ''
x.showSelect = false
const date1 = new Date();
const date2 = new Date(x.UpdateTime);
x.Day = getDaysBetween(date1, date2);
});
};
arrList(pageRes.data.data.pageData);
datas.selectedDatas = Array.from(new Set(datas.selectedDatas))
dataList.value = dataList.value.concat(pageRes.data.data.pageData);
queryObj.pageCount = pageRes.data.data.pageCount;
}
loading.value = false;
datas.journeyAds.RefreshLoading = false;
} catch (error) {
loading.value = false;
datas.journeyAds.RefreshLoading = false;
}
};
const scrollingHandler = () => {
if (SellTemplateRef.value && !loading.value) {
let maxHeight =
SellTemplateRef.value.scrollHeight - SellTemplateRef.value.offsetHeight;
let scrollTop = SellTemplateRef.value.scrollTop;
if (
(maxHeight - scrollTop == 0 || maxHeight - scrollTop < 1) &&
queryObj.pageCount > queryObj.pageIndex
) {
queryObj.pageIndex++;
querySearchHandler();
}
}
};
const refreshHandler = (obj:any) => {
if(obj){
if(obj.FileId) {
queryObj.FileId = obj.FileId
datas.selectedDatas = []
}
if(obj.OrderByType) queryObj.OrderByType = obj.OrderByType
if(obj.Navigations) Navigations.value = obj.Navigations
}
datas.journeyAds.RefreshLoading = true;
queryObj.pageIndex = 1;
querySearchHandler();
};
const operaFolder = (id: number, name: string) => {
folderObj.value.id = id;
folderObj.value.name = name;
folderObj.value.type = queryObj.FileType;
folderObj.value.parentId = queryObj.FileId
};
const checkPositionHandler = (n:any)=>{
if(n){
if(n.Position && n.Position.length>0){
Navigations.value=n.Position
queryObj.FileId = n.Position[n.Position.length-1].FileId
queryObj.FileType = 0
}else{
Navigations.value=[]
queryObj.FileId = 0
queryObj.FileType = n.FileType
}
emit('destroy-position')
}
}
watch(
() => searchData.value.SellTemplateType,
(n, o) => {
datas.selectedDatas = [];
queryObj.FileType = n;
queryObj.FileId = 0;
refreshHandler();
}
);
watch(() => queryObj.FileId,(n, o) => {
if(!n) Navigations.value = []
}
);
watch(() => props.position,(n,o)=>{
if(n){
checkPositionHandler(n)
refreshHandler()
}
},{
deep:true
})
onMounted(() => {});
checkPositionHandler(props.position)
querySearchHandler();
</script>
<style lang="scss" scoped>
@import url("../../../assets/styles/common.css");
.SelectAllBox {
position: relative;
top: 3px;
}
.journeyAds-title {
}
.journeyAds-TitleCenter {
width: 100%;
height: 18px;
margin-bottom: 3px;
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
white-space: wrap; /* 不换行 */
position: relative;
padding-right: 20px;
}
.journeyAds-TitleCenter span {
position: absolute;
right: 16px;
top: 0px;
}
.journeyAds-Input {
padding-right: 20px;
position: relative;
margin-bottom: 2px;
::v-deep(.el-textarea__inner) {
padding: 5px;
background: #f5f5f5;
}
}
.journeyAds-container {
position: relative;
overflow: auto;
}
.journeyAds-container th {
background: #fff;
position: sticky;
top: 0px;
z-index: 2;
}
.journeyAdsple-table td > div {
display: flex;
}
.journeyAdsple-table td,
.journeyAds-container th {
border-bottom: 1px solid #f6f6f6;
}
.journeyAdsple-table td:first-child,
.journeyAdsple-table td:nth-child(2),
.journeyAds-container th:first-child {
border: 0;
}
.journeyAdsple-table td {
padding-bottom: 6px;
}
.journeyAdsple-table td:nth-child(2) {
padding-bottom: 0;
}
.hoverShow {
opacity: 0;
}
.journeyAdsple-table:hover .hoverShow {
opacity: 1;
}
.share-icon-box{
position: relative;
}
.share-icon-box::after{
display: block;
position: absolute;
bottom: -4px;
right: 6px;
content: " ";
background: url('../../../assets/img/share.png');
width: 14px;
height: 14px;
z-index: 2;
}
.active {
color: $themeColor;
}
</style>
\ No newline at end of file
......@@ -29,17 +29,6 @@
</div>
</div>
<div>
<el-dropdown v-if="datas.selectedDatas.length>0" trigger="click" class="q-px-md">
<el-button>
<el-icon><CopyDocument /></el-icon>
<span class="">批量操作</span>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item icon="Expand" @click="MoveFile(0)">移动至</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<!--
<el-dropdown trigger="click">
<el-button>新建</el-button>
......@@ -172,11 +161,6 @@
journeyAds: { RefreshLoading: false } as any,
fileList: [] as any,
setFileList: [] as any,
pdfImg:
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708337830000_43.png",
adsImg:
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708250377000_777.png",
folderImg: "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708250377000_777.png",
});
const folderObj = ref<{
id: number;
......
<template>
<el-dialog v-model="show" v-loading="loading" :show-close="false"
:close-on-press-escape="false" :close-on-click-modal="false"
style="width: 260px;">
<template #header>
<div class="row overflow-hide">
<div>
<img v-if="details.FileType>0" class="q-px-md"
:src="details.FileType==1?datas.pdfImg:datas.adsImg"
style="height: 43px;" />
<img v-else class="q-px-md"
src="@/assets/img/file.png"
style="height: 43px;" />
</div>
<div class="q-pl-md col">
<div class="row flex-center">
<el-tooltip
placement="top-start">
<template #content><div class="text-center" style="width: 200px;">{{details.FileName}}</div></template>
<div class="TreeFile-Title pointer">{{details.FileName}}</div>
</el-tooltip>
</div>
<div class="text-small text-5B5D62 q-pt-sm">
<template v-if="details">
创建者:{{details.CreateName}}
</template>
<div v-else class="row items-center">
<div class="TreeFile-Title text-sm pointer">恢复文件</div>
</div>
</div>
</div>
</div>
</template>
<div class="TreeFile-container">
<!-- <el-input class="q-pb-md q-px-md" v-model="filterText" placeholder="关键词检索文件夹" />
<el-tree
ref="treeRef"
:data="dataList"
:props="defaultProps"
node-key="FileId"
default-expand-all
show-checkbox
check-strictly
:filter-node-method="filterNode"
@check="handleTreeNodeClick"/>-->
<el-tree-select
placeholder="请选择文件"
node-key="FileId"
:props="defaultProps"
v-model="datas.FolderId"
:data="dataList"
check-strictly
:render-after-expand="false"
style="width: 220px"
filterable
@current-change="handleTreeNodeClick"
/>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="()=>closedhandler()">关闭</el-button>
<el-button :disabled="datas.FolderId==null" type="primary" @click="()=>save()"> 保存恢复 </el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ApiResult } from '@/configs/axios';
import OrgService from '@/services/OrgService';
import { ref,reactive,watch } from 'vue';
import { View,Download,EditPen,Delete } from '@element-plus/icons-vue';
import { ElMessage,ElTree } from 'element-plus';
import FolderService from "@/services/FolderService";
const props = defineProps({
details:{
type:Object,
required:''
},
selectedDatas:{
type: Array,
required:[]
},
setFileList:{
type: Array,
required:[]
},
fileType: {
type:Number,
required: 1
},
fileId:{
type: Number,
required: ''
}
})
const emit = defineEmits<{
(event: 'close'): void,
(event: 'success'): void
}>()
interface Tree {
[key: string]: any
}
const filterText = ref('')
const treeRef = ref<InstanceType<typeof ElTree>>()
const defaultProps = {
children: 'ChildList',
label: 'FileName',
disabled: 'disabled',
}
const datas = reactive({
pdfImg: 'https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708337830000_43.png',
adsImg: 'https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708250377000_777.png',
fileList: [] as Tree[],
FolderId: null as Number,
FolderObj: {},
checkedKeys: null as any
})
const show=ref(true)
const loading = ref(true)
const deleteLoading = ref<any>(null);
const dataList=ref([])
const closedhandler=()=>{
emit('close')
}
const handleTreeNodeClick = (data:any) => {
datas.FolderObj = data
}
const filterNode = (value: string, data: Tree) => {
if (!value) return true
return data.FileName.includes(value)
}
const save = () => {
let title = ''
let Ids = ''
title = props.details.FileName
Ids = props.details.FileId
ElMessageBox.confirm(`此操作将${title}恢复到${datas.FolderObj.FileName},是否确定?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
try {
let queryMsg = {
Ids: Ids,
TargetFolderId: datas.FolderId,
};
deleteLoading.value = ElLoading.service({
lock: true,
text: "正在处理",
});
let pageRes = await FolderService.UpdateTripOtherStatus(queryMsg);
if (pageRes.data.resultCode == 1) {
ElMessage({
showClose: true,
message: `恢复文件成功`,
type: "success",
});
emit('close')
emit('success')
} else {
ElMessage({
showClose: true,
message: `恢复文件失败`,
type: "warning",
});
}
deleteLoading.value.close();
deleteLoading.value = null;
} catch (error) {}
})
.catch(() => {});
}
const getFile = async () => {
let querys = {
FileType: props.details.FileType
}
let pageRes = await FolderService.GetMyFolderTree(querys);
if (pageRes.data.resultCode == 1) {
dataList.value = pageRes.data.data
}
}
watch(filterText, (val) => {
treeRef.value!.filter(val)
})
getFile()
</script>
<style scoped>
.TreeFile-Title{
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 15px;
position: relative;
}
.TreeFile-Title.text-sm{
font-size: 12px;
}
.TreeFile-container th{
padding: 0 10px 5px 10px;
border-bottom: 1px solid #f6f6f6;
background: #fff;
position: sticky;
top: 0px;
z-index: 2;
}
.TreeFile-container td{
padding: 8px 10px;
border-bottom: 1px solid #f6f6f6;
}
.TreeFile-table {
}
</style>
\ No newline at end of file
......@@ -73,6 +73,7 @@
<journeyAdsList
:current-menu="currentMenu"
:position="position"
:set-file-list="datas.setFileList"
:list="dataList"
:msg="queryObj"
:navigations="Navigations"
......@@ -171,11 +172,6 @@ const datas = reactive({
journeyAds: { RefreshLoading: false } as any,
fileList: [] as any,
setFileList: [] as any,
pdfImg:
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708337830000_43.png",
adsImg:
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708250377000_777.png",
folderImg: "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708250377000_777.png",
});
const folderObj = ref<{
id: number;
......
......@@ -15,8 +15,13 @@
<div class="text-left q-pl-md">文档名称</div>
</th>
<th class="text-light" style="min-width: 150px; width: 150px">
<div class="row items-center just-center pointer" @click.stop="clickSort">
<span>最近修改 </span>
<div class="row items-center just-center pointer" @click.stop="currentMenu==-1?clickSort():''">
<span>
<template v-if="currentMenu==0">最近修改</template>
<template v-if="currentMenu==1">收藏时间</template>
<template v-if="currentMenu==3||currentMenu==4">最近修改</template>
<template v-if="currentMenu==-1">删除时间</template>
</span>
<span class="column">
<el-icon class="reactive"
style="top: 3px" :class="[queryObj.OrderByType==1?'active':'']"><CaretTop /></el-icon>
......@@ -72,8 +77,9 @@
<td class="text-center" @click.stop="item.FileType?OffEdit():editDelete(item,2)"><span>{{item.CreateName}}</span></td>
<td class="text-center">
<div class="hoverShow row items-center just-center q-pt-sm">
<el-button type="primary" :icon="Edit" size="small" @click.stop="editDelete(item)">编辑</el-button>
<el-dropdown class="q-pl-md" trigger="click">
<el-button v-if="currentMenu!=-1" type="primary" :icon="Edit" size="small" @click.stop="editDelete(item)">编辑</el-button>
<el-button v-else type="primary" icon="Position" size="small" @click.stop="recover(item)">恢复</el-button>
<el-dropdown v-if="currentMenu!=-1" class="q-pl-md" trigger="click">
<el-icon size="16" color="#b1b7cf"><MoreFilled /></el-icon>
<template #dropdown>
<el-dropdown-menu class="q-pa-md" @click.stop="OffEdit">
......@@ -140,6 +146,15 @@
<CopyFile v-if="isCopyTo"
:details="journeyAdsDetails"
@close="() => {journeyAdsDetails = '';isCopyTo=false}"></CopyFile>
<TreeFileRecover v-if="isTreeFileRecover"
:details="journeyAdsDetails"
:file-type="journeyAdsDetails.FileType"
@close="() => {journeyAdsDetails = '';isTreeFileRecover=false}"
@success="() => {
journeyAdsDetails = '';
isTreeFileRecover=false;
emit('success')}"></TreeFileRecover>
</template>
<script setup lang="ts">
import { ApiResult } from '@/configs/axios';
......@@ -158,6 +173,7 @@ import ShareForm from "./ShareForm.vue";
import Folder from "./Folder.vue";
import HistoricalVersion from "./HistoricalVersion.vue";
import TreeFile from "./TreeFile.vue";
import TreeFileRecover from "./TreeFileRecover.vue";
import breadPeeling from "./breadPeeling.vue";
import CopyFile from "./CopyFile.vue";
......@@ -230,6 +246,7 @@ import CopyFile from "./CopyFile.vue";
const isCopyTo = ref(false);
const isIndeterminate = ref(false);
const isTreeFile = ref(false)
const isTreeFileRecover = ref(false)
const Navigations = ref([] as Array<any>);
const searchData = ref({} as any);
searchData.value = inject(injectKeyTemplate);
......@@ -243,7 +260,39 @@ import CopyFile from "./CopyFile.vue";
}
emit('refreshHandler',obj)
}
// 恢复文件
const recover = async (row:any) => {
journeyAdsDetails.value = row
isTreeFileRecover.value = true
return
try {
let queryMsg = {
Ids: row.FileId
}
deleteLoading.value = ElLoading.service({
lock: true,
text: "正在处理",
});
let dataRes = await FolderService.UpdateTripOtherStatus(queryMsg);
deleteLoading.value.close();
deleteLoading.value = null;
if (dataRes.data.resultCode == 1) {
ElMessage({
showClose: true,
message: `恢复${row.FileName}成功`,
type: "success",
});
emit('refreshHandler')
}else{
ElMessage({
showClose: true,
message: `恢复${row.FileName}失败`,
type: "warning",
});
}
} catch (error) {}
}
// 收藏文件
const CollectHandler = async (row:any) => {
try {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment