From b0c3404cc7bc6ffe420426f73fe9a5b0f075d94d Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Thu, 4 Mar 2021 21:26:45 +0100
Subject: [PATCH] Fixed #588 - added new quick date options for charts

---
 .../resources/languages/base_de.properties    |   5 +
 .../resources/languages/base_en.properties    |   5 +
 src/main/resources/static/js/charts.js        | 130 ++++++++++--------
 .../resources/templates/charts/charts.ftl     |  14 +-
 4 files changed, 94 insertions(+), 60 deletions(-)

diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties
index fbe6a7681..ccf34ad1d 100644
--- a/src/main/resources/languages/base_de.properties
+++ b/src/main/resources/languages/base_de.properties
@@ -498,6 +498,11 @@ chart.quick.this.month=Diesen Monat
 chart.quick.this.year=Dieses Jahr
 chart.quick.all=Alle
 
+chart.quick.last.week=Letzte Woche
+chart.quick.last.month=Letzter Monat
+chart.quick.last.year=Letztes Jahr
+chart.quick.until.endOfLastYear=Alle bis Ende letzten Jahres
+
 chart.quick.last.week.days=Letzte 7 Tage
 chart.quick.last.month.days=Letzte 30 Tage
 chart.quick.last.year.days=Letzte 365 Tage
diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties
index 7a4225d86..337825d40 100644
--- a/src/main/resources/languages/base_en.properties
+++ b/src/main/resources/languages/base_en.properties
@@ -496,6 +496,11 @@ chart.quick.this.month=This month
 chart.quick.this.year=This year
 chart.quick.all=All
 
+chart.quick.last.week=Last week
+chart.quick.last.month=Last month
+chart.quick.last.year=Last year
+chart.quick.until.endOfLastYear=Until end of last year
+
 chart.quick.last.week.days=Last 7 days
 chart.quick.last.month.days=Last 30 days
 chart.quick.last.year.days=Last 365 days
