mirror of
https://gitlab.com/bramw/baserow.git
synced 2024-11-25 00:46:46 +00:00
89 lines
2.2 KiB
Vue
89 lines
2.2 KiB
Vue
<template>
|
|
<div :key="url" class="preview">
|
|
<component
|
|
:is="compatibleTypes[selectedPreview || 0].getPreviewComponent()"
|
|
v-if="
|
|
(compatibleTypes.length === 1 && externalTypes.length === 0) ||
|
|
selectedPreview !== null
|
|
"
|
|
:url="url"
|
|
:mime-type="mimeType"
|
|
>
|
|
<template #fallback><slot name="fallback" /></template>
|
|
</component>
|
|
<div
|
|
v-else-if="compatibleTypes.length > 1 || externalTypes.length === 1"
|
|
class="preview__select"
|
|
>
|
|
<slot name="fallback" />
|
|
<div v-if="externalTypes" class="preview__select-warning">
|
|
{{ $t('previewAny.externalWarning') }}
|
|
</div>
|
|
<div class="preview__select-buttons">
|
|
<Button
|
|
v-for="(preview, index) in compatibleTypes"
|
|
:key="preview.getType()"
|
|
type="secondary"
|
|
:icon="preview.isExternal() ? 'iconoir-lock-open' : ''"
|
|
@click.prevent.stop="selectedPreview = index"
|
|
>
|
|
{{ preview.getName() }}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
<slot v-else name="fallback" />
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import PreviewImage from '@baserow/modules/database/components/preview/PreviewImage'
|
|
import PreviewAudio from '@baserow/modules/database/components/preview/PreviewAudio'
|
|
import PreviewVideo from '@baserow/modules/database/components/preview/PreviewVideo'
|
|
|
|
export default {
|
|
name: 'PreviewAny',
|
|
components: {
|
|
PreviewImage,
|
|
PreviewAudio,
|
|
PreviewVideo,
|
|
},
|
|
props: {
|
|
mimeType: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
url: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
selectedPreview: null,
|
|
}
|
|
},
|
|
computed: {
|
|
// Allow to watch url property
|
|
currentUrl() {
|
|
return this.url
|
|
},
|
|
compatibleTypes() {
|
|
return this.$registry
|
|
.getOrderedList('preview')
|
|
.filter((previewType) =>
|
|
previewType.isCompatible(this.mimeType, this.url)
|
|
)
|
|
},
|
|
externalTypes() {
|
|
return this.compatibleTypes.filter((type) => type.isExternal())
|
|
},
|
|
},
|
|
watch: {
|
|
// On url change we reset the selectedPreview type
|
|
currentUrl() {
|
|
this.selectedPreview = null
|
|
},
|
|
},
|
|
}
|
|
</script>
|