From d8a093dcc33e3f7bb6a88e819ee050c33a44ce9c Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Mon, 13 Jun 2022 21:23:15 +0200
Subject: [PATCH] #696 - save transactions settings

---
 .../settings/SettingsController.java          | 31 +++++++++++++++
 .../TransactionsSettingsContainer.java        | 24 ++++++++++++
 .../resources/languages/base_de.properties    |  3 ++
 .../resources/languages/base_en.properties    |  3 ++
 .../containers/settingsTransactions.ftl       | 39 +++++++++++++++++++
 .../resources/templates/settings/settings.ftl | 35 ++---------------
 6 files changed, 104 insertions(+), 31 deletions(-)
 create mode 100644 BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/TransactionsSettingsContainer.java
 create mode 100644 BudgetMasterServer/src/main/resources/templates/settings/containers/settingsTransactions.ftl

diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
index 2fa7b1975..229dcf038 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
@@ -13,6 +13,7 @@ import de.deadlocker8.budgetmaster.services.ImportResultItem;
 import de.deadlocker8.budgetmaster.services.ImportService;
 import de.deadlocker8.budgetmaster.settings.containers.PersonalizationSettingsContainer;
 import de.deadlocker8.budgetmaster.settings.containers.SecuritySettingsContainer;
+import de.deadlocker8.budgetmaster.settings.containers.TransactionsSettingsContainer;
 import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService;
 import de.deadlocker8.budgetmaster.utils.Mappings;
 import de.deadlocker8.budgetmaster.utils.WebRequestUtils;
@@ -79,6 +80,7 @@ public class SettingsController extends BaseController
 		public static final String IMPORT_DATABASE_RESULT = "settings/importResult";
 		public static final String CONTAINER_SECURITY = "settings/containers/settingsSecurity";
 		public static final String CONTAINER_PERSONALIZATION = "settings/containers/settingsPersonalization";
+		public static final String CONTAINER_TRANSACTIONS = "settings/containers/settingsTransactions";
 	}
 
 	private static class RequestAttributeNames
@@ -193,6 +195,35 @@ public class SettingsController extends BaseController
 		return ReturnValues.CONTAINER_PERSONALIZATION;
 	}
 
