From 74d46be4c98a6bcf735351f55b53f7654862d0ea Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 8 Mar 2020 12:14:03 +0100
Subject: [PATCH] #455 - setting for amount of backups to keep

---
 .../deadlocker8/budgetmaster/settings/Settings.java | 13 +++++++++++++
 .../budgetmaster/settings/SettingsController.java   |  1 +
 .../budgetmaster/settings/SettingsValidator.java    |  3 ++-
 .../de/deadlocker8/budgetmaster/utils/Strings.java  |  2 +-
 src/main/resources/languages/_de.properties         |  4 ++--
 src/main/resources/languages/_en.properties         |  4 ++--
 src/main/resources/static/js/settings.js            | 13 ++++++++++++-
 src/main/resources/templates/settings/settings.ftl  |  8 +++++++-
 .../templates/transactions/newTransactionMacros.ftl |  2 +-
 9 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java b/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java
index 9b79844e6..1c1900278 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java
@@ -27,6 +27,7 @@ public class Settings
 	private Boolean autoBackupActivated;
 	private Integer autoBackupDays;
 	private AutoBackupTime autoBackupTime;
+	private Integer autoBackupFilesToKeep;
 
 	public Settings()
 	{
@@ -46,6 +47,7 @@ public class Settings
 		defaultSettings.setAutoBackupActivated(false);
 		defaultSettings.setAutoBackupDays(1);
 		defaultSettings.setAutoBackupTime(AutoBackupTime.DEFAULT);
+		defaultSettings.setAutoBackupFilesToKeep(3);
 
 		return defaultSettings;
 	}
@@ -174,6 +176,16 @@ public class Settings
 		this.autoBackupTime = autoBackupTime;
 	}
 
+	public Integer getAutoBackupFilesToKeep()
+	{
+		return autoBackupFilesToKeep;
+	}
+
+	public void setAutoBackupFilesToKeep(Integer autoBackupFilesToKeep)
+	{
+		this.autoBackupFilesToKeep = autoBackupFilesToKeep;
+	}
+
 	@Override
 	public String toString()
 	{
@@ -190,6 +202,7 @@ public class Settings
 				", autoBackupActivated=" + autoBackupActivated +
 				", autoBackupDays=" + autoBackupDays +
 				", autoBackupTime=" + autoBackupTime +
+				", autoBackupFilesToKeep=" + autoBackupFilesToKeep +
 				'}';
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
index 722505a22..1051628f5 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
@@ -112,6 +112,7 @@ public class SettingsController extends BaseController
 			final Settings defaultSettings = Settings.getDefault();
 			settings.setAutoBackupDays(defaultSettings.getAutoBackupDays());
 			settings.setAutoBackupTime(defaultSettings.getAutoBackupTime());
+			settings.setAutoBackupFilesToKeep(defaultSettings.getAutoBackupFilesToKeep());
 		}
 
 		if(bindingResult.hasErrors())
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsValidator.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsValidator.java
index 31efe6b18..049596dd9 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsValidator.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsValidator.java
@@ -15,6 +15,7 @@ public class SettingsValidator implements Validator
 
 	public void validate(Object obj, Errors errors)
 	{
-		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "autoBackupDays", Strings.WARNING_SETTINGS_EMPTY_SETTINGS_AUTO_BACKUP_DAYS);
+		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "autoBackupDays", Strings.WARNING_EMPTY_NUMBER);
+		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "autoBackupFilesToKeep", Strings.WARNING_EMPTY_NUMBER);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
index 550b5ba93..f51bbe5a1 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
@@ -38,9 +38,9 @@ public class Strings
     public static final String WARNING_SETTINGS_PASSWORD_LENGTH = "warning.settings.password.length";
     public static final String WARNING_SETTINGS_PASSWORD_CONFIRMATION_EMPTY = "warning.settings.password.confirmation.empty";
     public static final String WARNING_SETTINGS_PASSWORD_CONFIRMATION_WRONG = "warning.settings.password.confirmation.wrong";
