Files
lucia-frontend/src/components/File/UploadModal.vue
2024-08-13 13:52:05 +08:00

95 lines
2.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<Dialog :visible="uploadModal" modal :style="{ width: '90vw', height: '90vh' }" :contentClass="contentClass" @update:visible="$emit('closeModal', $event)">
<template #header>
<div class="py-5">
</div>
</template>
<label for="uploadFiles">
<div class=" h-full flex flex-col justify-center items-center p-4 space-y-4 relative">
<input id="uploadFiles" class=" absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer" type="file" accept="text/csv" @change="upload($event)">
<IconUploarding class="loader-arrow-upward"></IconUploarding>
<p class="text-neutral-900">Click or drag a file here.</p>
<p class="text-neutral-500">(Only <span class="text-primary">.csv</span> is supported)</p>
</div>
</label>
</Dialog>
</template>
<script>
import IconUploarding from '../icons/IconUploarding.vue';
import { uploadFailedFirst } from '@/module/alertModal.js'
import { storeToRefs } from 'pinia';
import FilesStore from '@/stores/files.js';
export default {
props: ['uploadModal'],
setup() {
const filesStore = FilesStore();
const { uploadFileName } = storeToRefs(filesStore);
return { filesStore, uploadFileName }
},
data() {
return {
contentClass: 'h-full',
}
},
components: {
IconUploarding,
},
methods: {
/**
* 上傳的行為
* @param {event} event input 傳入的事件
*/
async upload(event) {
const fileInput = document.getElementById('uploadFiles');
const target = event.target;
const formData = new FormData();
let uploadFile;
// 判斷是否有檔案
if(target && target.files) {
uploadFile = target.files[0];
}
// 判斷檔案大小不可超過 90MB (90(MB)*1024(KB)*1024(Bytes)=94,371,840)
if(uploadFile.size >= 94371840) {
fileInput.value = '';
return uploadFailedFirst('size');
}
// 將檔案加進 formData欄位一定要「csv」
formData.append('csv', uploadFile);
// 呼叫第一階段上傳 API
if(uploadFile) {
await this.filesStore.upload(formData);
}
if (uploadFile.name.endsWith('.csv')) {
this.uploadFileName = uploadFile.name.slice(0, -4);
} else {
// 處理錯誤或無效的文件格式
this.uploadFileName = ''; // 或者其他適合的錯誤處理方式
}
// 清除選擇文件
if(fileInput) {
fileInput.value = '';
}
}
},
beforeUnmount() {
this.$emit('closeModal', false);
}
}
</script>
<style scoped>
.loader-arrow-upward {
animation: bump 0.6s linear infinite alternate;
}
@keyframes bump {
0% {
transform: translate(0%, 5px);
}
100% {
transform: translate(0%, -5px);
}
}
</style>