From 720ace96f318abfd638dc126e5839b679d64361d Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Mon, 18 Feb 2019 20:12:55 +0100 Subject: [PATCH] #293 - added ui input for filtering by name --- .../TransactionSpecifications.java | 2 +- .../filter/FilterConfiguration.java | 22 +++++++++++++++++-- .../services/TransactionService.java | 4 ++-- src/main/resources/languages/_de.properties | 1 + src/main/resources/languages/_en.properties | 3 ++- src/main/resources/static/js/filter.js | 16 ++++++++++++++ .../resources/templates/filter/filter.ftl | 16 ++++++++++++++ 7 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/TransactionSpecifications.java b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/TransactionSpecifications.java index 333b852f3..3fafab39f 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/TransactionSpecifications.java +++ b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/TransactionSpecifications.java @@ -53,7 +53,7 @@ public class TransactionSpecifications predicates.add(builder.and(transaction.get(Transaction_.category).get("ID").in(categoryIDs))); } - if(name != null) + if(name != null && name.length() > 0) { predicates.add(builder.and(builder.like(builder.lower(transaction.get(Transaction_.name)), "%"+name.toLowerCase()+"%"))); } diff --git a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java index b1f27f42d..86bc1f52e 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java +++ b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java @@ -10,20 +10,22 @@ public class FilterConfiguration private boolean includeNotRepeating; private boolean includeRepeating; private List<FilterCategory> filterCategories; + private String name; - public static final FilterConfiguration DEFAULT = new FilterConfiguration(true, true, true, true, null); + public static final FilterConfiguration DEFAULT = new FilterConfiguration(true, true, true, true, null, ""); public FilterConfiguration() { } - public FilterConfiguration(boolean includeIncome, boolean includeExpenditure, boolean includeNotRepeating, boolean includeRepeating, List<FilterCategory> filterCategories) + public FilterConfiguration(boolean includeIncome, boolean includeExpenditure, boolean includeNotRepeating, boolean includeRepeating, List<FilterCategory> filterCategories, String name) { this.includeIncome = includeIncome; this.includeExpenditure = includeExpenditure; this.includeNotRepeating = includeNotRepeating; this.includeRepeating = includeRepeating; this.filterCategories = filterCategories; + this.name = name; } public boolean isIncludeIncome() @@ -85,6 +87,16 @@ public class FilterConfiguration this.filterCategories = filterCategories; } + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + public List<Integer> getIncludedCategoryIDs() { if(filterCategories == null) @@ -140,6 +152,11 @@ public class FilterConfiguration } } + if(!defaultConfiguration.getName().equals(name)) + { + return true; + } + return false; } @@ -152,6 +169,7 @@ public class FilterConfiguration ", includeNotRepeating=" + includeNotRepeating + ", includeRepeating=" + includeRepeating + ", filterCategories=" + filterCategories + + ", name='" + name + '\'' + '}'; } } diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java b/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java index cc2303781..53bff3001 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/services/TransactionService.java @@ -97,11 +97,11 @@ public class TransactionService implements Resetable if(account.getType().equals(AccountType.ALL)) { - Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, null, filterConfiguration.isIncludeIncome(), filterConfiguration.isIncludeExpenditure(), filterConfiguration.isIncludeRepeatingAndNotRepeating(), filterConfiguration.getIncludedCategoryIDs(), null); + Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, null, filterConfiguration.isIncludeIncome(), filterConfiguration.isIncludeExpenditure(), filterConfiguration.isIncludeRepeatingAndNotRepeating(), filterConfiguration.getIncludedCategoryIDs(), filterConfiguration.getName()); return transactionRepository.findAll(spec); } - Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, account, filterConfiguration.isIncludeIncome(), filterConfiguration.isIncludeExpenditure(), filterConfiguration.isIncludeRepeatingAndNotRepeating(), filterConfiguration.getIncludedCategoryIDs(), null); + Specification spec = TransactionSpecifications.withDynamicQuery(startDate, endDate, account, filterConfiguration.isIncludeIncome(), filterConfiguration.isIncludeExpenditure(), filterConfiguration.isIncludeRepeatingAndNotRepeating(), filterConfiguration.getIncludedCategoryIDs(), filterConfiguration.getName()); return transactionRepository.findAll(spec); } diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties index 12570d3b5..0f3620dcd 100644 --- a/src/main/resources/languages/_de.properties +++ b/src/main/resources/languages/_de.properties @@ -252,6 +252,7 @@ filter.categories=Kategorien filter.categories.button.all=Alle filter.categories.button.none=Keine filter.name=Name +filter.name.contains=Name enth�lt filter.tags=Tags filter.tags.button.all=Alle filter.tags.button.none=Keine diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties index fecec8e63..bad6cc7b8 100644 --- a/src/main/resources/languages/_en.properties +++ b/src/main/resources/languages/_en.properties @@ -239,7 +239,7 @@ report.budget.rest=Remaining Budget: # filter filter.active=Filter active -filer.apply=Apply Filter +filter.apply=Apply Filter filter.reset=Reset filter.type=Type filter.type.income=Income @@ -251,6 +251,7 @@ filter.categories=Categories filter.categories.button.all=All filter.categories.button.none=None filter.name=Name +filter.name.contains=Name contains filter.tags=Tags filter.tags.button.all=All filter.tags.button.none=None diff --git a/src/main/resources/static/js/filter.js b/src/main/resources/static/js/filter.js index 89546c470..cb7994929 100644 --- a/src/main/resources/static/js/filter.js +++ b/src/main/resources/static/js/filter.js @@ -5,6 +5,10 @@ $(document).ready(function () { updateStatus(); }); + $('#filter-name').on('input', function() { + updateStatus(); + }); + updateStatus(); }); @@ -12,6 +16,7 @@ function updateStatus() { updateStatusForSectionByCheckboxes('section-type'); updateStatusForSectionByCheckboxes('section-repeating'); updateStatusForSectionByCheckboxes('section-categories'); + updateStatusForSectionName('section-name'); } function updateStatusForSectionByCheckboxes(identifier) { @@ -31,3 +36,14 @@ function getStatusByCheckboxes(item) { return checkedCount + "/" + checkboxes.length; } +function updateStatusForSectionName(identifier) { + var section = document.getElementById(identifier); + var nameValue = section.querySelector('#filter-name').value; + var statusText = '1/1'; + + if(nameValue.length === 0) + { + statusText = '0/1'; + } + section.querySelector('.collapsible-header-status').innerText = statusText; +} \ No newline at end of file diff --git a/src/main/resources/templates/filter/filter.ftl b/src/main/resources/templates/filter/filter.ftl index 7ff669d29..614576fe5 100644 --- a/src/main/resources/templates/filter/filter.ftl +++ b/src/main/resources/templates/filter/filter.ftl @@ -92,6 +92,22 @@ </div> </div> </li> + + <li id="section-name"> + <div class="collapsible-header"> + <i class="material-icons">subject</i> + ${locale.getString("filter.name")} + <div class="collapsible-header-status"></div> + </div> + <div class="collapsible-body"> + <div class="row no-margin"> + <div class="input-field col s12"> + <input id="filter-name" type="text" name="name" value="<#if filterConfiguration.getName()??>${filterConfiguration.getName()}</#if>"> + <label for="filter-name">${locale.getString("filter.name.contains")}</label> + </div> + </div> + </div> + </li> </ul> </div> </div> -- GitLab