| <!-- | 
|  * @Author: 秦少卫 | 
|  * @Date: 2024-05-30 10:48:00 | 
|  * @LastEditors: 秦少卫 | 
|  * @LastEditTime: 2024-06-09 17:08:48 | 
|  * @Description: 模板文件 | 
| --> | 
| <template> | 
|   <Tooltip :content="props.name" placement="top"> | 
|     <div class="file-type-box"> | 
|       <Image | 
|         lazy | 
|         @click="beforeClearTip" | 
|         :src="props.src" | 
|         fit="contain" | 
|         height="100%" | 
|         width="100%" | 
|         :alt="props.name" | 
|       /> | 
|       <div class="more"> | 
|         <Dropdown trigger="click" @on-click="operation"> | 
|           <Button size="small" shape="circle" type="text"> | 
|             <Icon type="ios-more" :size="24" /> | 
|           </Button> | 
|           <template #list> | 
|             <DropdownMenu> | 
|               <DropdownItem name="reName">重命名</DropdownItem> | 
|               <DropdownItem name="delete">删除</DropdownItem> | 
|               <DropdownItem name="transfer">迁移目录</DropdownItem> | 
|             </DropdownMenu> | 
|           </template> | 
|         </Dropdown> | 
|       </div> | 
|     </div> | 
|   </Tooltip> | 
|   <!-- 迁移文件夹 --> | 
|   <Modal v-model="modalVisable" title="请选择迁移目录" @on-ok="transferRequest"> | 
|     <TreeSelect v-model="fileTypeId" :data="treeData" v-width="200" /> | 
|   </Modal> | 
|   <!--  --> | 
| </template> | 
|   | 
| <script setup name="ImportTmpl"> | 
| import useMaterial from '@/hooks/useMaterial'; | 
| import { useI18n } from 'vue-i18n'; | 
| import useSelect from '@/hooks/select'; | 
| import { getUserFileTypeTree, updataTempl } from '@/api/user'; | 
| const { t } = useI18n(); | 
| const { canvasEditor } = useSelect(); | 
| const { reNameFileType, removeTemplInfo, routerToId, getTemplInfo } = useMaterial(); | 
|   | 
| import { Modal, Input, Spin, Message } from 'view-ui-plus'; | 
|   | 
| const props = defineProps({ | 
|   name: { | 
|     type: String, | 
|     default: '', | 
|   }, | 
|   src: { | 
|     type: String, | 
|     default: '', | 
|   }, | 
|   previewSrc: { | 
|     type: String, | 
|     default: '', | 
|   }, | 
|   itemId: { | 
|     type: [Number, String], | 
|     default: '', | 
|   }, | 
|   json: { | 
|     type: Object, | 
|     default: () => ({}), | 
|   }, | 
| }); | 
|   | 
| const emit = defineEmits(['change']); | 
|   | 
| const operation = (value) => { | 
|   const mapActions = { | 
|     reName: reNameFile, | 
|     delete: deleteFile, | 
|     transfer: transfer, | 
|   }; | 
|   mapActions[value](); | 
| }; | 
| const fileName = ref(''); | 
|   | 
| const reNameFile = () => { | 
|   fileName.value = props.name; | 
|   Modal.confirm({ | 
|     title: '重命名', | 
|     render: (h) => { | 
|       return h(Input, { | 
|         size: 'large', | 
|         modelValue: fileName, | 
|         autofocus: true, | 
|         placeholder: '请输入文件名称', | 
|       }); | 
|     }, | 
|     onOk: async () => { | 
|       if (fileName.value === '') { | 
|         Message.warning('文件名称不能为空'); | 
|         return; | 
|       } | 
|       await reNameFileType(fileName.value, props.itemId); | 
|       emit('change'); | 
|     }, | 
|   }); | 
| }; | 
|   | 
| const deleteFile = async () => { | 
|   await removeTemplInfo(props.itemId); | 
|   emit('change'); | 
| }; | 
|   | 
| const beforeClearTip = () => { | 
|   Modal.confirm({ | 
|     title: t('tip'), | 
|     content: `<p>${t('replaceTip')}</p>`, | 
|     okText: t('ok'), | 
|     cancelText: t('cancel'), | 
|     onOk: () => getTempData(), | 
|   }); | 
| }; | 
|   | 
| // 获取模板数据 | 
| const getTempData = async () => { | 
|   Spin.show({ | 
|     render: (h) => h('div', t('alert.loading_data')), | 
|   }); | 
|   const data = await getTemplInfo(props.itemId); | 
|   routerToId(props.itemId); | 
|   canvasEditor.loadJSON(JSON.stringify(data.data.attributes.json), Spin.hide); | 
| }; | 
|   | 
| const modalVisable = ref(false); | 
| const fileTypeId = ref(''); | 
| const treeData = ref([]); | 
|   | 
| const transfer = async () => { | 
|   treeData.value = []; | 
|   fileTypeId.value = ''; | 
|   const res = await getUserFileTypeTree(); | 
|   treeData.value = [res.data.data]; | 
|   modalVisable.value = true; | 
| }; | 
|   | 
| const transferRequest = async () => { | 
|   const parentId = fileTypeId.value === 'root' ? '' : fileTypeId.value; | 
|   await updataTempl(props.itemId, { | 
|     data: { | 
|       parentId: String(parentId), | 
|     }, | 
|   }); | 
|   emit('change'); | 
| }; | 
| </script> | 
|   | 
| <style scoped lang="less"> | 
| // 文件夹 | 
| .file-type-box { | 
|   width: 134px; | 
|   height: 116px; | 
|   cursor: pointer; | 
|   background: #fff; | 
|   position: relative; | 
|   display: flex; | 
|   flex-direction: column; | 
|   justify-content: center; | 
|   align-items: center; | 
|   border: 1px solid #f1f1f1; | 
|   border-radius: 10px; | 
|   img { | 
|     width: 60px; | 
|     margin-top: 12px; | 
|   } | 
|   div.more { | 
|     position: absolute; | 
|     display: none; | 
|   } | 
|   &:hover { | 
|     background: rgb(243, 245, 249); | 
|     border: 1px solid rgb(225, 230, 239); | 
|     border-radius: 8px; | 
|     img { | 
|       opacity: 0.8; | 
|     } | 
|     div.more { | 
|       display: block; | 
|       top: 5px; | 
|       right: 5px; | 
|     } | 
|   } | 
| } | 
| </style> |