<template> <transition name="fm-modal"> <div class="fm-modal" ref="fmModal" v-on:click="hideModal"> <div class="modal-dialog" role="document" v-bind:class="modalSize" v-on:click.stop > <component v-bind:is="modalName" /> </div> </div> </transition> </template> <script> import NewFile from "./views/NewFile.vue"; import NewFolder from "./views/NewFolder.vue"; import Upload from "./views/Upload.vue"; import Delete from "./views/Delete.vue"; import Clipboard from "./views/Clipboard.vue"; import Status from "./views/Status.vue"; import Rename from "./views/Rename.vue"; import Properties from "./views/Properties.vue"; import Preview from "./views/Preview.vue"; import TextEdit from "./views/TextEdit.vue"; import AudioPlayer from "./views/AudioPlayer.vue"; import VideoPlayer from "./views/VideoPlayer.vue"; import Zip from "./views/Zip.vue"; import Unzip from "./views/Unzip.vue"; import About from "./views/About.vue"; export default { name: "Modal", components: { NewFile, NewFolder, Upload, Delete, Clipboard, Status, Rename, Properties, Preview, TextEdit, AudioPlayer, VideoPlayer, Zip, Unzip, About, }, mounted() { // set height this.$store.commit( "fm/modal/setModalBlockHeight", this.$refs.fmModal.offsetHeight ); }, computed: { /** * Selected modal name * @returns {null|*} */ modalName() { return this.$store.state.fm.modal.modalName; }, /** * Modal size style * @returns {{'modal-lg': boolean, 'modal-sm': boolean}} */ modalSize() { return { "modal-xl": this.modalName === "Preview" || this.modalName === "TextEdit", "modal-lg": this.modalName === "VideoPlayer", "modal-sm": false, }; }, }, methods: { /** * Hide modal window */ hideModal() { this.$store.commit("fm/modal/clearModal"); }, }, }; </script> <style scoped lang="scss"> // @import "~bootstrap/scss/mixins"; // @import "~bootstrap/scss/functions"; // @import "~bootstrap/scss/variables"; // @import "~bootstrap/scss/modal"; .fm-modal { position: absolute; z-index: 9998; top: 0; bottom: 0; left: 0; right: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.35); display: block; transition: opacity 0.4s ease; overflow: auto; .modal-xl { max-width: 96%; } } .fm-modal-enter-active, .fm-modal-leave-active { transition: opacity 0.5s; } .fm-modal-enter, .fm-modal-leave-to { opacity: 0; } </style>