From 6ea86a6192a7abdbb1fc9fb41a558221ae6d874b Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 21 Mar 2021 18:22:32 +0100 Subject: [PATCH] #590 - use select with icons --- .../budgetmaster/accounts/AccountState.java | 34 +++++++++++-- .../resources/languages/base_de.properties | 7 ++- .../resources/languages/base_en.properties | 7 ++- src/main/resources/static/js/customSelect.js | 8 +++ .../templates/accounts/newAccount.ftl | 16 +++--- .../templates/helpers/customSelectMacros.ftl | 50 +++++++++++++++++++ 6 files changed, 106 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountState.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountState.java index 217345583..993d680ea 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountState.java +++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountState.java @@ -2,7 +2,35 @@ package de.deadlocker8.budgetmaster.accounts; public enum AccountState { - FULL_ACCESS, - READ_ONLY, - HIDDEN + FULL_ACCESS("fas fa-edit", "account.state.full.access"), + READ_ONLY("fas fa-lock", "account.state.read.only"), + HIDDEN("far fa-eye-slash", "account.state.hidden"); + + private final String icon; + private final String localizationKey; + + AccountState(String icon, String localizationKey) + { + this.icon = icon; + this.localizationKey = localizationKey; + } + + public String getIcon() + { + return icon; + } + + public String getLocalizationKey() + { + return localizationKey; + } + + @Override + public String toString() + { + return "AccountState{" + + "icon='" + icon + '\'' + + ", localizationKey='" + localizationKey + '\'' + + "} " + super.toString(); + } } diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties index d7cfffcca..74e1720e0 100644 --- a/src/main/resources/languages/base_de.properties +++ b/src/main/resources/languages/base_de.properties @@ -271,12 +271,15 @@ account.new.label.icon=Icon account.new.icon.placeholder=Hier klicken um ein Icon auszuwählen account.new.icon.upload.choose.file=Datei auswählen account.new.icon.upload=Hochladen +account.new.label.state=Sichtbarkeit account.default.name=Standardkonto account.all=Alle Konten account.budget.asof=Stand account.tooltip.default=Als Standardkonto festlegen -account.tooltip.readonly.activate=Konto aktivieren -account.tooltip.readonly.deactivate=Konto deaktivieren + +account.state.full.access=Vollzugriff +account.state.read.only=Lesezugriff +account.state.hidden=Versteckt transaction.new.label.name=Name transaction.new.label.amount=Betrag diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties index 3079713e4..47f8b13f4 100644 --- a/src/main/resources/languages/base_en.properties +++ b/src/main/resources/languages/base_en.properties @@ -271,12 +271,15 @@ account.new.label.icon=Icon account.new.icon.placeholder=Click here to select an icon account.new.icon.upload.choose.file=Choose file account.new.icon.upload=Upload +account.new.label.state=Visibility account.default.name=Default Account account.all=All Accounts account.budget.asof=as of account.tooltip.default=Set as default account -account.tooltip.readonly.activate=Enable account -account.tooltip.readonly.deactivate=Disable account + +account.state.full.access=Vollzugriff +account.state.read.only=Lesezugriff +account.state.hidden=Versteckt transaction.new.label.name=Name transaction.new.label.amount=Amount diff --git a/src/main/resources/static/js/customSelect.js b/src/main/resources/static/js/customSelect.js index 35f9e8449..7421a6aa4 100644 --- a/src/main/resources/static/js/customSelect.js +++ b/src/main/resources/static/js/customSelect.js @@ -26,6 +26,14 @@ $(document).ready(function() allCustomSelects.push(transferAccountSelect); } + let selectorAccountStateSelect = '.account-state-select-wrapper'; + if($(selectorAccountStateSelect).length) + { + let accountStateSelect = new CustomSelect(selectorAccountStateSelect); + accountStateSelect.init(); + allCustomSelects.push(accountStateSelect); + } + let selectorGlobalAccountSelect = '.global-account-select-wrapper'; if($(selectorGlobalAccountSelect).length) { diff --git a/src/main/resources/templates/accounts/newAccount.ftl b/src/main/resources/templates/accounts/newAccount.ftl index 77d5bed1c..e0da30a81 100644 --- a/src/main/resources/templates/accounts/newAccount.ftl +++ b/src/main/resources/templates/accounts/newAccount.ftl @@ -17,6 +17,7 @@ <@navbar.navbar "accounts" settings/> <#import "accountFunctions.ftl" as accountFunctions> + <#import "../helpers/customSelectMacros.ftl" as customSelectMacros> <main> <div class="card main-card background-color"> @@ -63,15 +64,12 @@ </div> <#-- state --> - <div class="row"> - <div class="input-field col s12 m12 l8 offset-l2" id="account-state"> - <select name="accountState"> - <#list availableAccountStates as state> - <option value="${state}">${state}</option> - </#list> - </select> - </div> - </div> + <#if account.getAccountState()??> + <#assign selectedState=account.getAccountState()> + <#else> + <#assign selectedState=availableAccountStates[0]> + </#if> + <@customSelectMacros.customAccountStateSelect "account-state-select-wrapper" "accountState" availableAccountStates selectedState "col s12 m12 l8 offset-l2" locale.getString("account.new.label.state") "account-state"/> <br> diff --git a/src/main/resources/templates/helpers/customSelectMacros.ftl b/src/main/resources/templates/helpers/customSelectMacros.ftl index d1a4cd67d..00229caef 100644 --- a/src/main/resources/templates/helpers/customSelectMacros.ftl +++ b/src/main/resources/templates/helpers/customSelectMacros.ftl @@ -101,6 +101,41 @@ </div> </#macro> +<#macro customAccountStateSelect selector inputName availableStates selectedState inputClasses labelText id > + <div class="row"> + <div class="input-field ${inputClasses}"> + <i class="material-icons prefix">visibility</i> + <label class="input-label" for="${id}">${labelText}</label> + <div class="custom-select-wrapper ${selector}" id="${id}"> + <div class="custom-select"> + <div class="custom-select-trigger" tabindex="0"> + <div class="custom-select-selected-item"> + <#if selectedState??><@customSelectOptionAccountStateContent selectedState "no-margin-left"/></#if> + </div> + <div class="custom-select-arrow"></div> + </div> + <div class="custom-select-options"> + <#list availableStates as state> + <#if selectedState??> + <#if selectedState == state> + <@customSelectAccountStateOption state true/> + <#else> + <@customSelectAccountStateOption state false/> + </#if> + <#continue> + </#if> + + <@customSelectAccountStateOption state false/> + </#list> + </div> + </div> + + <input type="hidden" name="${inputName}" class="hidden-input-custom-select" <#if selectedState??>value="${selectedState.name()}"</#if>/> + </div> + </div> + </div> +</#macro> + <#macro customSelectCategoryOption category isSelected> <div class="custom-select-option <#if isSelected>selected</#if>" data-value="${category.getID()?c}"> <@customSelectOptionCategoryContent category/> @@ -139,4 +174,19 @@ </span> </#if> </div> +</#macro> + +<#macro customSelectAccountStateOption state isSelected> + <div class="custom-select-option <#if isSelected>selected</#if>" data-value="${state.name()}"> + <@customSelectOptionAccountStateContent state=state/> + </div> +</#macro> + +<#macro customSelectOptionAccountStateContent state classes=""> + <div class="category-circle category-circle-small ${classes}" data-value="${state.name()}"> + <span class="text-blue"> + <i class="${state.getIcon()}"></i> + </span> + </div> + <span class="custom-select-item-name">${locale.getString(state.getLocalizationKey())}</span> </#macro> \ No newline at end of file -- GitLab