diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java index 567f225152a48ba35b3648aec87172f7ae819cd6..84044e40988cef8f3ee9767e4519e31863b6e8ea 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java @@ -11,6 +11,7 @@ import jakarta.validation.constraints.Size; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Objects; @@ -206,6 +207,16 @@ public class Account implements ProvidesID, Iconizable return FONT_COLOR_LIGHT_THEME; } + public Long getRemainingDays() + { + if(this.endDate == null) + { + return null; + } + + return LocalDate.now().until(this.endDate, ChronoUnit.DAYS); + } + @Override public String toString() { diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties index 605429f0eea5a71ddbced7d35148a879bd96c561..9fd51faa62b81fdba5f0c8dd817a902fbe1428cc 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_de.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties @@ -358,6 +358,8 @@ account.new.label.endDate=Enddatum account.default.name=Standardkonto account.all=Alle Konten account.tooltip.default=Als Standardkonto festlegen +account.tooltip.endDate.soon=Das Enddatum für dieses Konto wird in {0} Tagen erreicht! +account.tooltip.endDate.done=Das Enddatum für dieses Konto wurde vor {0} Tagen erreicht! account.state.full.access=Vollzugriff account.state.read.only=Lesezugriff diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties index bf10454f4b085c08994755d01936e8281a8d4f20..12b2a8146806c0be9203ae0271f3a4d59fa31cbd 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_en.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties @@ -357,6 +357,8 @@ account.new.label.endDate=End Date account.default.name=Default Account account.all=All Accounts account.tooltip.default=Set as default account +account.tooltip.endDate.soon=The end date for this account will be reached in {0} days! +account.tooltip.endDate.done=The end date for this account was reached {0} days ago! account.state.full.access=Full access account.state.read.only=Read-only diff --git a/BudgetMasterServer/src/main/resources/static/css/style.css b/BudgetMasterServer/src/main/resources/static/css/style.css index 2de6a9caa8e3d675c8eddd3f6a3c0badb798d1c7..b32adecf9629563c73b7ee74867d3b97dade33c1 100644 --- a/BudgetMasterServer/src/main/resources/static/css/style.css +++ b/BudgetMasterServer/src/main/resources/static/css/style.css @@ -365,7 +365,6 @@ input[type="radio"]:checked + span::after, [type="radio"].with-gap:checked + spa .global-account-select-option { display: flex; flex-direction: row; - align-items: flex-start; background-color: var(--color-background); border: 3px solid transparent; padding: 0; @@ -375,6 +374,18 @@ input[type="radio"]:checked + span::after, [type="radio"].with-gap:checked + spa border: 3px solid var(--color-grey); } +.global-account-select-option-header { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding-bottom: 5px; +} + +.global-account-select-option-header i { + font-size: 1.3rem; +} + .global-account-select-option-column-2 { display: flex; flex-direction: column; diff --git a/BudgetMasterServer/src/main/resources/static/js/main.js b/BudgetMasterServer/src/main/resources/static/js/main.js index 368ec0fb3e59986865e8bd99f68dca392e8127a4..47c108fef2297c2d96b31ae0e8ae45ff87ade587 100644 --- a/BudgetMasterServer/src/main/resources/static/js/main.js +++ b/BudgetMasterServer/src/main/resources/static/js/main.js @@ -80,6 +80,7 @@ function fetchAndShowModal(item, containerID, modalID) $('#' + containerID).html(data); $(modalID).modal(); $(modalID).modal('open'); + $('.global-account-select-option').find('.tooltipped').tooltip(); } }); } diff --git a/BudgetMasterServer/src/main/resources/templates/globalAccountSelectModal.ftl b/BudgetMasterServer/src/main/resources/templates/globalAccountSelectModal.ftl index d2c87f95afbaa4f5ab3148abb6392a1dbfcc2f49..b0563be5bc6a2c1e598834c347081e0ed5f915e1 100644 --- a/BudgetMasterServer/src/main/resources/templates/globalAccountSelectModal.ftl +++ b/BudgetMasterServer/src/main/resources/templates/globalAccountSelectModal.ftl @@ -33,11 +33,23 @@ <div class="col s12 m6 xl6"> <a href="<@s.url '/accounts/${account.getID()?c}/select'/>" class="text-default"> <div class="card-panel global-account-select-option" data-account-index="${account?index}"> - <#if account?index < 10> - <div class="keyboard-key bold global-account-select-option-key">${account?index}</div> - <#else> - <div class="keyboard-key bold global-account-select-option-key-hidden"> </div> - </#if> + <div class="global-account-select-option-header"> + <#if account?index < 10> + <div class="keyboard-key bold global-account-select-option-key">${account?index}</div> + <#else> + <div class="keyboard-key bold global-account-select-option-key-hidden"> </div> + </#if> + + <#if account.getEndDate()??> + <#assign remainingDays=account.getRemainingDays()/> + <#if remainingDays <= 0> + <i class="fas fa-bell text-red tooltipped" data-position="right" data-tooltip="${locale.getString("account.tooltip.endDate.done", remainingDays?abs)}"></i> + <#elseif remainingDays <= 30> + <i class="fas fa-bell text-yellow tooltipped" data-position="right" data-tooltip="${locale.getString("account.tooltip.endDate.soon", remainingDays)}"></i> + </#if> + </#if> + + </div> <div class="global-account-select-option-content"> <@customSelectMacros.accountIcon account accountName "category-circle-preview account-icon-big"/> <div class="global-account-select-option-column-2"> diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/AccountTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/AccountTest.java new file mode 100644 index 0000000000000000000000000000000000000000..68020f8a0a25ae59a529ceb63f1c6477af068365 --- /dev/null +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/AccountTest.java @@ -0,0 +1,48 @@ +package de.deadlocker8.budgetmaster.unit; + +import de.deadlocker8.budgetmaster.accounts.Account; +import de.deadlocker8.budgetmaster.accounts.AccountType; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; + +import static org.assertj.core.api.Assertions.assertThat; + +class AccountTest +{ + + @Test + void test_getRemainingDays_NoEndDate() + { + final Account account = new Account("account", "", AccountType.CUSTOM, null); + assertThat(account.getRemainingDays()) + .isNull(); + } + + @Test + void test_getRemainingDays_EndDateNotReached() + { + final LocalDate today = LocalDate.now(); + final Account account = new Account("account", "", AccountType.CUSTOM, today.plusDays(30)); + assertThat(account.getRemainingDays()) + .isEqualTo(30); + } + + @Test + void test_getRemainingDays_EndDateExactlyReached() + { + final LocalDate today = LocalDate.now(); + final Account account = new Account("account", "", AccountType.CUSTOM, today); + assertThat(account.getRemainingDays()) + .isZero(); + } + + @Test + void test_getRemainingDays_EndDateReached() + { + final LocalDate today = LocalDate.now(); + final Account account = new Account("account", "", AccountType.CUSTOM, today.minusDays(5)); + assertThat(account.getRemainingDays()) + .isEqualTo(-5); + } +}