diff --git a/src/main/java/de/deadlocker8/budgetmaster/templategroup/TemplateGroupController.java b/src/main/java/de/deadlocker8/budgetmaster/templategroup/TemplateGroupController.java index 0f72f9a4f7756685e4993aebaddfbfa66a3219cd..2146810422a134e31dce63df5411e94d5e44de8b 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/templategroup/TemplateGroupController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/templategroup/TemplateGroupController.java @@ -1,6 +1,9 @@ package de.deadlocker8.budgetmaster.templategroup; +import com.google.gson.JsonObject; import de.deadlocker8.budgetmaster.controller.BaseController; +import de.deadlocker8.budgetmaster.templates.Template; +import de.deadlocker8.budgetmaster.templates.TemplateService; import de.deadlocker8.budgetmaster.utils.Mappings; import de.deadlocker8.budgetmaster.utils.ResourceNotFoundException; import de.deadlocker8.budgetmaster.utils.WebRequestUtils; @@ -22,11 +25,13 @@ import java.util.Optional; public class TemplateGroupController extends BaseController { private final TemplateGroupService templateGroupService; + private final TemplateService templateService; @Autowired - public TemplateGroupController(TemplateGroupService templateGroupService) + public TemplateGroupController(TemplateGroupService templateGroupService, TemplateService templateService) { this.templateGroupService = templateGroupService; + this.templateService = templateService; } @GetMapping @@ -106,4 +111,52 @@ public class TemplateGroupController extends BaseController model.addAttribute("templateGroup", templateGroup); return "templateGroups/newTemplateGroup"; } + + @PostMapping(value = "/moveTemplateToGroup") + @ResponseBody + public String moveTemplateToGroup(@RequestParam("templateID") String templateID, + @RequestParam("groupID") String groupID) + { + int templateIDParsed; + int groupIDParsed; + try + { + templateIDParsed = Integer.parseInt(templateID); + groupIDParsed = Integer.parseInt(groupID); + } + catch(NumberFormatException e) + { + return createJsonResponse(false, Localization.getString("template.move.to.group.error.parse")); + } + + Optional<Template> templateOptional = templateService.findById(templateIDParsed); + if(templateOptional.isEmpty()) + { + return createJsonResponse(false, Localization.getString("template.move.to.group.error.invalidTemplate")); + } + + Optional<TemplateGroup> templateGroupOptional = templateGroupService.findById(groupIDParsed); + if(templateGroupOptional.isEmpty()) + { + return createJsonResponse(false, Localization.getString("template.move.to.group.error.invalidGroup")); + + } + + final Template template = templateOptional.get(); + final TemplateGroup templateGroup = templateGroupOptional.get(); + + LOGGER.debug("Moving template with ID {} to group {}", templateID, groupID); + template.setTemplateGroup(templateGroup); + templateService.getRepository().save(template); + + return createJsonResponse(true, Localization.getString("template.move.to.group.success")); + } + + private String createJsonResponse(boolean isSuccess, String localizedMessage) + { + final JsonObject data = new JsonObject(); + data.addProperty("success", isSuccess); + data.addProperty("localizedMessage", localizedMessage); + return data.toString(); + } } \ No newline at end of file diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties index a3a555192fd69996fcfb226568643148ed3b4a31..9a256e8e107df6a6448576e186810bb81693baa7 100644 --- a/src/main/resources/languages/base_de.properties +++ b/src/main/resources/languages/base_de.properties @@ -176,7 +176,11 @@ upload.image.headline=Bild hochladen available.images=Verfügbare Bilder icons.images=Eigene Bilder icons.builtin=Mitgelieferte Icons -icons.numberOf=Icons +icons.numberOf=Icons# +template.move.to.group.success=Erfolgreich gespeichert +template.move.to.group.error.parse=Fehler beim Speichern +template.move.to.group.error.invalidTemplate=Ungültige Vorlage +template.move.to.group.error.invalidGroup=Ungültige Gruppe notification.transaction.add.warning=Konto mit Sichtbarkeit "{0}" erlaubt keine neuen Buchungen! diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties index d66cf5f81ea0c69a6b64e1bdff84024508f5b729..ecc182a103bc3e9951a042ccf2a437455069c470 100644 --- a/src/main/resources/languages/base_en.properties +++ b/src/main/resources/languages/base_en.properties @@ -178,6 +178,10 @@ available.images=Available Images icons.images=Custom Images icons.builtin=Built-in Icons icons.numberOf=Icons +template.move.to.group.success=Successfully saved +template.move.to.group.error.parse=Fehler beim Speichern +template.move.to.group.error.invalidTemplate=Invalid template +template.move.to.group.error.invalidGroup=Invalid group notification.transaction.add.warning=Account with visibility "{0}" does not allow new transactions! diff --git a/src/main/resources/static/js/templates.js b/src/main/resources/static/js/templates.js index 585aded4ef4daae3a185b0386d66528f29f5a060..5a6f7a6c94306b95c1eec9e097281c5d6468bc54 100644 --- a/src/main/resources/static/js/templates.js +++ b/src/main/resources/static/js/templates.js @@ -12,9 +12,48 @@ $(document).ready(function() group: 'templates', onEnd: function (event) { let draggedItem = event.item; - console.log(draggedItem); - console.log(event.to); - console.log(event.to.dataset.groupName); + let templateID = draggedItem.dataset.templateId; + let groupID = event.to.dataset.groupId; + + let formID = 'form-move-template-to-group'; + let form = document.getElementById(formID); + let inputTemplateID = form.querySelector('input[name="templateID"]'); + let inputGroupID = form.querySelector('input[name="groupID"]'); + + inputTemplateID.value = templateID; + inputGroupID.value = groupID; + + $.ajax({ + url: form.action, + type: 'POST', + processData: false, + contentType: false, + data: new FormData(form), + success: function(response) + { + inputTemplateID.value = ''; + inputGroupID.value = ''; + + let parsedData = JSON.parse(response); + let isSuccess = parsedData['success'] + M.toast({ + html: parsedData['localizedMessage'], + classes: isSuccess ? 'green' : 'red' + }); + }, + error: function(response) + { + inputTemplateID.value = ''; + inputGroupID.value = ''; + + let parsedData = JSON.parse(response); + console.log(parsedData) + M.toast({ + html: parsedData['localizedMessage'], + classes: 'red' + }); + } + }); }, }); } diff --git a/src/main/resources/templates/templates/templateFunctions.ftl b/src/main/resources/templates/templates/templateFunctions.ftl index f83b7a11fda16aa8da585c0e029645291e16008c..ec2a6d4959d04694b0c0e91cf4d3612383e0d10b 100644 --- a/src/main/resources/templates/templates/templateFunctions.ftl +++ b/src/main/resources/templates/templates/templateFunctions.ftl @@ -40,7 +40,7 @@ <div class="row"> <div class="col s12"> <#list templatesByGroup as templateGroup, templates> - <ul class="collapsible expandable templateCollapsible" data-group-name="${getTemplateGroupName(templateGroup)}"> + <ul class="collapsible expandable templateCollapsible" data-group-id="${templateGroup.ID?c}"> <#if templatesByGroup?size != 1 && templates?size != 0> <div class="template-group-headline">${getTemplateGroupName(templateGroup)}</div> </#if> @@ -53,10 +53,16 @@ </div> </div> </div> + + <form id="form-move-template-to-group" method="post" action="<@s.url '/templateGroups/moveTemplateToGroup'/>"> + <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> + <input type="hidden" name="templateID" value=""/> + <input type="hidden" name="groupID" value=""/> + </form> </#macro> <#macro templateItem template> - <li class="template-item z-depth-2"> + <li class="template-item z-depth-2" data-template-id="${template.ID?c}"> <div class="collapsible-header bold"> <@templateHeader template/> <div class="collapsible-header-button">