|
@@ -0,0 +1,426 @@
|
|
|
|
+<script setup>
|
|
|
|
+import {ref,reactive} from 'vue'
|
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
|
+import {useClassify} from '../hooks/useClassify'
|
|
|
|
+import openShareIcon from '@/assets/imgs/ppt/ppt_icon_user1.png'
|
|
|
|
+import closeShareIcon from '@/assets/imgs/ppt/ppt_icon_user2.png'
|
|
|
|
+import {apiMyChartList,apiMyChartRemove} from '@/api/myETA'
|
|
|
|
+import { showConfirmDialog, showToast } from 'vant';
|
|
|
|
+
|
|
|
|
+const router=useRouter()
|
|
|
|
+
|
|
|
|
+const {
|
|
|
|
+ classifyTypeOpt,
|
|
|
|
+ classifyState,
|
|
|
|
+ getMyClassify,
|
|
|
|
+ getPubClassify,
|
|
|
|
+ classifyTypeChange,
|
|
|
|
+ handleAddClassify,
|
|
|
|
+ handleConfirmEditClassify,
|
|
|
|
+
|
|
|
|
+ handleShowOpt,
|
|
|
|
+ handleClassifyShare,
|
|
|
|
+ handleCopyClassify,
|
|
|
|
+ handleClassifyDel
|
|
|
|
+}=useClassify()
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+async function initPage(){
|
|
|
|
+ getPubClassify()
|
|
|
|
+ await getMyClassify()
|
|
|
|
+ listState.cid=classifyState.myClassifyList[0]?.MyChartClassifyId
|
|
|
|
+ if(!listState.cid){
|
|
|
|
+ listState.finished=true
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ getList()
|
|
|
|
+}
|
|
|
|
+initPage()
|
|
|
|
+
|
|
|
|
+const activeType=ref('my')//my 我的 pub公共的
|
|
|
|
+
|
|
|
|
+// 设置共享
|
|
|
|
+function handleChangeShareStatus(type,item){
|
|
|
|
+ if(type==1&&!item.IsPublic) return
|
|
|
|
+ if(type==2&&item.IsPublic) return
|
|
|
|
+ handleClassifyShare()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function goMobileSearch() {
|
|
|
|
+ router.push({
|
|
|
|
+ path:'/myETA/searchlist'
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const listState = reactive({
|
|
|
|
+ cid:0,
|
|
|
|
+ list:[],
|
|
|
|
+ page:1,
|
|
|
|
+ pageSize:20,
|
|
|
|
+ finished:false,
|
|
|
|
+ loading:false
|
|
|
|
+})
|
|
|
|
+async function getList(){
|
|
|
|
+ const res=await apiMyChartList({
|
|
|
|
+ CurrentIndex:listState.page,
|
|
|
|
+ PageSize:listState.pageSize,
|
|
|
|
+ MyChartClassifyId:listState.cid
|
|
|
|
+ })
|
|
|
|
+ if(res.Ret===200){
|
|
|
|
+ listState.loading=false
|
|
|
|
+ if(!res.Data){
|
|
|
|
+ listState.finished=true
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ listState.finished=res.Data.Paging.IsEnd
|
|
|
|
+ const arr=res.Data.List||[]
|
|
|
|
+ listState.list=[...listState.list,...arr]
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+function onLoad(){
|
|
|
|
+ listState.page++
|
|
|
|
+ getList()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 点击分类获取列表
|
|
|
|
+function goChartList(item){
|
|
|
|
+ listState.cid=item.MyChartClassifyId
|
|
|
|
+ listState.page=1
|
|
|
|
+ listState.list=[]
|
|
|
|
+ listState.finished=false
|
|
|
|
+ getList()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//移除图表
|
|
|
|
+function handleRemoveChart(item,index){
|
|
|
|
+ showConfirmDialog({
|
|
|
|
+ title: '提示',
|
|
|
|
+ message:'是否确认移出?',
|
|
|
|
+ }).then(()=>{
|
|
|
|
+ apiMyChartRemove({
|
|
|
|
+ MyChartClassifyId:Number(listState.cid),
|
|
|
|
+ MyChartId:item.MyChartId
|
|
|
|
+ }).then(res=>{
|
|
|
|
+ if(res.Ret===200){
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ showToast('移出成功')
|
|
|
|
+ }, 100);
|
|
|
|
+ listState.list.splice(index,1)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ }).catch(()=>{})
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 跳转详情
|
|
|
|
+function goDetail(item){
|
|
|
|
+ router.push({
|
|
|
|
+ path:"/myETA/chartdetail",
|
|
|
|
+ query:{
|
|
|
|
+ code:item.UniqueCode,
|
|
|
|
+ cid:listState.cid,
|
|
|
|
+ iscommon:classifyState.classifyTypeAct==1?false:true
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function goChooseChart(){
|
|
|
|
+ router.push({
|
|
|
|
+ path:'/myETA/choosechart'
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<template>
|
|
|
|
+ <div class="pad-myETA-classify-wrap">
|
|
|
|
+ <div class="left-classify-wrap">
|
|
|
|
+ <div class="sticky-box">
|
|
|
|
+ <div class="classify-type-box">
|
|
|
|
+ <span
|
|
|
|
+ :class="['item',item.type===classifyState.classifyTypeAct?'active':'']"
|
|
|
|
+ v-for="item in classifyTypeOpt"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ @click="classifyTypeChange(item)"
|
|
|
|
+ >{{item.name}}</span>
|
|
|
|
+ </div>
|
|
|
|
+ <ul class="list-box">
|
|
|
|
+ <li
|
|
|
|
+ class="item"
|
|
|
|
+ v-for="item in classifyState.classifyTypeAct==1?classifyState.myClassifyList:classifyState.pubClassifyList"
|
|
|
|
+ :key="item.MyChartClassifyId"
|
|
|
|
+ @click="goChartList(item)"
|
|
|
|
+ >
|
|
|
|
+ <img class="left-icon" src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
|
|
|
|
+ <div style="flex:1">
|
|
|
|
+ <div class="van-ellipsis name">{{item.MyChartClassifyName}}</div>
|
|
|
|
+ <div class="share-user" v-if="classifyState.classifyTypeAct==2">分享人: {{item.RealName}}</div>
|
|
|
|
+ </div>
|
|
|
|
+ <div @click.stop="handleShowOpt(item)" v-if="classifyState.classifyTypeAct!=2">
|
|
|
|
+ <van-popover position="bottom-start">
|
|
|
|
+ <template #reference>
|
|
|
|
+ <img
|
|
|
|
+ class="share-icon"
|
|
|
|
+ :src="item.IsPublic?openShareIcon:closeShareIcon" alt=""
|
|
|
|
+ >
|
|
|
|
+ </template>
|
|
|
|
+ <div class="pad-classify-file-opt-box">
|
|
|
|
+ <div class="item" @click="handleChangeShareStatus(1,item)">
|
|
|
|
+ <img :src="closeShareIcon" alt="">
|
|
|
|
+ <span>仅自己可见</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="item" @click="handleChangeShareStatus(2,item)">
|
|
|
|
+ <img :src="openShareIcon" alt="">
|
|
|
|
+ <span>所有人可见</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </van-popover>
|
|
|
|
+ </div>
|
|
|
|
+ <div @click.stop="handleShowOpt(item)">
|
|
|
|
+ <van-popover position="bottom-start">
|
|
|
|
+ <template #reference>
|
|
|
|
+ <div class="menu-icon">
|
|
|
|
+ <img class="icon" src="@/assets/imgs/ppt/ppt_icon_menu.png" alt="">
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <div class="pad-classify-file-opt-box">
|
|
|
|
+ <div class="item" v-if="classifyState.classifyTypeAct!=2" @click="handleAddClassify(item)">
|
|
|
|
+ <img src="@/assets/imgs/ppt/icon_action_copy.png" alt="">
|
|
|
|
+ <span>重命名</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="item del" v-if="classifyState.classifyTypeAct!=2" @click="handleClassifyDel(item)">
|
|
|
|
+ <img src="@/assets/imgs/icon_del.png" alt="">
|
|
|
|
+ <span>删除</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="item" v-if="classifyState.classifyTypeAct==2" @click="handleCopyClassify(classifyState.activeClassifyVal)">
|
|
|
|
+ <img src="@/assets/imgs/ppt/ppt_icon_copy.png" alt="">
|
|
|
|
+ <span>复制</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </van-popover>
|
|
|
|
+ </div>
|
|
|
|
+ </li>
|
|
|
|
+ </ul>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="right-list-wrap">
|
|
|
|
+ <div class="top-search-box">
|
|
|
|
+ <van-search
|
|
|
|
+ shape="round"
|
|
|
|
+ readonly
|
|
|
|
+ placeholder="请输入图表名称"
|
|
|
|
+ style="flex:1"
|
|
|
|
+ @click="goMobileSearch"
|
|
|
|
+ />
|
|
|
|
+ <div class="btn" @click="goChooseChart">选择图表</div>
|
|
|
|
+ <div class="btn" @click="handleAddClassify('')">添加分类</div>
|
|
|
|
+ </div>
|
|
|
|
+ <van-list
|
|
|
|
+ v-model:loading="listState.loading"
|
|
|
|
+ :finished="listState.finished"
|
|
|
|
+ :finished-text="listState.list.length>0?'没有更多了':'暂无图表'"
|
|
|
|
+ :immediate-check="false"
|
|
|
|
+ @load="onLoad"
|
|
|
|
+ >
|
|
|
|
+ <img v-if="listState.list.length==0&&listState.finished" class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
|
|
|
|
+ <ul class="chart-list">
|
|
|
|
+ <li
|
|
|
|
+ class="chart-list-item"
|
|
|
|
+ v-for="item,index in listState.list"
|
|
|
|
+ :key="item.ChartInfoId"
|
|
|
|
+ @click="goDetail(item)"
|
|
|
|
+ >
|
|
|
|
+ <div class="van-ellipsis name">{{item.ChartName}}</div>
|
|
|
|
+ <img class="img" :src="item.ChartImage" alt="">
|
|
|
|
+ <div class="time">
|
|
|
|
+ <span>{{item.CreateTime.slice(0,10)}}</span>
|
|
|
|
+ <div class="remove-box" @click.stop="handleRemoveChart(item,index)" v-if="classifyState.classifyTypeAct==1">
|
|
|
|
+ <img src="@/assets/imgs/myETA/icon_remove2.png" alt="">
|
|
|
|
+ <span>移出</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </li>
|
|
|
|
+ </ul>
|
|
|
|
+ </van-list>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <!-- 添加我的分类弹窗 -->
|
|
|
|
+ <van-dialog
|
|
|
|
+ v-model:show="classifyState.showEidtClassifyName"
|
|
|
|
+ :title="classifyState.isAddClassifyName?'添加分类':'重命名'"
|
|
|
|
+ show-cancel-button
|
|
|
|
+ confirmButtonText="确定"
|
|
|
|
+ @confirm="handleConfirmEditClassify"
|
|
|
|
+ >
|
|
|
|
+ <div class="rename-wrap">
|
|
|
|
+ <input type="text" placeholder="请输入分类名称!" v-model="classifyState.classifyNameVal">
|
|
|
|
+ </div>
|
|
|
|
+ </van-dialog>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<style lang="scss">
|
|
|
|
+@media screen and (min-width:$media-width){
|
|
|
|
+ .pad-classify-file-opt-box{
|
|
|
|
+ border: 1px solid $border-color;
|
|
|
|
+ padding: 10px 0;
|
|
|
|
+ .item{
|
|
|
|
+ padding: 10px 20px;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ img{
|
|
|
|
+ width: 20px;
|
|
|
|
+ margin-right: 8px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .del{
|
|
|
|
+ color: $theme-red;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+</style>
|
|
|
|
+
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+@media screen and (min-width:$media-width){
|
|
|
|
+ .pad-myETA-classify-wrap{
|
|
|
|
+ display: flex;
|
|
|
|
+ .left-classify-wrap{
|
|
|
|
+ width: 300px;
|
|
|
|
+ min-height: 100vh;
|
|
|
|
+ border-right: 1px solid $border-color;
|
|
|
|
+ padding: 30px;
|
|
|
|
+ .sticky-box{
|
|
|
|
+ position: sticky;
|
|
|
|
+ top: 90px;
|
|
|
|
+ }
|
|
|
|
+ .classify-type-box{
|
|
|
|
+ span{
|
|
|
|
+ display: inline-block;
|
|
|
|
+ padding-bottom: 5px;
|
|
|
|
+ margin-right: 30px;
|
|
|
|
+ color: $font-grey_999;
|
|
|
|
+ }
|
|
|
|
+ .active{
|
|
|
|
+ color: $theme-color;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ border-bottom: 2px solid $theme-color;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .list-box{
|
|
|
|
+ padding-top: 30px;
|
|
|
|
+ .item{
|
|
|
|
+ padding: 10px 0;
|
|
|
|
+ display: flex;
|
|
|
|
+ position: relative;
|
|
|
|
+ .left-icon{
|
|
|
|
+ width: 20px;
|
|
|
|
+ height: 20px;
|
|
|
|
+ margin-right: 8px;
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
+ position: relative;
|
|
|
|
+ top: -2px;
|
|
|
|
+ }
|
|
|
|
+ .name{
|
|
|
|
+ flex: 1;
|
|
|
|
+ }
|
|
|
|
+ .share-user{
|
|
|
|
+ font-size: 12px;
|
|
|
|
+ color: $font-grey_999;
|
|
|
|
+ margin-top: 10px;
|
|
|
|
+ }
|
|
|
|
+ .menu-icon{
|
|
|
|
+ margin-left: 20px;
|
|
|
|
+ width: 15px;
|
|
|
|
+ text-align: center;
|
|
|
|
+ .icon{
|
|
|
|
+ width: 3px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .share-icon{
|
|
|
|
+ width: 16px;
|
|
|
|
+ height: 16px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .right-list-wrap{
|
|
|
|
+ flex: 1;
|
|
|
|
+ .top-search-box{
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ position: sticky;
|
|
|
|
+ top: 60px;
|
|
|
|
+ background-color: #fff;
|
|
|
|
+ padding: 30px;
|
|
|
|
+ .btn{
|
|
|
|
+ width: 112px;
|
|
|
|
+ height: 40px;
|
|
|
|
+ background-color: $theme-color;
|
|
|
|
+ color: #fff;
|
|
|
|
+ text-align: center;
|
|
|
|
+ line-height: 40px;
|
|
|
|
+ border-radius: 3px;
|
|
|
|
+ margin-left: 20px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .chart-list{
|
|
|
|
+ padding: 0 30px;
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ .chart-list-item{
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ width: 250px;
|
|
|
|
+ padding: 10px 14px;
|
|
|
|
+ border: 1px solid $border-color;
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
+ margin-left: 10px;
|
|
|
|
+ margin-right: 10px;
|
|
|
|
+ .img{
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 150px;
|
|
|
|
+ display: block;
|
|
|
|
+ margin: 10px 0;
|
|
|
|
+ }
|
|
|
|
+ .time{
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ color: $font-grey_999;
|
|
|
|
+ position: relative;
|
|
|
|
+ .remove-box{
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 0;
|
|
|
|
+ right: 0;
|
|
|
|
+ color: $theme-red;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ img{
|
|
|
|
+ width: 18px;
|
|
|
|
+ height: 18px;
|
|
|
|
+ margin-right: 5px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .rename-wrap{
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ padding: 50px 30px;
|
|
|
|
+ span{
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
+ margin-right: 20px;
|
|
|
|
+ }
|
|
|
|
+ input{
|
|
|
|
+ flex: 1;
|
|
|
|
+ line-height: 35px;
|
|
|
|
+ padding: 0 30px;
|
|
|
|
+ border-radius: 35px;
|
|
|
|
+ border: 1px solid $border-color;
|
|
|
|
+ width: 150px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|