From 061617ef8f3a46917d8326aa20e3cd950ec5d197 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 7 Jun 2020 12:29:21 +0200
Subject: [PATCH] #338 - allow selection of "no account"

---
 .../budgetmaster/templates/TemplateController.java  | 12 +++++++++---
 .../budgetmaster/templates/TemplateService.java     |  4 ++--
 src/main/resources/static/js/templates.js           | 13 ++++++++++++-
 .../resources/templates/templates/newTemplate.ftl   |  6 ++++--
 .../templates/templates/templateFunctions.ftl       | 11 +++++++++++
 .../templates/transactions/newTransactionMacros.ftl |  4 ++--
 .../templates/transactions/newTransactionNormal.ftl |  4 ++--
 .../transactions/newTransactionRepeating.ftl        |  4 ++--
 .../transactions/newTransactionTransfer.ftl         |  8 ++++----
 9 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
index 4edf2e672..918a68802 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
@@ -122,7 +122,7 @@ public class TemplateController extends BaseController
 		}
 
 		final Template template = templateOptional.get();
-		templateService.prepareTemplateForNewTransaction(template);
+		templateService.prepareTemplateForNewTransaction(template, true);
 
 		boolean isPayment = true;
 		if(template.getAmount() != null)
@@ -144,7 +144,7 @@ public class TemplateController extends BaseController
 	public String newTemplate(Model model)
 	{
 		final Template emptyTemplate = new Template();
-		templateService.prepareTemplateForNewTransaction(emptyTemplate);
+		templateService.prepareTemplateForNewTransaction(emptyTemplate, false);
 		templateService.prepareModelNewOrEdit(model, false, emptyTemplate, true, accountService.getAllAccountsAsc());
 		return "templates/newTemplate";
 	}
@@ -152,7 +152,8 @@ public class TemplateController extends BaseController
 	@PostMapping(value = "/templates/newTemplate")
 	public String post(Model model,
 					   @ModelAttribute("NewTemplate") Template template, BindingResult bindingResult,
-					   @RequestParam(value = "isPayment", required = false) boolean isPayment)
+					   @RequestParam(value = "isPayment", required = false) boolean isPayment,
+					   @RequestParam(value = "includeAccount", required = false) boolean includeAccount)
 	{
 
 		TemplateValidator templateValidator = new TemplateValidator(templateService.getExistingTemplateNames());
@@ -168,6 +169,11 @@ public class TemplateController extends BaseController
 			return "templates/newTemplate";
 		}
 
+		if(!includeAccount)
+		{
+			template.setAccount(null);
+		}
+
 		templateService.getRepository().save(template);
 		return "redirect:/templates";
 	}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java
index d4b4768ea..db8744559 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java
@@ -75,14 +75,14 @@ public class TemplateService implements Resetable
 		getRepository().save(template);
 	}
 
