PadPPTIndexWrap.vue 16 KB

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