Commit 38e1bb2b authored by 罗超's avatar 罗超

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

parents 46e39564 118c4915
......@@ -5,6 +5,20 @@ import Api,{ HttpResponse, Result } from './../utils/request';
*/
class ConfigService{
/**
* 获取行程广告最近版本
*/
static async GetTripBrowsePage(params : any):Promise<HttpResponse>{
return Api.Post("triptemplate_GetTripBrowsePage",params)
}
/**
* 新增修改最近浏览
*/
static async SetTripBrowse(params : any):Promise<HttpResponse>{
return Api.Post("triptemplate_SetTripBrowse",params)
}
/**
* 获取行程广告历史版本
*/
......
......@@ -507,6 +507,7 @@ const sellGetTripTemplate = async () =>{
}
let dataRes = await ConfigService.sellGetTemplateDetails(queryMsg);
if (dataRes.data.resultCode == 1) {
RecordBrowsing()
if(searchData.value.TempId) queryObj.value.TempId = searchData.value.TempId
else if(searchData.value.TempId2&&!searchData.value.TempId) queryObj.value.TempId = searchData.value.TempId2
else if(searchData.value.sellTempId) queryObj.value.TempId = searchData.value.sellTempId
......@@ -550,6 +551,22 @@ const sellGetTripTemplate = async () =>{
}
}
/**
* 行程广告浏览记录
*/
const RecordBrowsing = async () => {
try {
let queryMsg = {
FileId: searchData.value.sellId
}
let datasRes = await ConfigService.SetTripBrowse(queryMsg);
if (datasRes.data.resultCode == 1 && datasRes.data.data && datasRes.data.data.TempId) {
}
} catch (error) {
}
}
// 页面被切换时
const thumbnailsRef = ref<InstanceType<typeof Draggable>>()
......
......@@ -76,7 +76,7 @@
</div>
</div>
<div class="col">
<!-- <Example></Example> -->
<BrowsingHistory :current-menu="currentMenu" v-if="currentMenu==0"></BrowsingHistory>
<journeyAds :current-menu="currentMenu" v-if="currentMenu==3||currentMenu==4"></journeyAds>
</div>
</div>
......@@ -88,7 +88,7 @@ import { userStore } from '@/store/user';
import { storeToRefs } from 'pinia';
import { ref,reactive,provide,inject } from 'vue';
import SearchDocument from './components/SearchDocument.vue'
import Example from './components/Example.vue'
import BrowsingHistory from './components/BrowsingHistory.vue'
import journeyAds from './components/journeyAds.vue'
import { Plus,ArrowDown,Clock,Star,Share,Picture,Management,Delete,RefreshRight,Refresh,Loading } from '@element-plus/icons-vue';
......@@ -107,7 +107,6 @@ const currentMenu = ref<number>(0)
const searchData = ref({} as any)
searchData.value = inject(injectKeyTemplate)
searchData.value.currentMenu = currentMenu.value
if(searchData.value.SellTemplateType){
let current = 0
if(searchData.value.SellTemplateType==1) current = 3
......
<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()">
<template v-if="currentMenu == 0">最近</template>
</span>
<breadPeeling v-if="queryObj.FileId" :navigations="Navigations"
@Inquire="breadPeelingInquire"></breadPeeling>
</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>
<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>
</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%;">
<div style="min-width: '700px';height: 100%;">
<table class="text-small" style="width: 100%">
<tr @click="OffEdit">
<th class="text-left" style="width: 20px;">
<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 class="column">
<el-icon class="reactive"
style="top: 3px" :class="[datas.Sort==2?'active':'']"><CaretTop /></el-icon>
<el-icon class="reactive"
style="top:-3px" :class="[datas.Sort==1?'active':'']"><CaretBottom /></el-icon>
</span>
</div>
</th>
<th class="text-light" style="min-width: 100px; width: 100px">
创建者
</th>
<th class="text-light" style="min-width: 120px; width: 120px">
操作
</th>
</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"
: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;" />
</td>
<td class="journeyAds-title wrap row">
<div class="col" v-if="!item.editTitle" @click.stop="item.FileType?OffEdit():editDelete(item,2)">
<div class="row flex-center">
<el-tooltip
placement="top-start">
<template #content><div style="max-width: 600px;">{{item.FileName}}</div></template>
<div class="journeyAds-TitleCenter">{{item.FileName}}
<span v-if="item.FileName.length>70">...</span>
</div>
</el-tooltip>
</div>
</div>
<el-input
class="journeyAds-Input"
v-model="item.FileName"
autosize
type="textarea"
placeholder="Please input"
maxlength="500"
size="small"
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">
<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-icon size="16" color="#b1b7cf"><MoreFilled /></el-icon>
<template #dropdown>
<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-menu>
</template>
</el-dropdown>
</div>
</td>
</tr>
</template>
</table>
</div>
<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"
>
<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>
<ShareForm
:id="shareId"
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"
v-if="isHistoricalVersion"
@close="() => {journeyAdsDetails = '';isHistoricalVersion=false}"
></HistoricalVersion>
<TreeFile v-if="isTreeFile"
: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>
</template>
<script setup lang="ts">
import { ref, reactive, provide, watch, inject, onMounted } from "vue";
import { ElLoading, ElMessage, ElMessageBox } from "element-plus";
import { MoreFilled, Edit, ArrowLeft,CopyDocument,DCaret,CaretTop,CaretBottom } from "@element-plus/icons-vue";
import ConfigService from "@/services/ConfigService";
import FolderService from "@/services/FolderService";
import { injectKeyTemplate } from "@/types/injectKey";
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";
const SalesEditorStore = useSellTemplateStore();
const marketStore = useScreenStore();
const props = defineProps({
currentMenu: {
type: Number,
default: 3,
},
});
const PopoverVisibleControls = ref(false);
const shareId = ref(0);
const journeyAdsDetails = ref('');
const isHistoricalVersion = ref(false);
const isTreeFile = ref(false)
const Navigations = ref([] as Array<any>);
const showHistory = ref(true);
const isIndeterminate = ref(false);
const dataList = ref([] as Array<any>);
const copyDataList = ref([] as Array<any>);
const NewDataList = ref([] as Array<any>);
const searchData = ref({} as any);
searchData.value = inject(injectKeyTemplate);
const deleteLoading = ref<any>(null);
const datas = reactive({
Sort: 0,
selectedDatas: [] as Array,
selectAll: false as any,
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;
name: string;
parentId: number;
type: number;
}>({ id: -1, name: "", parentId: 0, number: 1 });
const queryObj = reactive({
pageIndex: 1,
pageSize: 50,
pageCount: 0, //总页数
FileType: 0,
});
const editObj = reactive({});
//datas.journeyAds = inject('journeyAds')
const loading = ref(false as any);
const SellTemplateRef = ref<any>();
const clickSort = (type:any) =>{
if(datas.Sort==0) copyDataList.value = JSON.parse(JSON.stringify(dataList.value))
// 1降序 2升序
if(datas.Sort==2) datas.Sort=0
else datas.Sort++
getSort()
}
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
if(datas.Sort==1) time = new Date(list[i].UpdateTime.replace(/-/,'/'))-new Date(list[j].UpdateTime.replace(/-/,'/'))
if(datas.Sort==2) 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;
}
}
}
dataList.value = datas.Sort?list:JSON.parse(JSON.stringify(copyDataList.value))
for(let i=0;i<dataList.value.length;i++) {
if (datas.selectAll) {
dataList.value[i].singleChoice = true;
datas.selectedDatas.push(dataList.value[i].FileId);
} else if (
datas.selectedDatas.length > 0 &&
datas.selectedDatas.indexOf(dataList.value[i].FileId) != -1
) dataList.value[i].singleChoice = true;
}
}
// 导航
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
SalesEditorStore.setSalesEditor(type)
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;
isHistoricalVersion.value = true
};
// 重命名
const OffEdit = () => {
for (let i = 0; i < dataList.value.length; i++) {
dataList.value[i].editTitle = false;
if (
editObj.value &&
editObj.value.FileId &&
dataList.value[i].FileId == editObj.value.FileId
) {
dataList.value[i].FileName = editObj.value.FileName;
}
}
};
const handleUpdateTitle = async (row: any) => {
if (!row.FileName) row.FileName = editObj.value.FileName;
row.editTitle = false;
if (row.FileName != editObj.value.FileName) {
editObj.value.FileName = row.FileName;
try {
let queryMsg = {
FileId: row.FileId,
Title: editObj.value.FileName,
};
let TemplateRes = await ConfigService.ReNameTripOther(queryMsg);
if (TemplateRes.data.resultCode == 1) {
ElMessage({
showClose: true,
message: "重命名成功",
type: "success",
});
} else {
ElMessage({
showClose: true,
message: "重命名失败",
type: "warning",
});
}
} catch (error) {}
}
};
const startEditTitle = (row: any) => {
row.editTitle = true;
editObj.value = JSON.parse(JSON.stringify(row));
};
// 全选按钮
const clickSelectAll = () => {
setTimeout(() => {
for (let i = 0; i < dataList.value.length; i++) {
if (datas.selectAll == true) {
datas.selectedDatas.push(dataList.value[i].FileId)
dataList.value[i].singleChoice = true;
}
else {
datas.selectedDatas = [];
isIndeterminate.value = false;
dataList.value[i].singleChoice = false;
}
}
}, 100);
};
const singleChoice = (row: any) => {
isIndeterminate.value = false;
if (!row.singleChoice) {
datas.selectedDatas.push(row.FileId);
} else {
let index;
for (let i = 0; i < datas.selectedDatas.length; i++) {
if (datas.selectedDatas[i] == row.FileId) index = i;
}
datas.selectedDatas.splice(index, 1);
isIndeterminate.value = true;
}
let checkedCount = datas.selectedDatas.length;
let datasList = dataList.value.length;
if (datasList > 0 && checkedCount > 0 && datasList == checkedCount)
datas.selectAll = true;
if (datasList > 0 && checkedCount > 0 && datasList > checkedCount) {
datas.selectAll = "";
isIndeterminate.value = true;
}
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: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
try {
let queryMsg = {
Id: item.FileId,
};
deleteLoading.value = ElLoading.service({
lock: true,
text: "正在处理",
});
let pageRes = await ConfigService.sellSetRemoveTemplate(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 editDelete = async (row: any, type: Number) => {
if (type == 1) {
if (row.FileType) DeleteTemplate(row);
else DeleteFile(row);
} else {
if (row.FileType) {
let list = [
{
id: "test-slide-1",
pageType: 0,
elements: [],
background: {
type: "solid",
color: "#ffffff",
},
},
];
useSlidesStore().setSlides(list);
searchData.value.sellId = row.FileId;
searchData.value.sellTempId = row.TempId;
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 () => {
loading.value = true;
try {
if (queryObj.pageIndex == 1) dataList.value = [];
let pageRes = await ConfigService.GetTripBrowsePage(queryObj);
if (pageRes.data.resultCode == 1) {
let arrList = function (list) {
list.forEach((x) => {
x.show = false;
x.singleChoice = false;
x.Id = ''
x.showSelect = false
if (datas.selectAll) {
x.singleChoice = true;
datas.selectedDatas.push(x.FileId);
} else if (
datas.selectedDatas.length > 0 &&
datas.selectedDatas.indexOf(x.FileId) != -1
)
x.singleChoice = true;
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);
copyDataList.value = dataList.value
queryObj.pageCount = pageRes.data.data.pageCount;
getSort()
}
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 = () => {
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;
};
watch(
() => searchData.value.SellTemplateType,
(n, o) => {
isIndeterminate.value = false;
datas.selectAll = false;
datas.selectedDatas = [];
queryObj.FileType = n;
queryObj.FileId = 0;
refreshHandler();
}
);
watch(() => queryObj.FileId,(n, o) => {
if(!n) Navigations.value = []
}
);
onMounted(() => {});
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;
padding-bottom: 21px;
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;
}
.active {
color: $themeColor;
}
</style>
\ No newline at end of file
<template>
<div ref="SellTemplateRef" style="height: 100%; overflow: auto;">
<el-scrollbar height="100%" class="q-px-md">
<div class="row items-center q-pt-md" style="min-width:1000px; ">
<el-checkbox size="sm" v-model="datas.selectAll"
@click="clickSelectAll"/>
<div class="col row" style="border-bottom: 1px solid #F6F6F6;margin-left: 65px;">
<div class="col text-small q-pb-md">
文档名称
</div>
<div class="row Example-right text-small">
<div class="col text-center">最近修改</div>
<div class="col text-center">创建者</div>
<div class="text-center Example-More Example-Controls">
<Popover trigger="click" placement="bottom-start" v-model:value="datas.showControls" center class="col">
<template #content>
<div class="column">
<div class="pointer q-mb-sm">重命名</div>
<div class="pointer">历史版本</div>
</div>
</template>
<div class="select-btn row items-center"><IconSetting /></div>
</Popover>
</div>
</div>
</div>
</div>
<pre style="min-width:1000px;height: 50px;" v-for="(item,index) in dataList">
<div class="row items-center text-5B5D62 Example-box">
<div class="row items-center">
<el-checkbox size="sm" v-model="item.singleChoice"
@click="singleChoice(item)"/>
<img class="q-px-lg" :src="item.TemplateType==1?datas.pdfImg:datas.adsImg"
style="height: 25px;" />
</div>
<div class="col row Example-borderBot q-pt-sm q-pb-md">
<div class="col row">
<span>{{item.Title}}</span>
</div>
<div class="row items-center Example-right text-small">
<div class="col text-center">{{item.UpdateTime}}</div>
<div class="col text-center">{{item.CreateByName}}</div>
<div class="Example-More Example-Controls">
<Popover trigger="click" placement="bottom-start" v-model:value="item.showMore" center class="col">
<template #content>
<div class="column">
<div class="pointer q-mb-sm">重命名</div>
<div class="pointer">历史版本</div>
</div>
</template>
<div class="select-btn row items-center"><IconMore /></div>
</Popover>
</div>
</div>
</div>
</div>
</pre>
<div>
<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'>
<span class="text-samll bg-white" style="background: #f3f6fb;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>
</div>
</el-scrollbar>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, provide, watch, inject, onMounted } from 'vue'
import { ElLoading, ElMessage, ElMessageBox } from "element-plus";
import ConfigService from '@/services/ConfigService'
import { injectKeyTemplate } from '@/types/injectKey'
import { recentTime } from '@/utils/common'
const PopoverVisibleControls = ref(false)
const dataList = ref([] as Array < any > )
const searchData = ref({} as any)
searchData.value = inject(injectKeyTemplate)
const datas = reactive({
selectAll: false,
showControls: false,
SellDatas:{
currentMenu: 3,
},
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',
})
let TemplateType = 0
if(searchData.value.SellTemplateType) TemplateType = searchData.value.SellTemplateType
const queryObj = reactive({
Title: '',
pageIndex: 1,
pageSize: 20,
pageCount: 0, //总页数
TemplateType: TemplateType,
})
datas.SellDatas = inject('SellDatas')
const loading = ref(false as any)
const SellTemplateRef = ref<any>()
// 全选按钮
const clickSelectAll = () => {
}
const singleChoice = (row:any) => {
}
const setTemplateType = (Id:number) => {
console.log(Id)
queryObj.TemplateType = Id
searchData.value.SellTemplateType = Id
queryObj.pageIndex = 1
querySearchHandler()
}
const DeleteTemplate = async (item:any) => {
ElMessageBox.confirm(
'此操作将删除该模版,是否确定?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
).then(async () => {
try {
let queryMsg = {
Id: item.Id
}
deleteLoading.value = ElLoading.service({
lock:true,
text:'正在处理'
})
let pageRes = await ConfigService.sellSetRemoveTemplate(queryMsg);
if (pageRes.data.resultCode == 1) {
queryObj.pageIndex = 1
ElMessage({
showClose: true,
message: `删除${item.TemplateType==2?'广告':'行程'}成功`,
type: 'success',
})
querySearchHandler()
}else {
ElMessage({
showClose: true,
message: `删除${item.TemplateType==2?'广告':'行程'}失败`,
type: 'warning',
})
}
deleteLoading.value.close()
deleteLoading.value = null
} catch (error) {}
}).catch(() => {})
}
const editDelete = async (row:any,type:Number) => {
if(type==1){
DeleteTemplate(row)
}else{
let list = [
{
id: 'test-slide-1',
pageType: 0,
elements: [],
background: {
type: 'solid',
color: '#ffffff',
},
}
]
useSlidesStore().setSlides(list)
searchData.value.sellId = row.Id
searchData.value.sellTempId = row.TempId
searchData.value.TemplateType = row.TemplateType
SalesEditorStore.setSalesEditor(2)
marketStore.setMarket(false)
}
}
const querySearchHandler = async () => {
loading.value = true
try {
if(queryObj.pageIndex == 1) dataList.value =[]
let pageRes = await ConfigService.sellGetTripOtherPage(queryObj);
if (pageRes.data.resultCode == 1) {
let arrList = function(list){
list.forEach(x => {
x.show = false
x.showMore = false
});
}
arrList(pageRes.data.data.pageData)
dataList.value = dataList.value.concat(pageRes.data.data.pageData);
queryObj.pageCount = pageRes.data.data.pageCount;
}
loading.value = false
} catch (error) {
loading.value = 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()
}
}
}
watch(() => datas.SellDatas.currentMenu, () => {
queryObj.pageIndex = 1
querySearchHandler()
})
onMounted(()=>{
SellTemplateRef.value.addEventListener("scroll", scrollingHandler);
})
querySearchHandler()
</script>
<style lang="scss" scoped>
@import url('../../../assets/styles/common.css');
.Example-box{
}
.Example-right{
width: 300px;
}
.Example-borderBot{
border-bottom: 1px solid #F6F6F6;
}
.Example-Controls{
width: 50px;
}
.Example-More{
height: 20px;
font-size: 12px;
display: flex;
flex-shrink: 0;
cursor: pointer;
.btn {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
&:hover {
background-color: $lightGray;
}
}
.select-btn {
width: 30px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
&:hover {
background-color: $lightGray;
}
}
.icon {
margin-right: 3px;
font-size: 14px;
}
}
</style>
\ No newline at end of file
......@@ -285,7 +285,7 @@ if (searchData.value.SellTemplateType)
const queryObj = reactive({
pageIndex: 1,
pageSize: 20,
pageSize: 50,
pageCount: 0, //总页数
FileType: TemplateType,
FileId: 0,
......@@ -685,7 +685,7 @@ querySearchHandler();
.journeyAds-TitleCenter {
width: 100%;
height: 18px;
padding-bottom: 21px;
margin-bottom: 3px;
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
white-space: wrap; /* 不换行 */
......
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