<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>