Add basic file deletion logic
This commit is contained in:
parent
ea9cdea08d
commit
6b4bf3eaa7
2 changed files with 64 additions and 2 deletions
14
resources/assets/scripts/api/server/files/deleteElement.ts
Normal file
14
resources/assets/scripts/api/server/files/deleteElement.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import {withCredentials} from "@/api/http";
|
||||||
|
import {ServerApplicationCredentials} from "@/store/types";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes files and/or folders from the server. You should pass through an array of
|
||||||
|
* file or folder paths to be deleted.
|
||||||
|
*/
|
||||||
|
export function deleteElement(server: string, credentials: ServerApplicationCredentials, items: Array<string>): Promise<any> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
withCredentials(server, credentials).post('/v1/server/file/delete', { items })
|
||||||
|
.then(resolve)
|
||||||
|
.catch(reject);
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,13 +1,19 @@
|
||||||
<template>
|
<template>
|
||||||
<Modal :show="visible" v-on:close="visible = false">
|
<Modal :show="visible" v-on:close="visible = false">
|
||||||
|
<MessageBox
|
||||||
|
class="alert error mb-8"
|
||||||
|
title="Error"
|
||||||
|
:message="error"
|
||||||
|
v-if="error"
|
||||||
|
/>
|
||||||
<div v-if="object">
|
<div v-if="object">
|
||||||
<h3 class="font-medium mb-6">Really delete {{ object.name }}?</h3>
|
<h3 class="font-medium mb-6">Really delete {{ object.name }}?</h3>
|
||||||
<p class="text-sm text-neutral-700">
|
<p class="text-sm text-neutral-700">
|
||||||
Deletion is a permanent operation: <strong>{{ object.name }}</strong><span v-if="object.folder">, as well as its contents,</span> will be removed immediately.
|
Deletion is a permanent operation: <strong>{{ object.name }}</strong><span v-if="object.directory">, as well as its contents,</span> will be removed immediately.
|
||||||
</p>
|
</p>
|
||||||
<div class="mt-8 text-right">
|
<div class="mt-8 text-right">
|
||||||
<button class="btn btn-secondary btn-sm" v-on:click.prevent="visible = false">Cancel</button>
|
<button class="btn btn-secondary btn-sm" v-on:click.prevent="visible = false">Cancel</button>
|
||||||
<button class="btn btn-red btn-sm ml-2">Yes, Delete</button>
|
<button class="btn btn-red btn-sm ml-2" v-on:click="deleteItem">Yes, Delete</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
@ -17,10 +23,16 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Modal from '@/components/core/Modal.vue';
|
import Modal from '@/components/core/Modal.vue';
|
||||||
import {DirectoryContentObject} from "@/api/server/types";
|
import {DirectoryContentObject} from "@/api/server/types";
|
||||||
|
import {deleteElement} from '@/api/server/files/deleteElement';
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
import {AxiosError} from "axios";
|
||||||
|
import { join } from 'path';
|
||||||
|
|
||||||
type DataStructure = {
|
type DataStructure = {
|
||||||
|
isLoading: boolean,
|
||||||
object: null | DirectoryContentObject,
|
object: null | DirectoryContentObject,
|
||||||
visible: boolean,
|
visible: boolean,
|
||||||
|
error: string | null,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
|
@ -29,11 +41,17 @@
|
||||||
|
|
||||||
data: function (): DataStructure {
|
data: function (): DataStructure {
|
||||||
return {
|
return {
|
||||||
|
isLoading: false,
|
||||||
visible: false,
|
visible: false,
|
||||||
object: null,
|
object: null,
|
||||||
|
error: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapState('server', ['fm', 'server', 'credentials']),
|
||||||
|
},
|
||||||
|
|
||||||
mounted: function () {
|
mounted: function () {
|
||||||
window.events.$on('server:files:delete', (object: DirectoryContentObject) => {
|
window.events.$on('server:files:delete', (object: DirectoryContentObject) => {
|
||||||
this.visible = true;
|
this.visible = true;
|
||||||
|
@ -44,5 +62,35 @@
|
||||||
beforeDestroy: function () {
|
beforeDestroy: function () {
|
||||||
window.events.$off('server:files:delete');
|
window.events.$off('server:files:delete');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
deleteItem: function () {
|
||||||
|
if (!this.object) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.isLoading = true;
|
||||||
|
|
||||||
|
deleteElement(this.server.uuid, this.credentials, [
|
||||||
|
join(this.fm.currentDirectory, this.object.name)
|
||||||
|
])
|
||||||
|
.then(() => {
|
||||||
|
this.$emit('close');
|
||||||
|
this.closeModal();
|
||||||
|
})
|
||||||
|
.catch((error: AxiosError) => {
|
||||||
|
this.error = `There was an error deleting the requested ${(this.object && this.object.directory) ? 'folder' : 'file'}. Response was: ${error.message}`;
|
||||||
|
console.error('Error at Server::Files::Delete', { error });
|
||||||
|
})
|
||||||
|
.then(() => this.isLoading = false);
|
||||||
|
},
|
||||||
|
|
||||||
|
closeModal: function () {
|
||||||
|
this.object = null;
|
||||||
|
this.isLoading = false;
|
||||||
|
this.visible = false;
|
||||||
|
this.error = null;
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in a new issue