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 229dcf038617f855e00dad8d2f9df274de808ea9..520b7e0faca636b0ab95f2858b22de45692f5063 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 0000000000000000000000000000000000000000..063dd7b24c288ce97339550f41c2dd8deab6c5ad --- /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 5d697f9809bf3ad9711f490e778d517bf49b5edf..ef77b4acb606c13f02c63b8ab61d262b16c0c9fb 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 eafb8b9a228472ad07bfaee4ed0fc4c60321db85..56735f3d086cb747e90f9b63c59fd5b45128cef1 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 0000000000000000000000000000000000000000..0f157e768c1c3740552a40e156b6bb3da7892bf2 --- /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 94ff9c810826ed057a2a2972890789652b1f3b99..050e6c7b19d66a9250199296f45055f99002941b 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>