From dbd5fb71e2fb21afebffb162e7e9827b843fc03c Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 19 Jul 2019 21:42:09 +0200
Subject: [PATCH] Fixed #435 - added quick date ranges

---
 pom.xml                                       |  6 +++
 src/main/resources/languages/_de.properties   |  8 +++
 src/main/resources/languages/_en.properties   |  8 +++
 src/main/resources/static/css/charts.css      | 14 ++++++
 src/main/resources/static/css/dark/charts.css | 14 ++++++
 src/main/resources/static/css/dark/style.css  |  4 --
 src/main/resources/static/css/style.css       |  4 --
 src/main/resources/static/js/charts.js        | 50 +++++++++++++++++++
 .../resources/templates/charts/charts.ftl     | 26 ++++++++--
 9 files changed, 123 insertions(+), 11 deletions(-)
 create mode 100644 src/main/resources/static/css/charts.css
 create mode 100644 src/main/resources/static/css/dark/charts.css

diff --git a/pom.xml b/pom.xml
index 44873d0b8..9ac628a38 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,6 +65,7 @@
         <sortablejs.version>1.8.1</sortablejs.version>
         <mousetrap.version>1.6.1</mousetrap.version>
         <plotly.version>1.48.3</plotly.version>
+        <moment.version>2.24.0</moment.version>
         <webdrivermanager.version>2.2.1</webdrivermanager.version>
         <selenium.version>3.141.59</selenium.version>
 
