Files
vuefilemanager/resources/js/store/modules/fileFunctions.js
Čarodej 19cc01131b - gate implementation
- protected shared view fix
2021-09-24 10:52:19 +02:00

418 lines
13 KiB
JavaScript
Vendored

import i18n from '/resources/js/i18n/index'
import router from '/resources/js/router'
import {events} from '/resources/js/bus'
import axios from 'axios'
import Vue from 'vue'
const defaultState = {
processingPopup: undefined,
isProcessingFile: false,
filesInQueueUploaded: 0,
filesInQueueTotal: 0,
uploadingProgress: 0,
fileQueue: [],
}
const actions = {
downloadZip: ({getters}) => {
let files = []
// get ids of selected files
getters.clipboard.forEach(file => {
let type = file.data.type === 'folder'
? 'folder'
: 'file'
files.push(file.data.id + '|' + type)
})
let items = files.join(',')
// Get route
let route = getters.sharedDetail
? `/api/zip/${router.currentRoute.params.token}?items=${items}`
: `/api/zip?items=${items}`
Vue.prototype.$downloadFile(route, 'files.zip')
},
moveItem: ({commit, getters, dispatch}, {to_item, noSelectedItem}) => {
let itemsToMove = []
let items = [noSelectedItem]
// If coming no selected item dont get items to move from clipboard
if (!noSelectedItem)
items = getters.clipboard
items.forEach(data => itemsToMove.push({
'id': data.data.id,
'type': data.data.type
}))
// Remove file preview
if (!noSelectedItem)
commit('CLIPBOARD_CLEAR')
// Get route
let route = getters.sharedDetail
? `/api/editor/move/${router.currentRoute.params.token}`
: '/api/move'
let moveToId = null
if (to_item.data)
moveToId = to_item.data.id
else if (to_item.id)
moveToId = to_item.id
axios
.post(route, {
to_id: moveToId,
items: itemsToMove
})
.then(() => {
itemsToMove.forEach(item => {
commit('REMOVE_ITEM', item.id)
commit('INCREASE_FOLDER_ITEM', moveToId)
if (item.type === 'folder')
dispatch('getAppData')
if (Vue.prototype.$isThisRoute(router.currentRoute, ['Public']))
dispatch('getFolderTree')
})
})
.catch(() => Vue.prototype.$isSomethingWrong())
},
createFolder: ({commit, getters, dispatch}, folder) => {
// Get route
let route = getters.sharedDetail
? `/api/editor/create-folder/${router.currentRoute.params.token}`
: '/api/create-folder'
let parent_id = getters.currentFolder
? getters.currentFolder.data.id
: undefined
axios
.post(route, {
parent_id: parent_id,
name: folder.name,
icon: folder.icon
})
.then(response => {
commit('ADD_NEW_FOLDER', response.data)
events.$emit('scrollTop')
// Set focus on new folder name
setTimeout(() => {
events.$emit('newFolder:focus', response.data.data.id)
}, 10)
if (Vue.prototype.$isThisRoute(router.currentRoute, ['Public']))
dispatch('getFolderTree')
else
dispatch('getAppData')
})
.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
? `/api/editor/rename/${data.id}/${router.currentRoute.params.token}`
: `/api/rename/${data.id}`
axios
.post(route, {
...data,
_method: 'patch'
})
.then(response => {
commit('CHANGE_ITEM_NAME', response.data)
if (data.type === 'folder' && ! Vue.prototype.$isThisRoute(router.currentRoute, ['Public']))
dispatch('getAppData')
if (data.type === 'folder' && Vue.prototype.$isThisRoute(router.currentRoute, ['Public']))
dispatch('getFolderTree')
})
.catch(() => Vue.prototype.$isSomethingWrong())
},
uploadFiles: ({commit, getters}, {form, fileSize, totalUploadedSize}) => {
return new Promise((resolve, reject) => {
// Get route
let route = getters.sharedDetail
? `/api/editor/upload/${router.currentRoute.params.token}`
: '/api/upload'
// Create cancel token for axios cancellation
const CancelToken = axios.CancelToken,
source = CancelToken.source()
axios
.post(route, form, {
cancelToken: source.token,
headers: {
'Content-Type': 'application/octet-stream'
},
onUploadProgress: event => {
let percentCompleted = Math.floor(((totalUploadedSize + event.loaded) / fileSize) * 100);
commit('UPLOADING_FILE_PROGRESS', percentCompleted >= 100 ? 100 : percentCompleted)
// Set processing file
if (percentCompleted >= 100)
commit('PROCESSING_FILE', true)
}
})
.then(response => {
resolve(response)
// Proceed if was returned database record
if (response.data.data.id) {
commit('PROCESSING_FILE', false)
// Remove first file from file queue
commit('SHIFT_FROM_FILE_QUEUE')
// Check if user is in uploading folder, if yes, than show new file
if ((! getters.currentFolder && !response.data.data.attributes.parent_id) || response.data.data.attributes.parent_id === getters.currentFolder.data.id) {
// Add uploaded item into view
commit('ADD_NEW_ITEMS', response.data)
}
// Reset file progress
commit('UPLOADING_FILE_PROGRESS', 0)
// Increase count in files in queue uploaded for 1
commit('INCREASE_FILES_IN_QUEUE_UPLOADED')
// Start uploading next file if file queue is not empty
if (getters.fileQueue.length) {
Vue.prototype.$handleUploading(getters.fileQueue[0])
}
// Reset upload process
if (!getters.fileQueue.length)
commit('CLEAR_UPLOAD_PROGRESS')
}
})
.catch(error => {
reject(error)
let messages = {
'423': {
title: i18n.t('popup_exceed_limit.title'),
message: i18n.t('popup_exceed_limit.message')
},
'422': {
title: i18n.t('popup_mimetypes_blacklist.title'),
message: i18n.t('popup_mimetypes_blacklist.message')
},
'413': {
title: i18n.t('popup_paylod_error.title'),
message: i18n.t('popup_paylod_error.message')
}
}
console.log(error.response);
console.log(error.response.status);
events.$emit('alert:open', {
emoji: '😬😬😬',
title: messages[error.response.status]['title'],
message: messages[error.response.status]['message']
})
commit('PROCESSING_FILE', false)
commit('CLEAR_UPLOAD_PROGRESS')
})
// Cancel the upload request
events.$on('cancel-upload', () => {
source.cancel()
// Hide upload progress bar
commit('PROCESSING_FILE', false)
commit('CLEAR_UPLOAD_PROGRESS')
})
})
},
restoreItem: ({commit, getters}, item) => {
let itemToRestore = []
let items = [item]
let restoreToHome = Vue.prototype.$isThisRoute(router.currentRoute, ['Trash'])
// If coming no selected item dont get items to restore from clipboard
if (!item)
items = getters.clipboard
items.forEach(data => itemToRestore.push({
type: data.data.type,
id: data.data.id
}))
// Remove file preview
commit('CLIPBOARD_CLEAR')
axios
.post(getters.api + '/trash/restore', {
to_home: restoreToHome,
items: itemToRestore
})
.then(
items.forEach(item => commit('REMOVE_ITEM', item.data.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 clipboard
if (!noSelectedItem)
items = getters.clipboard
items.forEach(data => {
itemsToDelete.push({
force_delete: !!data.data.attributes.deleted_at,
type: data.data.type,
id: data.data.id
})
// Remove file
commit('REMOVE_ITEM', data.data.id)
// Remove item from sidebar
if (getters.permission === 'master') {
if (data.data.type === 'folder')
commit('REMOVE_ITEM_FROM_FAVOURITES', data)
}
// Remove file
commit('REMOVE_ITEM', data.data.id)
// Remove item from sidebar
if (getters.permission === 'master') {
if (data.data.type === 'folder')
commit('REMOVE_ITEM_FROM_FAVOURITES', data)
}
})
// Remove file preview
if (!noSelectedItem) {
commit('CLIPBOARD_CLEAR')
}
// Get route
let route = getters.sharedDetail
? `/api/editor/remove/${router.currentRoute.params.token}`
: '/api/remove'
axios
.post(route, {
items: itemsToDelete
})
.then(() => {
itemsToDelete.forEach(data => {
// If is folder, update app data
if (data.type === 'folder') {
if (data.id === getters.currentFolder.data.id) {
if (Vue.prototype.$isThisRoute(router.currentRoute, ['Public'])) {
dispatch('browseShared')
} else {
dispatch('getFolder')
}
}
}
})
if (Vue.prototype.$isThisRoute(router.currentRoute, ['Public']))
dispatch('getFolderTree')
else
dispatch('getAppData')
})
//.catch(() => Vue.prototype.$isSomethingWrong())
},
emptyTrash: ({commit, getters}) => {
// Clear file browser
commit('LOADING_STATE', {loading: true, data: []})
axios
.post(getters.api + '/trash/dump', {
_method: 'delete'
})
.then(() => {
commit('LOADING_STATE', {loading: false, data: []})
events.$emit('scrollTop')
commit('CLIPBOARD_CLEAR')
})
.catch(() => Vue.prototype.$isSomethingWrong())
}
}
const mutations = {
PROCESSING_POPUP(state, status) {
state.processingPopup = status
},
ADD_FILES_TO_QUEUE(state, file) {
state.fileQueue.push(file)
},
SHIFT_FROM_FILE_QUEUE(state) {
state.fileQueue.shift()
},
PROCESSING_FILE(state, status) {
state.isProcessingFile = status
},
UPLOADING_FILE_PROGRESS(state, percentage) {
state.uploadingProgress = percentage
},
INCREASE_FILES_IN_QUEUES_TOTAL(state, count) {
state.filesInQueueTotal += count
},
INCREASE_FILES_IN_QUEUE_UPLOADED(state) {
state.filesInQueueUploaded++
},
CLEAR_UPLOAD_PROGRESS(state) {
state.filesInQueueUploaded = 0
state.filesInQueueTotal = 0
state.fileQueue = []
}
}
const getters = {
filesInQueueUploaded: state => state.filesInQueueUploaded,
filesInQueueTotal: state => state.filesInQueueTotal,
uploadingProgress: state => state.uploadingProgress,
isProcessingFile: state => state.isProcessingFile,
processingPopup: state => state.processingPopup,
fileQueue: state => state.fileQueue
}
export default {
state: defaultState,
mutations,
actions,
getters
}