mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-06 02:33:48 +00:00
397 lines
9.9 KiB
JavaScript
Vendored
397 lines
9.9 KiB
JavaScript
Vendored
import i18n from '@/i18n/index'
|
|
import router from '@/router'
|
|
import { events } from '@/bus'
|
|
import { last } from 'lodash'
|
|
import axios from 'axios'
|
|
import Vue from 'vue'
|
|
|
|
const defaultState = {
|
|
isZippingFiles: false,
|
|
}
|
|
|
|
const actions = {
|
|
downloadFolder: ({commit, getters}, folder) => {
|
|
|
|
commit('ZIPPING_FILE_STATUS', true)
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/zip-folder/' + folder.unique_id + '/public/' + router.currentRoute.params.token
|
|
: '/api/zip-folder/' + folder.unique_id
|
|
|
|
axios.get(route)
|
|
.then(response => {
|
|
Vue.prototype.$downloadFile(response.data.url, response.data.name)
|
|
})
|
|
.catch(() => {
|
|
Vue.prototype.$isSomethingWrong()
|
|
})
|
|
.finally(() => {
|
|
commit('ZIPPING_FILE_STATUS', false)
|
|
})
|
|
|
|
},
|
|
downloadFiles: ({ commit, getters }) => {
|
|
let files = []
|
|
|
|
// get unique_ids of selected files
|
|
getters.fileInfoDetail.forEach(file => files.push(file.unique_id))
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/zip/public/' + router.currentRoute.params.token
|
|
: '/api/zip'
|
|
|
|
commit('ZIPPING_FILE_STATUS', true)
|
|
|
|
axios.post(route, {
|
|
files: files
|
|
})
|
|
.then(response => {
|
|
Vue.prototype.$downloadFile(response.data.url, response.data.name)
|
|
})
|
|
.catch(() => {
|
|
Vue.prototype.$isSomethingWrong()
|
|
})
|
|
.finally(() => {
|
|
commit('ZIPPING_FILE_STATUS', false)
|
|
})
|
|
},
|
|
moveItem: ({ commit, getters, dispatch }, { to_item, noSelectedItem }) => {
|
|
|
|
let itemsToMove = []
|
|
let items = [noSelectedItem]
|
|
|
|
// If coming no selected item dont get items to move from fileInfoDetail
|
|
if (!noSelectedItem)
|
|
items = getters.fileInfoDetail
|
|
|
|
items.forEach(data => itemsToMove.push({
|
|
'force_delete': data.deleted_at ? true : false,
|
|
'unique_id': data.unique_id,
|
|
'type': data.type
|
|
}))
|
|
|
|
// Remove file preview
|
|
if (!noSelectedItem)
|
|
commit('CLEAR_FILEINFO_DETAIL')
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/move/public/' + router.currentRoute.params.token
|
|
: '/api/move'
|
|
|
|
axios
|
|
.post(route, {
|
|
_method: 'post',
|
|
to_unique_id: to_item.unique_id,
|
|
items: itemsToMove
|
|
})
|
|
.then(() => {
|
|
itemsToMove.forEach(item => {
|
|
commit('REMOVE_ITEM', item.unique_id)
|
|
commit('INCREASE_FOLDER_ITEM', to_item.unique_id)
|
|
|
|
if (item.type === 'folder')
|
|
dispatch('getAppData')
|
|
if (getters.currentFolder.location === 'public')
|
|
dispatch('getFolderTree')
|
|
})
|
|
})
|
|
.catch(() => Vue.prototype.$isSomethingWrong())
|
|
},
|
|
createFolder: ({ commit, getters, dispatch }, folderName) => {
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/create-folder/public/' + router.currentRoute.params.token
|
|
: '/api/create-folder'
|
|
|
|
axios
|
|
.post(route, {
|
|
parent_id: getters.currentFolder.unique_id,
|
|
name: folderName
|
|
})
|
|
.then(response => {
|
|
commit('ADD_NEW_FOLDER', response.data)
|
|
|
|
events.$emit('scrollTop')
|
|
|
|
//Set focus on new folder name
|
|
setTimeout(() => {
|
|
events.$emit('newFolder:focus', response.data.unique_id)
|
|
}, 10);
|
|
|
|
if (getters.currentFolder.location !== 'public')
|
|
dispatch('getAppData')
|
|
if (getters.currentFolder.location === 'public')
|
|
dispatch('getFolderTree')
|
|
|
|
})
|
|
.catch(() => Vue.prototype.$isSomethingWrong())
|
|
},
|
|
renameItem: ({ commit, getters, dispatch }, data) => {
|
|
|
|
// Updated name in favourites panel
|
|
if (getters.permission === 'master' && data.type === 'folder')
|
|
commit('UPDATE_NAME_IN_FAVOURITES', data)
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/rename-item/' + data.unique_id + '/public/' + router.currentRoute.params.token
|
|
: '/api/rename-item/' + data.unique_id
|
|
|
|
axios
|
|
.post(route, {
|
|
name: data.name,
|
|
type: data.type,
|
|
folder_icon: data.folder_icon,
|
|
_method: 'patch'
|
|
})
|
|
.then(response => {
|
|
commit('CHANGE_ITEM_NAME', response.data)
|
|
|
|
if (data.type === 'folder' && getters.currentFolder.location !== 'public')
|
|
dispatch('getAppData')
|
|
if (data.type === 'folder' && getters.currentFolder.location === 'public')
|
|
dispatch('getFolderTree')
|
|
})
|
|
.catch(() => Vue.prototype.$isSomethingWrong())
|
|
},
|
|
uploadFiles: ({ commit, getters }, { form, fileSize, totalUploadedSize }) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/upload/public/' + router.currentRoute.params.token
|
|
: '/api/upload'
|
|
|
|
// Create cancel token for axios cancelation
|
|
const CancelToken = axios.CancelToken
|
|
const source = CancelToken.source()
|
|
|
|
axios
|
|
.post(route, form, {
|
|
cancelToken: source.token,
|
|
headers: {
|
|
'Content-Type': 'application/octet-stream'
|
|
},
|
|
onUploadProgress: event => {
|
|
|
|
var percentCompleted = Math.floor(((totalUploadedSize + event.loaded) / fileSize) * 100)
|
|
|
|
commit('UPLOADING_FILE_PROGRESS', percentCompleted >= 100 ? 100 : percentCompleted)
|
|
|
|
if (percentCompleted >= 100) {
|
|
commit('PROCESSING_FILE', true)
|
|
}
|
|
}
|
|
})
|
|
.then(response => {
|
|
commit('PROCESSING_FILE', false)
|
|
|
|
// Check if user is in uploading folder, if yes, than show new file
|
|
if (response.data.folder_id == getters.currentFolder.unique_id)
|
|
commit('ADD_NEW_ITEMS', response.data)
|
|
|
|
resolve(response)
|
|
})
|
|
.catch(error => {
|
|
commit('PROCESSING_FILE', false)
|
|
|
|
reject(error)
|
|
|
|
switch (error.response.status) {
|
|
case 423:
|
|
events.$emit('alert:open', {
|
|
emoji: '😬😬😬',
|
|
title: i18n.t('popup_exceed_limit.title'),
|
|
message: i18n.t('popup_exceed_limit.message')
|
|
})
|
|
break
|
|
case 415:
|
|
events.$emit('alert:open', {
|
|
emoji: '😬😬😬',
|
|
title: i18n.t('popup_mimetypes_blacklist.title'),
|
|
message: i18n.t('popup_mimetypes_blacklist.message')
|
|
})
|
|
break
|
|
case 413:
|
|
events.$emit('alert:open', {
|
|
emoji: '😟😟😟',
|
|
title: i18n.t('popup_paylod_error.title'),
|
|
message: i18n.t('popup_paylod_error.message')
|
|
})
|
|
break
|
|
default:
|
|
events.$emit('alert:open', {
|
|
title: i18n.t('popup_error.title'),
|
|
message: i18n.t('popup_error.message')
|
|
})
|
|
break
|
|
}
|
|
|
|
// Reset uploader
|
|
commit('UPDATE_FILE_COUNT_PROGRESS', undefined)
|
|
})
|
|
|
|
// Cancel the upload request
|
|
events.$on('cancel-upload', () => {
|
|
source.cancel()
|
|
|
|
// Hide upload progress bar
|
|
commit('PROCESSING_FILE', false)
|
|
commit('UPDATE_FILE_COUNT_PROGRESS', undefined)
|
|
})
|
|
})
|
|
},
|
|
restoreItem: ({ commit, getters }, item) => {
|
|
|
|
let itemToRestore = []
|
|
let items = [item]
|
|
let restoreToHome = false
|
|
|
|
// If coming no selected item dont get items to restore from fileInfoDetail
|
|
if (!item)
|
|
items = getters.fileInfoDetail
|
|
|
|
// Check if file can be restored to home directory
|
|
if (getters.currentFolder.location === 'trash')
|
|
restoreToHome = true
|
|
|
|
items.forEach(data => itemToRestore.push({
|
|
'type': data.type,
|
|
'unique_id': data.unique_id,
|
|
}))
|
|
|
|
// Remove file preview
|
|
commit('CLEAR_FILEINFO_DETAIL')
|
|
|
|
axios
|
|
.post(getters.api + '/restore-items' ,{
|
|
to_home: restoreToHome,
|
|
data: itemToRestore,
|
|
})
|
|
.then(
|
|
|
|
// Remove file
|
|
items.forEach( data => commit('REMOVE_ITEM', data.unique_id) )
|
|
)
|
|
.catch(() => Vue.prototype.$isSomethingWrong())
|
|
},
|
|
deleteItem: ({ commit, getters, dispatch }, noSelectedItem) => {
|
|
|
|
let itemsToDelete = []
|
|
let items = [noSelectedItem]
|
|
|
|
// If coming no selected item dont get items to move from fileInfoDetail
|
|
if (!noSelectedItem)
|
|
items = getters.fileInfoDetail
|
|
|
|
items.forEach(data => {
|
|
itemsToDelete.push({
|
|
'force_delete': data.deleted_at ? true : false,
|
|
'type': data.type,
|
|
'unique_id': data.unique_id
|
|
})
|
|
|
|
// Remove file
|
|
commit('REMOVE_ITEM', data.unique_id)
|
|
|
|
// Remove item from sidebar
|
|
if (getters.permission === 'master') {
|
|
|
|
if (data.type === 'folder')
|
|
commit('REMOVE_ITEM_FROM_FAVOURITES', data)
|
|
}
|
|
|
|
// Remove file
|
|
commit('REMOVE_ITEM', data.unique_id)
|
|
|
|
// Remove item from sidebar
|
|
if (getters.permission === 'master') {
|
|
|
|
if (data.type === 'folder')
|
|
commit('REMOVE_ITEM_FROM_FAVOURITES', data)
|
|
}
|
|
})
|
|
|
|
// Remove file preview
|
|
if (!noSelectedItem) {
|
|
commit('CLEAR_FILEINFO_DETAIL')
|
|
}
|
|
|
|
// Get route
|
|
let route = getters.sharedDetail && !getters.sharedDetail.protected
|
|
? '/api/remove-item/public/' + router.currentRoute.params.token
|
|
: '/api/remove-item'
|
|
|
|
axios
|
|
.post(route, {
|
|
_method: 'post',
|
|
data: itemsToDelete
|
|
})
|
|
.then(() => {
|
|
|
|
itemsToDelete.forEach(data => {
|
|
|
|
// If is folder, update app data
|
|
if (data.type === 'folder') {
|
|
|
|
if (data.unique_id === getters.currentFolder.unique_id) {
|
|
|
|
if (getters.currentFolder.location === 'public') {
|
|
dispatch('browseShared', [{ folder: last(getters.browseHistory), back: true, init: false }])
|
|
} else {
|
|
dispatch('getFolder', [{ folder: last(getters.browseHistory), back: true, init: false }])
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
if (getters.currentFolder.location !== 'public')
|
|
dispatch('getAppData')
|
|
|
|
if (getters.currentFolder.location === 'public')
|
|
dispatch('getFolderTree')
|
|
|
|
})
|
|
.catch(() => Vue.prototype.$isSomethingWrong())
|
|
},
|
|
emptyTrash: ({ commit, getters }) => {
|
|
|
|
// Clear file browser
|
|
commit('LOADING_STATE', { loading: true, data: [] })
|
|
|
|
axios
|
|
.post(getters.api + '/empty-trash', {
|
|
_method: 'delete'
|
|
})
|
|
.then(() => {
|
|
commit('LOADING_STATE', { loading: false, data: [] })
|
|
events.$emit('scrollTop')
|
|
|
|
// Remove file preview
|
|
commit('CLEAR_FILEINFO_DETAIL')
|
|
})
|
|
.catch(() => Vue.prototype.$isSomethingWrong())
|
|
}
|
|
}
|
|
|
|
const mutations = {
|
|
ZIPPING_FILE_STATUS(state, status) {
|
|
state.isZippingFiles = status
|
|
}
|
|
}
|
|
|
|
const getters = {
|
|
isZippingFiles: state => state.isZippingFiles
|
|
}
|
|
|
|
export default {
|
|
state: defaultState,
|
|
mutations,
|
|
actions,
|
|
getters
|
|
}
|