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 %}
-