mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-05-21 04:35:00 +00:00
upload progressbar UI
This commit is contained in:
@@ -110,7 +110,7 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters([
|
...mapGetters([
|
||||||
'isLogged', 'isGuest', 'config'
|
'isLogged', 'isGuest', 'config', 'filesQueue'
|
||||||
]),
|
]),
|
||||||
isGuestLayout() {
|
isGuestLayout() {
|
||||||
return (includes([
|
return (includes([
|
||||||
@@ -139,6 +139,11 @@ export default {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
filesQueue() {
|
||||||
|
//this.$handleUploading()
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
isScaledDown: false
|
isScaledDown: false
|
||||||
|
|||||||
@@ -1,20 +1,26 @@
|
|||||||
<template>
|
<template>
|
||||||
<transition name="info-panel">
|
<transition name="info-panel">
|
||||||
<div v-if="uploadingFilesCount" class="upload-progress">
|
<div v-if="filesQueue.length > 0" class="upload-progress">
|
||||||
<div class="progress-title">
|
<div class="progress-title">
|
||||||
|
|
||||||
|
<!--Is processing-->
|
||||||
<span v-if="isProcessingFile">
|
<span v-if="isProcessingFile">
|
||||||
<refresh-cw-icon size="12" class="sync-alt"></refresh-cw-icon>
|
<refresh-cw-icon size="12" class="sync-alt"></refresh-cw-icon>
|
||||||
{{ $t('uploading.processing_file') }}
|
{{ $t('uploading.processing_file') }}
|
||||||
</span>
|
</span>
|
||||||
<span v-if="!isProcessingFile && uploadingFilesCount.total === 1">
|
|
||||||
{{ $t('uploading.progress_single_upload', {progress: uploadingFileProgress}) }}
|
<!--Single file upload-->
|
||||||
|
<span v-if="!isProcessingFile && filesQueue.length === 1">
|
||||||
|
{{ $t('uploading.progress_single_upload', {progress: 80}) }}
|
||||||
</span>
|
</span>
|
||||||
<span v-if="!isProcessingFile && uploadingFilesCount.total > 1">
|
|
||||||
{{ $t('uploading.progress', {current:uploadingFilesCount.current, total: uploadingFilesCount.total, progress: uploadingFileProgress}) }}
|
<!--Multi file upload-->
|
||||||
|
<span v-if="!isProcessingFile && filesQueue.length > 1">
|
||||||
|
{{ $t('uploading.progress', {current:'x', total: filesQueue.length, progress: 80}) }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="progress-wrapper">
|
<div class="progress-wrapper">
|
||||||
<ProgressBar :progress="uploadingFileProgress" />
|
<ProgressBar :progress="80" />
|
||||||
<span @click="cancelUpload" :title="$t('uploading.cancel')" class="cancel-icon">
|
<span @click="cancelUpload" :title="$t('uploading.cancel')" class="cancel-icon">
|
||||||
<x-icon size="16" @click="cancelUpload"></x-icon>
|
<x-icon size="16" @click="cancelUpload"></x-icon>
|
||||||
</span>
|
</span>
|
||||||
@@ -38,9 +44,8 @@
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters([
|
...mapGetters([
|
||||||
'uploadingFileProgress',
|
|
||||||
'uploadingFilesCount',
|
|
||||||
'isProcessingFile',
|
'isProcessingFile',
|
||||||
|
'filesQueue',
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
Vendored
+22
-15
@@ -76,19 +76,20 @@ const Helpers = {
|
|||||||
this.$store.dispatch('createFolder', folderName)
|
this.$store.dispatch('createFolder', folderName)
|
||||||
}
|
}
|
||||||
|
|
||||||
Vue.prototype.$handleUploading = async function (files, parent_id) {
|
Vue.prototype.$handleUploading = async function () {
|
||||||
|
|
||||||
|
//let files = this.$store.getters.filesQueue
|
||||||
let fileBuffer = []
|
let fileBuffer = []
|
||||||
|
|
||||||
// Append the file list to fileBuffer array
|
// Append the file list to fileBuffer array
|
||||||
Array.prototype.push.apply(fileBuffer, files);
|
Array.prototype.push.apply(fileBuffer, this.$store.getters.filesQueue);
|
||||||
|
|
||||||
let fileSucceed = 0
|
let fileSucceed = 0
|
||||||
|
|
||||||
// Update files count in progressbar
|
// Update files count in progressbar
|
||||||
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
|
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
|
||||||
current: fileSucceed,
|
current: fileSucceed,
|
||||||
total: files.length
|
total: this.$store.getters.filesQueue.length
|
||||||
})
|
})
|
||||||
|
|
||||||
// Reset upload progress to 0
|
// Reset upload progress to 0
|
||||||
@@ -96,21 +97,20 @@ const Helpers = {
|
|||||||
|
|
||||||
// Get parent id
|
// Get parent id
|
||||||
let parentFolder = this.$store.getters.currentFolder ? this.$store.getters.currentFolder.unique_id : 0
|
let parentFolder = this.$store.getters.currentFolder ? this.$store.getters.currentFolder.unique_id : 0
|
||||||
let rootFolder = parent_id ? parent_id : parentFolder
|
|
||||||
|
|
||||||
// Upload files
|
// Upload files
|
||||||
do {
|
do {
|
||||||
let file = fileBuffer.shift(),
|
let onQueue = fileBuffer.shift(),
|
||||||
chunks = []
|
chunks = []
|
||||||
|
|
||||||
// Calculate ceils
|
// Calculate ceils
|
||||||
let size = this.$store.getters.config.chunkSize,
|
let size = this.$store.getters.config.chunkSize,
|
||||||
chunksCeil = Math.ceil(file.size / size);
|
chunksCeil = Math.ceil(onQueue.file.size / size);
|
||||||
|
|
||||||
// Create chunks
|
// Create chunks
|
||||||
for (let i = 0; i < chunksCeil; i++) {
|
for (let i = 0; i < chunksCeil; i++) {
|
||||||
chunks.push(file.slice(
|
chunks.push(onQueue.file.slice(
|
||||||
i * size, Math.min(i * size + size, file.size), file.type
|
i * size, Math.min(i * size + size, onQueue.file.size), onQueue.file.type
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ const Helpers = {
|
|||||||
let formData = new FormData(),
|
let formData = new FormData(),
|
||||||
uploadedSize = 0,
|
uploadedSize = 0,
|
||||||
isNotGeneralError = true,
|
isNotGeneralError = true,
|
||||||
striped_name = file.name.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, ''),
|
striped_name = onQueue.file.name.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, ''),
|
||||||
filename = Array(16).fill(0).map(x => Math.random().toString(36).charAt(2)).join('') + '-' + striped_name + '.part'
|
filename = Array(16).fill(0).map(x => Math.random().toString(36).charAt(2)).join('') + '-' + striped_name + '.part'
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@@ -128,14 +128,14 @@ const Helpers = {
|
|||||||
|
|
||||||
// Set form data
|
// Set form data
|
||||||
formData.set('file', chunk, filename);
|
formData.set('file', chunk, filename);
|
||||||
formData.set('parent_id', rootFolder)
|
formData.set('parent_id', onQueue.parent_id)
|
||||||
formData.set('is_last', isLast);
|
formData.set('is_last', isLast);
|
||||||
|
|
||||||
// Upload chunks
|
// Upload chunks
|
||||||
do {
|
do {
|
||||||
await store.dispatch('uploadFiles', {
|
await store.dispatch('uploadFiles', {
|
||||||
form: formData,
|
form: formData,
|
||||||
fileSize: file.size,
|
fileSize: onQueue.file.size,
|
||||||
totalUploadedSize: uploadedSize
|
totalUploadedSize: uploadedSize
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
uploadedSize = uploadedSize + chunk.size
|
uploadedSize = uploadedSize + chunk.size
|
||||||
@@ -165,7 +165,7 @@ const Helpers = {
|
|||||||
// Progress file log
|
// Progress file log
|
||||||
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
|
store.commit('UPDATE_FILE_COUNT_PROGRESS', {
|
||||||
current: fileSucceed,
|
current: fileSucceed,
|
||||||
total: files.length
|
total: this.$store.getters.filesQueue.length
|
||||||
})
|
})
|
||||||
|
|
||||||
} while (fileBuffer.length !== 0)
|
} while (fileBuffer.length !== 0)
|
||||||
@@ -187,10 +187,17 @@ const Helpers = {
|
|||||||
// Prevent submit empty files
|
// Prevent submit empty files
|
||||||
if (event.dataTransfer.items.length == 0) return
|
if (event.dataTransfer.items.length == 0) return
|
||||||
|
|
||||||
// Get files
|
// Push files to queue
|
||||||
let files = [...event.dataTransfer.items].map(item => item.getAsFile());
|
[...event.dataTransfer.items].map(item => {
|
||||||
|
this.$store.commit('ADD_FILES_TO_QUEUE', {
|
||||||
|
parent_id: parent_id,
|
||||||
|
file: item.getAsFile(),
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
this.$handleUploading(files, parent_id)
|
if (! this.$store.getters.uploadingFilesCount) {
|
||||||
|
this.$handleUploading()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vue.prototype.$downloadFile = function (url, filename) {
|
Vue.prototype.$downloadFile = function (url, filename) {
|
||||||
|
|||||||
+8
-1
@@ -7,6 +7,7 @@ import Vue from 'vue'
|
|||||||
|
|
||||||
const defaultState = {
|
const defaultState = {
|
||||||
processingPopup: undefined,
|
processingPopup: undefined,
|
||||||
|
filesQueue: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
const actions = {
|
const actions = {
|
||||||
@@ -197,6 +198,8 @@ const actions = {
|
|||||||
if (response.data.folder_id == getters.currentFolder.unique_id)
|
if (response.data.folder_id == getters.currentFolder.unique_id)
|
||||||
commit('ADD_NEW_ITEMS', response.data)
|
commit('ADD_NEW_ITEMS', response.data)
|
||||||
|
|
||||||
|
// TODO: handle new uploads if exist
|
||||||
|
|
||||||
resolve(response)
|
resolve(response)
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -384,11 +387,15 @@ const actions = {
|
|||||||
const mutations = {
|
const mutations = {
|
||||||
PROCESSING_POPUP(state, status) {
|
PROCESSING_POPUP(state, status) {
|
||||||
state.processingPopup = status
|
state.processingPopup = status
|
||||||
|
},
|
||||||
|
ADD_FILES_TO_QUEUE(state, file) {
|
||||||
|
state.filesQueue.push(file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getters = {
|
const getters = {
|
||||||
processingPopup: state => state.processingPopup
|
processingPopup: state => state.processingPopup,
|
||||||
|
filesQueue: state => state.filesQueue,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
Reference in New Issue
Block a user