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