%PDF- %PDF-
Direktori : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/app/slides/external/ |
Current File : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/app/slides/external/External.vue |
<template> <div class="attachments-browser external-media-importer"> <div v-if="downloading" class="ms-hero-status"> <div v-if="uploadPercentage > 0" class="ms-upload-progress"> <div class="ms-upload-image"> <span :aria-label="$refs['external-api'].fileName" tabindex="0" role="checkbox" aria-checked="false" style="width:150px;height:150px" class="attachment save-ready"> <div class="attachment-preview js--select-attachment type-image subtype-jpeg portrait"> <div class="thumbnail"> <div class="centered"> <img :src="$refs['external-api'].selected.urls.regular" :alt="$refs['external-api'].fileName" draggable="false"> </div> </div> </div> </span> </div> <div class="ms-progress"> <div :style="{width: uploadPercentage + '%'}" class="ms-progress-bar"/> <span class="text-lg">{{ downloadingMessage ? downloadingMessage : __('Crunching...', 'ml-slider') }}</span> </div> </div> </div> <component v-show="!downloading" ref="external-api" :is="component"> <template slot="search-tools"> <slot name="search-tools"/> </template> </component> </div> </template> <script> import { EventManager } from '../../utils' import { Axios } from '../../api' import unsplash from './Unsplash.vue' export default { components: { unsplash }, props: { source: { type: [String], default: 'unsplash' }, slideshowId: { type: [String, Number], default: null }, slideId: { type: [String, Number], default: null }, slideType: { type: [String], default: 'image' } }, data() { return { page: 1, component: null, mediaButton: {}, ourMediaButton: {}, downloading: false, uploadPercentage: 1, downloadingMessage: '' } }, watch: { downloading() { this.ourMediaButton.disabled = this.downloading if (this.downloading) window.metaslider.about_to_reload = true } }, created() { // This can support other APIs, hard coded now for unsplash this.component = this.source }, mounted() { // Set up the download progress bar % EventManager.$on('metaslider/external-api-percentage', ({ percentage }) => { this.uploadPercentage = percentage }) // If the user has some images selected from the original media selector, remove them const importerContainer = document.querySelector('.external-media-importer') let clearButton = importerContainer.closest('.media-modal-content') clearButton = clearButton.querySelector('button.clear-selection') clearButton && clearButton.click() // Manually deselect any possible remaining images const selectedImages = document.querySelectorAll('.attachment.save-ready.selected') selectedImages && selectedImages.forEach(image => { image.click() }) // Hack into the media upload button when the component is active let modalContainer = importerContainer.closest('.media-modal-content') this.mediaButton = modalContainer.querySelector('.media-frame-toolbar .media-toolbar-primary button.media-button') // Clone the button and use our version instead (original restored on destroy) this.ourMediaButton = this.mediaButton.cloneNode() this.ourMediaButton.classList.add('float-right', 'rtl\:float-left') this.ourMediaButton.innerHTML = this.mediaButton.innerHTML this.mediaButton.parentNode.insertBefore(this.ourMediaButton, this.mediaButton) this.ourMediaButton.disabled = false this.mediaButton.style.visibility = 'hidden' // The component isn't destroyed on tab switching, so this could be added multiple times. That's ok. this.ourMediaButton.addEventListener('click', this.interceptAddButton) }, destroyed() { // Delete our button and show the original button this.ourMediaButton.removeEventListener('click', this.interceptAddButton) this.ourMediaButton.parentNode.removeChild(this.ourMediaButton) this.mediaButton.style.visibility = 'visible' const container = document.getElementById('image-api-container') container && container.parentNode.removeChild(container) if (window.metaslider.about_to_reload) { delete window.metaslider.about_to_reload // Close any WP media modals (currently we only have two) window.create_slides && window.create_slides.close() window.update_slide_frame && window.update_slide_frame.close() } }, methods: { async interceptAddButton(event) { // Child components must impliment some of these referenced methods if (this.$refs['external-api'].selected.id) { this.downloading = true this.downloadingMessage = this.__('Saving...', 'ml-slider') const { data } = await this.$refs['external-api'].download() const uploadData = this.$refs['external-api'].upload const formData = new FormData() const name = this.$refs['external-api'].fileName // Add the file formData.append('files[' + name + ']', data, name) // Add the data (captions, etc) Object.keys(this.$refs['external-api'].upload).forEach(key => { let value = uploadData[key] formData.append('image_data[' + name + '][' + key + ']', value) }) // Add additional info as needed formData.append('slideshow_id', this.slideshowId) this.slideType && formData.append('slide_type', this.slideType) this.slideId && formData.append('slide_id', this.slideId) formData.append('action', 'ms_import_images') const thumbnail = await Axios.post('import/images', formData).catch(error => { this.notifyError('metaslider/image-import-error', error, true) this.slideId = true // Prevent page reload this.$destroy() // Close the module }) // incread slider to 100 and wait a second this.uploadPercentage = 100 this.downloadingMessage = this.__('Complete!', 'ml-slider') await new Promise(resolve => setTimeout(resolve, 1500)) // Reload to show the new slide !this.slideId && window.location.reload(true) // Set the new image if we are on a slide if (this.slideId) { document.querySelector('[data-slide-id="' + this.slideId + '"] .thumb').style.backgroundImage = 'url(' + thumbnail.data.data + ')' // Update any image data fields as necessary (field does not need to exist) EventManager.$emit('metaslider/image-meta-updated', ['' + this.slideId], this.$refs['external-api'].upload) } // We're done! this.$destroy() } // Don't need error handling / validation here } } } </script> <style lang="scss"> .external-media-importer { ul.attachments li { max-width: 175px; } } .ms-hero-status { display: flex; align-items: center; // justify-content: center; flex-direction: column; width: 100%; height: 100%; .ms-upload-progress { height: 100%; } .ms-progress { width: 50%; span { line-height: 24px; } } } .ms-upload-image { margin: 1rem 0; border: 2px solid rgba(204, 204, 204, 0.7); img { width: 100%; display: block; } } </style>