From 7ad8eaab51f000a26e9a4cf83c910f857b8e3d37 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 13 May 2018 15:03:45 +0200
Subject: [PATCH] #178, #267 - added radio buttons for repeating end options

---
 .../controller/PaymentController.java         |  4 +-
 .../repeating/endoption/RepeatingEnd.java     | 20 +++++++++
 .../endoption/RepeatingEndAfterXTimes.java    |  1 +
 .../repeating/endoption/RepeatingEndDate.java |  1 +
 .../endoption/RepeatingEndNever.java          |  8 +++-
 src/main/resources/languages/_de.properties   | 10 +++++
 src/main/resources/languages/_en.properties   | 10 +++++
 src/main/resources/static/css/style.css       | 11 ++++-
 src/main/resources/static/js/payments.js      | 32 +++++++++++---
 .../templates/payments/newPayment.ftl         | 44 +++++++++++++++++--
 10 files changed, 129 insertions(+), 12 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java
index 7fbacc698..1a43ec032 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java
@@ -108,7 +108,9 @@ public class PaymentController extends BaseController
 					   @RequestParam(value = "isPayment", required = false) boolean isPayment,
 					   @RequestParam(value = "enableRepeating", required = false) boolean enableRepeating,
 					   @RequestParam(value = "repeatingModifierNumber", required = false) int repeatingModifierNumber,