-    public static final String WARNING_SETTINGS_EMPTY_SETTINGS_AUTO_BACKUP_DAYS = "warning.settings.empty.auto.backup.days";
     public static final String WARNING_EMPTY_CHART_NAME = "warning.empty.chart.name";
     public static final String WARNING_EMPTY_CHART_SCRIPT = "warning.empty.chart.script";
+    public static final String WARNING_EMPTY_NUMBER = "warning.empty.number";
 
     //REPORT
     public static final String REPORT_FOOTER_LEFT = "report.footer.left";
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index e4d6009ae..ec30d6ac0 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -122,14 +122,13 @@ warning.duplicate.account.name=Es existiert bereits ein Konto mit diesem Namen.
 warning.empty.category.color=Die Kategoriefarbe darf nicht leer sein.
 warning.empty.transaction.name=Das Feld f�r den Namen darf nicht leer sein.
 warning.transaction.amount=Gib eine g�ltige Zahl f�r den Betrag ein.
-warning.transaction.number=Gib eine g�ltige Zahl gr��er 0 ein.
+warning.empty.number=Gib eine g�ltige Zahl gr��er 0 ein.
 warning.empty.transaction.date=Bitte w�hle ein Datum aus.
 warning.wrong.password=Das Passwort ist nicht korrekt.
 warning.settings.password.empty=Bitte gib ein Passwort ein.
 warning.settings.password.length=Das Passwort muss mindestens drei Zeichen lang sein.
 warning.settings.password.confirmation.empty=Bitte gib dein Passwort zur Best�tigung erneut ein.
 warning.settings.password.confirmation.wrong=Passwort und Passwort Wiederholung stimmen nicht �berein.
-warning.settings.empty.auto.backup.days=Gib eine g�ltige Zahl gr��er 0 ein.
 warning.empty.chart.name=Bitte gib einen Namen ein.
 warning.empty.chart.script=Bitte gib ein Script ein.
 
@@ -179,6 +178,7 @@ settings.backup.auto.deactivated=Aus
 settings.backup.auto.activated=An
 settings.backup.auto.days=Intervall in Tagen
 settings.backup.auto.time=Uhrzeit
+settings.backup.auto.files.to.keep=Anzahl aufzubewahrender Backups
 
 settings.database.import=Importieren
 settings.database.export=Exportieren
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index 0fbd729b1..fd7f42ff0 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -122,14 +122,13 @@ warning.duplicate.account.name=An account with this name is already existing.
 warning.empty.category.color=The category color should not be empty.
 warning.empty.transaction.name=The field for the name can not be empty.
 warning.transaction.amount=Please enter a valid number in the amount field.
-warning.transaction.number=Please enter a valid number greater than 0.
+warning.empty.number=Please enter a valid number greater than 0.
 warning.empty.transaction.date=Please select a date.
 warning.wrong.password=The password is not correct.
 warning.settings.password.empty=Please enter a password.
 warning.settings.password.length=The password must be at least three characters long.
 warning.settings.password.confirmation.empty=Please enter your password again for confirmation.
 warning.settings.password.confirmation.wrong=Password and password confirmation do not match.
-warning.settings.empty.auto.backup.days=Please enter a valid number greater than 0.
 warning.empty.chart.name=Please insert a name.
 warning.empty.chart.script=Please insert a script.
 
@@ -179,6 +178,7 @@ settings.backup.auto.deactivated=Off
 settings.backup.auto.activated=On
 settings.backup.auto.days=Interval in days
 settings.backup.auto.time=Time of day
+settings.backup.auto.files.to.keep=Number of backups to keep
 
 settings.database.import=Import
 settings.database.export=Export
diff --git a/src/main/resources/static/js/settings.js b/src/main/resources/static/js/settings.js
index 3970e855c..886dc2089 100644
--- a/src/main/resources/static/js/settings.js
+++ b/src/main/resources/static/js/settings.js
@@ -26,6 +26,15 @@ $(document).ready(function()
         });
     }
 