+	@PostMapping(value = "/save/transactions")
+	public String saveContainerTransactions(Model model,
+											   @ModelAttribute("TransactionsSettingsContainer") TransactionsSettingsContainer transactionsSettingsContainer,
+											   BindingResult bindingResult)
+	{
+		transactionsSettingsContainer.fixBooleans();
+
+		final Settings settings = settingsService.getSettings();
+
+		if(bindingResult.hasErrors())
+		{
+			model.addAttribute(ModelAttributes.ERROR, bindingResult);
+
+			final JsonObject toastContent = getToastContent("notification.settings.transactions.error", NotificationType.ERROR);
+			model.addAttribute(ModelAttributes.TOAST_CONTENT, toastContent);
+			model.addAttribute(ModelAttributes.SETTINGS, settings);
+			return ReturnValues.CONTAINER_TRANSACTIONS;
+		}
+
+		// update settings
+		settings.setRestActivated(transactionsSettingsContainer.getRestActivated());
+		settingsService.updateSettings(settings);
+
+		final JsonObject toastContent = getToastContent("notification.settings.transactions.saved", NotificationType.SUCCESS);
+		model.addAttribute(ModelAttributes.TOAST_CONTENT, toastContent);
+		model.addAttribute(ModelAttributes.SETTINGS, settings);
+		return ReturnValues.CONTAINER_TRANSACTIONS;
+	}
+
 	private JsonObject getToastContent(String localizationKey, NotificationType notificationType)
 	{
 		final JsonObject toastContent = new JsonObject();
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/TransactionsSettingsContainer.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/TransactionsSettingsContainer.java
new file mode 100644
index 000000000..bfc801d22
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/TransactionsSettingsContainer.java
@@ -0,0 +1,24 @@
+package de.deadlocker8.budgetmaster.settings.containers;
+
+public final class TransactionsSettingsContainer
+{
+	private Boolean restActivated;
+
+	public TransactionsSettingsContainer(Boolean restActivated)
+	{
+		this.restActivated = restActivated;
+	}
+
+	public Boolean getRestActivated()
+	{
+		return restActivated;
+	}
+
+	public void fixBooleans()
+	{
+		if(restActivated == null)
+		{
+			restActivated = false;
+		}
+	}
+}
diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties
index 9cde9d2e9..5d697f980 100644
--- a/BudgetMasterServer/src/main/resources/languages/base_de.properties
+++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties
@@ -173,6 +173,8 @@ notification.settings.security.warning=Passwort entspricht bereits gespeicherten
 notification.settings.security.error=Fehler beim Speichern des Passworts
 notification.settings.personalization.saved=Personalisierung gespeichert
 notification.settings.personalization.error=Fehler beim Speichern der Personalisierung
+notification.settings.transactions.saved=Buchungseinstellungen gespeichert
+notification.settings.transactions.error=Fehler beim Speichern der Buchungseinstellungen
 notification.settings.update.available=BudgetMaster Update "{0}" verfügbar
 notification.settings.database.delete.success=Datenbank erfolgreich gelöscht
 notification.settings.backup.run.success=Backup erfolgreich
@@ -314,6 +316,7 @@ settings.category.circle.style.deactivated=Quadrate
 settings.category.circle.style.activated=Kreise
 settings.personalization=Personalisierung
 settings.personalization.reload.page=Zum Anwenden visueller Änderungen <a href="">Seite neu laden</a>
+settings.transactions=Buchungen
 
 settings.database.import=Importieren
 settings.database.export=Exportieren
diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties
index b2e64859d..eafb8b9a2 100644
--- a/BudgetMasterServer/src/main/resources/languages/base_en.properties
+++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties
@@ -174,6 +174,8 @@ notification.settings.security.warning=Password equals already saved password
 notification.settings.security.error=Error saving password
 notification.settings.personalization.saved=Personalization settings saved
 notification.settings.personalization.error=Error saving personalization settings
+notification.settings.transactions.saved=Transactions settings saved
+notification.settings.transactions.error=Error saving transactions settings
 notification.settings.update.available=BudgetMaster update "{0}" available
 notification.settings.database.delete.success=Successfully deleted database
 notification.settings.backup.run.success=Backup successful
@@ -315,6 +317,7 @@ settings.category.circle.style.deactivated=Squares
 settings.category.circle.style.activated=Circles
 settings.personalization=Personalization
 settings.personalization.reload.page=<a href="">Reload</a> page to apply visual changes
+settings.transactions=Transactions
 
 settings.database.import=Import
 settings.database.export=Export
diff --git a/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsTransactions.ftl b/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsTransactions.ftl
new file mode 100644
index 000000000..c0abf9861
--- /dev/null
+++ b/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsTransactions.ftl
@@ -0,0 +1,39 @@
+<#import "/spring.ftl" as s>
+<#import "../../helpers/validation.ftl" as validation>
+<#import "../../helpers/header.ftl" as header>
+<@header.globals/>
+
+<#import "settingsContainer.ftl" as settingsContainerMacros>
+<#import "../settingsMacros.ftl" as settingsMacros>
+
+<#macro transactionsSettingsContainer settings>
+    <@settingsContainerMacros.settingsContainer 'TransactionsSettingsContainer' 'transactionsSettingsContainer'>
+        <div class="row">
+            <div class="col s12">
+                <div class="table-container">
+                    <div class="table-cell">
+                        <div class="switch-cell-margin">${locale.getString("settings.rest")}</div>
+                    </div>
+                    <div class="table-cell table-cell-spacer"></div>
+                    <div class="table-cell">
+                        <@settingsMacros.switch "rest" "restActivated" settings.isRestActivated()/>
+                    </div>
+                    <div class="table-cell table-cell-spacer"></div>
+                    <div class="table-cell">
+                        <div class="switch-cell-margin">
+                            <a class="btn btn-flat tooltipped text-default" data-position="bottom" data-tooltip="${locale.getString("settings.rest.description")}"><i class="material-icons">help_outline</i></a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="row">
+            <div class="col s12 center-align">
+                <@header.buttonSubmit name='action' icon='save' localizationKey='save' color='background-green' formaction='/settings/save/transactions'/>
+            </div>
+        </div>
+    </@settingsContainerMacros.settingsContainer>
+</#macro>
+
+<@transactionsSettingsContainer settings/>
diff --git a/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl b/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl
index 3f2166342..94ff9c810 100644
--- a/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl
+++ b/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl
@@ -16,6 +16,7 @@
 
         <#import "containers/settingsSecurity.ftl" as settingsSecurityMacros>
         <#import "containers/settingsPersonalization.ftl" as settingsPersonalizationMacros>
+        <#import "containers/settingsTransactions.ftl" as settingsTransactionMacros>
 
 
         <main>
@@ -40,37 +41,8 @@
                                         <@settingsPersonalizationMacros.personalizationSettingsContainer settings=settings showReloadWarning=false/>
                                     </@settingsMacros.settingsCollapsibleItem>
 
-                                    <@settingsMacros.settingsCollapsibleItem "" "list" "Transactions">
-                                        <div class="row">
-                                            <div class="col s12">
-                                                <div class="table-container">
-                                                    <div class="table-cell">
-                                                        <div class="switch-cell-margin">${locale.getString("settings.rest")}</div>
-                                                        <div class="switch-cell-margin">Warn about expenditure switch</div>
-                                                    </div>
-                                                    <div class="table-cell table-cell-spacer"></div>
-                                                    <div class="table-cell">
-                                                        <@settingsMacros.switch "rest" "restActivated" settings.isRestActivated()/>
-                                                        <@settingsMacros.switch "rest" "restActivated" settings.isRestActivated()/>
-                                                    </div>
-                                                    <div class="table-cell table-cell-spacer"></div>
-                                                    <div class="table-cell">
-                                                        <div class="switch-cell-margin">
-                                                            <a class="btn btn-flat tooltipped text-default" data-position="bottom" data-tooltip="${locale.getString("settings.rest.description")}"><i class="material-icons">help_outline</i></a>
-                                                        </div>
-                                                        <div class="switch-cell-margin">
-                                                            <a class="btn btn-flat tooltipped text-default" data-position="bottom" data-tooltip="${locale.getString("settings.rest.description")}"><i class="material-icons">help_outline</i></a>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                        </div>
-
-                                        <div class="row">
-                                            <div class="col s12 center-align">
-                                                <@header.buttonSubmit name='action' icon='save' localizationKey='save' color='background-green'/>
-                                            </div>
-                                        </div>
+                                    <@settingsMacros.settingsCollapsibleItem "transactionsSettingsContainer" "list" locale.getString("settings.transactions")>
+                                        <@settingsTransactionMacros.transactionsSettingsContainer settings/>
                                     </@settingsMacros.settingsCollapsibleItem>
 
                                     <@settingsMacros.settingsCollapsibleItem "" "cloud_download" locale.getString("settings.backup")>
@@ -242,6 +214,7 @@
         <script>
             initSettingsContainer('SecuritySettingsContainer', 'securitySettingsContainer');
             initSettingsContainer('PersonalizationSettingsContainer', 'personalizationSettingsContainer');
+            initSettingsContainer('TransactionsSettingsContainer', 'transactionsSettingsContainer');
         </script>
     </@header.body>
 </html>
-- 
GitLab