| <template> | |
| <div class="export-dialog"> | |
| <Tabs | |
| :tabs="tabs" | |
| :value="dialogForExport" | |
| card | |
| @update:value="key => setDialogForExport(key as DialogForExportTypes)" | |
| /> | |
| <div class="content"> | |
| <component :is="currentDialogComponent" @close="setDialogForExport('')"></component> | |
| </div> | |
| </div> | |
| </template> | |
| <script lang="ts" setup> | |
| import { computed } from 'vue' | |
| import { storeToRefs } from 'pinia' | |
| import { useMainStore } from '@/store' | |
| import type { DialogForExportTypes } from '@/types/export' | |
| import ExportImage from './ExportImage.vue' | |
| import ExportJSON from './ExportJSON.vue' | |
| import ExportPDF from './ExportPDF.vue' | |
| import ExportPPTX from './ExportPPTX.vue' | |
| import ExportSpecificFile from './ExportSpecificFile.vue' | |
| import ExportHTML from './ExportHTML.vue' | |
| import Tabs from '@/components/Tabs.vue' | |
| interface TabItem { | |
| key: DialogForExportTypes | |
| label: string | |
| } | |
| const mainStore = useMainStore() | |
| const { dialogForExport } = storeToRefs(mainStore) | |
| const setDialogForExport = mainStore.setDialogForExport | |
| const tabs: TabItem[] = [ | |
| { key: 'pptist', label: '导出 pptist 文件' }, | |
| { key: 'pptx', label: '导出 PPTX' }, | |
| { key: 'html', label: '导出 HTML' }, | |
| { key: 'image', label: '导出图片' }, | |
| { key: 'json', label: '导出 JSON' }, | |
| { key: 'pdf', label: '打印 / 导出 PDF' }, | |
| ] | |
| const currentDialogComponent = computed<unknown>(() => { | |
| const dialogMap = { | |
| 'image': ExportImage, | |
| 'json': ExportJSON, | |
| 'pdf': ExportPDF, | |
| 'pptx': ExportPPTX, | |
| 'pptist': ExportSpecificFile, | |
| 'html': ExportHTML, | |
| } | |
| if (dialogForExport.value) return dialogMap[dialogForExport.value] || null | |
| return null | |
| }) | |
| </script> | |
| <style lang="scss" scoped> | |
| .export-dialog { | |
| margin: -20px; | |
| } | |
| .content { | |
| height: 460px; | |
| padding: 12px; | |
| font-size: 13px; | |
| @include overflow-overlay(); | |
| } | |
| </style> |