From 9a2d477f1a344ce0e0e00ae975e73232dd554ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de> Date: Mon, 5 Sep 2022 09:17:20 +0200 Subject: [PATCH] Add edit object modal to upload a new file #15 --- src/components/BucketView.vue | 20 +++++++++++++++++ src/components/Modals/UploadObjectModal.vue | 24 ++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/components/BucketView.vue b/src/components/BucketView.vue index 5f8b98e..6d261da 100644 --- a/src/components/BucketView.vue +++ b/src/components/BucketView.vue @@ -118,6 +118,7 @@ const objectState = reactive({ bucketPermissionError: false, createdPermission: undefined, deletedItem: "", + editObjectKey: "", } as { objects: S3ObjectMetaInformation[]; loading: boolean; @@ -125,6 +126,7 @@ const objectState = reactive({ bucketPermissionError: boolean; createdPermission: undefined | BucketPermission; deletedItem: string; + editObjectKey: string; }); // Watcher @@ -434,6 +436,11 @@ function deleteFolder(folderPath: string) { }); } +function getObjectFileName(key: string): string { + const splittedKey = key.split("/"); + return splittedKey[splittedKey.length - 1]; +} + watch( visibleObjects, (visObjs) => { @@ -545,6 +552,7 @@ watch( modalID="upload-object-modal" modal-label="some-label" :key-prefix="currentSubFolders.join('/')" + :edit-object-file-name="undefined" @object-created="objectUploaded" /> <!-- Add folder button --> @@ -739,6 +747,9 @@ watch( class="dropdown-item" type="button" :disabled="!writeS3Permission" + data-bs-toggle="modal" + data-bs-target="#edit-object-modal" + @click="objectState.editObjectKey = obj.key" > Edit </button> @@ -797,6 +808,15 @@ watch( </tr> </tbody> </table> + <upload-object-modal + :bucket-name="props.bucketName" + :s3-client="client" + modalID="edit-object-modal" + modal-label="some-label" + :key-prefix="currentSubFolders.join('/')" + :edit-object-file-name="getObjectFileName(objectState.editObjectKey)" + @object-created="objectUploaded" + /> </div> </div> </template> diff --git a/src/components/Modals/UploadObjectModal.vue b/src/components/Modals/UploadObjectModal.vue index abf84cf..ca819ef 100644 --- a/src/components/Modals/UploadObjectModal.vue +++ b/src/components/Modals/UploadObjectModal.vue @@ -2,7 +2,7 @@ import type { S3Client } from "@aws-sdk/client-s3"; import { Upload } from "@aws-sdk/lib-storage"; import BootstrapModal from "@/components/Modals/BootstrapModal.vue"; -import { computed, onMounted, reactive } from "vue"; +import { computed, onMounted, reactive, watch } from "vue"; import type { ComputedRef } from "vue"; import type { S3ObjectMetaInformation } from "@/client"; import dayjs from "dayjs"; @@ -15,6 +15,7 @@ const props = defineProps<{ bucketName: string; keyPrefix: string; s3Client: S3Client; + editObjectFileName: string | undefined; }>(); const randomIDSuffix = Math.random().toString(16).substr(2, 8); @@ -30,6 +31,13 @@ const emit = defineEmits<{ (e: "object-created", object: S3ObjectMetaInformation): void; }>(); +watch( + () => props.editObjectFileName, + (nextFileName) => { + formState.key = nextFileName ?? ""; + } +); + const formState = reactive({ file: {}, key: "", @@ -48,6 +56,10 @@ const uploadProgress: ComputedRef<number> = computed(() => Math.round((100 * formState.uploadDone) / formState.uploadTotal) ); +const editObject: ComputedRef<boolean> = computed( + () => props.editObjectFileName !== undefined +); + async function uploadObject() { const key = props.keyPrefix.length > 0 @@ -99,7 +111,9 @@ async function uploadObject() { // eslint-disable-next-line function fileChange(event: any) { formState.file = event.target.files[0]; - formState.key = formState.file.name; + if (!editObject.value) { + formState.key = formState.file.name; + } } onMounted(() => { @@ -197,9 +211,13 @@ onMounted(() => { > <input type="text" - class="form-control" + :class="{ + 'form-control-plaintext': editObject, + 'form-control': !editObject, + }" :id="'objectKey' + randomIDSuffix" required + :disabled="editObject" v-model="formState.key" /> </div> -- GitLab