From ddb0ef54ed28c88e6c76c4627dc61db1c71b1024 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Mon, 22 Apr 2019 12:00:31 +0200 Subject: [PATCH] #429 - splitted ftl for normal and repeating transactions --- .../transactions/TransactionController.java | 81 +++++++++++++++++-- src/main/resources/languages/_de.properties | 4 +- src/main/resources/languages/_en.properties | 4 +- src/main/resources/static/js/transactions.js | 72 +++++++++-------- .../transactions/newTransactionNormal.ftl | 73 +++++++++++++++++ ...action.ftl => newTransactionRepeating.ftl} | 4 +- .../transactions/transactionsMacros.ftl | 12 +-- 7 files changed, 201 insertions(+), 49 deletions(-) create mode 100644 src/main/resources/templates/transactions/newTransactionNormal.ftl rename src/main/resources/templates/transactions/{newTransaction.ftl => newTransactionRepeating.ftl} (94%) diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java index b30248f46..b88054acf 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java @@ -124,8 +124,8 @@ public class TransactionController extends BaseController return "redirect:/transactions"; } - @RequestMapping("/transactions/newTransaction") - public String newTransaction(Model model, @CookieValue("currentDate") String cookieDate) + @RequestMapping("/transactions/newTransaction/normal") + public String newTransactionNormal(Model model, @CookieValue("currentDate") String cookieDate) { DateTime date = helpers.getDateTimeFromCookie(cookieDate); Transaction emptyTransaction = new Transaction(); @@ -135,11 +135,79 @@ public class TransactionController extends BaseController model.addAttribute("accounts", accountService.getAllAccountsAsc()); model.addAttribute("transaction", emptyTransaction); model.addAttribute("settings", settingsRepository.findOne(0)); - return "transactions/newTransaction"; + return "transactions/newTransactionNormal"; + } + + @RequestMapping("/transactions/newTransaction/repeating") + public String newTransactionRepeating(Model model, @CookieValue("currentDate") String cookieDate) + { + DateTime date = helpers.getDateTimeFromCookie(cookieDate); + Transaction emptyTransaction = new Transaction(); + emptyTransaction.setCategory(categoryRepository.findByType(CategoryType.NONE)); + model.addAttribute("currentDate", date); + model.addAttribute("categories", categoryRepository.findAllByOrderByNameAsc()); + model.addAttribute("accounts", accountService.getAllAccountsAsc()); + model.addAttribute("transaction", emptyTransaction); + model.addAttribute("settings", settingsRepository.findOne(0)); + return "transactions/newTransactionRepeating"; + } + + @SuppressWarnings("ConstantConditions") + @RequestMapping(value = "/transactions/newTransaction/normal", method = RequestMethod.POST) + public String post(Model model, @CookieValue("currentDate") String cookieDate, + @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, + @RequestParam(value = "isRepeating", required = false) boolean isRepeating, + @RequestParam(value = "isPayment", required = false) boolean isPayment) + { + DateTime date = helpers.getDateTimeFromCookie(cookieDate); + + TransactionValidator transactionValidator = new TransactionValidator(); + transactionValidator.validate(transaction, bindingResult); + + if(transaction.getAmount() == null) + { + transaction.setAmount(0); + } + + if(isPayment) + { + transaction.setAmount(-Math.abs(transaction.getAmount())); + } + else + { + transaction.setAmount(Math.abs(transaction.getAmount())); + } + + List<Tag> tags = transaction.getTags(); + if(tags != null) + { + transaction.setTags(new ArrayList<>()); + for(Tag currentTag : tags) + { + //noinspection ConstantConditions + transaction = addTagForTransaction(currentTag.getName(), transaction); + } + } + + transaction.setRepeatingOption(null); + + if(bindingResult.hasErrors()) + { + model.addAttribute("error", bindingResult); + model.addAttribute("currentDate", date); + model.addAttribute("categories", categoryRepository.findAllByOrderByNameAsc()); + model.addAttribute("accounts", accountService.getAllAccountsAsc()); + model.addAttribute("transaction", transaction); + model.addAttribute("settings", settingsRepository.findOne(0)); + return "transactions/newTransactionNormal"; + } + + transactionRepository.save(transaction); + return "redirect:/transactions"; } @SuppressWarnings("ConstantConditions") - @RequestMapping(value = "/transactions/newTransaction", method = RequestMethod.POST) + @RequestMapping(value = "/transactions/newTransaction/repeating", method = RequestMethod.POST) public String post(Model model, @CookieValue("currentDate") String cookieDate, @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult, @RequestParam(value = "isRepeating", required = false) boolean isRepeating, @@ -220,13 +288,14 @@ public class TransactionController extends BaseController model.addAttribute("accounts", accountService.getAllAccountsAsc()); model.addAttribute("transaction", transaction); model.addAttribute("settings", settingsRepository.findOne(0)); - return "transactions/newTransaction"; + return "transactions/newTransactionNormal"; } transactionRepository.save(transaction); return "redirect:/transactions"; } + @RequestMapping("/transactions/{ID}/edit") public String editTransaction(Model model, @CookieValue("currentDate") String cookieDate, @PathVariable("ID") Integer ID) { @@ -248,7 +317,7 @@ public class TransactionController extends BaseController model.addAttribute("accounts", accountService.getAllAccountsAsc()); model.addAttribute("transaction", transaction); model.addAttribute("settings", settingsRepository.findOne(0)); - return "transactions/newTransaction"; + return "transactions/newTransactionNormal"; } private Settings getSettings() diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties index f8f365afe..3cb168077 100644 --- a/src/main/resources/languages/_de.properties +++ b/src/main/resources/languages/_de.properties @@ -30,9 +30,11 @@ title.warning=Warnung title.error=Fehler title.category.new=Neue Kategorie title.category.edit=Kategorie bearbeiten -title.transaction.edit=Buchung bearbeiten +title.transaction.edit={0} bearbeiten +title.transaction.new=Neue {0} title.transaction.new.normal=Buchung title.transaction.new.repeating=Wiederholend +title.transaction.new.repeating.long=Wiederholende Buchung title.transaction.new.transfer=Umbuchung title.datepicker.year=Jahr w�hlen title.datepicker.month=Monat w�hlen diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties index 2dfc1199b..cd6e3064b 100644 --- a/src/main/resources/languages/_en.properties +++ b/src/main/resources/languages/_en.properties @@ -30,9 +30,11 @@ title.warning=Warning title.error=Error title.category.new=New Category title.category.edit=Edit Category -title.transaction.edit=Edit Transaction +title.transaction.edit=Edit {0} +title.transaction.new=New {0} title.transaction.new.normal=Transaction title.transaction.new.repeating=Recurring +title.transaction.new.repeating.long=Recurring Transaction title.transaction.new.transfer=Transfer title.datepicker.year=Choose year title.datepicker.month=Choose month diff --git a/src/main/resources/static/js/transactions.js b/src/main/resources/static/js/transactions.js index d2adee417..6b7da4937 100644 --- a/src/main/resources/static/js/transactions.js +++ b/src/main/resources/static/js/transactions.js @@ -270,54 +270,60 @@ function validateForm() validateAmount($('#transaction-amount').val()); // handle tags - var tags = M.Chips.getInstance(document.querySelector('.chips-autocomplete')).chipsData; - var parent = document.getElementById("hidden-transaction-tags"); - for(var i = 0; i < tags.length; i++) + if($(".chips-autocomplete").length) { - var input = document.createElement("input"); - input.setAttribute("type", "hidden"); - input.setAttribute("name", "tags[" + i + "].name"); - input.setAttribute("value", tags[i].tag); - parent.appendChild(input); + var tags = M.Chips.getInstance(document.querySelector('.chips-autocomplete')).chipsData; + var parent = document.getElementById("hidden-transaction-tags"); + for (var i = 0; i < tags.length; i++) + { + var input = document.createElement("input"); + input.setAttribute("type", "hidden"); + input.setAttribute("name", "tags[" + i + "].name"); + input.setAttribute("value", tags[i].tag); + parent.appendChild(input); + } } - if(document.getElementById("enableRepeating").checked) + if($("#enableRepeating").length) { - if(!validateNumber($(transactionRepeatingModifierID).val(), transactionRepeatingModifierID.substr(1), "hidden-" + transactionRepeatingModifierID.substr(1), numberValidationMessage)) + if(document.getElementById("enableRepeating").checked) { - return false; - } + if(!validateNumber($(transactionRepeatingModifierID).val(), transactionRepeatingModifierID.substr(1), "hidden-" + transactionRepeatingModifierID.substr(1), numberValidationMessage)) + { + return false; + } - // handle repeating end - var endNever = document.getElementById("repeating-end-never"); - var endAfterXTimes = document.getElementById("repeating-end-after-x-times"); - var endDate = document.getElementById("repeating-end-date"); - var endInput = document.getElementById("hidden-transaction-repeating-end-value"); + // handle repeating end + var endNever = document.getElementById("repeating-end-never"); + var endAfterXTimes = document.getElementById("repeating-end-after-x-times"); + var endDate = document.getElementById("repeating-end-date"); + var endInput = document.getElementById("hidden-transaction-repeating-end-value"); - if(endNever.checked) - { - return true; - } + if(endNever.checked) + { + return true; + } - if(endAfterXTimes.checked) - { - if(!validateNumber($(transactionRepeatingEndAfterXTimesInputID).val(), transactionRepeatingEndAfterXTimesInputID.substr(1), null, numberValidationMessage)) + if(endAfterXTimes.checked) { - return false; + if(!validateNumber($(transactionRepeatingEndAfterXTimesInputID).val(), transactionRepeatingEndAfterXTimesInputID.substr(1), null, numberValidationMessage)) + { + return false; + } + + endInput.value = $(transactionRepeatingEndAfterXTimesInputID).val(); } - endInput.value = $(transactionRepeatingEndAfterXTimesInputID).val(); + if(endDate.checked) + { + endInput.value = $("#transaction-repeating-end-date-input").val(); + } } - - if(endDate.checked) + else { - endInput.value = $("#transaction-repeating-end-date-input").val(); + document.getElementById("hidden-" + transactionRepeatingModifierID.substr(1)).value = -1; } } - else - { - document.getElementById("hidden-" + transactionRepeatingModifierID.substr(1)).value = -1; - } return true; } diff --git a/src/main/resources/templates/transactions/newTransactionNormal.ftl b/src/main/resources/templates/transactions/newTransactionNormal.ftl new file mode 100644 index 000000000..5b74c8c14 --- /dev/null +++ b/src/main/resources/templates/transactions/newTransactionNormal.ftl @@ -0,0 +1,73 @@ +<html> + <head> + <#import "../helpers/header.ftl" as header> + <@header.header "BudgetMaster"/> + <@header.style "transactions"/> + <@header.style "datepicker"/> + <@header.style "categories"/> + <#import "/spring.ftl" as s> + </head> + <body class="budgetmaster-blue-light"> + <#import "../helpers/navbar.ftl" as navbar> + <@navbar.navbar "transactions" settings/> + + <#import "newTransactionMacros.ftl" as newTransactionMacros> + + <main> + <div class="card main-card background-color"> + <div class="container"> + <div class="section center-align"> + <div class="headline"><#if transaction.getID()??>${locale.getString("title.transaction.edit")}<#else>${locale.getString("title.transaction.new", locale.getString("title.transaction.new.normal"))}</#if></div> + </div> + </div> + <div class="container"> + <#import "../helpers/validation.ftl" as validation> + <form name="NewTransaction" action="<@s.url '/transactions/newTransaction/normal'/>" method="post" onsubmit="return validateForm()"> + <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> + <input type="hidden" name="ID" value="<#if transaction.getID()??>${transaction.getID()?c}</#if>"> + <input type="hidden" name="isRepeating" value="${transaction.isRepeating()?c}"> + + <#-- isPayment switch --> + <@newTransactionMacros.isExpenditureSwitch transaction/> + + <#-- name --> + <@newTransactionMacros.transactionName transaction/> + + <#-- amount --> + <@newTransactionMacros.transactionAmount transaction/> + + <#-- category --> + <@newTransactionMacros.categorySelect categories transaction.getCategory() "col s12 m12 l8 offset-l2" locale.getString("transaction.new.label.category")/> + + <#-- date --> + <@newTransactionMacros.transactionStartDate transaction currentDate/> + + <#-- description --> + <@newTransactionMacros.transactionDescription transaction/> + + <#-- tags --> + <@newTransactionMacros.transactionTags transaction/> + + <#-- account --> + <@newTransactionMacros.account accounts transaction/> + + <br> + <#-- buttons --> + <@newTransactionMacros.buttons/> + </form> + </div> + </div> + </main> + + <!-- Pass localization to JS --> + <#import "../helpers/globalDatePicker.ftl" as datePicker> + <@datePicker.datePickerLocalization/> + + <!-- Scripts--> + <#import "../helpers/scripts.ftl" as scripts> + <@scripts.scripts/> + <script src="<@s.url '/js/spectrum.js'/>"></script> + <script src="<@s.url '/js/transactions.js'/>"></script> + <script src="<@s.url '/js/categorySelect.js'/>"></script> + </body> +</html> diff --git a/src/main/resources/templates/transactions/newTransaction.ftl b/src/main/resources/templates/transactions/newTransactionRepeating.ftl similarity index 94% rename from src/main/resources/templates/transactions/newTransaction.ftl rename to src/main/resources/templates/transactions/newTransactionRepeating.ftl index 37991ea23..7ca6e61e6 100644 --- a/src/main/resources/templates/transactions/newTransaction.ftl +++ b/src/main/resources/templates/transactions/newTransactionRepeating.ftl @@ -17,12 +17,12 @@ <div class="card main-card background-color"> <div class="container"> <div class="section center-align"> - <div class="headline"><#if transaction.getID()??>${locale.getString("title.transaction.edit")}<#else>${locale.getString("title.transaction.new")}</#if></div> + <div class="headline"><#if transaction.getID()??>${locale.getString("title.transaction.edit")}<#else>${locale.getString("title.transaction.new", locale.getString("title.transaction.new.repeating.long"))}</#if></div> </div> </div> <div class="container"> <#import "../helpers/validation.ftl" as validation> - <form name="NewTransaction" action="<@s.url '/transactions/newTransaction'/>" method="post" onsubmit="return validateForm()"> + <form name="NewTransaction" action="<@s.url '/transactions/newTransaction/repeating'/>" method="post" onsubmit="return validateForm()"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> <input type="hidden" name="ID" value="<#if transaction.getID()??>${transaction.getID()?c}</#if>"> <input type="hidden" name="isRepeating" value="${transaction.isRepeating()?c}"> diff --git a/src/main/resources/templates/transactions/transactionsMacros.ftl b/src/main/resources/templates/transactions/transactionsMacros.ftl index a98c0696b..963275a39 100644 --- a/src/main/resources/templates/transactions/transactionsMacros.ftl +++ b/src/main/resources/templates/transactions/transactionsMacros.ftl @@ -117,16 +117,16 @@ </a> <ul class="${listClasses}"> <li> - <a href="<@s.url '/transactions/newTransaction'/>" class="btn-floating btn budgetmaster-dark-green"><i class="material-icons">swap_horiz</i></a> - <a href="<@s.url '/transactions/newTransaction'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new.transfer")}</a> + <a href="<@s.url '/transactions/newTransaction/transfer'/>" class="btn-floating btn budgetmaster-dark-green"><i class="material-icons">swap_horiz</i></a> + <a href="<@s.url '/transactions/newTransaction/transfer'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new.transfer")}</a> </li> <li> - <a href="<@s.url '/transactions/newTransaction'/>" class="btn-floating btn budgetmaster-blue"><i class="material-icons">repeat</i></a> - <a href="<@s.url '/transactions/newTransaction'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new.repeating")}</a> + <a href="<@s.url '/transactions/newTransaction/repeating'/>" class="btn-floating btn budgetmaster-blue"><i class="material-icons">repeat</i></a> + <a href="<@s.url '/transactions/newTransaction/repeating'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new.repeating")}</a> </li> <li> - <a href="<@s.url '/transactions/newTransaction'/>" class="btn-floating btn budgetmaster-orange"><i class="material-icons">payment</i></a> - <a href="<@s.url '/transactions/newTransaction'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new.normal")}</a> + <a href="<@s.url '/transactions/newTransaction/normal'/>" class="btn-floating btn budgetmaster-orange"><i class="material-icons">payment</i></a> + <a href="<@s.url '/transactions/newTransaction/normal'/>" class="btn-floating btn mobile-fab-tip no-wrap">${locale.getString("title.transaction.new.normal")}</a> </li> </ul> </div> -- GitLab