Newer
Older
import BootstrapModal from "@/components/modals/BootstrapModal.vue";
import { Modal, Toast } from "bootstrap";
import { onMounted, reactive, watch } from "vue";
import type { _Object as S3Object } from "@aws-sdk/client-s3";
import { useBucketStore } from "@/stores/buckets";
import { useS3ObjectStore } from "@/stores/s3objects";
import BootstrapToast from "@/components/BootstrapToast.vue";
const objectRepository = useS3ObjectStore();
const props = defineProps<{
modalID: string;
srcObject: S3Object;
srcBucket: string;
destKey: string;
destBucket: string;
uploading: boolean;
}>({
destKey: "",
destBucket: "",
uploading: false,
const bucketRepository = useBucketStore();
const randomIDSuffix = Math.random().toString(16).substring(2, 8);
let copyModal: Modal | null = null;
let successToast: Toast | null = null;
let errorToast: Toast | null = null;
function getFileName(key?: string): string {
if (key == undefined) {
return "";
}
const splittedKey = key.split("/");
return splittedKey[splittedKey.length - 1];
}
function copyObject() {
if (props.srcObject.Key == undefined) {
return;
}
objectRepository
.copyObject(
props.srcBucket,
props.srcObject,
formState.destBucket,
formState.destKey,
)
.then(() => {
copyModal?.hide();
successToast?.show();
formState.destBucket = "";
})
.catch((e) => {
console.error(e);
errorToast?.show();
})
.finally(() => {
formState.uploading = false;
});
}
function modalClosed() {
formState.destBucket = "";
}
watch(
() => props.srcObject.Key,
formState.destKey = newKey ?? "";
);
onMounted(() => {
copyModal = new Modal("#" + props.modalID);
successToast = new Toast("#successToast-" + randomIDSuffix);
errorToast = new Toast("#errorToast-" + randomIDSuffix);
});
</script>
<template>
<bootstrap-toast :toast-id="'successToast-' + randomIDSuffix">
Successfully copied file
</bootstrap-toast>
<bootstrap-toast
:toast-id="'errorToast-' + randomIDSuffix"
color-class="danger"
>
There has been some Error.<br />
Try again later
</bootstrap-toast>
modal-label="Copy Object Modal"
v-on="{ 'hidden.bs.modal': modalClosed }"
>
<template v-slot:header>
<h4>Copy file {{ getFileName(props.srcObject.Key) }}</h4>
</template>
<template v-slot:body>
<div class="container-fluid">
<div class="row">
<form
class="col-7"
:id="'copyObjectForm' + randomIDSuffix"
@submit.prevent="copyObject"
>
<div class="mb-3">
<label
:for="'destinationBucket' + randomIDSuffix"
class="form-label"
>
Destination Bucket *
</label>
<select
class="form-select text-lowercase"
:id="'destinationBucket' + randomIDSuffix"
required
v-model="formState.destBucket"
>
<option disabled selected>Select one...</option>
<option
v-for="bucket in bucketRepository.writableBuckets"
:key="bucket.name"
:value="bucket.name"
>
</option>
</select>
</div>
<div class="mb-3">
<label :for="'objectKey' + randomIDSuffix" class="form-label"
>Destination Filename *</label
>
<input
type="text"
class="form-control"
:id="'objectKey' + randomIDSuffix"
required
v-model="formState.destKey"
/>
</div>
</form>
<div class="col-5">
You can copy objects. You have to create destination buckets prior
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
to copy.<br />
You can specify folder by using '/' at destination object field. For
example, if you want to copy object under the folder named
'folder1', you need to specify destination object like
'folder1/[your object name]'.
</div>
</div>
</div>
</template>
<template v-slot:footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
Close
</button>
<button
:disabled="formState.uploading"
type="submit"
:form="'copyObjectForm' + randomIDSuffix"
class="btn btn-primary"
>
<span
v-if="formState.uploading"
class="spinner-border spinner-border-sm"
role="status"
aria-hidden="true"
></span>
Copy
</button>
</template>
</bootstrap-modal>
</template>
<style scoped></style>