@@ -195,6 +196,11 @@
             <artifactId>plotly.js</artifactId>
             <version>${plotly.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>momentjs</artifactId>
+            <version>${moment.version}</version>
+        </dependency>
 
         <!-- selenium -->
         <dependency>
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index ea30e4fbe..9763ddd2e 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -349,6 +349,14 @@ chart.steps.second.label.end=Enddatum
 chart.steps.third.step=Schritt 3:
 chart.steps.third=Wende Filter an (optional)
 
+chart.quick.this.week=Diese Woche
+chart.quick.this.month=Diesen Monat
+chart.quick.this.year=Dieses Jahr
+
+chart.quick.last.week.days=Letzte 7 Tage
+chart.quick.last.month.days=Letzte 30 Tage
+chart.quick.last.year.days=Letzte 365 Tage
+
 chart.script.default=/* This list will be dynamically filled with all the transactions between\n \
 * the start and and date you select on the "Show Chart" page\n \
 * and filtered according to your specified filter.\n \
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index ae218ba7a..e23664365 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -348,6 +348,14 @@ chart.steps.second.label.end=End date
 chart.steps.third.step=Step 3:
 chart.steps.third=Apply filters (optional)
 
+chart.quick.this.week=This week
+chart.quick.this.month=This month
+chart.quick.this.year=This 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
+
 chart.script.default=/* This list will be dynamically filled with all the transactions between\n \
 * the start and and date you select on the "Show Chart" page\n \
 * and filtered according to your specified filter.\n \
diff --git a/src/main/resources/static/css/charts.css b/src/main/resources/static/css/charts.css
new file mode 100644
index 000000000..4351b0893
--- /dev/null
+++ b/src/main/resources/static/css/charts.css
@@ -0,0 +1,14 @@
+.step-name {
+    margin-left: 1em;
+}
+
+.quick-date {
+    color: #039be5;
+    text-align: center;
+    padding: 0 0 10px 0;
+}
+
+.quick-date:hover {
+    cursor: pointer;
+    text-decoration: underline #2E79B9;
+}
\ No newline at end of file
diff --git a/src/main/resources/static/css/dark/charts.css b/src/main/resources/static/css/dark/charts.css
new file mode 100644
index 000000000..4351b0893
--- /dev/null
+++ b/src/main/resources/static/css/dark/charts.css
@@ -0,0 +1,14 @@
+.step-name {
+    margin-left: 1em;
+}
+
+.quick-date {
+    color: #039be5;
+    text-align: center;
+    padding: 0 0 10px 0;
+}
+
+.quick-date:hover {
+    cursor: pointer;
+    text-decoration: underline #2E79B9;
+}
\ No newline at end of file
diff --git a/src/main/resources/static/css/dark/style.css b/src/main/resources/static/css/dark/style.css
index ec82a98c7..66d6a0448 100644
--- a/src/main/resources/static/css/dark/style.css
+++ b/src/main/resources/static/css/dark/style.css
@@ -581,10 +581,6 @@ input[type="radio"]:not(:checked) + span::before, [type="radio"]:not(:checked) +
     margin-bottom: 20px;
 }
 
-.step-name {
-    margin-left: 1em;
-}
-
 .invisible {
     opacity: 0;
 }
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index 8d100ec79..aa697a2ae 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -503,10 +503,6 @@ input[type="radio"]:checked + span::after, [type="radio"].with-gap:checked + spa
     margin-bottom: 20px;
 }
 
-.step-name {
-    margin-left: 1em;
-}
-
 .invisible {
     opacity: 0;
 }
diff --git a/src/main/resources/static/js/charts.js b/src/main/resources/static/js/charts.js
index 82594404a..9f4035c9a 100644
--- a/src/main/resources/static/js/charts.js
+++ b/src/main/resources/static/js/charts.js
@@ -102,6 +102,11 @@ $( document ).ready(function() {
         resetFilter();
         applyFilter(modalFilter);
     });
+
+    $(".quick-date").click(function()
+    {
+        handleQuickDate(this, pickerStartDate, pickerEndDate);
+    });
 });
 
 function applyFilter(modal)
@@ -135,4 +140,49 @@ function resetFilter()
 {
     $("#filterSettings input[type=checkbox]").prop('checked', true);
     $("#filter-name").val('');
+}
+
+function handleQuickDate(element, pickerStartDate, pickerEndDate)
+{
+    var quickType = element.dataset.quick;
+    var startDate;
+    var endDate;
+
+    switch(quickType) {
+        case '0':
+            startDate = moment().startOf('isoWeek');
+            endDate = moment().endOf('isoWeek');
+            break;
+        case '1':
+            startDate = moment().startOf('month');
+            endDate = moment().endOf('month');
+            break;
+        case '2':
+            startDate = moment().startOf('year');
+            endDate = moment().endOf('year');
+            break;
+        case '3':
+            startDate = moment().subtract(7, 'days');
+            endDate = moment();
+            break;
+        case '4':
+            startDate = moment().subtract(30, 'days');
+            endDate = moment();
+            break;
+        case '5':
+            startDate = moment().subtract(365, 'days');
+            endDate = moment();
+            break;
+    }
+
+    setDateRange(startDate, endDate, pickerStartDate, pickerEndDate);
+}
+
+function setDateRange(startDate, endDate, pickerStartDate, pickerEndDate)
+{
+    pickerStartDate.setDate(startDate.toDate());
+    pickerStartDate.setInputValue();
+
+    pickerEndDate.setDate(endDate.toDate());
+    pickerEndDate.setInputValue();
 }
\ 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 4a6b699ca..d307a78a1 100644
--- a/src/main/resources/templates/charts/charts.ftl
+++ b/src/main/resources/templates/charts/charts.ftl
@@ -4,6 +4,7 @@
         <@header.header "BudgetMaster"/>
         <@header.style "datepicker"/>
         <@header.style "filter"/>
+        <@header.style "charts"/>
         <#import "/spring.ftl" as s>
     </head>
     <body class="budgetmaster-blue-light">
@@ -39,7 +40,7 @@
                                             <span class="step-name">${locale.getString("chart.steps.first")}</span>
                                         </div>
                                         <div class="collapsible-body">
-                                            <div class="row">
+                                            <div class="row no-margin-bottom">
                                                 <div class="input-field col s12 m12 l8 offset-l2 no-margin-top">
                                                     <select name="chartID">
                                                         <#list charts as chart>
@@ -64,7 +65,7 @@
                                             <span class="step-name">${locale.getString("chart.steps.second")}</span>
                                         </div>
                                         <div class="collapsible-body">
-                                            <div class="row">
+                                            <div class="row no-margin-bottom">
                                                 <div class="input-field col s6 m6 l4 offset-l2">
                                                     <#assign startDate = dateService.getLongDateString(chartSettings.getStartDate())/>
 
@@ -79,6 +80,24 @@
                                                     <label for="chart-datepicker-end">${locale.getString("chart.steps.second.label.end")}</label>
                                                 </div>
                                             </div>
+                                            <div class="row no-margin-bottom">
+                                                <div class="col s12 m12 l8 offset-l2 no-margin-top">
+                                                    <table class="no-border-table">
+                                                        <tr>
+                                                            <td class="quick-date" data-quick="0">${locale.getString("chart.quick.this.week")}</td>
+                                                            <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>
+                                                        </tr>
+                                                        <tr>
+                                                            <td class="quick-date" data-quick="3">${locale.getString("chart.quick.last.week.days")}</td>
+                                                            <td class="quick-date" data-quick="4">${locale.getString("chart.quick.last.month.days")}</td>
+                                                            <td class="quick-date" data-quick="5">${locale.getString("chart.quick.last.year.days")}</td>
+                                                        </tr>
+                                                    </table>
+                                                </div>
+                                                <div class="col s12 m12 l8 offset-l2 no-margin-top quick-date-container">
+                                                </div>
+                                            </div>
 
                                             <script>
                                                 startDate = "${startDate}".split(".");
@@ -96,7 +115,7 @@
                                             <span class="step-name">${locale.getString("chart.steps.third")}</span>
                                         </div>
                                         <div class="collapsible-body">
-                                            <div class="row">
+                                            <div class="row no-margin-bottom">
                                                 <div class="col s12 m12 l8 offset-l2 no-margin-top center-align">
                                                     <@transactionsMacros.buttonFilter chartSettings.getFilterConfiguration().isActive()/>
                                                 </div>
@@ -138,6 +157,7 @@
         <#import "../helpers/scripts.ftl" as scripts>
         <@scripts.scripts/>
         <script src="<@s.url '/webjars/plotly/1.48.3/dist/plotly.min.js'/>"></script>
+        <script src="<@s.url '/webjars/momentjs/2.24.0/min/moment.min.js'/>"></script>
         <script src="<@s.url '/js/charts.js'/>"></script>
         <script src="<@s.url '/js/filter.js'/>"></script>
 
-- 
GitLab