From e11d682e17e53de97aa3744724d153819bbafe34 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 14 Mar 2021 21:43:47 +0100
Subject: [PATCH] #419 - added option to delete images

---
 .../budgetmaster/images/ImageService.java     |  3 ++
 .../budgetmaster/images/MediaController.java  | 23 ++++++++++++
 .../resources/languages/base_de.properties    |  2 ++
 .../resources/languages/base_en.properties    |  2 ++
 src/main/resources/static/js/accounts.js      | 35 +++++++++++++++++++
 .../templates/accounts/availableImages.ftl    |  4 +++
 6 files changed, 69 insertions(+)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/images/ImageService.java b/src/main/java/de/deadlocker8/budgetmaster/images/ImageService.java
index 82d368596..9dcaefe5e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/images/ImageService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/images/ImageService.java
@@ -34,6 +34,7 @@ public class ImageService implements Resetable
 	}
 
 	@Override
+	@Transactional
 	public void deleteAll()
 	{
 		final List<Image> images = imageRepository.findAll();
@@ -53,6 +54,8 @@ public class ImageService implements Resetable
 		{
 			account.setIcon(null);
 		}
+
+		getRepository().delete(image);
 	}
 
 	@Override
diff --git a/src/main/java/de/deadlocker8/budgetmaster/images/MediaController.java b/src/main/java/de/deadlocker8/budgetmaster/images/MediaController.java
index e460496ca..c37e305e7 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/images/MediaController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/images/MediaController.java
@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.Optional;
 
 @Controller
 @RequestMapping(Mappings.MEDIA)
@@ -61,4 +62,26 @@ public class MediaController extends BaseController
 
 		return data.toString();
 	}
+
+	@GetMapping("/deleteImage/{ID}")
+	@ResponseBody
+	public String deleteImage(@PathVariable("ID") Integer ID)
+	{
+		boolean success = false;
+		String localizedMessage = Localization.getString("delete.image.error.not.existing", ID);
+
+		Optional<Image> imageOptional = imageService.getRepository().findById(ID);
+		if(imageOptional.isPresent())
+		{
+			success = true;
+			localizedMessage = Localization.getString("delete.image.success");
+			imageService.deleteImage(imageOptional.get());
+		}
+
+		final JsonObject data = new JsonObject();
+		data.addProperty("isDeleteSuccessful", success);
+		data.addProperty("localizedMessage", localizedMessage);
+
+		return data.toString();
+	}
 }
diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties
index 8a5561f25..bab198ae0 100644
--- a/src/main/resources/languages/base_de.properties
+++ b/src/main/resources/languages/base_de.properties
@@ -142,6 +142,8 @@ notification.settings.database.import.success=Import erfolgreich: {0} Konten, {1
 upload.image.success=Erfolgreich hochgeladen
 upload.image.error=Fehler: {0}
 upload.image.error.invalid.extension=Die Dateiendung "{0}" is nicht zugelassen für das Hochladen von Bildern
+delete.image.success=Erfolgreich gelöscht
+delete.image.error.not.existing=Fehler: Bild mit ID {0} existiert nicht
 
 # WARNING
 warning.text.account.delete=Das Konto "{0}" kann nicht gelöscht werden, da mindestens ein Konto existieren muss. Um dieses Konto zu löschen musst du zuerst ein neues anlegen.
diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties
index f5c0f58a5..da750082e 100644
--- a/src/main/resources/languages/base_en.properties
+++ b/src/main/resources/languages/base_en.properties
@@ -142,6 +142,8 @@ notification.settings.database.import.success=Import successful: {0} accounts, {
 upload.image.success=Upload successful
 upload.image.error=Error: {0}
 upload.image.error.invalid.extension=File extension "{0}" is not allowed for image upload
+delete.image.success=Successfully deleted
+delete.image.error.not.existing=Error: Image with ID {0} does not exist
 
 # WARNING
 warning.text.account.delete=The account "{0}" could not be deleted, because at least one account must exist at all time. You have to create a new account in order to delete this one.
diff --git a/src/main/resources/static/js/accounts.js b/src/main/resources/static/js/accounts.js
index 7f6ad7e16..807d7345f 100644
--- a/src/main/resources/static/js/accounts.js
+++ b/src/main/resources/static/js/accounts.js
@@ -84,6 +84,11 @@ function getAvailableImages(callback)
                 selectIcon(this);
             });
 
+            $('.account-icon-option-delete').click(function()
+            {
+                deleteImage(this);
+            });
+
             callback();
         }
     });
@@ -135,4 +140,34 @@ function uploadImage()
             });
         }
     });
+}
+
+function deleteImage(item)
+{
+    $.ajax({
+        type: 'GET',
+        url: $(item).attr('data-url'),
+        data: {},
+        success: function(response)
+        {
+            let parsedData = JSON.parse(response);
+            let isUploadSuccessful = parsedData['isDeleteSuccessful']
+            M.toast({
+                html: parsedData['localizedMessage'],
+                classes: isUploadSuccessful ? 'green' : 'red'
+            });
+
+            getAvailableImages(function()
+            {
+            });
+        },
+        error: function(response)
+        {
+            let parsedData = JSON.parse(response);
+            M.toast({
+                html: parsedData['localizedMessage'],
+                classes: 'red'
+            });
+        }
+    });
 }
\ No newline at end of file
diff --git a/src/main/resources/templates/accounts/availableImages.ftl b/src/main/resources/templates/accounts/availableImages.ftl
index 504abbfbc..edb3539ec 100644
--- a/src/main/resources/templates/accounts/availableImages.ftl
+++ b/src/main/resources/templates/accounts/availableImages.ftl
@@ -1,3 +1,6 @@
+<#import "/spring.ftl" as s>
+<#import "../helpers/header.ftl" as header>
+
 <#list availableImages as image>
     <@imageOption image 'account-icon'/>
 </#list>
@@ -7,5 +10,6 @@
         <div class="${classPrefix}-option">
             <img src="${image.getBase64EncodedImage()}" class="${classPrefix}-preview" data-image-id="${image.getID()}"/>
         </div>
+        <@header.buttonFlat url="/media/deleteImage/" + image.getID() icon='delete' localizationKey='' classes='no-padding text-default ' + classPrefix + '-option-delete' isDataUrl=true/>
     </div>
 </#macro>
\ No newline at end of file
-- 
GitLab