|
<template> |
|
<div class="link-handler" :style="{ top: height * canvasScale + 10 + 'px' }"> |
|
<a class="link" v-if="link.type === 'web'" :href="link.target" target="_blank">{{link.target}}</a> |
|
<a class="link" v-else @click="turnTarget(link.target)">幻灯片页面 {{link.target}}</a> |
|
<div class="btns"> |
|
<div class="btn" @click="openLinkDialog()">更换</div> |
|
<Divider type="vertical" /> |
|
<div class="btn" @click="removeLink(elementInfo)">移除</div> |
|
</div> |
|
</div> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { computed } from 'vue' |
|
import { storeToRefs } from 'pinia' |
|
import { useMainStore, useSlidesStore } from '@/store' |
|
import type { PPTElement, PPTElementLink } from '@/types/slides' |
|
import useLink from '@/hooks/useLink' |
|
import Divider from '@/components/Divider.vue' |
|
|
|
const props = defineProps<{ |
|
elementInfo: PPTElement |
|
link: PPTElementLink |
|
openLinkDialog: () => void |
|
}>() |
|
|
|
const mainStore = useMainStore() |
|
const slidesStore = useSlidesStore() |
|
const { canvasScale } = storeToRefs(mainStore) |
|
const { slides } = storeToRefs(slidesStore) |
|
const { removeLink } = useLink() |
|
const height = computed(() => props.elementInfo.type === 'line' ? 0 : props.elementInfo.height) |
|
|
|
const turnTarget = (slideId: string) => { |
|
const targetIndex = slides.value.findIndex(item => item.id === slideId) |
|
if (targetIndex !== -1) { |
|
mainStore.setActiveElementIdList([]) |
|
slidesStore.updateSlideIndex(targetIndex) |
|
} |
|
} |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
.link-handler { |
|
height: 30px; |
|
position: absolute; |
|
left: 0; |
|
font-size: 12px; |
|
padding: 0 10px; |
|
background-color: #fff; |
|
box-shadow: $boxShadow; |
|
display: flex; |
|
align-items: center; |
|
color: $themeColor; |
|
} |
|
.link { |
|
max-width: 300px; |
|
margin-right: 20px; |
|
word-break: keep-all; |
|
white-space: nowrap; |
|
cursor: pointer; |
|
|
|
@include ellipsis-oneline(); |
|
} |
|
.btns { |
|
display: flex; |
|
align-items: center; |
|
|
|
.btn { |
|
word-break: keep-all; |
|
cursor: pointer; |
|
} |
|
} |
|
</style> |