Commit c6067e8b authored by 罗超's avatar 罗超

Merge branch '1.2.0' of http://gitlab.oytour.com/viitto/pptist into 1.2.0

# Conflicts:
#	src/views/SellTemplate/components/BrowsingHistory.vue
parents 20ac819a fc933bf8
......@@ -45,6 +45,7 @@ declare module 'vue' {
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
......
......@@ -26,6 +26,7 @@ import { injectKeyTemplate } from '@/types/injectKey'
import ConfigService from '@/services/ConfigService'
import { domainManager } from '@/utils/domainManager'
import { enterFullscreen, exitFullscreen, isFullscreen } from '@/utils/fullscreen'
import { VIEWPORT_SIZE, VIEWPORT_VER_SIZE } from '@/configs/canvas'
import Editor from './views/Editor/index.vue'
import Screen from './views/Screen/index.vue'
......@@ -77,7 +78,7 @@ const userLoginHandler = async ()=>{
SalesTripId = param.SalesTripId
SellTemplateStore.setSalesTripId(SalesTripId)
try {
await sellGetTripTemplate()
await sellShareTemplate()
} catch (error) {}
}
ConfigIdStore.setConfigId(ConfigId)
......@@ -86,6 +87,11 @@ const userLoginHandler = async ()=>{
if(param.uid) await userStore().setUserLoginAsync(userId)
if(ConfigId>0&&model!=2) await GetTripConfig(ConfigId)
} catch (error) {}
if(param.ViewSlideshow) {
try {
await sellHistoryTripTemplate(param.sellId)
} catch (error) {}
}
if(userId>0)isFinish.value=true
if(!ConfigId&&!model&&(param.SalesTripId&&param.SalesTripId=='')) ElMessageBox.confirm(
'当前没有权限进行任何操作,请联系管理员!',
......@@ -105,8 +111,55 @@ onMounted(async () => {
mainStore.setAvailableFonts()
})
// 销售模版数据
const sellGetTripTemplate = async () =>{
// 销售历史版本模版数据
const sellHistoryTripTemplate = async (sellId:any) => {
const loadingObj = ElLoading.service({
text:'正在渲染数据',
lock:true
})
try {
let queryMsg = {
Id: sellId
}
let dataRes = await ConfigService.sellGetTemplateDetails(queryMsg);
if (dataRes.data.resultCode == 1) {
loadingObj.close()
loading.value = false
isFinish.value=true
let dataObj = dataRes.data.data
let viewportRatios = 1.414
if(dataObj.TemplateType==1) viewportRatios = 0.7069
if(dataObj.Width&&dataObj.Height) {
viewportRatios = dataObj.Height/dataObj.Width
VIEWPORT_SIZE.Value = dataObj.Height
VIEWPORT_VER_SIZE.Value = dataObj.Width
}else{
VIEWPORT_SIZE.Value = 1754
VIEWPORT_VER_SIZE.Value = 1240
}
slidesStore.setViewportRatio(viewportRatios)
let SlidesData = JSON.parse(dataObj.TempData)
let newSlides = []
await SlidesData.forEach((x,i)=>{
newSlides.push(x)
})
slidesStore.setSlides(newSlides)
slidesStore.updateSlideIndex(0)
ScreenStore.setScreening(true)
enterScreeningFromStart
}else{
loading.value = true
ShareTips.value = dataRes.data.message
loadingObj.close()
}
} catch (error) {
}
}
// 销售分享模版数据
const sellShareTemplate = async () =>{
const loadingObj = ElLoading.service({
text:'正在渲染数据',
......@@ -124,9 +177,17 @@ const sellGetTripTemplate = async () =>{
isFinish.value=true
let dataObj = dataRes.data.data
let viewportRatio = 1.414
if(dataRes.data.data.TempType==1) viewportRatio = 0.7069
if(dataRes.data.data.Width&&dataRes.data.data.Height) viewportRatio = dataRes.data.data.Height/dataRes.data.data.Width
if(dataObj.TempType==1) viewportRatio = 0.7069
if(dataObj.Width&&dataObj.Height) {
viewportRatio = dataObj.Height/dataObj.Width
VIEWPORT_SIZE.Value = dataObj.Height
VIEWPORT_VER_SIZE.Value = dataObj.Width
}else{
VIEWPORT_SIZE.Value = 1754
VIEWPORT_VER_SIZE.Value = 1240
}
slidesStore.setViewportRatio(viewportRatio)
let SlidesData = JSON.parse(dataObj.TempData)
let newSlides = []
await SlidesData.forEach((x,i)=>{
......
......@@ -5,6 +5,27 @@ import Api,{ HttpResponse, Result } from './../utils/request';
*/
class ConfigService{
/**
* 我的回收站
*/
static async GetTripOtherRecycleBinPage(params : any):Promise<HttpResponse>{
return Api.Post("triptemplate_GetTripOtherRecycleBinPage",params)
}
/**
* 共享给我的文件
*/
static async GetShareMyFile(params : any):Promise<HttpResponse>{
return Api.Post("triptemplate_GetShareMyFile",params)
}
/**
* 获取我的收藏
*/
static async GetTripCollectListPage(params : any):Promise<HttpResponse>{
return Api.Post("triptemplate_GetTripCollectListPage",params)
}
/**
* 获取行程广告最近版本
*/
......
......@@ -19,23 +19,20 @@ export const isPC = () => {
export const query = (url?:string)=>{
url = url??location.href
if(url.indexOf(process.env.VUE_APP_SHARE_URL)!=-1){
let str = url.substr(url.indexOf('?') + 1)
let json = {
SalesTripId: str.slice(2)
} as any
return json
}else{
let str = url.substr(url.indexOf('?') + 1)
let json = {} as any
const arr = str.split('&')
let json = {} as any
for(let i = 0; i < arr.length; i++) {
let item = arr[i].split('=')
json[item[0]] = item[1]
}
return json
}
if(url.indexOf(process.env.VUE_APP_SHARE_URL)!=-1&&!json.ViewSlideshow){
json = {
SalesTripId: str.slice(2)
} as any
return json
}else return json
}
/**
......
......@@ -105,7 +105,7 @@ if(searchData.value.SellTemplateType){
if(searchData.value.SellTemplateType==1) current = 3
if(searchData.value.SellTemplateType==2) current = 4
currentMenu.value = current
}else currentMenu.value = searchData.value.currentMenu
}else if(searchData.value.currentMenu!=undefined)currentMenu.value = searchData.value.currentMenu
const SalesEditorStore = useSellTemplateStore()
const marketStore = useScreenStore()
......
......@@ -3,19 +3,8 @@
<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()">
<template v-if="currentMenu == 0">最近</template>
</span>
<breadPeeling v-if="queryObj.FileId" :navigations="Navigations"
@Inquire="breadPeelingInquire"></breadPeeling>
<span class="q-pl-md">
<span class="pointer">最近</span>
</span>
</h5>
<div class="select-btn q-pl-lg pointer q-mt-sm">
......@@ -29,14 +18,29 @@
</div>
</div>
<div>
<el-dropdown v-if="datas.selectedDatas.length>0" trigger="click" class="q-px-md">
<!-- <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-item icon="Expand"></el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown> -->
<el-dropdown trigger="click">
<el-button>新建</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
@click="sellAdd(1)"
>新建行程</el-dropdown-item
>
<el-dropdown-item
@click="sellAdd(3)"
>建广告图</el-dropdown-item
>
</el-dropdown-menu>
</template>
</el-dropdown>
......@@ -53,20 +57,20 @@
<table class="text-small" style="width: 100%">
<tr @click="OffEdit">
<th class="text-left" style="width: 20px;">
<el-checkbox
<!-- <el-checkbox
size="sm"
class="SelectAllBox"
v-model="datas.selectAll"
@click="clickSelectAll"
:indeterminate="isIndeterminate"
/>
/> -->
</th>
<th colspan="2" class="text-light">
<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>
<span>最近修浏览 </span>
<span class="column">
<el-icon class="reactive"
style="top: 3px" :class="[datas.Sort==2?'active':'']"><CaretTop /></el-icon>
......@@ -84,18 +88,20 @@
</tr>
<template v-for="(item,index) in dataList">
<tr class="text-5B5D62 journeyAdsple-table pointer">
<td @click.stop="item.FileType?OffEdit():editDelete(item,2)"><div class="row items-center hoverShow"
<td @click.stop="OffEdit()">
<!-- <div class="row items-center hoverShow"
:style="{'opacity':item.singleChoice?1:''}">
<el-checkbox size="sm" class="SelectAllBox" v-model="item.singleChoice"
@click.stop="singleChoice(item)"/></div></td>
<td style="width: 30px;" @click.stop="item.FileType?OffEdit():editDelete(item,2)">
<img v-if="item.FileType" class="q-px-md" :src="item.FileType==1?datas.pdfImg:datas.adsImg"
style="height: 25px;" />
<img v-else class="q-px-md" src="@/assets/img/file.png"
style="height: 23px;" />
@click.stop="singleChoice(item)"/></div> -->
</td>
<td style="width: 30px;" @click.stop="OffEdit()" valign="middle" >
<div :class="{'share-icon-box':item.IsShare}" style="display: inline-block;">
<img v-if="item.FileType" class="q-px-md " :src="item.FileType==1?datas.pdfImg:datas.adsImg" style="height: 25px;" />
<img v-else class="q-px-md" src="@/assets/img/file.png" style="height: 23px;" />
</div>
</td>
<td class="journeyAds-title wrap row">
<div class="col" v-if="!item.editTitle" @click.stop="item.FileType?OffEdit():editDelete(item,2)">
<div class="col" v-if="!item.editTitle" @click.stop="OffEdit()">
<div class="row flex-center">
<el-tooltip
placement="top-start">
......@@ -117,8 +123,8 @@
v-if="item.editTitle"
@blur="handleUpdateTitle(item)"
/></td>
<td class="text-center" @click.stop="item.FileType?OffEdit():editDelete(item,2)"><span>{{item.Day?item.Day+'天前':item.UpdateTime}}</span></td>
<td class="text-center" @click.stop="item.FileType?OffEdit():editDelete(item,2)"><span>{{item.CreateName}}</span></td>
<td class="text-center" @click.stop="OffEdit()"><span>{{item.Day?item.Day+'天前':item.UpdateTime}}</span></td>
<td class="text-center" @click.stop="OffEdit()"><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>
......@@ -128,9 +134,10 @@
<el-dropdown-menu class="q-pa-md" @click.stop="OffEdit">
<el-dropdown-item v-if="item.FileType" icon="EditPen" @click.stop="startEditTitle(item)">重命名</el-dropdown-item>
<el-dropdown-item v-if="item.FileType" icon="Clock" @click.stop="history(item)">历史版本</el-dropdown-item>
<el-dropdown-item v-if="item.FileType" icon="Position" @click.stop="()=>shareId=item.FileId">分享</el-dropdown-item>
<el-dropdown-item icon="Expand" @click.stop="MoveFile(item)">移动至</el-dropdown-item>
<el-dropdown-item icon="Delete" @click="editDelete(item,1)">删除</el-dropdown-item>
<el-dropdown-item icon="Position" @click.stop="()=>shareId=item.FileId">分享</el-dropdown-item>
<el-dropdown-item v-if="item.IsShare" icon="Hide" @click.stop="removeShareHandler(item)">取消分享</el-dropdown-item>
<el-dropdown-item v-if="item.FileType" icon="CopyDocument" @click.stop="CopyTo(item)">复制到</el-dropdown-item>
<!-- <el-dropdown-item icon="Delete" @click="editDelete(item,1)">删除</el-dropdown-item> -->
</el-dropdown-menu>
</template>
</el-dropdown>
......@@ -172,15 +179,6 @@
v-if="shareId > 0"
@close="() => (shareId = 0)"
></ShareForm>
<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>
<HistoricalVersion
:details="journeyAdsDetails"
......@@ -188,18 +186,10 @@
@close="() => {journeyAdsDetails = '';isHistoricalVersion=false}"
></HistoricalVersion>
<TreeFile v-if="isTreeFile"
<CopyFile v-if="isCopyTo"
:details="journeyAdsDetails"
:selected-datas="datas.selectedDatas"
:set-file-list="datas.setFileList"
:file-type="queryObj.FileType"
@close="() => {journeyAdsDetails = '';isTreeFile=false}"
@success="() => {
journeyAdsDetails = '';
isTreeFile=false;
datas.selectAll = false;
datas.selectedDatas = [];
refreshHandler()}"></TreeFile>
@close="() => {journeyAdsDetails = '';isCopyTo=false}"></CopyFile>
</template>
<script setup lang="ts">
import { ref, reactive, provide, watch, inject, onMounted } from "vue";
......@@ -211,10 +201,8 @@
import { getDaysBetween } 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 TreeFile from "./TreeFile.vue";
import breadPeeling from "./breadPeeling.vue";
import CopyFile from "./CopyFile.vue";
const SalesEditorStore = useSellTemplateStore();
const marketStore = useScreenStore();
......@@ -229,7 +217,7 @@
const shareId = ref(0);
const journeyAdsDetails = ref('');
const isHistoricalVersion = ref(false);
const isTreeFile = ref(false)
const isCopyTo = ref(false);
const Navigations = ref([] as Array<any>);
const showHistory = ref(true);
const isIndeterminate = ref(false);
......@@ -239,6 +227,7 @@
const searchData = ref({} as any);
searchData.value = inject(injectKeyTemplate);
const deleteLoading = ref<any>(null);
const removeShareLoading = ref<any>(null);
const datas = reactive({
Sort: 0,
selectedDatas: [] as Array,
......@@ -252,12 +241,6 @@
"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;
name: string;
parentId: number;
type: number;
}>({ id: -1, name: "", parentId: 0, number: 1 });
const queryObj = reactive({
pageIndex: 1,
......@@ -270,6 +253,10 @@
const loading = ref(false as any);
const SellTemplateRef = ref<any>();
const CopyTo = (row:any) => {
isCopyTo.value = true
journeyAdsDetails.value = row
}
const clickSort = (type:any) =>{
if(datas.Sort==0) copyDataList.value = JSON.parse(JSON.stringify(dataList.value))
// 1降序 2升序
......@@ -304,23 +291,6 @@
}
}
// 导航
const BackInquire = () => {
datas.selectAll = false;
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.selectAll = false;
datas.selectedDatas = [];
Navigations.value.splice(index+1, Navigations.value.length-1)
queryObj.FileId = FileId
refreshHandler()
}
const sellAdd = (type:number) =>{
searchData.value.sellId = 0
searchData.value.sellTempId = 0
......@@ -328,26 +298,6 @@
marketStore.setMarket(true)
}
// 移动到文件夹
const MoveFile = (item:any) => {
if(item) journeyAdsDetails.value = item
else {
datas.setFileList = []
for(let i=0;i<dataList.value.length;i++){
for(let j=0;j<datas.selectedDatas.length;j++){
if(dataList.value[i].FileId==datas.selectedDatas[j]){
datas.setFileList.push(
{
FileId: dataList.value[i].FileId,
FileType: dataList.value[i].FileType
}
)
}
}
}
}
isTreeFile.value = true
}
// 历史版本
const history = (row: any) => {
journeyAdsDetails.value = row;
......@@ -399,6 +349,32 @@
editObj.value = JSON.parse(JSON.stringify(row));
};
const removeShareHandler= async (item:any) =>{
if(removeShareLoading.value) return
removeShareLoading.value=ElLoading.service({
lock: true,
text: "正在处理",
})
let errmsg=''
try {
let response = await ConfigService.RemoveFileShareAsync([item.FileId])
if(response.data.resultCode==ApiResult.SUCCESS){
ElMessage.success({
message:'设置成功'
})
item.IsShare=false
} else errmsg='取消分享失败,请刷新重试'
} catch (error) {
errmsg = '取消分享失败,请刷新重试'
}
if(errmsg!='') {
ElMessage.error({
message:errmsg
})
}
removeShareLoading.value.close();
removeShareLoading.value = null;
}
// 全选按钮
const clickSelectAll = () => {
......@@ -439,47 +415,6 @@
if (datasList == 0 && checkedCount == 0) datas.selectAll = "";
};
const DeleteFile = async (item: any) => {
ElMessageBox.confirm("此操作将删除该文件夹,是否确定?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
try {
let queryMsg = {
FolderId: item.FileId,
};
deleteLoading.value = ElLoading.service({
lock: true,
text: "正在处理",
});
let pageRes = await FolderService.RemoveTripFolder(queryMsg);
if (pageRes.data.resultCode == 1) {
ElMessage({
showClose: true,
message: `删除${
queryObj.FileType == 2 ? "广告" : "行程"
}文件夹成功`,
type: "success",
});
refreshHandler();
} else {
ElMessage({
showClose: true,
message: `删除${
queryObj.FileType == 2 ? "广告" : "行程"
}文件夹失败`,
type: "warning",
});
}
deleteLoading.value.close();
deleteLoading.value = null;
} catch (error) {}
})
.catch(() => {});
};
const DeleteTemplate = async (item: any) => {
ElMessageBox.confirm("此操作将删除该模版,是否确定?", "提示", {
confirmButtonText: "确定",
......@@ -518,10 +453,8 @@
};
const editDelete = async (row: any, type: Number) => {
if (type == 1) {
if (row.FileType) DeleteTemplate(row);
else DeleteFile(row);
DeleteTemplate(row)
} else {
if (row.FileType) {
let list = [
{
id: "test-slide-1",
......@@ -539,28 +472,6 @@
searchData.value.TemplateType = row.FileType;
SalesEditorStore.setSalesEditor(2);
marketStore.setMarket(false);
} else {
// 2文件夹详情
if (type == 2) {
console.log(row.FileId,row.ParentFileId)
queryObj.FileId = row.FileId;
Navigations.value.push(
{
FileId: row.FileId,
FileName: row.FileName,
ParentFileId: row.ParentFileId
}
);
datas.selectAll = false
datas.selectedDatas = []
isIndeterminate.value = false
refreshHandler();
} else {
folderObj.value.id = row.FileId;
folderObj.value.name = row.FileName;
folderObj.value.type = row.FileType;
}
}
}
};
const querySearchHandler = async () => {
......@@ -621,11 +532,6 @@
queryObj.pageIndex = 1;
querySearchHandler();
};
const operaFolder = (id: number, name: string) => {
folderObj.value.id = id;
folderObj.value.name = name;
folderObj.value.type = queryObj.FileType;
};
watch(
() => searchData.value.SellTemplateType,
......@@ -660,7 +566,7 @@
.journeyAds-TitleCenter {
width: 100%;
height: 18px;
padding-bottom: 21px;
margin-bottom: 3px;
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
white-space: wrap; /* 不换行 */
......@@ -715,6 +621,20 @@
.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;
}
......
<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" @click="OffEdit">
<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
v-if="!datas.editTitle"
placement="top-start">
<template #content><div class="text-center" style="width: 200px;">{{details.FileName}}</div></template>
<div class="TreeFile-Title pointer" @click.stop="datas.editTitle=true">{{details.FileName}}</div>
</el-tooltip>
<el-input
class="journeyAds-Input"
v-model="details.FileName"
autosize
type="textarea"
placeholder="Please input"
maxlength="500"
size="small"
v-if="datas.editTitle"
@blur="handleUpdateTitle"
/>
</div>
<div class="text-small text-5B5D62 q-pt-sm">
创建者:{{details.CreateName}}
</div>
</div>
</div>
</template>
<div class="TreeFile-container" @click="OffEdit">
<el-tree-select
placeholder="请选择文件"
node-key="FileId"
:props="defaultProps"
v-model="datas.FolderId"
:data="dataList"
default-expand-all
check-strictly
:render-after-expand="false"
style="width: 220px"
:filter-node-method="filterNode"
@check="handleTreeNodeClick"
/>
</div>
<template #footer>
<div @click="OffEdit">
<span class="dialog-footer">
<el-button @click="()=>closedhandler()">关闭</el-button>
<el-button type="primary" @click="()=>save()"> 保存复制 </el-button>
</span>
</div>
</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:''
},
fileType: {
type:Number,
required: 1
}
})
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,
editTitle: false,
})
const show=ref(true)
const loading = ref(true)
const deleteLoading = ref<any>(null);
const dataList=ref([])
const OffEdit = () => {
datas.editTitle = false
}
const handleUpdateTitle = () => {
OffEdit()
}
const closedhandler=()=>{
emit('close')
}
const handleTreeNodeClick = (data:any,checkObj:any) => {
OffEdit()
if (checkObj.checkedKeys.length != 0) {
datas.FolderObj = data
}
}
const filterNode = (value: string, data: Tree) => {
if (!value) return true
return data.FileName.includes(value)
}
const save = () => {
return
let title = ''
let FileList = []
if(!props.details) {
title = ` 12121 `
FileList = []
}else {
title = props.details.FileName
FileList.push({
FileId: props.details.FileId,
FileType: props.details.FileType
})
}
ElMessageBox.confirm(`此操作将${title}移动到${datas.FolderObj.FileName},是否确定?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
try {
let queryMsg = {
FileList: FileList,
TargetFolderId: datas.FolderId,
};
deleteLoading.value = ElLoading.service({
lock: true,
text: "正在处理",
});
let pageRes = await FolderService.UpdateTripOtherFolder(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.fileType
}
let pageRes = await FolderService.GetMyFolderTree(querys);
if (pageRes.data.resultCode == 1) {
dataList.value = pageRes.data.data
recursive(dataList.value)
}
}
const recursive = (arrs:Array,disabled:any) =>{
let isDisableds:Boolean
if(arrs.length>0) arrs.forEach(x => {
isDisableds = false
Object.assign(x,{disabled:isDisableds})
if(x.ChildList.length>0){
recursionChild(x,isDisableds)
}
})
else {
isDisableds = false
Object.assign(arrs,{disabled:isDisableds})
}
}
const recursionChild = (arrs:any,disabled:any) => {
if(arrs&&arrs.ChildList.length>0) {
recursive(arrs.ChildList,disabled)
}
}
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
<template>
<el-dialog v-model="show" v-loading="loading" :show-close="false"
:close-on-press-escape="false" :close-on-click-modal="false"
style="width: 500px;">
style="width: 600px;">
<template #header>
<div class="row overflow-hide">
<div>
......@@ -32,20 +32,36 @@
<th class="text-light" style="min-width: 100px;width: 100px;"><span >更新者</span></th>
<th class="text-light" style="min-width: 80px;width: 80px;">大小</th>
<th class="text-light">版本名称</th>
<!-- <th class="text-light" style="min-width: 120px;width: 120px;">操作</th> -->
<th class="text-light text-center" style="min-width: 120px;width: 120px;">操作</th>
</tr>
<template v-for="(item,index) in dataList">
<tr class="text-5B5D62 HistoricalVersion-table pointer">
<td class="text-light">
<tr class="HistoricalVersion-table pointer">
<td class="text-light text-5B5D62">
<span class="text-bold">{{item.UpdateTime.substr(0,11)}}</span>
<span class="q-pl-md q-pt-sm">{{item.UpdateTime.substr(11,19)}}</span>
</td>
<td class="HistoricalVersion-title text-light wrap">
<td class="HistoricalVersion-title text-light wrap text-5B5D62">
<span>{{item.CreateByName}}</span>
</td>
<td class="text-light"><span>{{item.FileSize}}KB</span></td>
<td class="text-light"><span>{{item.Title}}</span></td>
<!-- <td class="text-center"></td> -->
<td class="text-light text-5B5D62"><span>{{item.FileSize}}KB</span></td>
<td class="text-light">
<span :class="[item.NewTitle?'active':'text-5B5D62']">
{{item.NewTitle?item.NewTitle:item.Title}}</span>
</td>
<td class="text-center">
<span class="hoverShow">
<el-button type="primary" icon="View" size="small" @click.stop="clickControls(item)">查看</el-button>
<el-dropdown 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">
<el-dropdown-item icon="EditPen" @click.stop="clickControls(item,1)">另存</el-dropdown-item>
<el-dropdown-item icon="Clock" @click.stop="clickControls(item,2)">替换</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</span>
</td>
</tr>
</template>
</table>
......@@ -53,7 +69,7 @@
style="padding: 0 10px;">
<el-empty :image-size="60" description="暂无数据" />
</div>
<el-divider class="no-bg q-mt-lg" v-if='dataList.length>0&&queryObj.pageCount == queryObj.pageIndex && !loading'>
<el-divider class="no-bg q-mt-lg" v-if='dataList.length>0 && queryObj.pageCount == queryObj.pageIndex && !loading && queryObj.pageCount != 1'>
<span class="text-small bg-white" style="padding: 0 10px;color:#a3a3a3">已加载完成所有数据</span>
</el-divider>
<div v-if="loading" style="height:40px;" class="q-mt-md no-bg" background="transparent" v-loading="loading" element-loading-text="正在加载中"></div>
......@@ -70,10 +86,12 @@
<script setup lang="ts">
import { ApiResult } from '@/configs/axios';
import OrgService from '@/services/OrgService';
import { ref,reactive } from 'vue';
import { ref,reactive,provide } from 'vue';
import { View,Download,EditPen,Delete } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus';
import ConfigService from '@/services/ConfigService';
import { isPC, query } from '@/utils/common'
import { injectKeyTemplate } from '@/types/injectKey'
const props = defineProps({
id:{
......@@ -93,17 +111,49 @@ import ConfigService from '@/services/ConfigService';
adsImg: 'https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Test/Upload/Goods/1708250377000_777.png',
})
const searchData = ref({} as any)
provide(injectKeyTemplate,searchData)
const show=ref(true)
const loading = ref(true)
const HistoricalVersion = ref<any>()
const copyDataList = ref([] as Array<any>);
const queryObj = reactive({
pageIndex: 1,
pageSize: 10,
pageSize: 30,
pageCount: 0, //总页数
FileId: props.details.FileId,
UpdateTime: ''
})
const dataList=ref([])
const clickControls = (row:any,type:any) => {
if(type){
}else {
let param = query()
const url = `${process.env.VUE_APP_SHARE_URL}/?uid=${param.uid}&sellId=${row.FileId}&ViewSlideshow=1`
window.open(url);
}
}
const getSort = () => {
let list = JSON.parse(JSON.stringify(dataList.value))
for (let i=0;i<list.length;i++){
for (let j=i;j<list.length;j++){
let time
time = new Date(list[j].UpdateTime.replace(/-/,'/'))-new Date(list[i].UpdateTime.replace(/-/,'/'))
if(time>0){
let listObj=list[i];
list[i]=list[j];
list[j]=listObj;
}
}
}
datas.UpdateTime = list[0].UpdateTime
for (let i=0;i<dataList.value.length;i++){
if(dataList.value[i].UpdateTime==datas.UpdateTime) dataList.value[i].NewTitle = '当前版本'
}
}
const closedhandler=()=>{
emit('close')
}
......@@ -113,8 +163,16 @@ import ConfigService from '@/services/ConfigService';
if(queryObj.pageIndex == 1) dataList.value =[]
let pageRes = await ConfigService.GetFileHistory(queryObj);
if (pageRes.data.resultCode == 1) {
let arrList = function (list) {
list.forEach((x) => {
x.NewTitle = ''
});
};
arrList(pageRes.data.data.pageData);
dataList.value = dataList.value.concat(pageRes.data.data.pageData);
copyDataList.value = dataList.value
queryObj.pageCount = pageRes.data.data.pageCount;
getSort()
}
loading.value = false
} catch (error) {
......@@ -135,7 +193,7 @@ import ConfigService from '@/services/ConfigService';
querySearchHandler()
</script>
<style scoped>
<style lang="scss" scoped>
.HistoricalVersion-Title{
width: 100%;
overflow: hidden;
......@@ -156,7 +214,13 @@ import ConfigService from '@/services/ConfigService';
padding: 8px 10px;
border-bottom: 1px solid #f6f6f6;
}
.HistoricalVersion-table {
.hoverShow {
opacity: 0;
}
.HistoricalVersion-table:hover .hoverShow {
opacity: 1;
}
.active {
color: $themeColor;
}
</style>
\ No newline at end of file
......@@ -25,12 +25,12 @@
创建者:{{details.CreateName}}
</template>
<div v-else class="row items-center">
<el-tooltip
<!-- <el-tooltip
placement="top-start">
<template #content><div class="text-center" style="width: 200px;">移动文件 {{selectedDatas.join(',')}}</div></template>
<div class="TreeFile-Title text-sm pointer">移动文件 {{selectedDatas.join(',')}}</div>
</el-tooltip>
</el-tooltip> -->
<div class="TreeFile-Title text-sm pointer">批量移动文件</div>
</div>
</div>
</div>
......@@ -56,13 +56,12 @@
:props="defaultProps"
v-model="datas.FolderId"
:data="dataList"
default-expand-all
check-strictly
:render-after-expand="false"
show-checkbox
check-on-click-node
style="width: 220px"
default-expand-all
:filter-node-method="filterNode"
@check="handleTreeNodeClick"
/>
</div>
......@@ -124,6 +123,7 @@ import FolderService from "@/services/FolderService";
FolderObj: {},
checkedKeys: null as any
})
datas.FolderId = props.details?props.details.ParentFileId:props.setFileList[0].ParentFileId
const show=ref(true)
const loading = ref(true)
const deleteLoading = ref<any>(null);
......@@ -137,16 +137,13 @@ import FolderService from "@/services/FolderService";
// 树目前的选中状态对象,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性
if (checkObj.checkedKeys.length != 0) {
datas.FolderObj = data
if (checkObj.checkedKeys.length == 2) {
// 如果选择超过一个节点,则只保留最后一个节点
//单选实现
datas.FolderId = data.FileId
// if(checkObj.checkedNodes.length>1)
treeRef.value.setCheckedKeys([data.FileId]);
}else{
datas.FolderId = data.FileId
treeRef.value.setCheckedKeys([data.FileId]);
}
// if (checkObj.checkedKeys.length == 2) {
// datas.FolderId = data.FileId
// treeRef.value.setCheckedKeys([data.FileId]);
// }else{
// datas.FolderId = data.FileId
// treeRef.value.setCheckedKeys([data.FileId]);
// }
}
}
const filterNode = (value: string, data: Tree) => {
......@@ -157,7 +154,15 @@ import FolderService from "@/services/FolderService";
let title = ''
let FileList = []
if(!props.details) {
title = `文件ID ${props.selectedDatas.join(',')}`
title = `批量`
for(let i=0;i<props.setFileList.length;i++){
FileList.push(
{
FileId: props.setFileList[i].FileId,
FileType: props.setFileList[i].FileType
}
)
}
FileList = props.setFileList
}else {
title = props.details.FileName
......@@ -218,6 +223,7 @@ import FolderService from "@/services/FolderService";
const recursive = (arrs:Array,disabled:any) =>{
console.log(props.setFileList[0],'=====')
let isDisableds:Boolean
if(arrs.length>0) arrs.forEach(x => {
isDisableds = (props.selectedDatas.indexOf(x.FileId)!=-1&&!props.details)||props.details.FileId==x.FileId||disabled?true:false
......@@ -227,6 +233,7 @@ import FolderService from "@/services/FolderService";
if(props.setFileList[i].FileType&&props.setFileList[i].FileId==x.FileId) isDisableds = false
}
}
if((props.details.ParentFileId!=undefined&&props.details&&x.FileId==props.details.ParentFileId)||(props.setFileList.length>0&&props.setFileList[0].ParentFileId==x.FileId)) datas.FolderObj = x
Object.assign(x,{disabled:isDisableds})
if(x.ChildList.length>0){
recursionChild(x,isDisableds)
......
......@@ -152,6 +152,7 @@
<el-dropdown-item icon="Position" @click.stop="()=>shareId=item.FileId">分享</el-dropdown-item>
<el-dropdown-item v-if="item.IsShare" icon="Hide" @click.stop="removeShareHandler(item)">取消分享</el-dropdown-item>
<el-dropdown-item icon="Expand" @click.stop="MoveFile(item)">移动至</el-dropdown-item>
<el-dropdown-item v-if="item.FileType" icon="CopyDocument" @click.stop="CopyTo(item)">复制到</el-dropdown-item>
<el-dropdown-item icon="Delete" @click="editDelete(item,1)">删除</el-dropdown-item>
</el-dropdown-menu>
</template>
......@@ -222,6 +223,10 @@
datas.selectAll = false;
datas.selectedDatas = [];
refreshHandler()}"></TreeFile>
<CopyFile v-if="isCopyTo"
:details="journeyAdsDetails"
@close="() => {journeyAdsDetails = '';isCopyTo=false}"></CopyFile>
</template>
<script setup lang="ts">
import { ref, reactive, provide, watch, inject, onMounted, PropType } from "vue";
......@@ -256,6 +261,7 @@ const PopoverVisibleControls = ref(false);
const shareId = ref(0);
const journeyAdsDetails = ref('');
const isHistoricalVersion = ref(false);
const isCopyTo = ref(false);
const isTreeFile = ref(false)
const Navigations = ref([] as Array<any>);
const showHistory = ref(true);
......@@ -302,6 +308,10 @@ const editObj = reactive({});
const loading = ref(false as any);
const SellTemplateRef = ref<any>();
const CopyTo = (row:any) => {
isCopyTo.value = true
journeyAdsDetails.value = row
}
const clickSort = (type:any) =>{
if(datas.Sort==0) copyDataList.value = JSON.parse(JSON.stringify(dataList.value))
// 1降序 2升序
......@@ -371,7 +381,8 @@ const MoveFile = (item:any) => {
datas.setFileList.push(
{
FileId: dataList.value[i].FileId,
FileType: dataList.value[i].FileType
FileType: dataList.value[i].FileType,
ParentFileId: dataList.value[i].ParentFileId
}
)
}
......@@ -498,7 +509,7 @@ const singleChoice = (row: any) => {
};
const DeleteFile = async (item: any) => {
ElMessageBox.confirm("此操作将删除该文件夹,是否确定?", "提示", {
ElMessageBox.confirm("此操作将删除该文件夹及其下的文件,是否确定?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
......
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