PadPPTIndexWrap.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <script setup>
  2. import {ref} from 'vue'
  3. import {useClassify} from '../hooks/useClassify'
  4. import openShareIcon from '@/assets/imgs/ppt/ppt_icon_user1.png'
  5. import closeShareIcon from '@/assets/imgs/ppt/ppt_icon_user2.png'
  6. import {apiPPTList,apiPPTPubList} from '@/api/ppt'
  7. import { useRouter } from 'vue-router'
  8. import moment from 'moment'
  9. const router=useRouter()
  10. const {
  11. classifyState,
  12. getPPTClassifyData,
  13. fileOptState,
  14. handleShowFileOpt,
  15. handlePPTCatalogueCopy,
  16. handlePPTCatalogueDel,
  17. handlePPTCatalogueReName,
  18. PPTOptState,
  19. handleShowPPTOpt,
  20. handlePPTDel,
  21. handlePPTShare,
  22. handleShowPPTCopy,
  23. handlePPTCopy,
  24. handlePPTCopyBeforeClose,
  25. goPPTDetail
  26. }=useClassify()
  27. getPPTClassifyData()
  28. const activeType=ref('myPPT')
  29. // 获取ppt列表
  30. let activeGroupId=ref('')
  31. let pptList=ref([])
  32. async function getPPTList(){
  33. let res
  34. if(activeType.value=='myPPT'){
  35. res=await apiPPTList({GroupId:activeGroupId.value})
  36. }else{
  37. res=await apiPPTPubList({AdminId:activeGroupId.value})
  38. }
  39. if(res.Ret===200){
  40. pptList.value=res.Data.List||[]
  41. }
  42. }
  43. getPPTList()
  44. function handleClickCatalogue(item){
  45. activeGroupId.value=item.GroupId
  46. getPPTList()
  47. }
  48. // 设置共享
  49. function handleChangePPTShare(type,item){
  50. if(type==1&&!item.IsSingleShareBoolean) return
  51. if(type==2&&item.IsSingleShareBoolean) return
  52. handlePPTShare()
  53. }
  54. // 跳转搜索
  55. function goMobileSearch(){
  56. router.push('/ppt/search')
  57. }
  58. const showPopover=ref(false)
  59. </script>
  60. <template>
  61. <div class="pad-ppt-index-wrap">
  62. <div class="left-classify-wrap">
  63. <div class="sticky-box">
  64. <div class="classify-type-box">
  65. <span
  66. :class="activeType=='myPPT'&&'active'"
  67. @click="activeType='myPPT'"
  68. >我的PPT</span>
  69. <span
  70. :class="activeType=='pubPPT'&&'active'"
  71. @click="activeType='pubPPT'"
  72. >公共PPT</span>
  73. </div>
  74. <div class="classify-list" v-if="activeType=='myPPT'">
  75. <van-collapse class="level-two" v-model="classifyState.myActiveType" :border="false">
  76. <van-collapse-item
  77. :name="item.GroupId"
  78. v-for="item in classifyState.privateList"
  79. :key="item.GroupId"
  80. :is-link="false"
  81. >
  82. <template #title>
  83. <div class="title-second" @click="handleClickCatalogue(item)">
  84. <img src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
  85. <span class="van-ellipsis">{{item.GroupName}}</span>
  86. <div @click.stop="handleShowFileOpt(item)">
  87. <van-popover position="bottom-start">
  88. <template #reference>
  89. <div class="menu-icon">
  90. <img class="icon" src="@/assets/imgs/ppt/ppt_icon_menu.png" alt="">
  91. </div>
  92. </template>
  93. <div class="pad-classify-file-opt-box">
  94. <div class="item" @click="handlePPTCatalogueCopy">
  95. <img src="@/assets/imgs/ppt/icon_action_copy.png" alt="">
  96. <span>复制</span>
  97. </div>
  98. <div class="item" @click="fileOptState.showReName=true">
  99. <img src="@/assets/imgs/ppt/ppt_icon_write02.png" alt="">
  100. <span>重命名</span>
  101. </div>
  102. <div class="item del" @click="handlePPTCatalogueDel">
  103. <img src="@/assets/imgs/icon_del.png" alt="">
  104. <span>删除</span>
  105. </div>
  106. </div>
  107. </van-popover>
  108. </div>
  109. </div>
  110. </template>
  111. <div
  112. class="ppt-item"
  113. v-for="_item in item.PptList"
  114. :key="_item.GroupId"
  115. @click.stop="goPPTDetail(_item)"
  116. >
  117. <span class="van-ellipsis text">{{ _item.Title }}</span>
  118. <div @click.stop="handleShowPPTOpt(_item)">
  119. <van-popover position="bottom-start">
  120. <template #reference>
  121. <img class="share-icon" :src="_item.IsSingleShareBoolean?openShareIcon:closeShareIcon" alt="">
  122. </template>
  123. <div class="pad-classify-file-opt-box">
  124. <div class="item" @click="handleChangePPTShare(1,_item)">
  125. <img :src="closeShareIcon" alt="">
  126. <span>仅自己可见</span>
  127. </div>
  128. <div class="item" @click="handleChangePPTShare(2,_item)">
  129. <img :src="openShareIcon" alt="">
  130. <span>所有人可见</span>
  131. </div>
  132. </div>
  133. </van-popover>
  134. </div>
  135. <div @click.stop="handleShowPPTOpt(_item)">
  136. <van-popover position="bottom-start">
  137. <template #reference>
  138. <div class="menu-icon">
  139. <img class="icon" src="@/assets/imgs/ppt/ppt_icon_menu.png" alt="">
  140. </div>
  141. </template>
  142. <div class="pad-classify-file-opt-box">
  143. <div class="item" @click="handleShowPPTCopy">
  144. <img src="@/assets/imgs/ppt/icon_action_copy.png" alt="">
  145. <span>复制</span>
  146. </div>
  147. <div class="item del" @click="handlePPTDel">
  148. <img src="@/assets/imgs/icon_del.png" alt="">
  149. <span>删除</span>
  150. </div>
  151. </div>
  152. </van-popover>
  153. </div>
  154. </div>
  155. </van-collapse-item>
  156. </van-collapse>
  157. </div>
  158. <div class="classify-list" v-if="activeType=='pubPPT'">
  159. <van-collapse class="level-two" v-model="classifyState.pubActiveType" :border="false">
  160. <van-collapse-item
  161. :name="item.GroupId"
  162. v-for="item in classifyState.publicList"
  163. :key="item.GroupId"
  164. :is-link="false"
  165. >
  166. <template #title>
  167. <div class="title-second" @click="handleClickCatalogue(item)">
  168. <img src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
  169. <span class="van-ellipsis">{{item.GroupName}}</span>
  170. </div>
  171. </template>
  172. <div
  173. class="ppt-item"
  174. v-for="_item in item.PptList"
  175. :key="_item.GroupId"
  176. @click.stop="goPPTDetail(_item)"
  177. >
  178. <span class="van-ellipsis text">{{ _item.Title }}</span>
  179. <div @click.stop="handleShowPPTOpt(_item)">
  180. <van-popover position="bottom-start">
  181. <template #reference>
  182. <div class="menu-icon">
  183. <img class="icon" src="@/assets/imgs/ppt/ppt_icon_menu.png" alt="">
  184. </div>
  185. </template>
  186. <div class="pad-classify-file-opt-box">
  187. <div class="item" @click="handleShowPPTCopy">
  188. <img src="@/assets/imgs/ppt/icon_action_copy.png" alt="">
  189. <span>复制</span>
  190. </div>
  191. </div>
  192. </van-popover>
  193. </div>
  194. </div>
  195. </van-collapse-item>
  196. </van-collapse>
  197. </div>
  198. </div>
  199. </div>
  200. <div class="right-list-wrap">
  201. <div class="search-box">
  202. <van-search
  203. shape="round"
  204. readonly
  205. placeholder="请输入PPT标题"
  206. @click="goMobileSearch"
  207. />
  208. </div>
  209. <ul class="list-wrap">
  210. <li
  211. class="item"
  212. v-for="item in pptList"
  213. :key="item.PptId"
  214. @click="goPPTDetail(item)"
  215. >
  216. <div class="van-ellipsis title">{{item.Title}}</div>
  217. <img class="bg-img" src="/pptImg/pptcover_bg1.jpg" alt="">
  218. <div class="time">创建时间:{{moment(item.PptCreateTime).format('YYYY-MM-DD')}}</div>
  219. </li>
  220. <li class="empty-item"></li>
  221. <li class="empty-item"></li>
  222. </ul>
  223. </div>
  224. </div>
  225. <!-- 目录重命名 -->
  226. <van-dialog
  227. v-model:show="fileOptState.showReName"
  228. title="重命名"
  229. show-cancel-button
  230. confirmButtonText="保存"
  231. @confirm="handlePPTCatalogueReName"
  232. >
  233. <div class="file-rename-wrap">
  234. <span>目录名称</span>
  235. <input type="text" placeholder="请输入目录名" v-model="fileOptState.reNameVal">
  236. </div>
  237. </van-dialog>
  238. <!-- ppt复制弹窗 -->
  239. <van-dialog
  240. v-model:show="PPTOptState.showCopy"
  241. title="PPT目录"
  242. show-cancel-button
  243. confirmButtonText="保存"
  244. @confirm="handlePPTCopy"
  245. :before-close="handlePPTCopyBeforeClose"
  246. >
  247. <div class="ppt-copy-wrap">
  248. <span>选择目录</span>
  249. <van-popover v-model:show="showPopover">
  250. <ul class="select-copy-val-box">
  251. <li
  252. class="item"
  253. v-for="item in PPTOptState.copyActions"
  254. :key="item.GroupId"
  255. @click="PPTOptState.copySelectData=item;showPopover=false"
  256. >{{item.text}}111</li>
  257. </ul>
  258. <template #reference>
  259. <span class="select-value-box">{{PPTOptState.copySelectData.GroupName||'请选择目录'}}</span>
  260. </template>
  261. </van-popover>
  262. </div>
  263. </van-dialog>
  264. </template>
  265. <style lang="scss">
  266. .van-collapse-item__content{
  267. padding: 0;
  268. }
  269. .van-collapse-item--border:after{
  270. display: none;
  271. }
  272. .van-collapse-item__title--expanded{
  273. padding-bottom: 6px;
  274. }
  275. .van-collapse-item__wrapper{
  276. margin-bottom: 20px;
  277. }
  278. .van-collapse-item__title--expanded:after{
  279. display: none;
  280. }
  281. .select-copy-val-box{
  282. min-width: 150PX;
  283. padding: 10PX;
  284. max-height: 300PX;
  285. overflow-y: auto;
  286. &::-webkit-scrollbar{
  287. display: none;
  288. }
  289. .item{
  290. border-bottom: 1px solid $border-color;
  291. font-size: 14PX;
  292. padding: 10PX 0;
  293. }
  294. }
  295. @media screen and (min-width:$media-width){
  296. .pad-classify-file-opt-box{
  297. border: 1px solid $border-color;
  298. padding: 10px 0;
  299. .item{
  300. padding: 10px 20px;
  301. display: flex;
  302. align-items: center;
  303. img{
  304. width: 20px;
  305. margin-right: 8px;
  306. }
  307. }
  308. .del{
  309. color: $theme-red;
  310. }
  311. }
  312. }
  313. </style>
  314. <style lang="scss" scoped>
  315. @media screen and (min-width:$media-width){
  316. .pad-ppt-index-wrap{
  317. display: flex;
  318. .left-classify-wrap{
  319. width: 300px;
  320. min-height: 100vh;
  321. border-right: 1px solid $border-color;
  322. padding: 30px;
  323. .sticky-box{
  324. position: sticky;
  325. top: 90px;
  326. }
  327. .classify-type-box{
  328. span{
  329. display: inline-block;
  330. padding-bottom: 5px;
  331. margin-right: 30px;
  332. }
  333. .active{
  334. color: $theme-color;
  335. font-weight: bold;
  336. border-bottom: 2px solid $theme-color;
  337. }
  338. }
  339. .classify-list{
  340. height: 80vh;
  341. overflow-y: auto;
  342. &::-webkit-scrollbar{
  343. display: none;
  344. }
  345. }
  346. .level-two{
  347. padding-top: 20px;
  348. margin-left: -15px;
  349. }
  350. .title-second{
  351. display: flex;
  352. align-items: center;
  353. position: relative;
  354. img{
  355. width: 20px;
  356. margin-right: 8px;
  357. }
  358. span{
  359. display: block;
  360. width: 80%;
  361. font-size: 16px;
  362. }
  363. .menu-icon{
  364. width: 15px;
  365. position: absolute;
  366. right: 0;
  367. top: 5px;
  368. text-align: center;
  369. .icon{
  370. width: 3px;
  371. margin-right: 0;
  372. }
  373. }
  374. }
  375. .ppt-item{
  376. border-bottom: 1px solid $border-color;
  377. margin-left: 40px;
  378. margin-right: var(--van-cell-horizontal-padding);
  379. padding-top: 14px;
  380. padding-bottom: 10px;
  381. position: relative;
  382. color: $font-grey;
  383. display: flex;
  384. .text{
  385. width: calc(100% - 55px);
  386. display: block;
  387. }
  388. .menu-icon{
  389. width: 15px;
  390. position: absolute;
  391. right: 0;
  392. top: 20px;
  393. text-align: center;
  394. .icon{
  395. width: 3px;
  396. }
  397. }
  398. .share-icon{
  399. width: 16px;
  400. height: 16px;
  401. position: absolute;
  402. right: 35px;
  403. top: 17px;
  404. }
  405. }
  406. }
  407. .right-list-wrap{
  408. flex: 1;
  409. .search-box{
  410. padding: 0 10px;
  411. position: sticky;
  412. top: 60px;
  413. }
  414. .list-wrap{
  415. padding: var(--van-search-padding);
  416. display: flex;
  417. flex-wrap: wrap;
  418. justify-content: center;
  419. .item{
  420. display: block;
  421. box-sizing: border-box;
  422. width: 260px;
  423. min-height: 240px;
  424. padding: 10px 14px;
  425. border: 1px solid $border-color;
  426. margin-bottom: 20px;
  427. margin-left: 10px;
  428. margin-right: 10px;
  429. .bg-img{
  430. width: 100%;
  431. display: block;
  432. margin: 10px 0;
  433. }
  434. }
  435. .empty-item{
  436. display: block;
  437. box-sizing: border-box;
  438. width: 260px;
  439. padding: 10px 14px;
  440. margin-left: 10px;
  441. margin-right: 10px;
  442. }
  443. }
  444. }
  445. }
  446. .file-rename-wrap{
  447. display: flex;
  448. align-items: center;
  449. padding: 50px 30px;
  450. span{
  451. flex-shrink: 0;
  452. margin-right: 20px;
  453. }
  454. input{
  455. flex: 1;
  456. line-height: 35px;
  457. padding: 0 30px;
  458. border-radius: 35px;
  459. border: 1px solid $border-color;
  460. width: 150px;
  461. }
  462. }
  463. .ppt-copy-wrap{
  464. display: flex;
  465. align-items: center;
  466. padding: 50px 30px;
  467. span{
  468. flex-shrink: 0;
  469. margin-right: 20px;
  470. }
  471. :deep(.van-popover__wrapper){
  472. flex: 1;
  473. }
  474. .select-value-box{
  475. display: block;
  476. height: 35px;
  477. line-height: 35px;
  478. padding: 0 30px;
  479. border-radius: 35px;
  480. border: 1px solid $border-color;
  481. // min-width: 150px;
  482. }
  483. }
  484. }
  485. </style>