diff --git a/inventory/static/js/image.js b/inventory/static/js/image.js new file mode 100644 index 0000000..57653cc --- /dev/null +++ b/inventory/static/js/image.js @@ -0,0 +1,52 @@ +const ImageWidget = (() => { + function submitImageUpload(id) { + const form = document.getElementById(`image-upload-form-${id}`); + const formData = new FormData(form); + + fetch("/api/images", { + method: "POST", + body: formData + }).then(async response => { + if (!response.ok) { + // Try to parse JSON, fallback to text + const contentType = response.headers.get("Content-Type") || ""; + let errorDetails; + if (contentType.includes("application/json")) { + errorDetails = await response.json(); + } else { + errorDetails = { error: await response.text() }; + } + throw errorDetails; + } + return response.json(); + }).then(data => { + Toast.renderToast({ message: `Image uploaded.`, type: "success" }); + location.reload(); + }).catch(err => { + const msg = typeof err === "object" && err.error ? err.error : err.toString(); + Toast.renderToast({ message: `Upload failed: ${msg}`, type: "danger" }); + }); + } + + function deleteImage(inventoryId, imageId) { + if (!confirm("Are you sure you want to delete this image?")) return; + + fetch(`/api/images/${imageId}`, { + method: "DELETE" + }).then(response => response.json()).then(data => { + if (data.success) { + Toast.renderToast({ message: "Image deleted.", type: "success" }); + location.reload(); // Update view + } else { + Toast.renderToast({ message: `Failed to delete: ${data.error}`, type: "danger" }); + } + }).catch(err => { + Toast.renderToast({ message: `Error deleting image: ${err}`, type: "danger" }); + }); + } + + return { + submitImageUpload, + deleteImage + } +})(); \ No newline at end of file diff --git a/inventory/static/js/widget.js b/inventory/static/js/widget.js index 5f5dcb4..a453ad6 100644 --- a/inventory/static/js/widget.js +++ b/inventory/static/js/widget.js @@ -1,56 +1,3 @@ -const ImageWidget = (() => { - function submitImageUpload(id) { - const form = document.getElementById(`image-upload-form-${id}`); - const formData = new FormData(form); - - fetch("/api/images", { - method: "POST", - body: formData - }).then(async response => { - if (!response.ok) { - // Try to parse JSON, fallback to text - const contentType = response.headers.get("Content-Type") || ""; - let errorDetails; - if (contentType.includes("application/json")) { - errorDetails = await response.json(); - } else { - errorDetails = { error: await response.text() }; - } - throw errorDetails; - } - return response.json(); - }).then(data => { - Toast.renderToast({ message: `Image uploaded.`, type: "success" }); - location.reload(); - }).catch(err => { - const msg = typeof err === "object" && err.error ? err.error : err.toString(); - Toast.renderToast({ message: `Upload failed: ${msg}`, type: "danger" }); - }); - } - - function deleteImage(inventoryId, imageId) { - if (!confirm("Are you sure you want to delete this image?")) return; - - fetch(`/api/images/${imageId}`, { - method: "DELETE" - }).then(response => response.json()).then(data => { - if (data.success) { - Toast.renderToast({ message: "Image deleted.", type: "success" }); - location.reload(); // Update view - } else { - Toast.renderToast({ message: `Failed to delete: ${data.error}`, type: "danger" }); - } - }).catch(err => { - Toast.renderToast({ message: `Error deleting image: ${err}`, type: "danger" }); - }); - } - - return { - submitImageUpload, - deleteImage - } -})(); - const EditorWidget = (() => { let tempIdCounter = 1; diff --git a/inventory/templates/fragments/_image_fragment.html b/inventory/templates/fragments/_image_fragment.html index 4da308c..6ff57cb 100644 --- a/inventory/templates/fragments/_image_fragment.html +++ b/inventory/templates/fragments/_image_fragment.html @@ -6,7 +6,7 @@ {% if image %} Image of ID {{ id }} -