diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/search/Search.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/search/Search.java index 1587f38a3c770c05283f91d26d86a8c53ae4fa02..f1e01a1306a2a34890f8925663a3fcc8ce7c7981 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/search/Search.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/search/Search.java @@ -1,5 +1,7 @@ package de.deadlocker8.budgetmaster.search; +import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDate; public class Search @@ -13,7 +15,9 @@ public class Search private boolean searchTags; private boolean includeHiddenAccounts; private int page; + @DateTimeFormat(pattern = "dd.MM.yyyy") private LocalDate startDate; + @DateTimeFormat(pattern = "dd.MM.yyyy") private LocalDate endDate; public Search() @@ -127,7 +131,7 @@ public class Search public boolean isEmptySearch() { - return !searchName && !searchDescription && !searchCategory && !searchTags && startDate == null && endDate == null; + return !searchName && !searchDescription && !searchCategory && !searchTags; } @Override diff --git a/BudgetMasterServer/src/main/resources/static/js/charts.js b/BudgetMasterServer/src/main/resources/static/js/charts.js index 4a441e7963f4322af068cfae94a4464857a44994..6296f249e2a44ad5e95f0caef53871bd6d74bca1 100644 --- a/BudgetMasterServer/src/main/resources/static/js/charts.js +++ b/BudgetMasterServer/src/main/resources/static/js/charts.js @@ -21,7 +21,7 @@ $(document).ready(function() if($(".datepicker").length) { chartPickerStartDate = M.Datepicker.init(document.getElementById('chart-datepicker'), { - yearRange: 25, + yearRange: 50, firstDay: 1, showClearBtn: false, setDefaultDate: true, diff --git a/BudgetMasterServer/src/main/resources/static/js/search.js b/BudgetMasterServer/src/main/resources/static/js/search.js index 9207fab59fab441b257daedf403649e5e6b426ff..5f0d6f57b6b1b1e2e1f0a2dc432ffb5e31b0f44c 100644 --- a/BudgetMasterServer/src/main/resources/static/js/search.js +++ b/BudgetMasterServer/src/main/resources/static/js/search.js @@ -1,3 +1,6 @@ +let searchPickerStartDate; +let searchPickerEndDate; + $(document).ready(function() { $('.page-link').click(function() @@ -10,4 +13,94 @@ $(document).ready(function() document.getElementById('searchForm').submit(); } }); -}); \ No newline at end of file + + if($(".datepicker").length) + { + searchPickerStartDate = M.Datepicker.init(document.getElementById('search-datepicker'), { + yearRange: 50, + firstDay: 1, + showClearBtn: false, + setDefaultDate: startDate !== null, + defaultDate: startDate, + autoClose: true, + + i18n: { + // Strings and translations + months: monthNames, + monthsShort: monthNamesShort, + weekdays: weekDays, + weekdaysShort: weekDaysShort, + weekdaysAbbrev: weekDaysLetters, + + // Buttons + cancel: buttonCancel, + done: buttonClose, + + // Accessibility labels + labelMonthNext: '>', + labelMonthPrev: '<' + }, + + // Formats + format: 'dd.mm.yyyy', + formatSubmit: 'dd.mm.yyyy', + + onSelect: function() + { + if(typeof searchPickerEndDate !== "undefined") + { + let selectedDate = searchPickerEndDate.date; + searchPickerEndDate.destroy(); + searchPickerEndDate = createSearchDatePickerEnd(this.date, selectedDate); + } + } + }); + + // picker end date + if(typeof endDate !== "undefined") + { + searchPickerEndDate = createSearchDatePickerEnd(searchPickerStartDate.date, endDate); + } + } +}); + +function createSearchDatePickerEnd(minDate, selectedDate) +{ + if(selectedDate < minDate) + { + selectedDate = minDate; + } + + + + return M.Datepicker.init(document.getElementById('search-datepicker-end'), { + yearRange: 50, + firstDay: 1, + showClearBtn: false, + setDefaultDate: true, + minDate: minDate, + defaultDate: selectedDate, + autoClose: true, + + i18n: { + // Strings and translations + months: monthNames, + monthsShort: monthNamesShort, + weekdays: weekDays, + weekdaysShort: weekDaysShort, + weekdaysAbbrev: weekDaysLetters, + + // Buttons + cancel: buttonCancel, + done: buttonClose, + + // Accessibility labels + labelMonthNext: '>', + labelMonthPrev: '<' + }, + + // Formats + format: 'dd.mm.yyyy', + formatSubmit: 'dd.mm.yyyy' + }); +} \ No newline at end of file diff --git a/BudgetMasterServer/src/main/resources/templates/search/search.ftl b/BudgetMasterServer/src/main/resources/templates/search/search.ftl index 2150f4d56e9e8fc1b777109774aa7ec0336207a1..54c27d783f2560d08e28c017bf025986a4c63cc0 100644 --- a/BudgetMasterServer/src/main/resources/templates/search/search.ftl +++ b/BudgetMasterServer/src/main/resources/templates/search/search.ftl @@ -3,6 +3,7 @@ <#import "../helpers/header.ftl" as header> <@header.globals/> <@header.header "BudgetMaster - ${locale.getString('search')}"/> + <@header.style "datepicker"/> <@header.style "transactions"/> <@header.style "search"/> <#import "/spring.ftl" as s> @@ -26,6 +27,7 @@ <form id="searchForm" action="<@s.url '/search'/>" method="get"> <@searchMacros.searchTextAndButton search/> <@searchMacros.checkboxes search/> + <@searchMacros.dateRange search/> <input type="hidden" name="page" id="inputPageNumber" value="${page.getNumber()}"/> </form> @@ -83,6 +85,10 @@ </div> </main> + <!-- Pass localization to JS --> + <#import "../helpers/globalDatePicker.ftl" as datePicker> + <@datePicker.datePickerLocalization/> + <!-- Scripts--> <#import "../helpers/scripts.ftl" as scripts> <@scripts.scripts/> diff --git a/BudgetMasterServer/src/main/resources/templates/search/searchMacros.ftl b/BudgetMasterServer/src/main/resources/templates/search/searchMacros.ftl index 3c011ca274a65c9bac0ab434f78377b5a07efb35..caf7c3f5705c4fa46584063c2a85328ca0de144c 100644 --- a/BudgetMasterServer/src/main/resources/templates/search/searchMacros.ftl +++ b/BudgetMasterServer/src/main/resources/templates/search/searchMacros.ftl @@ -3,19 +3,19 @@ <#macro searchTextAndButton search> <div class="row no-margin-bottom valign-wrapper"> - <div class="col s10 m7 offset-m1 l6 offset-l2"> + <div class="col s10 m6 offset-m2 l5 offset-l3"> <div class="input-field"> <input id="searchText" type="text" name="searchText" value="${search.getSearchText()}"> <label for="searchText">${locale.getString("search")}</label> </div> </div> - <div class="col s2 m3 l4"> + <div class="col s2 m4 l4"> <div class="hide-on-small-only"> - <@header.buttonSubmit name='action' icon='search' localizationKey='search.submit' id='button-save-account'/> + <@header.buttonSubmit name='action' icon='search' localizationKey='search.submit' id='button-perform-search'/> </div> <div class="hide-on-med-and-up"> - <@header.buttonSubmit name='action' icon='search' localizationKey='' id='button-save-account'/> + <@header.buttonSubmit name='action' icon='search' localizationKey='' id='button-perform-search'/> </div> </div> </div> @@ -66,6 +66,48 @@ </div> </#macro> +<#macro dateRange search> + <div class="row"> + <div class="input-field col s6 m4 offset-m2 l3 offset-l3"> + <#if search.getStartDate()??> + <#assign startDate = dateService.getLongDateString(search.getStartDate())/> + <script> + startDate = "${startDate}".split("."); + startDate = new Date(startDate[2], startDate[1] - 1, startDate[0]); + </script> + <#else> + <#assign startDate = ''/> + <script> + startDate = null; + </script> + </#if> + + <i class="material-icons prefix">today</i> + <input id="search-datepicker" type="text" class="datepicker" name="startDate" value="${startDate}"> + <label for="search-datepicker">${locale.getString("chart.steps.second.label.start")}</label> + </div> + + <div class="input-field col s6 m4 l3"> + <#if search.getEndDate()??> + <#assign endDate = dateService.getLongDateString(search.getEndDate())/> + <script> + endDate = "${endDate}".split("."); + endDate = new Date(endDate[2], endDate[1] - 1, endDate[0]); + </script> + <#else> + <#assign endDate = ''/> + <script> + endDate = null; + </script> + </#if> + + <i class="material-icons prefix">event</i> + <input id="search-datepicker-end" type="text" class="datepicker" name="endDate" value="${endDate}"> + <label for="search-datepicker-end">${locale.getString("chart.steps.second.label.end")}</label> + </div> + </div> +</#macro> + <#macro pagination page position> <div class="row pagination-position-${position}"> <div class="col s12 center-align">