diff --git a/resources/js/views/dashboard/MediaEdit.vue b/resources/js/views/dashboard/MediaEdit.vue index 8a5b39d..55493f5 100644 --- a/resources/js/views/dashboard/MediaEdit.vue +++ b/resources/js/views/dashboard/MediaEdit.vue @@ -14,12 +14,18 @@ @failed-validation="handleFailValidation"> - + + - + @@ -30,7 +36,7 @@ - + - + - + @@ -111,19 +119,25 @@ import SMForm from "../../components/SMForm.vue"; import SMInput from "../../components/SMInput.vue"; import SMMastHead from "../../components/SMMastHead.vue"; import SMLoading from "../../components/SMLoading.vue"; -import { toTitleCase } from "../../helpers/string"; import { useToastStore } from "../../store/ToastStore"; import SMColumn from "../../components/SMColumn.vue"; import SMImage from "../../components/SMImage.vue"; import SMButtonRow from "../../components/SMButtonRow.vue"; +import SMImageStack from "../../components/SMImageStack.vue"; const route = useRoute(); const router = useRouter(); const pageError = ref(200); const pageLoading = ref(true); -const pageHeading = route.params.id ? "Edit Media" : "Upload Media"; +const editMultiple = "id" in route.params && route.params.id.includes(","); +const pageHeading = route.params.id + ? editMultiple + ? "Edit Multiple Media" + : "Edit Media" + : "Upload Media"; const progressText = ref(""); +const imageStackUrls = ref([]); const form = reactive( Form({ @@ -148,32 +162,50 @@ const imageUrl = ref(""); const handleLoad = async () => { if (route.params.id) { - try { - let result = await api.get({ - url: "/media/{id}", - params: { - id: route.params.id, - }, + if (editMultiple === false) { + try { + let result = await api.get({ + url: "/media/{id}", + params: { + id: route.params.id, + }, + }); + + const data = result.data as MediaResponse; + + form.controls.file.value = data.medium.name; + form.controls.title.value = data.medium.title; + form.controls.description.value = data.medium.description; + form.controls.permission.value = data.medium.permission; + fileData.url = data.medium.url; + fileData.mime_type = data.medium.mime_type; + fileData.size = data.medium.size; + fileData.storage = data.medium.storage; + fileData.status = + data.medium.status == "" ? "OK" : data.medium.status; + + fileData.dimensions = data.medium.dimensions; + + imageUrl.value = fileData.url; + } catch (err) { + pageError.value = err.status; + } + } else { + (route.params.id as string).split(",").forEach(async (id) => { + try { + let result = await api.get({ + url: "/media/{id}", + params: { + id: id, + }, + }); + + const data = result.data as MediaResponse; + imageStackUrls.value.push(data.medium.url); + } catch (err) { + pageError.value = err.status; + } }); - - const data = result.data as MediaResponse; - - form.controls.file.value = data.medium.name; - form.controls.title.value = data.medium.title; - form.controls.description.value = data.medium.description; - form.controls.permission.value = data.medium.permission; - fileData.url = data.medium.url; - fileData.mime_type = data.medium.mime_type; - fileData.size = data.medium.size; - fileData.storage = data.medium.storage; - fileData.status = - data.medium.status == "" ? "OK" : data.medium.status; - - fileData.dimensions = data.medium.dimensions; - - imageUrl.value = fileData.url; - } catch (err) { - pageError.value = err.status; } } @@ -183,59 +215,105 @@ const handleLoad = async () => { const handleSubmit = async () => { try { form.loading(true); - let submitData = new FormData(); + if (editMultiple === false) { + let submitData = new FormData(); - // add file if there is one - if (form.controls.file.value instanceof File) { - submitData.append("file", form.controls.file.value); - } + // add file if there is one + if (form.controls.file.value instanceof File) { + submitData.append("file", form.controls.file.value); + } - submitData.append("title", form.controls.title.value as string); - submitData.append( - "permission", - form.controls.permission.value as string - ); - submitData.append( - "description", - form.controls.description.value as string - ); + submitData.append("title", form.controls.title.value as string); + submitData.append( + "permission", + form.controls.permission.value as string + ); + submitData.append( + "description", + form.controls.description.value as string + ); - if (route.params.id) { - await api.put({ - url: "/media/{id}", - params: { - id: route.params.id, - }, - body: submitData, - headers: { - "Content-Type": "multipart/form-data", - }, - progress: (progressEvent) => - (progressText.value = `Uploading File: ${Math.floor( - (progressEvent.loaded / progressEvent.total) * 100 - )}%`), + if (route.params.id) { + await api.put({ + url: "/media/{id}", + params: { + id: route.params.id, + }, + body: submitData, + headers: { + "Content-Type": "multipart/form-data", + }, + progress: (progressEvent) => + (progressText.value = `Uploading File: ${Math.floor( + (progressEvent.loaded / progressEvent.total) * 100 + )}%`), + }); + } else { + await api.post({ + url: "/media", + body: submitData, + headers: { + "Content-Type": "multipart/form-data", + }, + progress: (progressEvent) => + (progressText.value = `Uploading File: ${Math.floor( + (progressEvent.loaded / progressEvent.total) * 100 + )}%`), + }); + } + + useToastStore().addToast({ + title: route.params.id ? "Media Updated" : "Media Created", + content: route.params.id + ? "The media item has been updated." + : "The media item been created.", + type: "success", }); } else { - await api.post({ - url: "/media", - body: submitData, - headers: { - "Content-Type": "multipart/form-data", - }, - progress: (progressEvent) => - (progressText.value = `Uploading File: ${Math.floor( - (progressEvent.loaded / progressEvent.total) * 100 - )}%`), - }); - } + let successCount = 0; + let errorCount = 0; - useToastStore().addToast({ - title: route.params.id ? "Media Updated" : "Media Created", - content: route.params.id - ? "The media item has been updated." - : "The media item been created.", - type: "success", - }); + (route.params.id as string).split(",").forEach(async (id) => { + try { + let data = { + title: form.controls.title.value, + content: form.controls.content.value, + }; + + await api.put({ + url: "/media/{id}", + params: { + id: id, + }, + body: data, + }); + + successCount++; + } catch (err) { + errorCount++; + } + }); + + if (errorCount === 0) { + useToastStore().addToast({ + title: "Media Updated", + content: `The selected media have been updated.`, + type: "success", + }); + } else if (successCount === 0) { + useToastStore().addToast({ + title: "Error Updating Media", + content: "An unexpected server error occurred.", + type: "danger", + }); + } else { + useToastStore().addToast({ + title: "Some Media Updated", + content: `Only ${successCount} media items where updated. ${errorCount} could not because of an unexpected error.`, + type: "warning", + }); + } + } const urlParams = new URLSearchParams(window.location.search); const returnUrl = urlParams.get("return"); @@ -330,7 +408,6 @@ handleLoad();