From b7b8131c1d2515a1642ee582e3a7e66cb1b79bf0 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 2 Oct 2021 16:46:35 +0200
Subject: [PATCH] #596 - eliminated special page for editing recurring
 transactions

---
 .../transactions/TransactionController.java   | 60 ++++-------
 src/main/resources/static/js/transactions.js  |  2 +-
 .../transactions/newTransactionNormal.ftl     |  1 +
 .../transactions/newTransactionRepeating.ftl  | 99 -------------------
 .../transactions/transactionsMacros.ftl       |  4 -
 5 files changed, 23 insertions(+), 143 deletions(-)
 delete mode 100644 src/main/resources/templates/transactions/newTransactionRepeating.ftl

diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
index 6fc12e7d3..9411433f1 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
@@ -132,10 +132,14 @@ public class TransactionController extends BaseController
 	}
 
 	@PostMapping(value = "/newTransaction/normal")
-	public String postNormal(Model model,
-							 @CookieValue("currentDate") String cookieDate,
-							 @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
-							 @RequestParam(value = "previousType", required = false) TransactionType previousType)
+	public String postRepeating(Model model, @CookieValue("currentDate") String cookieDate,
+								@ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
+								@RequestParam(value = "isRepeating", required = false) boolean isRepeating,
+								@RequestParam(value = "previousType", required = false) TransactionType previousType,
+								@RequestParam(value = "repeatingModifierNumber", required = false) int repeatingModifierNumber,
+								@RequestParam(value = "repeatingModifierType", required = false) String repeatingModifierType,
+								@RequestParam(value = "repeatingEndType", required = false) String repeatingEndType,
+								@RequestParam(value = "repeatingEndValue", required = false) String repeatingEndValue)
 	{
 		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
 
@@ -147,9 +151,17 @@ public class TransactionController extends BaseController
 		transactionService.handleAmount(transaction);
 		transactionService.handleTags(transaction);
 
-		transaction.setRepeatingOption(null);
+		if(isRepeating)
+		{
+			final RepeatingOption repeatingOption = createRepeatingOption(transaction.getDate(), repeatingModifierNumber, repeatingModifierType, repeatingEndType, repeatingEndValue);
+			transaction.setRepeatingOption(repeatingOption);
+		}
+		else
+		{
+			transaction.setRepeatingOption(null);
+		}
 
-		return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionNormal");
+		return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransaction");
 	}
 
 	private void handlePreviousType(TransactionType previousType, Transaction transaction)
@@ -161,31 +173,8 @@ public class TransactionController extends BaseController
 	}
 
 	@SuppressWarnings("ConstantConditions")
-	@PostMapping(value = "/newTransaction/repeating")
-	public String postRepeating(Model model, @CookieValue("currentDate") String cookieDate,
-								@ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
-								@RequestParam(value = "isRepeating", required = false) boolean isRepeating,
-								@RequestParam(value = "previousType", required = false) TransactionType previousType,
-								@RequestParam(value = "repeatingModifierNumber", required = false) int repeatingModifierNumber,
-								@RequestParam(value = "repeatingModifierType", required = false) String repeatingModifierType,
-								@RequestParam(value = "repeatingEndType", required = false) String repeatingEndType,
-								@RequestParam(value = "repeatingEndValue", required = false) String repeatingEndValue)
+	private RepeatingOption createRepeatingOption(DateTime startDate, int repeatingModifierNumber, String repeatingModifierType, String repeatingEndType, String repeatingEndValue)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
-
-		// handle repeating transactions
-		if(transaction.getID() != null && isRepeating)
-		{
-			transactionService.deleteTransaction(transaction.getID());
-		}
-
-		TransactionValidator transactionValidator = new TransactionValidator();
-		transactionValidator.validate(transaction, bindingResult);
-
-		transactionService.handleAmount(transaction);
-		transactionService.handleTags(transaction);
-
-		RepeatingOption repeatingOption;
 		RepeatingModifierType type = RepeatingModifierType.getByLocalization(repeatingModifierType);
 		RepeatingModifier repeatingModifier = RepeatingModifier.fromModifierType(type, repeatingModifierNumber);
 
@@ -205,10 +194,7 @@ public class TransactionController extends BaseController
 				break;
 		}
 
-		repeatingOption = new RepeatingOption(transaction.getDate(), repeatingModifier, repeatingEnd);
-		transaction.setRepeatingOption(repeatingOption);
-
-		return handleRedirect(model, transaction.getID() != null, transaction, bindingResult, date, "transactions/newTransactionRepeating");
+		return new RepeatingOption(startDate, repeatingModifier, repeatingEnd);
 	}
 
 	@PostMapping(value = "/newTransaction/transfer")
@@ -270,11 +256,6 @@ public class TransactionController extends BaseController
 		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
 		transactionService.prepareModelNewOrEdit(model, true, date, null, transaction, accountService.getAllActivatedAccountsAsc());
 
-		if(transaction.isRepeating())
-		{
-			return "transactions/newTransactionRepeating";
-		}
-
 		if(transaction.isTransfer())
 		{
 			return "transactions/newTransactionTransfer";
@@ -355,6 +336,7 @@ public class TransactionController extends BaseController
 				transactionCopy.setRepeatingOption(null);
 				redirectUrl = "transactions/newTransactionNormal";
 				break;
+//				TODO
 			case REPEATING:
 				transactionCopy.setTransferAccount(null);
 				redirectUrl = "transactions/newTransactionRepeating";
diff --git a/src/main/resources/static/js/transactions.js b/src/main/resources/static/js/transactions.js
index 282bab801..0a566b1b9 100644
--- a/src/main/resources/static/js/transactions.js
+++ b/src/main/resources/static/js/transactions.js
@@ -410,7 +410,7 @@ function validateForm(allowEmptyAmount = false)
         }
     }
 
