From 1393f324a0657981d046ef2043902982c872cf69 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Mon, 9 Mar 2020 21:40:53 +0100
Subject: [PATCH] #388 - added button to create template from transaction (only
 for normal and transfer)

---
 .../transactions/TransactionController.java   | 56 +++++++++++++------
 .../transactions/TransactionSubmitAction.java | 27 +++++++++
 src/main/resources/languages/_de.properties   |  1 +
 src/main/resources/languages/_en.properties   |  1 +
 src/main/resources/static/css/dark/style.css  | 10 +++-
 src/main/resources/static/css/style.css       | 10 +++-
 .../transactions/newTransactionMacros.ftl     | 10 +++-
 .../transactions/newTransactionNormal.ftl     |  1 +
 .../transactions/newTransactionTransfer.ftl   |  1 +
 9 files changed, 96 insertions(+), 21 deletions(-)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java

diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
index 5f808b024..8298996de 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
@@ -126,21 +126,33 @@ public class TransactionController extends BaseController
 	}
 
 	@PostMapping(value = "/transactions/newTransaction/normal")
-	public String postNormal(Model model, @CookieValue("currentDate") String cookieDate,
+	public String postNormal(Model model, @RequestParam String action,
+							 @CookieValue("currentDate") String cookieDate,
 							 @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
 							 @RequestParam(value = "isPayment", required = false) boolean isPayment)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		if(action.equals(TransactionSubmitAction.TEMPLATE.getActionName()))
+		{
+			LOGGER.debug("Received request to create template from existing normal transaction");
+			return "redirect:/transactions";
+		}
 
-		TransactionValidator transactionValidator = new TransactionValidator();
-		transactionValidator.validate(transaction, bindingResult);
+		if(action.equals(TransactionSubmitAction.SAVE.getActionName()))
+		{
+			DateTime date = dateService.getDateTimeFromCookie(cookieDate);
 
-		handleAmount(transaction, isPayment);
-		handleTags(transaction);
+			TransactionValidator transactionValidator = new TransactionValidator();
+			transactionValidator.validate(transaction, bindingResult);
+
+			handleAmount(transaction, isPayment);
+			handleTags(transaction);
 
-		transaction.setRepeatingOption(null);
+			transaction.setRepeatingOption(null);
 
-		return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionNormal", isPayment);
+			return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionNormal", isPayment);
+		}
+
+		return "redirect:/transactions";
 	}
 
 	@SuppressWarnings("ConstantConditions")
@@ -195,21 +207,33 @@ public class TransactionController extends BaseController
 	}
 
 	@PostMapping(value = "/transactions/newTransaction/transfer")
-	public String postTransfer(Model model, @CookieValue("currentDate") String cookieDate,
+	public String postTransfer(Model model, @RequestParam String action,
+							   @CookieValue("currentDate") String cookieDate,
 							   @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
 							   @RequestParam(value = "isPayment", required = false) boolean isPayment)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		if(action.equals(TransactionSubmitAction.TEMPLATE.getActionName()))
+		{
+			LOGGER.debug("Received request to create template from existing transfer");
+			return "redirect:/transactions";
+		}
 
-		TransactionValidator transactionValidator = new TransactionValidator();
-		transactionValidator.validate(transaction, bindingResult);
+		if(action.equals(TransactionSubmitAction.SAVE.getActionName()))
+		{
+			DateTime date = dateService.getDateTimeFromCookie(cookieDate);
 
-		handleAmount(transaction, isPayment);
-		handleTags(transaction);
+			TransactionValidator transactionValidator = new TransactionValidator();
+			transactionValidator.validate(transaction, bindingResult);
+
+			handleAmount(transaction, isPayment);
+			handleTags(transaction);
 
-		transaction.setRepeatingOption(null);
+			transaction.setRepeatingOption(null);
 
-		return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionTransfer", isPayment);
+			return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionTransfer", isPayment);
+		}
+
+		return "redirect:/transactions";
 	}
 
 	private void handleAmount(Transaction transaction, boolean isPayment)
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java
new file mode 100644
index 000000000..8923f459d
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java
@@ -0,0 +1,27 @@
+package de.deadlocker8.budgetmaster.transactions;
+
+public enum TransactionSubmitAction
+{
+	SAVE("save"),
+	TEMPLATE("template");
+
+	private String actionName;
+
+	TransactionSubmitAction(String actionName)
+	{
+		this.actionName = actionName;
+	}
+
+	public String getActionName()
+	{
+		return actionName;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "TransactionSubmitAction{" +
+				"actionName='" + actionName + '\'' +
+				'}';
+	}
+}
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index 646e92888..1f03635ca 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -63,6 +63,7 @@ tagfield.placeholder=Tag hier eingeben
 placeholder=Keine Daten verfügbar
 placeholder.seems.empty=Ganz schön leer hier...
 placeholder.advice=Füge {0} hinzu
