%PDF- %PDF-
| Direktori : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/app/slides/import/ |
| Current File : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/app/slides/import/DragDropImport.vue |
<template>
<div id="ms-image-drag-drop">
<span v-if="!dragAndDropCapable">{{ __('Drag and drop interface not available.', 'ml-slider') }}</span>
<form v-show="dragAndDropCapable">
<div
ref="fileform"
:class="{'ms-drag-hovering': isDragHovering || uploadPercentage > 0, 'has-error': error}"
class="ms-drag-drop"
@dragenter="isDragHovering = true"
@dragleave="isDragHovering = false">
<div
v-if="uploadPercentage > 0"
class="ms-upload-progress">
<div class="ms-progress">
<div
:style="{width: uploadPercentage + '%'}"
class="ms-progress-bar"/>
<span>{{ __('Crunching...', 'ml-slider') }}</span>
</div>
</div>
</div>
<span v-if="uploadPercentage === 0 && !error">{{ __('Drop images here', 'ml-slider') }}</span>
<span
v-if="error"
v-text="error"/>
</form>
</div>
</template>
<script>
import { Axios } from '../../api'
export default {
// TODO: perhaps use this to allow a file or package to be dropped (for future export/import)
// props: [],
data() {
return {
dragAndDropCapable: false,
files: [],
uploadPercentage: 0,
isDragHovering: false,
error: false
}
},
mounted() {
const dragDropEvents = [
'drag', 'dragstart', 'dragend', 'dragover', 'dragenter', 'dragleave', 'drop'
]
this.dragAndDropCapable = this.determineDragAndDropCapable()
if (this.dragAndDropCapable) {
// Add a listener for each event to stop browser default
dragDropEvents.forEach(event => {
this.$refs.fileform.addEventListener(event, e => {
e.preventDefault()
e.stopPropagation()
})
})
// Add an event listener to upload when dropping on the form
this.$refs.fileform.addEventListener('drop', this.attachDropEvent)
}
},
methods: {
attachDropEvent(event) {
this.isDragHovering = true
// Add only images to the local files array
for (let i = 0; i < event.dataTransfer.files.length; i++) {
/\.(jpe?g|png|gif)$/i.test(event.dataTransfer.files[i].name) && this.files.push(event.dataTransfer.files[i])
}
// If no files found reset the UI and show an error
if (!this.files.length) {
this.isDragHovering = false
this.error = this.__('No valid files found', 'ml-slider')
}
// Upload right away
this.files.length && this.submitFiles()
},
// Determines if the drag and drop functionality is in the window
determineDragAndDropCapable() {
let div = document.createElement('div')
return (('draggable' in div) ||
('ondragstart' in div && 'ondrop' in div)) &&
'FormData' in window &&
'FileReader' in window
},
// Handles uploading
submitFiles() {
let formData = new FormData()
for (let key in this.files) {
formData.append('files[' + key + ']', this.files[key])
}
// Start the uploader animation
this.uploadPercentage = 1
// Add param for old WP
formData.append('action', 'ms_import_images')
this.files.length && Axios.post('import/images', formData, {
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress: progressEvent => {
// Leave the last 20% for the final confirmation from the server
let percentage = parseInt(Math.round((progressEvent.loaded * 100) / progressEvent.total)) - 20
this.uploadPercentage = percentage > 1 ? percentage : 1
}
}).then(response => {
console.info('MetaSlider: ', response)
this.uploadPercentage = 100
// Refresh to show added slides
window.location.reload(true)
}).catch(error => {
this.uploadPercentage = 0
this.isDragHovering = false
this.$refs.fileform.removeEventListener('drop', this.attachDropEvent)
this.error = this.getErrorMessage(error.response)
this.notifyError('metaslider/drag-and-drop-error', error, true)
})
}
}
}
</script>
<style lang="scss" scoped>
@import '../../assets/styles/globals.scss';
@import '../../assets/styles/mixins.scss';
#ms-image-drag-drop > form {
display: flex;
justify-content: center;
align-items: center;
position: relative;
height: 100px;
margin: auto;
margin-top: 1rem;
> div {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 0;
left:0;
color: #a0a5aa;
background: transparent;
transition: all 0.2s ease-in-out;
font-size: 1.3em;
width: 100%;
height: 100%;
border: 4px dashed #b4b9be;
&.ms-drag-hovering {
background: #eee;
height: 200%;
border-color: $blue-light;
}
&.has-error {
border-color: $red !important;
~ span {
color: $red;
}
}
}
}
</style>