-    if(document.getElementsByName('isRepeating')[0].value === '1')
+    if(document.getElementsByName('isRepeating')[0].value)
     {
         if(!validateNumber($(transactionRepeatingModifierID).val(), transactionRepeatingModifierID.substr(1), "hidden-" + transactionRepeatingModifierID.substr(1), numberValidationMessage, REGEX_NUMBER))
         {
diff --git a/src/main/resources/templates/transactions/newTransactionNormal.ftl b/src/main/resources/templates/transactions/newTransactionNormal.ftl
index 4dfcf5698..87de8e513 100644
--- a/src/main/resources/templates/transactions/newTransactionNormal.ftl
+++ b/src/main/resources/templates/transactions/newTransactionNormal.ftl
@@ -39,6 +39,7 @@
                             may then override an existing transactions if the ID is also already used in transactions table -->
                             <input type="hidden" name="ID" value="<#if transaction.class.simpleName == "Transaction" && transaction.getID()??>${transaction.getID()?c}</#if>">
                             <input type="hidden" name="previousType" value="<#if previousType??>${previousType.name()}</#if>">
+                            <input type="hidden" name="isRepeating" value="${transaction.isRepeating()?c}">
 
                             <#-- isPayment switch -->
                             <@newTransactionMacros.isExpenditureSwitch transaction/>
diff --git a/src/main/resources/templates/transactions/newTransactionRepeating.ftl b/src/main/resources/templates/transactions/newTransactionRepeating.ftl
deleted file mode 100644
index 8d1d12344..000000000
--- a/src/main/resources/templates/transactions/newTransactionRepeating.ftl
+++ /dev/null
@@ -1,99 +0,0 @@
-<html>
-    <head>
-        <#import "../helpers/header.ftl" as header>
-        <@header.globals/>
-        <#assign title = locale.getString("title.transaction.new.repeating.long")/>
-        <#if isEdit>
-            <#assign title=locale.getString("title.transaction.edit", title)/>
-        <#else>
-            <#assign title=locale.getString("title.transaction.new", title)/>
-        </#if>
-
-        <@header.header "BudgetMaster - ${title}"/>
-        <@header.style "transactions"/>
-        <@header.style "datepicker"/>
-        <#import "/spring.ftl" as s>
-    </head>
-    <@header.body>
-        <#import "../helpers/navbar.ftl" as navbar>
-        <@navbar.navbar "transactions" settings/>
-
-        <#import "newTransactionMacros.ftl" as newTransactionMacros>
-        <#import "../helpers/customSelectMacros.ftl" as customSelectMacros>
-
-        <main>
-            <div class="card main-card background-color">
-                <div class="container">
-                    <div class="section center-align">
-                        <div class="headline">${title}</div>
-                    </div>
-                </div>
-
-                <@header.content>
-                    <div class="container">
-                        <#import "../helpers/validation.ftl" as validation>
-                        <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}">
-                            <input type="hidden" name="previousType" value="<#if previousType??>${previousType.name()}</#if>">
-
-                            <#-- isPayment switch -->
-                            <@newTransactionMacros.isExpenditureSwitch transaction/>
-
-                            <#assign hint=helpers.getHintByLocalizationKey("hint.transaction.save")/>
-                            <@header.hint hint=hint/>
-
-                            <#-- name -->
-                            <@newTransactionMacros.transactionName transaction suggestionsJSON/>
-
-                            <#-- amount -->
-                            <@newTransactionMacros.transactionAmount transaction/>
-
-                            <#-- category -->
-                            <@customSelectMacros.customCategorySelect 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 -->
-                            <#if transaction.getAccount()??>
-                                <#assign selectedAccount = transaction.getAccount()/>
-                            <#else>
-                                <#assign selectedAccount = helpers.getCurrentAccountOrDefault()/>
-                            </#if>
-                            <@customSelectMacros.customAccountSelect "account-select-wrapper" "account" accounts selectedAccount "col s12 m12 l8 offset-l2" locale.getString("transaction.new.label.account") "transaction-account"/>
-
-                            <#-- repeating options -->
-                            <@newTransactionMacros.transactionRepeating transaction currentDate/>
-
-                            <#-- buttons -->
-                            <@newTransactionMacros.buttons "/transactions"/>
-                            <@newTransactionMacros.buttonTransactionActions isEdit false previousType??/>
-                        </form>
-
-                        <div id="changeTransactionTypeModalContainer"></div>
-                    </div>
-                </@header.content>
-            </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/libs/spectrum.js'/>"></script>
-        <script src="<@s.url '/js/helpers.js'/>"></script>
-        <script src="<@s.url '/js/transactions.js'/>"></script>
-        <script src="<@s.url '/js/transactionActions.js'/>"></script>
-    </@header.body>
-</html>
diff --git a/src/main/resources/templates/transactions/transactionsMacros.ftl b/src/main/resources/templates/transactions/transactionsMacros.ftl
index 70c6acb1e..4d777d875 100644
--- a/src/main/resources/templates/transactions/transactionsMacros.ftl
+++ b/src/main/resources/templates/transactions/transactionsMacros.ftl
@@ -144,10 +144,6 @@
                 <a href="<@s.url '/transactions/newTransaction/transfer'/>" class="btn-floating btn background-green-dark"><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/repeating'/>" class="btn-floating btn background-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/normal'/>" class="btn-floating btn background-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>
-- 
GitLab