+save.as.template=Vorlage erzeugen
 
 # WEEK DAYS
 monday=Montag
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index d5c026f21..2b22384d2 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -63,6 +63,7 @@ tagfield.placeholder=Enter Tag here
 placeholder=No data available
 placeholder.seems.empty=It''s pretty empty here...
 placeholder.advice=Get started by adding {0}
+save.as.template=Create template
 
 # WEEK DAYS
 monday=Monday
diff --git a/src/main/resources/static/css/dark/style.css b/src/main/resources/static/css/dark/style.css
index b0ff8c050..7a2c2d3a5 100644
--- a/src/main/resources/static/css/dark/style.css
+++ b/src/main/resources/static/css/dark/style.css
@@ -176,11 +176,13 @@ ul.sidenav.sidenav-fixed > li:last-child
     font-weight: 600;
 }
 
-.btn:hover {
+.btn:hover,
+.btn-floating:hover {
     background-color: #70A3CF;
 }
 
-.btn:focus {
+.btn:focus,
+.btn-floating:focus {
     background-color: #2E79B9;
 }
 
@@ -614,6 +616,10 @@ input[type="radio"]:not(:checked) + span::before, [type="radio"]:not(:checked) +
     .budget {
         font-size: 2.5vmin;
     }
+
+    .fixed-action-btn {
+        right: 53px;
+    }
 }
 
 @media all and (max-width: 959px) and (min-width: 600px) {
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index e740eb462..0f867bda3 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -158,11 +158,13 @@ ul.sidenav.sidenav-fixed > li:last-child
     font-weight: 600;
 }
 
-.btn:hover {
+.btn:hover,
+.btn-floating:hover {
     background-color: #70A3CF;
 }
 
-.btn:focus {
+.btn:focus,
+.btn-floating:focus {
     background-color: #2E79B9;
 }
 
@@ -533,6 +535,10 @@ input[type="radio"]:checked + span::after, [type="radio"].with-gap:checked + spa
     .budget {
         font-size: 2.5vmin;
     }
+
+    .fixed-action-btn {
+        right: 53px;
+    }
 }
 
 @media all and (max-width: 959px) and (min-width: 600px) {
diff --git a/src/main/resources/templates/transactions/newTransactionMacros.ftl b/src/main/resources/templates/transactions/newTransactionMacros.ftl
index 93c4d0af7..54bdd552c 100644
--- a/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -362,7 +362,15 @@
 </#macro>
 
 <#macro buttonSave>
-    <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action">
+    <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action" value="save">
         <i class="material-icons left">save</i>${locale.getString("save")}
     </button>
+</#macro>
+
+<#macro buttonTemplate>
+    <div class="fixed-action-btn">
+        <button class="btn-floating btn-large waves-effect waves-light budgetmaster-blue tooltipped" type="submit" name="action" value="template" data-position="left" data-tooltip="${locale.getString("save.as.template")}">
+            <i class="material-icons left">file_copy</i>${locale.getString("save")}
+        </button>
+    </div>
 </#macro>
\ No newline at end of file
diff --git a/src/main/resources/templates/transactions/newTransactionNormal.ftl b/src/main/resources/templates/transactions/newTransactionNormal.ftl
index d90a0f7fd..c613caad4 100644
--- a/src/main/resources/templates/transactions/newTransactionNormal.ftl
+++ b/src/main/resources/templates/transactions/newTransactionNormal.ftl
@@ -58,6 +58,7 @@
                         <br>
                         <#-- buttons -->
                         <@newTransactionMacros.buttons/>
+                        <@newTransactionMacros.buttonTemplate/>
                     </form>
                 </div>
             </div>
diff --git a/src/main/resources/templates/transactions/newTransactionTransfer.ftl b/src/main/resources/templates/transactions/newTransactionTransfer.ftl
index f2a42f819..5b1268702 100644
--- a/src/main/resources/templates/transactions/newTransactionTransfer.ftl
+++ b/src/main/resources/templates/transactions/newTransactionTransfer.ftl
@@ -63,6 +63,7 @@
                         <br>
                         <#-- buttons -->
                         <@newTransactionMacros.buttons/>
+                        <@newTransactionMacros.buttonTemplate/>
                     </form>
                 </div>
             </div>
-- 
GitLab