diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/FilterController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/FilterController.java new file mode 100644 index 0000000000000000000000000000000000000000..0a30210fe9c767cd40a60d91003cc4032a227bb6 --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/controller/FilterController.java @@ -0,0 +1,66 @@ +package de.deadlocker8.budgetmaster.controller; + +import de.deadlocker8.budgetmaster.entities.category.Category; +import de.deadlocker8.budgetmaster.filter.FilterCategory; +import de.deadlocker8.budgetmaster.filter.FilterConfiguration; +import de.deadlocker8.budgetmaster.services.CategoryService; +import de.deadlocker8.budgetmaster.services.HelpersService; +import de.deadlocker8.budgetmaster.services.TransactionService; +import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + + +@Controller +public class FilterController extends BaseController +{ + @Autowired + private TransactionService transactionService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private HelpersService helpers; + + @RequestMapping("/filter") + public String filter(Model model, @CookieValue(value = "currentDate", required = false) String cookieDate) + { + DateTime date = helpers.getDateTimeFromCookie(cookieDate); + + model.addAttribute("currentDate", date); + + List<Category> categories = categoryService.getRepository().findAllByOrderByNameAsc(); + List<FilterCategory> filterCategories = new ArrayList<>(); + for(Category category : categories) + { + filterCategories.add(new FilterCategory(category.getID(), category.getName(), false)); + } + + FilterConfiguration filterConfiguration = new FilterConfiguration(); + filterConfiguration.setIncludeIncome(true); + filterConfiguration.setIncludeExpenditure(true); + filterConfiguration.setIncludeNotRepeating(true); + filterConfiguration.setIncludeRepeating(true); + filterConfiguration.setFilterCategories(filterCategories); + + model.addAttribute("filterConfiguration", filterConfiguration); + return "filter/filter"; + } + + @RequestMapping(value = "/filter/apply", method = RequestMethod.POST) + public String post(HttpServletResponse response, @ModelAttribute("NewFilterConfiguration") FilterConfiguration filterConfiguration) + { + System.out.println(filterConfiguration); + return "redirect:/filter"; + } +} \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterCategory.java b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterCategory.java new file mode 100644 index 0000000000000000000000000000000000000000..d8bf9a40b3fcb34767b69925c3a21aa38bfb7c64 --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterCategory.java @@ -0,0 +1,59 @@ +package de.deadlocker8.budgetmaster.filter; + +public class FilterCategory +{ + private Integer ID; + private String name; + private boolean include; + + public FilterCategory() + { + } + + public FilterCategory(Integer ID, String name, boolean include) + { + this.ID = ID; + this.name = name; + this.include = include; + } + + public Integer getID() + { + return ID; + } + + public void setID(Integer ID) + { + this.ID = ID; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public boolean isInclude() + { + return include; + } + + public void setInclude(boolean include) + { + this.include = include; + } + + @Override + public String toString() + { + return "FilterCategory{" + + "ID=" + ID + + ", name='" + name + '\'' + + ", include=" + include + + '}'; + } +} diff --git a/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..78544858d0cf2c12b2a43c9ed319c2d1159938fc --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/filter/FilterConfiguration.java @@ -0,0 +1,87 @@ +package de.deadlocker8.budgetmaster.filter; + +import java.util.List; + +public class FilterConfiguration +{ + private boolean includeIncome; + private boolean includeExpenditure; + private boolean includeNotRepeating; + private boolean includeRepeating; + private List<FilterCategory> filterCategories; + + public FilterConfiguration() + { + } + + public FilterConfiguration(boolean includeIncome, boolean includeExpenditure, boolean includeNotRepeating, boolean includeRepeating, List<FilterCategory> filterCategories) + { + this.includeIncome = includeIncome; + this.includeExpenditure = includeExpenditure; + this.includeNotRepeating = includeNotRepeating; + this.includeRepeating = includeRepeating; + this.filterCategories = filterCategories; + } + + public boolean isIncludeIncome() + { + return includeIncome; + } + + public void setIncludeIncome(boolean includeIncome) + { + this.includeIncome = includeIncome; + } + + public boolean isIncludeExpenditure() + { + return includeExpenditure; + } + + public void setIncludeExpenditure(boolean includeExpenditure) + { + this.includeExpenditure = includeExpenditure; + } + + public boolean isIncludeNotRepeating() + { + return includeNotRepeating; + } + + public void setIncludeNotRepeating(boolean includeNotRepeating) + { + this.includeNotRepeating = includeNotRepeating; + } + + public boolean isIncludeRepeating() + { + return includeRepeating; + } + + public void setIncludeRepeating(boolean includeRepeating) + { + this.includeRepeating = includeRepeating; + } + + public List<FilterCategory> getFilterCategories() + { + return filterCategories; + } + + public void setFilterCategories(List<FilterCategory> filterCategories) + { + this.filterCategories = filterCategories; + } + + @Override + public String toString() + { + return "FilterConfiguration{" + + "includeIncome=" + includeIncome + + ", includeExpenditure=" + includeExpenditure + + ", includeNotRepeating=" + includeNotRepeating + + ", includeRepeating=" + includeRepeating + + ", filterCategories=" + filterCategories + + '}'; + } +} diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties index e6f25bd9d0d9bc90ac189f179d08f54be546d874..38f105e087e038b6ff71f4219d2f9c1446409a8c 100644 --- a/src/main/resources/languages/_de.properties +++ b/src/main/resources/languages/_de.properties @@ -240,6 +240,21 @@ report.budget.rest=Restbudget: # filter filter.active=Filter aktiv +filter.apply=Filter anwenden +filter.type=Art +filter.type.income=Einnahme +filter.type.expenditure=Ausgabe +filter.repeating=Wiederholung +filter.repeating.false=nicht wiederholend +filter.repeating.true=wiederholend +filter.categories=Kategorien +filter.categories.button.all=Alle +filter.categories.button.none=Keine +filter.name=Name +filter.tags=Tags +filter.tags.button.all=Alle +filter.tags.button.none=Keine +filter.button.reset=Zur�cksetzen # home menu home.menu.accounts=Konten erlauben es mehrere Buchungen zu gruppieren. Du kannst so viele Konten erstellen, wie du m�chtest. Zum Erstellen, Aktualisieren oder L�schen von Accounts klicke hier. diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties index 8b944f71610e1ef648b2ad79b926b2460befe03a..82d19573daf89352fe769a9a9e612c1d849f76e8 100644 --- a/src/main/resources/languages/_en.properties +++ b/src/main/resources/languages/_en.properties @@ -239,6 +239,21 @@ report.budget.rest=Remaining Budget: # filter filter.active=Filter active +filer.apply=Apply Filter +filter.type=Type +filter.type.income=Income +filter.type.expenditure=Expenditure +filter.repeating=Repeating +filter.repeating.false=not repeating +filter.repeating.true=repeating +filter.categories=Categories +filter.categories.button.all=All +filter.categories.button.none=None +filter.name=Name +filter.tags=Tags +filter.tags.button.all=All +filter.tags.button.none=None +filter.button.reset=Reset # home menu home.menu.accounts=Accounts allow you to group multiple transactions. You can create as many accounts as you want. Create, update and delete them by clicking here. diff --git a/src/main/resources/static/css/filter.css b/src/main/resources/static/css/filter.css new file mode 100644 index 0000000000000000000000000000000000000000..d78e40dea60b10feb7b3ddcab739422601ade535 --- /dev/null +++ b/src/main/resources/static/css/filter.css @@ -0,0 +1,9 @@ +.collapsible-header-status { + position: absolute; + right: 15px; + font-weight: bold; +} + +.collapsible-header { + position: relative; +} \ No newline at end of file diff --git a/src/main/resources/static/js/filter.js b/src/main/resources/static/js/filter.js new file mode 100644 index 0000000000000000000000000000000000000000..72ae829ea26effbfdcf4ff58956ffc130a052a4b --- /dev/null +++ b/src/main/resources/static/js/filter.js @@ -0,0 +1,3 @@ +$(document).ready(function () { + $('.collapsible').collapsible(); +}); diff --git a/src/main/resources/templates/filter/filter.ftl b/src/main/resources/templates/filter/filter.ftl new file mode 100644 index 0000000000000000000000000000000000000000..b3a71af8a5ccd2bb978eb0495df70f1b504b5e08 --- /dev/null +++ b/src/main/resources/templates/filter/filter.ftl @@ -0,0 +1,114 @@ +<html> + <head> + <#import "../helpers/header.ftl" as header> + <@header.header "BudgetMaster"/> + <@header.style "filter"/> + <#import "/spring.ftl" as s> + </head> + <body class="budgetmaster-blue-light"> + <#import "../helpers/navbar.ftl" as navbar> + <@navbar.navbar ""/> + + <main> + <div class="card main-card background-color"> + <div class="container"> + <form name="NewFilterConfiguration" action="<@s.url '/filter/apply'/>" method="post"> + <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> + + <div class="row"> + <div class="s12"> + <ul class="collapsible"> + <li> + <div class="collapsible-header"> + <i class="fas fa-piggy-bank"></i> + ${locale.getString("filter.type")} + <div class="collapsible-header-status">1/2</div> + </div> + <div class="collapsible-body"> + <div class="row no-margin"> + <div class="col s6 m6 l6"> + <label> + <input type="checkbox" name="includeIncome" <#if filterConfiguration.isIncludeIncome()>checked="checked"</#if>> + <span class="text-color">${locale.getString('filter.type.income')}</span> + </label> + </div> + <div class="col s6 m6 l6"> + <label> + <input type="checkbox" name="includeExpenditure" <#if filterConfiguration.isIncludeExpenditure()>checked="checked"</#if>> + <span class="text-color">${locale.getString('filter.type.expenditure')}</span> + </label> + </div> + </div> + </div> + </li> + + <li> + <div class="collapsible-header"> + <i class="material-icons">repeat</i> + ${locale.getString("filter.repeating")} + <div class="collapsible-header-status">1/2</div> + </div> + <div class="collapsible-body"> + <div class="row no-margin"> + <div class="col s6 m6 l6"> + <label> + <input type="checkbox" name="includeNotRepeating" <#if filterConfiguration.isIncludeNotRepeating()>checked="checked"</#if>> + <span class="text-color">${locale.getString('filter.repeating.false')}</span> + </label> + </div> + <div class="col s6 m6 l6"> + <label> + <input type="checkbox" name="includeRepeating" <#if filterConfiguration.isIncludeRepeating()>checked="checked"</#if>> + <span class="text-color">${locale.getString('filter.repeating.true')}</span> + </label> + </div> + </div> + </div> + </li> + + <li> + <div class="collapsible-header"> + <i class="material-icons">label</i> + ${locale.getString("filter.categories")} + <div class="collapsible-header-status">1/2</div> + </div> + <div class="collapsible-body"> + <div class="row no-margin"> + <div class="col s12"> + <#list filterConfiguration.getFilterCategories() as filterCategory> + <div> + <label> + <input type="checkbox" name="filterCategories['${filterCategory?index}'].include"> + <span class="text-color">${filterCategory.getName()}</span> + </label> + <input type="hidden" name="filterCategories['${filterCategory?index}'].ID" value="${filterCategory.getID()}"/> + <input type="hidden" name="filterCategories['${filterCategory?index}'].name" value="${filterCategory.getName()}"/> + </div> + </#list> + </div> + </div> + </div> + </li> + </ul> + </div> + </div> + + <#-- button save --> + <div class="row valign-wrapper"> + <div class="col s12 center-align"> + <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="buttonSave"> + <i class="fas fa-filter left"></i>${locale.getString("filter.apply")} + </button> + </div> + </div> + </form> + </div> + </div> + </main> + + <!-- Scripts--> + <#import "../helpers/scripts.ftl" as scripts> + <@scripts.scripts/> + <script src="<@s.url '/js/filter.js'/>"></script> + </body> +</html> \ No newline at end of file