diff --git a/nginx/vue/src/views/admin/CreateRowing.vue b/nginx/vue/src/views/admin/CreateRowing.vue index 44a685f..6bd99ec 100644 --- a/nginx/vue/src/views/admin/CreateRowing.vue +++ b/nginx/vue/src/views/admin/CreateRowing.vue @@ -3,44 +3,49 @@ import Button from "@/components/input/Button.vue"; import { ref } from "vue"; import axios from "axios"; -const image = ref(null); -const status = ref(""); -const error = ref(""); +const images = ref([]); +const results = ref([]); function onFileChange(e) { - image.value = e.target.files[0] || null; + images.value = Array.from(e.target.files); + results.value = []; } async function submit() { - if (!image.value) { - error.value = "Please select an image"; - return; - } - error.value = ""; - status.value = "Uploading..."; + if (!images.value.length) return; + results.value = images.value.map((f) => ({ name: f.name, status: "Uploading..." })); - const formData = new FormData(); - formData.append("image", image.value); + await Promise.all( + images.value.map(async (file, i) => { + const formData = new FormData(); + formData.append("image", file); + try { + const res = await axios.post("/api/rowing", formData, { + headers: { "Content-Type": "multipart/form-data" }, + }); + const mins = Math.floor(res.data.Time / 1e9 / 60); + const secs = String(Math.floor((res.data.Time / 1e9) % 60)).padStart(2, "0"); + results.value[i].status = `${res.data.Distance}m in ${mins}:${secs}`; + results.value[i].ok = true; + } catch (err) { + results.value[i].status = err.response?.data?.error || "Upload failed"; + results.value[i].ok = false; + } + }) + ); - try { - const res = await axios.post("/api/rowing", formData, { - headers: { "Content-Type": "multipart/form-data" }, - }); - status.value = `Saved: ${res.data.Distance}m in ${Math.floor(res.data.Time / 1e9 / 60)}:${String(Math.floor((res.data.Time / 1e9) % 60)).padStart(2, "0")}`; - image.value = null; - } catch (err) { - status.value = ""; - error.value = err.response?.data?.error || "Upload failed"; - } + images.value = []; }