diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java index b4907d6c2fcafd310a964c49cc51db7eac4d5071..8f15cc4b831137e6d9d79f28509f7bae654ede60 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java @@ -7,12 +7,12 @@ import de.deadlocker8.budgetmaster.tags.Tag; import de.deadlocker8.budgetmaster.tags.Tag_; import org.springframework.data.jpa.domain.Specification; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.JoinType; -import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.*; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; public class TransactionSearchSpecifications { @@ -92,10 +92,10 @@ public class TransactionSearchSpecifications final Predicate allPredicates = builder.and(accountStatePredicate, predicatesCombined); - if(search.getStartDate() != null && search.getEndDate() != null) + final Optional<Predicate> datePredicateOptional = getDatePredicate(builder, transaction, search); + if(datePredicateOptional.isPresent()) { - final Predicate dateConstraint = builder.between(transaction.get(Transaction_.date), search.getStartDate(), search.getEndDate()); - return builder.and(dateConstraint, allPredicates); + return builder.and(datePredicateOptional.get(), allPredicates); } return allPredicates; @@ -115,4 +115,24 @@ public class TransactionSearchSpecifications return allowedAccountStates; } + + private static Optional<Predicate> getDatePredicate(CriteriaBuilder builder, Root<Transaction> transaction, Search search) + { + if(search.getStartDate() != null && search.getEndDate() != null) + { + return Optional.of(builder.between(transaction.get(Transaction_.date), search.getStartDate(), search.getEndDate())); + } + + if(search.getStartDate() != null) + { + return Optional.of(builder.between(transaction.get(Transaction_.date), search.getStartDate(), LocalDate.of(2100, 1, 1))); + } + + if(search.getEndDate() != null) + { + return Optional.of(builder.between(transaction.get(Transaction_.date), LocalDate.of(2000, 1, 1), search.getEndDate())); + } + + return Optional.empty(); + } } diff --git a/BudgetMasterServer/src/main/resources/static/js/search.js b/BudgetMasterServer/src/main/resources/static/js/search.js index 5f0d6f57b6b1b1e2e1f0a2dc432ffb5e31b0f44c..317ebea9644233112f61af4a064d5ecc6d8bdb26 100644 --- a/BudgetMasterServer/src/main/resources/static/js/search.js +++ b/BudgetMasterServer/src/main/resources/static/js/search.js @@ -66,18 +66,18 @@ $(document).ready(function() function createSearchDatePickerEnd(minDate, selectedDate) { + let shouldSetDefaultDate = endDate !== null; if(selectedDate < minDate) { + shouldSetDefaultDate = selectedDate !== null; selectedDate = minDate; } - - return M.Datepicker.init(document.getElementById('search-datepicker-end'), { yearRange: 50, firstDay: 1, showClearBtn: false, - setDefaultDate: true, + setDefaultDate: shouldSetDefaultDate, minDate: minDate, defaultDate: selectedDate, autoClose: true, diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java index 2315d8ae21af618cec0439c4ab4651d6d7406d3b..62045b38e441a674e2727069773aa1d2a40a7c7b 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java @@ -346,4 +346,26 @@ class TransactionSearchSpecificationsTest assertThat(results).hasSize(4) .contains(transaction2, transferTransaction, repeatingTransaction, transactionFromHiddenAccount); } + + @Test + void getMatches_OnlyStartDateDefined() + { + Search search = new Search("", true, true, true, true, true, 0, LocalDate.of(2018, 1, 1), null); + Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); + + List<Transaction> results = transactionRepository.findAll(spec); + assertThat(results).hasSize(5) + .contains(transaction2, transferTransaction, repeatingTransaction, transactionFromHiddenAccount, transactionWithMultipleTags); + } + + @Test + void getMatches_OnlyEndDateDefined() + { + Search search = new Search("", true, true, true, true, true, 0, null, LocalDate.of(2019, 1, 1)); + Specification spec = TransactionSearchSpecifications.withDynamicQuery(search); + + List<Transaction> results = transactionRepository.findAll(spec); + assertThat(results).hasSize(5) + .contains(transaction1, transaction2, transferTransaction, repeatingTransaction, transactionFromHiddenAccount); + } } \ No newline at end of file