index.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <template>
  2. <div class="export-dialog">
  3. <Tabs
  4. :tabs="tabs"
  5. :value="dialogForExport"
  6. card
  7. @update:value="key => setDialogForExport(key as DialogForExportTypes)"
  8. />
  9. <div class="content">
  10. <component :is="currentDialogComponent" @close="setDialogForExport('')"></component>
  11. </div>
  12. </div>
  13. </template>
  14. <script lang="ts" setup>
  15. import { computed } from 'vue'
  16. import { storeToRefs } from 'pinia'
  17. import { useMainStore } from '@/store'
  18. import type { DialogForExportTypes } from '@/types/export'
  19. import ExportImage from './ExportImage.vue'
  20. import ExportJSON from './ExportJSON.vue'
  21. import ExportPDF from './ExportPDF.vue'
  22. import ExportPPTX from './ExportPPTX.vue'
  23. import ExportSpecificFile from './ExportSpecificFile.vue'
  24. import Tabs from '@/components/Tabs.vue'
  25. interface TabItem {
  26. key: DialogForExportTypes
  27. label: string
  28. }
  29. const mainStore = useMainStore()
  30. const { dialogForExport } = storeToRefs(mainStore)
  31. const setDialogForExport = mainStore.setDialogForExport
  32. const tabs: TabItem[] = [
  33. { key: 'pptist', label: '导出 pptist 文件' },
  34. { key: 'pptx', label: '导出 PPTX' },
  35. { key: 'image', label: '导出图片' },
  36. { key: 'json', label: '导出 JSON' },
  37. { key: 'pdf', label: '打印 / 导出 PDF' },
  38. ]
  39. const currentDialogComponent = computed<unknown>(() => {
  40. const dialogMap = {
  41. 'image': ExportImage,
  42. 'json': ExportJSON,
  43. 'pdf': ExportPDF,
  44. 'pptx': ExportPPTX,
  45. 'pptist': ExportSpecificFile,
  46. }
  47. if (dialogForExport.value) return dialogMap[dialogForExport.value] || null
  48. return null
  49. })
  50. </script>
  51. <style lang="scss" scoped>
  52. .export-dialog {
  53. margin: -20px;
  54. }
  55. .content {
  56. height: 460px;
  57. padding: 12px;
  58. font-size: 13px;
  59. @include overflow-overlay();
  60. }
  61. </style>