-	public void prepareTemplateForNewTransaction(Template template)
+	public void prepareTemplateForNewTransaction(Template template, boolean prepareAccount)
 	{
 		if(template.getCategory() == null)
 		{
 			template.setCategory(categoryService.getRepository().findByType(CategoryType.NONE));
 		}
 
-		if(template.getAmount() == null)
+		if(prepareAccount && template.getAccount() == null)
 		{
 			final Account selectedAccount = accountService.getRepository().findByIsSelected(true);
 			template.setAccount(selectedAccount);
diff --git a/src/main/resources/static/js/templates.js b/src/main/resources/static/js/templates.js
index 13d3df6e8..7daf9a19a 100644
--- a/src/main/resources/static/js/templates.js
+++ b/src/main/resources/static/js/templates.js
@@ -34,7 +34,6 @@ $(document).ready(function()
         accordion: false
     });
 
-
     let inputSearchTemplate = document.getElementById('searchTemplate');
     if(inputSearchTemplate !== undefined)
     {
@@ -49,6 +48,18 @@ $(document).ready(function()
     {
         document.getElementById('template-name').focus();
     }
+
+    if($("#include-account").length)
+    {
+        document.getElementById('include-account').addEventListener('change', (event) =>
+        {
+            let accountSelect = document.getElementById('transaction-account')
+            let accountSelectInstance = M.FormSelect.getInstance(accountSelect);
+            accountSelectInstance.destroy();
+            accountSelect.disabled = !event.target.checked;
+            M.FormSelect.init(document.querySelectorAll('#transaction-account'), {});
+        });
+    }
 });
 
 function createAndOpenModal(data)
diff --git a/src/main/resources/templates/templates/newTemplate.ftl b/src/main/resources/templates/templates/newTemplate.ftl
index b1e2d68d5..0da3a789a 100644
--- a/src/main/resources/templates/templates/newTemplate.ftl
+++ b/src/main/resources/templates/templates/newTemplate.ftl
@@ -51,9 +51,11 @@
 
                         <#-- account -->
                         <#if template.getAccount()??>
-                            <@newTransactionMacros.account accounts template.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@templateFunctions.templateIncludeAccountCheckbox "include-account" "includeAccount" locale.getString('template.checkbox.include.account') true/>
+                            <@newTransactionMacros.account accounts template.getAccount() "transaction-account" "account" "" false/>
                         <#else>
-                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@templateFunctions.templateIncludeAccountCheckbox "include-account" "includeAccount" locale.getString('template.checkbox.include.account') false/>
+                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" "", true/>
                         </#if>
 
                         <br>
diff --git a/src/main/resources/templates/templates/templateFunctions.ftl b/src/main/resources/templates/templates/templateFunctions.ftl
index 04c34cf26..ed2d0e839 100644
--- a/src/main/resources/templates/templates/templateFunctions.ftl
+++ b/src/main/resources/templates/templates/templateFunctions.ftl
@@ -136,4 +136,15 @@
             <label for="template-name">${locale.getString("template.new.label.name")}</label>
         </div>
     </div>
+</#macro>
+
+<#macro templateIncludeAccountCheckbox id name label checked>
+    <div class="row">
+        <div class="input-field col s12 m12 l8 offset-l2">
+            <label>
+                <input id="${id}" name="${name}" type="checkbox" <#if checked>checked</#if>>
+                <span class="columnName-checkbox-label text-color">${label}</span>
+            </label>
+        </div>
+    </div>
 </#macro>
\ No newline at end of file
diff --git a/src/main/resources/templates/transactions/newTransactionMacros.ftl b/src/main/resources/templates/transactions/newTransactionMacros.ftl
index 69edc1a37..0a01dbf27 100644
--- a/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -180,10 +180,10 @@
     </script>
 </#macro>
 
-<#macro account accounts selectedAccount id name label>
+<#macro account accounts selectedAccount id name label disabled>
     <div class="row">
         <div class="input-field col s12 m12 l8 offset-l2">
-            <select id="${id}" name="${name}" <@validation.validation "account"/>>
+            <select id="${id}" name="${name}" <@validation.validation "account"/> <#if disabled>disabled</#if>>
                 <#list accounts as account>
                     <#if (account.getType().name() != "CUSTOM")>
                         <#continue>
diff --git a/src/main/resources/templates/transactions/newTransactionNormal.ftl b/src/main/resources/templates/transactions/newTransactionNormal.ftl
index 2890327da..6cbfe5e44 100644
--- a/src/main/resources/templates/transactions/newTransactionNormal.ftl
+++ b/src/main/resources/templates/transactions/newTransactionNormal.ftl
@@ -51,9 +51,9 @@
 
                         <#-- account -->
                         <#if transaction.getAccount()??>
-                            <@newTransactionMacros.account accounts transaction.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@newTransactionMacros.account accounts transaction.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account") false/>
                         <#else>
-                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account") false/>
                         </#if>
 
                         <br>
diff --git a/src/main/resources/templates/transactions/newTransactionRepeating.ftl b/src/main/resources/templates/transactions/newTransactionRepeating.ftl
index ec00585ac..1fbd570c8 100644
--- a/src/main/resources/templates/transactions/newTransactionRepeating.ftl
+++ b/src/main/resources/templates/transactions/newTransactionRepeating.ftl
@@ -51,9 +51,9 @@
 
                         <#-- account -->
                         <#if transaction.getAccount()??>
-                            <@newTransactionMacros.account accounts transaction.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@newTransactionMacros.account accounts transaction.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account") false/>
                         <#else>
-                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account") false/>
                         </#if>
 
                         <#-- repeating options -->
diff --git a/src/main/resources/templates/transactions/newTransactionTransfer.ftl b/src/main/resources/templates/transactions/newTransactionTransfer.ftl
index 498f3cea2..6ae040977 100644
--- a/src/main/resources/templates/transactions/newTransactionTransfer.ftl
+++ b/src/main/resources/templates/transactions/newTransactionTransfer.ftl
@@ -49,16 +49,16 @@
 
                         <#-- account -->
                         <#if transaction.getAccount()??>
-                            <@newTransactionMacros.account accounts transaction.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@newTransactionMacros.account accounts transaction.getAccount() "transaction-account" "account" locale.getString("transaction.new.label.account"), false/>
                         <#else>
-                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account")/>
+                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-account" "account" locale.getString("transaction.new.label.account") false/>
                         </#if>
 
                         <#-- transfer account -->
                         <#if transaction.getTransferAccount()??>
-                            <@newTransactionMacros.account accounts transaction.getTransferAccount() "transaction-transfer-account" "transferAccount" locale.getString("transaction.new.label.transfer.account")/>
+                            <@newTransactionMacros.account accounts transaction.getTransferAccount() "transaction-transfer-account" "transferAccount" locale.getString("transaction.new.label.transfer.account") false/>
                         <#else>
-                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-transfer-account" "transferAccount" locale.getString("transaction.new.label.transfer.account")/>
+                            <@newTransactionMacros.account accounts helpers.getCurrentAccountOrDefault() "transaction-transfer-account" "transferAccount" locale.getString("transaction.new.label.transfer.account") false/>
                         </#if>
 
                         <br>
-- 
GitLab