diff --git a/src/main/resources/static/js/charts.js b/src/main/resources/static/js/charts.js
index 7ee9a9503..d2103d41e 100644
--- a/src/main/resources/static/js/charts.js
+++ b/src/main/resources/static/js/charts.js
@@ -1,8 +1,9 @@
+let modalFilter;
+let chartPickerStartDate;
+let chartPickerEndDate;
+
 $(document).ready(function()
 {
-    let modalFilter;
-    let pickerStartDate;
-    let pickerEndDate;
 
     if($("#chart-script").length)
     {
@@ -26,7 +27,7 @@ $(document).ready(function()
 
     if($(".datepicker").length)
     {
-        pickerStartDate = M.Datepicker.init(document.getElementById('chart-datepicker'), {
+        chartPickerStartDate = M.Datepicker.init(document.getElementById('chart-datepicker'), {
             yearRange: 25,
             firstDay: 1,
             showClearBtn: false,
@@ -55,10 +56,11 @@ $(document).ready(function()
 
             onSelect: function()
             {
-                if(typeof pickerEndDate !== "undefined")
+                if(typeof chartPickerEndDate !== "undefined")
                 {
-                    pickerEndDate.destroy();
-                    pickerEndDate = createDatePickerEnd(this.date, pickerEndDate.date);
+                    let selectedDate = chartPickerEndDate.date;
+                    chartPickerEndDate.destroy();
+                    chartPickerEndDate = createDatePickerEnd(this.date, selectedDate);
                 }
             }
         });
@@ -66,45 +68,8 @@ $(document).ready(function()
         // picker end date
         if(typeof endDate !== "undefined")
         {
-            pickerEndDate = createDatePickerEnd(pickerStartDate.date, endDate);
-        }
-    }
-
-    function createDatePickerEnd(minDate, selectedDate)
-    {
-        if(selectedDate < minDate)
-        {
-            selectedDate = minDate;
+            chartPickerEndDate = createDatePickerEnd(chartPickerStartDate.date, endDate);
         }
-
-        return M.Datepicker.init(document.getElementById('chart-datepicker-end'), {
-            yearRange: 50,
-            firstDay: 1,
-            showClearBtn: false,
-            setDefaultDate: true,
-            minDate: minDate,
-            defaultDate: selectedDate,
-
-            i18n: {
-                // Strings and translations
-                months: monthNames,
-                monthsShort: monthNamesShort,
-                weekdays: weekDays,
-                weekdaysShort: weekDaysShort,
-                weekdaysAbbrev: weekDaysLetters,
-
-                // Buttons
-                done: buttonClose,
-
-                // Accessibility labels
-                labelMonthNext: '>',
-                labelMonthPrev: '<'
-            },
-
-            // Formats
-            format: 'dd.mm.yyyy',
-            formatSubmit: 'dd.mm.yyyy'
-        });
     }
 
     $(".filter-button-close").click(function()
@@ -120,10 +85,47 @@ $(document).ready(function()
 
     $(".quick-date").click(function()
     {
-        handleQuickDate(this, pickerStartDate, pickerEndDate);
+        handleQuickDate(this);
     });
 });
 
+function createDatePickerEnd(minDate, selectedDate)
+{
+    if(selectedDate < minDate)
+    {
+        selectedDate = minDate;
+    }
+
+    return M.Datepicker.init(document.getElementById('chart-datepicker-end'), {
+        yearRange: 50,
+        firstDay: 1,
+        showClearBtn: false,
+        setDefaultDate: true,
+        minDate: minDate,
+        defaultDate: selectedDate,
+
+        i18n: {
+            // Strings and translations
+            months: monthNames,
+            monthsShort: monthNamesShort,
+            weekdays: weekDays,
+            weekdaysShort: weekDaysShort,
+            weekdaysAbbrev: weekDaysLetters,
+
+            // Buttons
+            done: buttonClose,
+
+            // Accessibility labels
+            labelMonthNext: '>',
+            labelMonthPrev: '<'
+        },
+
+        // Formats
+        format: 'dd.mm.yyyy',
+        formatSubmit: 'dd.mm.yyyy'
+    });
+}
+
 function applyFilter(modal)
 {
     let filterButton = document.getElementById("modalFilterTrigger");
@@ -156,7 +158,7 @@ function resetFilter()
     $("#filter-name").val('');
 }
 
-function handleQuickDate(element, pickerStartDate, pickerEndDate)
+function handleQuickDate(element)
 {
     let quickType = element.dataset.quick;
     let startDate;
@@ -181,31 +183,47 @@ function handleQuickDate(element, pickerStartDate, pickerEndDate)
             endDate = moment("2100-01-01");
             break;
         case '4':
+            startDate = moment().subtract(1,'weeks').startOf('isoWeek');
+            endDate = moment().subtract(1,'weeks').endOf('isoWeek');
+            break;
+        case '5':
+            startDate = moment().subtract(1,'months').startOf('month');
+            endDate = moment().subtract(1,'months').endOf('month');
+            break;
+        case '6':
+            startDate = moment().subtract(1,'years').startOf('year');
+            endDate = moment().subtract(1,'years').endOf('year');
+            break;
+        case '7':
+            startDate = moment("2000-01-01");
+            endDate = moment().subtract(1, 'years').endOf('year');
+            break;
+        case '8':
             startDate = moment().subtract(7, 'days');
             endDate = moment();
             break;
-        case '5':
+        case '9':
             startDate = moment().subtract(30, 'days');
             endDate = moment();
             break;
-        case '6':
+        case '10':
             startDate = moment().subtract(365, 'days');
             endDate = moment();
             break;
-        case '7':
+        case '11':
             startDate = moment("2000-01-01");
             endDate = moment();
             break;
     }
 
-    setDateRange(startDate, endDate, pickerStartDate, pickerEndDate);
+    setDateRange(startDate, endDate);
 }
 
-function setDateRange(startDate, endDate, pickerStartDate, pickerEndDate)
+function setDateRange(startDate, endDate)
 {
-    pickerStartDate.setDate(startDate.toDate());
-    pickerStartDate.setInputValue();
+    chartPickerStartDate.setDate(startDate.startOf('day').toDate());
+    chartPickerStartDate.setInputValue();
 
-    pickerEndDate.setDate(endDate.toDate());
-    pickerEndDate.setInputValue();
+    chartPickerEndDate.destroy();
+    chartPickerEndDate = createDatePickerEnd(chartPickerStartDate.date, endDate.startOf('day').toDate());
 }
\ No newline at end of file
diff --git a/src/main/resources/templates/charts/charts.ftl b/src/main/resources/templates/charts/charts.ftl
index 85ccd72fa..07611e2ea 100644
--- a/src/main/resources/templates/charts/charts.ftl
+++ b/src/main/resources/templates/charts/charts.ftl
@@ -160,12 +160,18 @@
                                 <td class="quick-date" data-quick="1">${locale.getString("chart.quick.this.month")}</td>
                                 <td class="quick-date" data-quick="2">${locale.getString("chart.quick.this.year")}</td>
                                 <td class="quick-date" data-quick="3">${locale.getString("chart.quick.all")}</td>
+                            </tr>
+                             <tr>
+                                <td class="quick-date" data-quick="4">${locale.getString("chart.quick.last.week")}</td>
+                                <td class="quick-date" data-quick="5">${locale.getString("chart.quick.last.month")}</td>
+                                <td class="quick-date" data-quick="6">${locale.getString("chart.quick.last.year")}</td>
+                                <td class="quick-date" data-quick="7">${locale.getString("chart.quick.until.endOfLastYear")}</td>
                             </tr>
                             <tr>
-                                <td class="quick-date" data-quick="4">${locale.getString("chart.quick.last.week.days")}</td>
-                                <td class="quick-date" data-quick="5">${locale.getString("chart.quick.last.month.days")}</td>
-                                <td class="quick-date" data-quick="6">${locale.getString("chart.quick.last.year.days")}</td>
-                                <td class="quick-date" data-quick="7">${locale.getString("chart.quick.until.today")}</td>
+                                <td class="quick-date" data-quick="8">${locale.getString("chart.quick.last.week.days")}</td>
+                                <td class="quick-date" data-quick="9">${locale.getString("chart.quick.last.month.days")}</td>
+                                <td class="quick-date" data-quick="10">${locale.getString("chart.quick.last.year.days")}</td>
+                                <td class="quick-date" data-quick="11">${locale.getString("chart.quick.until.today")}</td>
                             </tr>
                         </table>
                     </div>
-- 
GitLab