diff --git a/src/main/java/de/deadlocker8/budgetmaster/images/ImageService.java b/src/main/java/de/deadlocker8/budgetmaster/images/ImageService.java index 82d368596022351671dc18093dbe2164bbd73740..9dcaefe5e9d7cc0a3a6e341c9cf7997c4b8e550d 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 e460496ca93b26df86e3008ade9542085b1c8001..c37e305e7592ee3efe2303bf5f45218456acfa13 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 8a5561f255d9892ddb13e3f3f35b00d57a0503b9..bab198ae0dbed3af29135acdcbf08dbcfb733307 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 f5c0f58a5db27c7b8c9a9f57a379191e60349273..da750082e6ecb5a6f39edf8216d72975bb8297de 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 7f6ad7e16dfff33fad0630407a47b1cea5801656..807d7345f420a40bf4753c2ebc24dafd829bc9a0 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 504abbfbcb8a0abf278ed4ceb5a1434d74ab8fb8..edb3539ecee633aca6a98698a4ed16eeef9444dd 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