-					   @RequestParam(value = "repeatingModifierType", required = false) String repeatingModifierType)
+					   @RequestParam(value = "repeatingModifierType", required = false) String repeatingModifierType,
+					   @RequestParam(value = "repeatingEndType", required = false) String repeatingEndType,
+					   @RequestParam(value = "repeatingEndValue", required = false) String repeatingEndValue)
 	{
 		PaymentValidator paymentValidator = new PaymentValidator();
 		paymentValidator.validate(payment, bindingResult);
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java
index 54ad0ed7a..a82787583 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEnd.java
@@ -14,6 +14,16 @@ public abstract class RepeatingEnd
 	@GeneratedValue(strategy = GenerationType.AUTO)
 	private Integer ID;
 
+	@Transient
+	private String localizationKey;
+
+	RepeatingEnd(String localizationKey)
+	{
+		this.localizationKey = localizationKey;
+	}
+
+	RepeatingEnd() {}
+
 	public Integer getID()
 	{
 		return ID;
@@ -24,5 +34,15 @@ public abstract class RepeatingEnd
 		this.ID = ID;
 	}
 
+	public String getLocalizationKey()
+	{
+		return localizationKey;
+	}
+
+	public void setLocalizationKey(String localizationKey)
+	{
+		this.localizationKey = localizationKey;
+	}
+
 	public abstract boolean isEndReached(List<DateTime> dates);
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java
index 9f5b10087..287ac1c40 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndAfterXTimes.java
@@ -12,6 +12,7 @@ public class RepeatingEndAfterXTimes extends RepeatingEnd
 
 	public RepeatingEndAfterXTimes(int times)
 	{
+		super("repeating.end.key.afterXTimes");
 		this.times = times;
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java
index 131b9f9e5..3a9904723 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndDate.java
@@ -14,6 +14,7 @@ public class RepeatingEndDate extends RepeatingEnd
 
 	public RepeatingEndDate(DateTime endDate)
 	{
+		super("repeating.end.key.date");
 		this.endDate = endDate;
 	}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java
index 4b5747766..8f41f8132 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repeating/endoption/RepeatingEndNever.java
@@ -2,12 +2,18 @@ package de.deadlocker8.budgetmaster.repeating.endoption;
 
 import org.joda.time.DateTime;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
 import java.util.List;
 
 @Entity
 public class RepeatingEndNever extends RepeatingEnd
 {
+	public RepeatingEndNever()
+	{
+		super("repeating.end.key.never");
+	}
+
 	@Override
 	@Transient
 	public boolean isEndReached(List<DateTime> dates)
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index b82b391c0..50eb64ff4 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -330,6 +330,16 @@ repeating.modifier.days=Tage
 repeating.modifier.months=Monate
 repeating.modifier.years=Jahre
 
+repeating.end.key.never = never
+repeating.end.key.afterXTimes = afterXTimes
+repeating.end.key.date = date
+
+repeating.end=Endet
+repeating.end.never=niemals
+repeating.end.afterXTimes.A=nach
+repeating.end.afterXTimes.B=Wiederholungen
+repeating.end.date=am
+
 paymenttab.button.filter=Filter
 paymenttab.label.filter.active=Filter aktiv
 paymenttab.label.incomes=Einnahmen:
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index 635cba0ec..fe5ccf8fb 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -330,6 +330,16 @@ repeating.modifier.days=Days
 repeating.modifier.months=Months
 repeating.modifier.years=Years
 
+repeating.end.key.never = never
+repeating.end.key.afterXTimes = afterXTimes
+repeating.end.key.date = date
+
+repeating.end=Ends
+repeating.end.never=never
+repeating.end.afterXTimes.A=after
+repeating.end.afterXTimes.B=times
+repeating.end.date=on
+
 paymenttab.button.filter=Filter
 paymenttab.label.filter.active=Filter active
 paymenttab.label.incomes=Incomes:
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index 66f3bdc4f..07cc94463 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -293,7 +293,7 @@ ul.dropdown-content.select-dropdown li.selected {
 }
 
 /* chips autocomplete dropdown */
-.autocomplete-content li span{
+.autocomplete-content li span {
     color: #2E79B9;
 }
 
@@ -301,6 +301,15 @@ ul.dropdown-content.select-dropdown li.selected {
     background-color: rgba(0, 0, 0, 0.15);
 }
 
+/* radio buttons */
+input[type="radio"]:checked + label::after, [type="radio"].with-gap:checked + label::after {
+    background-color: #2E79B9;
+}
+
+input[type="radio"]:checked + label::after, [type="radio"].with-gap:checked + label::before, [type="radio"].with-gap:checked + label::after {
+    border: 2px solid #2E79B9;
+}
+
 .account-budget {
     font-size: 20px !important;
 }
diff --git a/src/main/resources/static/js/payments.js b/src/main/resources/static/js/payments.js
index e908fc8c0..d752028b6 100644
--- a/src/main/resources/static/js/payments.js
+++ b/src/main/resources/static/js/payments.js
@@ -62,15 +62,13 @@ $( document ).ready(function() {
     $('#enableRepeating').change(function(){
         if($(this).is(":checked"))
         {
-            $('#payment-repeating-modifier').prop('disabled', false);
-            $('#payment-repeating-modifier-type').prop('disabled', false);
-            $('#payment-repeating-modifier-type').material_select();
+            $('#payment-repeating-modifier-row').show();
+            $('#payment-repeating-end').show();
         }
         else
         {
-            $('#payment-repeating-modifier').prop('disabled', true);
-            $('#payment-repeating-modifier-type').prop('disabled', true);
-            $('#payment-repeating-modifier-type').material_select();
+            $('#payment-repeating-modifier-row').hide();
+            $('#payment-repeating-end').hide();
         }
     });
 
@@ -149,6 +147,7 @@ function removeTooltip(id)
 
 function validateForm()
 {
+    // handle tags
     var tags = $('.chips-autocomplete').material_chip('data');
     var parent = document.getElementById("hidden-payment-tags");
     for(var i = 0; i < tags.length; i++)
@@ -160,5 +159,26 @@ function validateForm()
         parent.appendChild(input);
     }
 
+    // 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-payment-repeating-end-value");
+
+    if(endNever.checked)
+    {
+        return true;
+    }
+
+    if(endAfterXTimes.checked)
+    {
+        endInput.value = "12";
+    }
+
+    if(endDate.checked)
+    {
+        endInput.value = "13.05.18";
+    }
+
     return true;
 }
\ No newline at end of file
diff --git a/src/main/resources/templates/payments/newPayment.ftl b/src/main/resources/templates/payments/newPayment.ftl
index c1f2535e1..aaa969da1 100644
--- a/src/main/resources/templates/payments/newPayment.ftl
+++ b/src/main/resources/templates/payments/newPayment.ftl
@@ -140,7 +140,7 @@
                         </div>
 
                         <#-- repeating modifier -->
-                        <div class="row">
+                        <div class="row" id="payment-repeating-modifier-row">
                             <div class="input-field col s6 m6 l4 offset-l2">
                                 <input id="payment-repeating-modifier" name="repeatingModifierNumber" type="text" <@validation.validation "repeatingModifierNumber"/> value="<#if payment.getRepeatingOption()??>${payment.getRepeatingOption().getModifier().getQuantity()}</#if>">
                                 <label for="payment-repeating-modifier">${locale.getString("payment.new.label.repeating.all")}</label>
@@ -154,16 +154,54 @@
                                         <#if payment.getRepeatingOption()??>
                                             <#if payment.getRepeatingOption().getModifier().getLocalizationKey() == modifierName>
                                                 <option selected value="${modifierName}">${modifierName}</option>
+                                            <#else>
+                                                <option value="${modifierName}">${modifierName}</option>
                                             </#if>
+                                        <#else>
+                                            <option value="${modifierName}">${modifierName}</option>
                                         </#if>
-                                        <option value="${modifierName}">${modifierName}</option>
                                     </#list>
                                 </select>
-                                <input type="hidden" id="hidden-payment-repeating-modifier-type" value="<#if payment.getRepeatingOption()??>${locale.getString(payment.getRepeatingOption().getModifier().getLocalizationKey())}</#if>">
                             </div>
                         </div>
 
                         <#-- repeating end option -->
+                        <div class="row" id="payment-repeating-end">
+                            <div class="col s12 m12 l8 offset-l2">
+                                ${locale.getString("repeating.end")}
+                                <p>
+                                    <#if payment.getRepeatingOption()??>
+                                        <#if payment.getRepeatingOption().getEndOption().getLocalizationKey() == locale.getString("repeating.end.key.never")>
+                                            <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-never" checked value="${locale.getString("repeating.end.key.never")}"/>
+                                        <#else>
+                                            <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-never" value="${locale.getString("repeating.end.key.never")}"/>
+                                        </#if>
+                                    <#else>
+                                        <#-- default -->
+                                        <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-never" checked value="${locale.getString("repeating.end.key.never")}"/>
+                                    </#if>
+                                    <label for="repeating-end-never">${locale.getString("repeating.end.never")}</label>
+                                </p>
+                                <p>
+                                    <#if payment.getRepeatingOption()?? && payment.getRepeatingOption().getEndOption().getLocalizationKey() == locale.getString("repeating.end.key.afterXTimes")>
+                                        <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-after-x-times" checked value="${locale.getString("repeating.end.key.afterXTimes")}"/>
+                                    <#else>
+                                        <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-after-x-times" value="${locale.getString("repeating.end.key.afterXTimes")}"/>
+                                    </#if>
+                                    <label for="repeating-end-after-x-times">${locale.getString("repeating.end.afterXTimes.A")} 8 ${locale.getString("repeating.end.afterXTimes.B")}</label>
+                                </p>
+                                <p>
+                                    <#if payment.getRepeatingOption()?? && payment.getRepeatingOption().getEndOption().getLocalizationKey() == locale.getString("repeating.end.key.date")>
+                                        <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-date" checked value="${locale.getString("repeating.end.key.date")}"/>
+                                    <#else>
+                                        <input class="with-gap" name="repeatingEndType" type="radio" id="repeating-end-date" value="${locale.getString("repeating.end.key.date")}"/>
+                                    </#if>
+                                    <label for="repeating-end-date">${locale.getString("repeating.end.date")} 13.05.2018</label>
+                                </p>
+                                <input type="hidden" id="hidden-payment-repeating-end-value" name="repeatingEndValue" value="">
+                            </div>
+                        </div>
+
                         <br>
 
                         <#-- buttons -->
-- 
GitLab