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 333b852f37637a4cd93b0784511f4e5c83dd6a65..3fafab39f32b32676aa9bce5a2965216685c0625 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 b1f27f42d865e3a1af2d7f9d74a5b06108fee1be..86bc1f52eed774b5627a757502177f2da93f4e81 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 cc230378135d8ed49412984142791ab67c8f1320..53bff300174fb5e598b3ac1cd328045b5c57daa6 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 12570d3b5b0275c4027fc97b3f673d8b16f98a43..0f3620dcdc9af64e2d308570797201402164e99f 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 fecec8e63cad3311aff3a502da33c9972537845d..bad6cc7b8823bc0422c9425a81f9027edb082f8b 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 89546c470946880bd07035506e110278843d3a36..cb7994929f0bf7ea21e8a2924fb854c08f7e0e36 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 7ff669d29a28eba11ae2a60a04200516437802a9..614576fe51a779e735f353d41f592f8371130912 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>