From 84812fb761d33d5e447a6f18dfc0beb994cdf3f0 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Mon, 13 Jun 2022 21:31:09 +0200 Subject: [PATCH] #696 - save update settings --- .../settings/SettingsController.java | 43 ++++++++-- .../containers/UpdateSettingsContainer.java | 24 ++++++ .../resources/languages/base_de.properties | 2 + .../resources/languages/base_en.properties | 2 + .../settings/containers/settingsUpdate.ftl | 83 +++++++++++++++++++ .../resources/templates/settings/settings.ftl | 78 ++--------------- 6 files changed, 154 insertions(+), 78 deletions(-) create mode 100644 BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/UpdateSettingsContainer.java create mode 100644 BudgetMasterServer/src/main/resources/templates/settings/containers/settingsUpdate.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 229dcf038..520b7e0fa 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java @@ -14,6 +14,7 @@ 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.settings.containers.UpdateSettingsContainer; import de.deadlocker8.budgetmaster.update.BudgetMasterUpdateService; import de.deadlocker8.budgetmaster.utils.Mappings; import de.deadlocker8.budgetmaster.utils.WebRequestUtils; @@ -81,6 +82,7 @@ public class SettingsController extends BaseController 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"; + public static final String CONTAINER_UPDATE = "settings/containers/settingsUpdate"; } private static class RequestAttributeNames @@ -126,8 +128,8 @@ public class SettingsController extends BaseController @PostMapping(value = "/save/security") public String saveContainerSecurity(Model model, - @ModelAttribute("SecuritySettingsContainer") SecuritySettingsContainer securitySettingsContainer, - BindingResult bindingResult) + @ModelAttribute("SecuritySettingsContainer") SecuritySettingsContainer securitySettingsContainer, + BindingResult bindingResult) { Optional<FieldError> passwordErrorOptional = securitySettingsContainer.validate(); passwordErrorOptional.ifPresent(bindingResult::addError); @@ -158,8 +160,8 @@ public class SettingsController extends BaseController @PostMapping(value = "/save/personalization") public String saveContainerPersonalization(Model model, - @ModelAttribute("PersonalizationSettingsContainer") PersonalizationSettingsContainer personalizationSettingsContainer, - BindingResult bindingResult) + @ModelAttribute("PersonalizationSettingsContainer") PersonalizationSettingsContainer personalizationSettingsContainer, + BindingResult bindingResult) { personalizationSettingsContainer.fixBooleans(); @@ -197,8 +199,8 @@ public class SettingsController extends BaseController @PostMapping(value = "/save/transactions") public String saveContainerTransactions(Model model, - @ModelAttribute("TransactionsSettingsContainer") TransactionsSettingsContainer transactionsSettingsContainer, - BindingResult bindingResult) + @ModelAttribute("TransactionsSettingsContainer") TransactionsSettingsContainer transactionsSettingsContainer, + BindingResult bindingResult) { transactionsSettingsContainer.fixBooleans(); @@ -224,6 +226,35 @@ public class SettingsController extends BaseController return ReturnValues.CONTAINER_TRANSACTIONS; } + @PostMapping(value = "/save/update") + public String saveContainerUpdate(Model model, + @ModelAttribute("UpdateSettingsContainer") UpdateSettingsContainer updateSettingsContainer, + BindingResult bindingResult) + { + updateSettingsContainer.fixBooleans(); + + final Settings settings = settingsService.getSettings(); + + if(bindingResult.hasErrors()) + { + model.addAttribute(ModelAttributes.ERROR, bindingResult); + + final JsonObject toastContent = getToastContent("notification.settings.update.error", NotificationType.ERROR); + model.addAttribute(ModelAttributes.TOAST_CONTENT, toastContent); + model.addAttribute(ModelAttributes.SETTINGS, settings); + return ReturnValues.CONTAINER_UPDATE; + } + + // update settings + settings.setAutoUpdateCheckEnabled(updateSettingsContainer.getAutoUpdateCheckEnabled()); + settingsService.updateSettings(settings); + + final JsonObject toastContent = getToastContent("notification.settings.update.saved", NotificationType.SUCCESS); + model.addAttribute(ModelAttributes.TOAST_CONTENT, toastContent); + model.addAttribute(ModelAttributes.SETTINGS, settings); + return ReturnValues.CONTAINER_UPDATE; + } + private JsonObject getToastContent(String localizationKey, NotificationType notificationType) { final JsonObject toastContent = new JsonObject(); diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/UpdateSettingsContainer.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/UpdateSettingsContainer.java new file mode 100644 index 000000000..063dd7b24 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/UpdateSettingsContainer.java @@ -0,0 +1,24 @@ +package de.deadlocker8.budgetmaster.settings.containers; + +public final class UpdateSettingsContainer +{ + private Boolean autoUpdateCheckEnabled; + + public UpdateSettingsContainer(Boolean autoUpdateCheckEnabled) + { + this.autoUpdateCheckEnabled = autoUpdateCheckEnabled; + } + + public Boolean getAutoUpdateCheckEnabled() + { + return autoUpdateCheckEnabled; + } + + public void fixBooleans() + { + if(autoUpdateCheckEnabled == null) + { + autoUpdateCheckEnabled = false; + } + } +} diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties index 5d697f980..ef77b4acb 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_de.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties @@ -175,6 +175,8 @@ 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.saved=Updateeinstellungen gespeichert +notification.settings.update.error=Fehler beim Speichern der Updateeinstellungen 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 diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties index eafb8b9a2..56735f3d0 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_en.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties @@ -176,6 +176,8 @@ 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.saved=Update settings saved +notification.settings.update.error=Error saving update settings notification.settings.update.available=BudgetMaster update "{0}" available notification.settings.database.delete.success=Successfully deleted database notification.settings.backup.run.success=Backup successful diff --git a/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsUpdate.ftl b/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsUpdate.ftl new file mode 100644 index 000000000..0f157e768 --- /dev/null +++ b/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsUpdate.ftl @@ -0,0 +1,83 @@ +<#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 updateSettingsContainer settings> + <@settingsContainerMacros.settingsContainer 'UpdateSettingsContainer' 'updateSettingsContainer'> + <div class="row"> + <div class="col s12 m12 l8 offset-l2 center-align"> + <div class="table-container"> + <div class="table-cell"> + <div class="right-align" style="margin-bottom: 1em;">${locale.getString("settings.updates.current.version")}</div> + <div class="right-align">${locale.getString("settings.updates.latest.version")}</div> + </div> + + <div class="table-cell table-cell-spacer"></div> + + <div class="table-cell"> + <div class="left-align" style="margin-bottom: 1em; margin-right: 5em"> + <div class="banner background-grey <#if settings.isUseDarkTheme()>text-black<#else>text-white</#if>"> + v${build.getVersionName()} + </div> + </div> + <div class="left-align"> + <#if updateService.getAvailableVersionString() == "-"> + <#if settings.isUseDarkTheme()> + <#assign bannerClasses="background-grey text-black"> + <#else> + <#assign bannerClasses="background-grey text-white"> + </#if> + <#else> + <#if updateService.isUpdateAvailable()> + <#assign bannerClasses="background-orange text-black"> + <#else> + <#assign bannerClasses="background-green text-white"> + </#if> + </#if> + + <div class="banner ${bannerClasses}"> + ${updateService.getAvailableVersionString()} + </div> + </div> + </div> + + <div class="table-cell table-cell-valign"> + <@header.buttonLink url='/settings/updateSearch' icon='refresh' localizationKey='settings.updates.search'/> + </div> + </div> + </div> + </div> + + <div class="row"> + <div class="col s12"> + <div class="table-container"> + <div class="table-cell"> + <div class="switch-cell-margin">${locale.getString("settings.updates.automatic")}</div> + </div> + <div class="table-cell table-cell-spacer"></div> + <div class="table-cell"> + <@settingsMacros.switch "updates.automatic" "autoUpdateCheckEnabled" settings.isAutoUpdateCheckEnabled()/> + </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.updates.automatic.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/update'/> + </div> + </div> + </@settingsContainerMacros.settingsContainer> +</#macro> + +<@updateSettingsContainer settings/> diff --git a/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl b/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl index 94ff9c810..050e6c7b1 100644 --- a/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl +++ b/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl @@ -16,7 +16,8 @@ <#import "containers/settingsSecurity.ftl" as settingsSecurityMacros> <#import "containers/settingsPersonalization.ftl" as settingsPersonalizationMacros> - <#import "containers/settingsTransactions.ftl" as settingsTransactionMacros> + <#import "containers/settingsTransactions.ftl" as settingsTransactionsMacros> + <#import "containers/settingsUpdate.ftl" as settingsUpdatenMacros> <main> @@ -42,7 +43,7 @@ </@settingsMacros.settingsCollapsibleItem> <@settingsMacros.settingsCollapsibleItem "transactionsSettingsContainer" "list" locale.getString("settings.transactions")> - <@settingsTransactionMacros.transactionsSettingsContainer settings/> + <@settingsTransactionsMacros.transactionsSettingsContainer settings/> </@settingsMacros.settingsCollapsibleItem> <@settingsMacros.settingsCollapsibleItem "" "cloud_download" locale.getString("settings.backup")> @@ -81,76 +82,8 @@ </div> </@settingsMacros.settingsCollapsibleItem> - <@settingsMacros.settingsCollapsibleItem "" "system_update" locale.getString("settings.updates")> - <div class="row"> - <div class="col s12 m12 l8 offset-l2 center-align"> - <div class="table-container"> - <div class="table-cell"> - <div class="right-align" style="margin-bottom: 1em;">${locale.getString("settings.updates.current.version")}</div> - <div class="right-align">${locale.getString("settings.updates.latest.version")}</div> - </div> - - <div class="table-cell table-cell-spacer"></div> - - <div class="table-cell"> - <div class="left-align" style="margin-bottom: 1em; margin-right: 5em"> - <div class="banner background-grey <#if settings.isUseDarkTheme()>text-black<#else>text-white</#if>"> - v${build.getVersionName()} - </div> - </div> - <div class="left-align"> - <#if updateService.getAvailableVersionString() == "-"> - <#if settings.isUseDarkTheme()> - <#assign bannerClasses="background-grey text-black"> - <#else> - <#assign bannerClasses="background-grey text-white"> - </#if> - <#else> - <#if updateService.isUpdateAvailable()> - <#assign bannerClasses="background-orange text-black"> - <#else> - <#assign bannerClasses="background-green text-white"> - </#if> - </#if> - - <div class="banner ${bannerClasses}"> - ${updateService.getAvailableVersionString()} - </div> - </div> - </div> - - <div class="table-cell table-cell-valign"> - <@header.buttonLink url='/settings/updateSearch' icon='refresh' localizationKey='settings.updates.search'/> - </div> - </div> - </div> - </div> - - <div class="row"> - <div class="col s12"> - <div class="table-container"> - <div class="table-cell"> - <div class="switch-cell-margin">${locale.getString("settings.updates.automatic")}</div> - </div> - <div class="table-cell table-cell-spacer"></div> - <div class="table-cell"> - <@settingsMacros.switch "updates.automatic" "autoUpdateCheckEnabled" settings.isAutoUpdateCheckEnabled()/> - </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.updates.automatic.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 "updateSettingsContainer" "system_update" locale.getString("settings.updates")> + <@settingsUpdatenMacros.updateSettingsContainer settings/> </@settingsMacros.settingsCollapsibleItem> <@settingsMacros.settingsCollapsibleItem "" "miscellaneous_services" "Misc"> @@ -215,6 +148,7 @@ initSettingsContainer('SecuritySettingsContainer', 'securitySettingsContainer'); initSettingsContainer('PersonalizationSettingsContainer', 'personalizationSettingsContainer'); initSettingsContainer('TransactionsSettingsContainer', 'transactionsSettingsContainer'); + initSettingsContainer('UpdateSettingsContainer', 'updateSettingsContainer'); </script> </@header.body> </html> -- GitLab