|
<template> |
|
<div |
|
class="base-element" |
|
:class="`base-element-${elementInfo.id}`" |
|
:style="{ |
|
zIndex: elementIndex, |
|
}" |
|
> |
|
<component |
|
:is="currentElementComponent" |
|
:elementInfo="elementInfo" |
|
target="thumbnail" |
|
></component> |
|
</div> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { computed } from 'vue' |
|
import { ElementTypes, type PPTElement } from '@/types/slides' |
|
|
|
import BaseImageElement from '@/views/components/element/ImageElement/BaseImageElement.vue' |
|
import BaseTextElement from '@/views/components/element/TextElement/BaseTextElement.vue' |
|
import BaseShapeElement from '@/views/components/element/ShapeElement/BaseShapeElement.vue' |
|
import BaseLineElement from '@/views/components/element/LineElement/BaseLineElement.vue' |
|
import BaseChartElement from '@/views/components/element/ChartElement/BaseChartElement.vue' |
|
import BaseTableElement from '@/views/components/element/TableElement/BaseTableElement.vue' |
|
import BaseLatexElement from '@/views/components/element/LatexElement/BaseLatexElement.vue' |
|
import BaseVideoElement from '@/views/components/element/VideoElement/BaseVideoElement.vue' |
|
import BaseAudioElement from '@/views/components/element/AudioElement/BaseAudioElement.vue' |
|
|
|
const props = defineProps<{ |
|
elementInfo: PPTElement |
|
elementIndex: number |
|
}>() |
|
|
|
const currentElementComponent = computed<unknown>(() => { |
|
const elementTypeMap = { |
|
[ElementTypes.IMAGE]: BaseImageElement, |
|
[ElementTypes.TEXT]: BaseTextElement, |
|
[ElementTypes.SHAPE]: BaseShapeElement, |
|
[ElementTypes.LINE]: BaseLineElement, |
|
[ElementTypes.CHART]: BaseChartElement, |
|
[ElementTypes.TABLE]: BaseTableElement, |
|
[ElementTypes.LATEX]: BaseLatexElement, |
|
[ElementTypes.VIDEO]: BaseVideoElement, |
|
[ElementTypes.AUDIO]: BaseAudioElement, |
|
} |
|
return elementTypeMap[props.elementInfo.type] || null |
|
}) |
|
</script> |