+    let autoBackupFilesToKeep= $('#settings-backup-auto-files-to-keep');
+    if(autoBackupFilesToKeep.length)
+    {
+        autoBackupFilesToKeep.on('change keydown paste input', function()
+        {
+            validateNumber(autoBackupFilesToKeep.val(), "settings-backup-auto-files-to-keep", "hidden-settings-backup-auto-files-to-keep", numberValidationMessage);
+        });
+    }
+
     // on initial page load
     let autoBackupCheckbox = document.getElementsByName("autoBackupActivated")[0];
     $('#settings-auto-backup').toggle(autoBackupCheckbox.checked);
@@ -36,7 +45,9 @@ function validateForm()
     let autoBackupCheckbox = document.getElementsByName("autoBackupActivated")[0];
     if(autoBackupCheckbox.checked)
     {
-        return validateNumber($('#settings-backup-auto-days').val(), 'settings-backup-auto-days', "hidden-settings-backup-auto-days", numberValidationMessage);
+        let autoBackupDaysValid = validateNumber($('#settings-backup-auto-days').val(), "settings-backup-auto-days", "hidden-settings-backup-auto-days", numberValidationMessage);
+        let autoBackupFilesToKeepValid = validateNumber($('#settings-backup-auto-files-to-keep').val(), "settings-backup-auto-files-to-keep", "hidden-settings-backup-auto-files-to-keepp", numberValidationMessage);
+        return autoBackupDaysValid && autoBackupFilesToKeepValid;
     }
 
     return true;
diff --git a/src/main/resources/templates/settings/settings.ftl b/src/main/resources/templates/settings/settings.ftl
index 3d677210c..06176c65f 100644
--- a/src/main/resources/templates/settings/settings.ftl
+++ b/src/main/resources/templates/settings/settings.ftl
@@ -115,13 +115,19 @@
                             <input type="hidden" id="hidden-settings-backup-auto-days" name="autoBackupDays" value="<#if settings.getAutoBackupActivated()??>${settings.getAutoBackupDays()}</#if>">
 
                             <script>
-                                numberValidationMessage = "${locale.getString("warning.transaction.number")}";
+                                numberValidationMessage = "${locale.getString("warning.empty.number")}";
                             </script>
 
                             <div class="input-field col s12 m12 l8 offset-l2">
                                 <input id="settings-backup-auto-time" type="text" name="autoBackupTime" <@validation.validation "autoBackupTime"/> value="<#if settings.getAutoBackupActivated()??>${settings.getAutoBackupTime().name()}</#if>">
                                 <label for="settings-backup-auto-time">${locale.getString("settings.backup.auto.time")}</label>
                             </div>
+
+                            <div class="input-field col s12 m12 l8 offset-l2">
+                                <input id="settings-backup-auto-files-to-keep" type="text" <@validation.validation "autoBackupFilesToKeep"/> value="<#if settings.getAutoBackupActivated()??>${settings.getAutoBackupFilesToKeep()}</#if>">
+                                <label for="settings-backup-auto-files-to-keep">${locale.getString("settings.backup.auto.files.to.keep")}</label>
+                            </div>
+                            <input type="hidden" id="hidden-settings-backup-auto-files-to-keep" name="autoBackupFilesToKeep" value="<#if settings.getAutoBackupActivated()??>${settings.getAutoBackupFilesToKeep()}</#if>">
                         </div>
 
                         <br>
diff --git a/src/main/resources/templates/transactions/newTransactionMacros.ftl b/src/main/resources/templates/transactions/newTransactionMacros.ftl
index 6492928d7..93c4d0af7 100644
--- a/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -74,7 +74,7 @@
 
     <script>
         amountValidationMessage = "${locale.getString("warning.transaction.amount")}";
-        numberValidationMessage = "${locale.getString("warning.transaction.number")}";
+        numberValidationMessage = "${locale.getString("warning.empty.number")}";
     </script>
 </#macro>
 
-- 
GitLab