From 151cce2578e0e6ef6c12215aa08c15bd06802387 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 18 Jul 2021 11:42:59 +0200
Subject: [PATCH] #585 - load images for each chart

---
 .../budgetmaster/charts/Chart.java            | 19 ++++++++++++++++---
 .../budgetmaster/charts/ChartService.java     |  1 +
 .../budgetmaster/charts/DefaultCharts.java    | 18 +++++++++---------
 .../resources/templates/charts/charts.ftl     |  2 +-
 ...tabaseParser_v7_convertToInternalTest.java |  2 +-
 5 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java b/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java
index 4f96ea1fe..45362237f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java
@@ -30,8 +30,9 @@ public class Chart
 
 	private ChartDisplayType displayType;
 	private ChartGroupType groupType;
+	private String previewImageFileName;
 
-	public Chart(String name, String script, ChartType type, int version, ChartDisplayType displayType, ChartGroupType groupType)
+	public Chart(String name, String script, ChartType type, int version, ChartDisplayType displayType, ChartGroupType groupType, String previewImageFileName)
 	{
 		this.name = name;
 		this.script = script;
@@ -39,6 +40,7 @@ public class Chart
 		this.version = version;
 		this.displayType = displayType;
 		this.groupType = groupType;
+		this.previewImageFileName = previewImageFileName;
 	}
 
 	public Chart()
@@ -115,6 +117,16 @@ public class Chart
 		this.groupType = chartGroupType;
 	}
 
+	public String getPreviewImageFileName()
+	{
+		return previewImageFileName;
+	}
+
+	public void setPreviewImageFileName(String previewImageFileName)
+	{
+		this.previewImageFileName = previewImageFileName;
+	}
+
 	@Override
 	public String toString()
 	{
@@ -126,6 +138,7 @@ public class Chart
 				", version=" + version +
 				", displayType=" + displayType +
 				", chartGroupType=" + groupType +
+				", previewImageFileName=" + previewImageFileName +
 				'}';
 	}
 
@@ -135,12 +148,12 @@ public class Chart
 		if(this == o) return true;
 		if(o == null || getClass() != o.getClass()) return false;
 		Chart chart = (Chart) o;
-		return version == chart.version && Objects.equals(ID, chart.ID) && Objects.equals(name, chart.name) && Objects.equals(script, chart.script) && type == chart.type && displayType == chart.displayType && groupType == chart.groupType;
+		return version == chart.version && Objects.equals(ID, chart.ID) && Objects.equals(name, chart.name) && Objects.equals(script, chart.script) && type == chart.type && displayType == chart.displayType && groupType == chart.groupType && Objects.equals(previewImageFileName, chart.previewImageFileName);
 	}
 
 	@Override
 	public int hashCode()
 	{
-		return Objects.hash(ID, name, script, type, version, displayType, groupType);
+		return Objects.hash(ID, name, script, type, version, displayType, groupType, previewImageFileName);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java
index e479e0f2b..b0beea706 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java
@@ -73,6 +73,7 @@ public class ChartService implements Resettable, AccessAllEntities<Chart>
 				currentChart.setScript(chart.getScript());
 				currentChart.setDisplayType(chart.getDisplayType());
 				currentChart.setGroupType(chart.getGroupType());
+				currentChart.setPreviewImageFileName(chart.getPreviewImageFileName());
 				chartRepository.save(currentChart);
 			}
 		}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
index 40838aa2e..d5852eee9 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
@@ -16,39 +16,39 @@ public class DefaultCharts
 
 	public static final Chart CHART_DEFAULT = new Chart(null,
 			getChartFromFile("charts/Default.js"),
-			ChartType.CUSTOM, -1, ChartDisplayType.CUSTOM, ChartGroupType.NONE);
+			ChartType.CUSTOM, -1, ChartDisplayType.CUSTOM, ChartGroupType.NONE, null);
 
 	private static final Chart CHART_ACCOUNT_SUM_PER_DAY = new Chart("charts.default.accountSumPerDay",
 			getChartFromFile("charts/AccountSumPerDay.js"),
-			ChartType.DEFAULT, 10, ChartDisplayType.LINE, ChartGroupType.NONE);
+			ChartType.DEFAULT, 11, ChartDisplayType.LINE, ChartGroupType.NONE, "accountSumPerDay.png");
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BAR = new Chart("charts.default.incomesAndExpendituresPerMonthBar",
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthBar.js"),
-			ChartType.DEFAULT, 10, ChartDisplayType.BAR, ChartGroupType.MONTH);
+			ChartType.DEFAULT, 11, ChartDisplayType.BAR, ChartGroupType.MONTH, "incomesAndExpendituresPerMonthBar.png");
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_LINE = new Chart("charts.default.incomesAndExpendituresPerMonthLine",
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthLine.js"),
-			ChartType.DEFAULT, 10, ChartDisplayType.LINE, ChartGroupType.MONTH);
+			ChartType.DEFAULT, 11, ChartDisplayType.LINE, ChartGroupType.MONTH, "incomesAndExpendituresPerMonthLine.png");
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_BAR = new Chart("charts.default.incomesAndExpendituresByCategoryBar",
 			getChartFromFile("charts/IncomesAndExpendituresByCategoryBar.js"),
-			ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.NONE);
+			ChartType.DEFAULT, 6, ChartDisplayType.BAR, ChartGroupType.NONE, "incomesAndExpendituresByCategoryBar.png");
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_PIE = new Chart("charts.default.incomesAndExpendituresByCategoryPie",
 			getChartFromFile("charts/IncomesAndExpendituresByCategoryPie.js"),
-			ChartType.DEFAULT, 6, ChartDisplayType.PIE, ChartGroupType.NONE);
+			ChartType.DEFAULT, 7, ChartDisplayType.PIE, ChartGroupType.NONE, "incomesAndExpendituresByCategoryPie.png");
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BY_CATEGORIES = new Chart("charts.default.incomesAndExpendituresPerMonthByCategories",
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthByCategories.js"),
-			ChartType.DEFAULT, 20, ChartDisplayType.BAR, ChartGroupType.MONTH);
+			ChartType.DEFAULT, 21, ChartDisplayType.BAR, ChartGroupType.MONTH, "incomesAndExpendituresPerMonthByCategories.png");
 
 	private static final Chart CHART_REST_PER_MONTH = new Chart("charts.default.restPerMonth",
 			getChartFromFile("charts/RestPerMonth.js"),
-			ChartType.DEFAULT, 6, ChartDisplayType.BAR, ChartGroupType.MONTH);
+			ChartType.DEFAULT, 7, ChartDisplayType.BAR, ChartGroupType.MONTH, "restPerMonth.png");
 
 	private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_YEAR_BAR = new Chart("charts.default.incomesAndExpendituresPerYearBar",
 			getChartFromFile("charts/IncomesAndExpendituresPerYearBar.js"),
-			ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.YEAR);
+			ChartType.DEFAULT, 6, ChartDisplayType.BAR, ChartGroupType.YEAR, "incomesAndExpendituresPerYearBar.png");
 
 	private DefaultCharts()
 	{
diff --git a/src/main/resources/templates/charts/charts.ftl b/src/main/resources/templates/charts/charts.ftl
index d3ea2db82..429c9b71f 100644
--- a/src/main/resources/templates/charts/charts.ftl
+++ b/src/main/resources/templates/charts/charts.ftl
@@ -296,7 +296,7 @@
     <div class="col s6 m4 l3 center-align">
         <div class="card chart-preview background-grey-dark">
             <div class="card-image">
-                <img src="<@s.url '/images/charts/a.png'/>">
+                <img src="<@s.url '/images/charts/' + chart.getPreviewImageFileName()!"placeholder.png"/>">
             </div>
             <div class="card-action bold">
                 ${chartFunctions.getChartName(chart)}
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java
index e1d829406..f322b7938 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseParser_v7_convertToInternalTest.java
@@ -68,7 +68,7 @@ class DatabaseParser_v7_convertToInternalTest
 			DatabaseParser_v7 importer = new DatabaseParser_v7(json);
 			InternalDatabase database = importer.parseDatabaseFromJSON().convertToInternal();
 
-			final Chart chart = new Chart("The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7, ChartDisplayType.CUSTOM, ChartGroupType.NONE);
+			final Chart chart = new Chart("The best chart", "/* This list will be dynamically filled with all the transactions between\r\n* the start and and date you select on the \"Show Chart\" page\r\n* and filtered according to your specified filter.\r\n* An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:\r\n* https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts\r\n*/\r\nvar transactionData \u003d [];\r\n\r\n// Prepare your chart settings here (mandatory)\r\nvar plotlyData \u003d [{\r\n    x: [],\r\n    y: [],\r\n    type: \u0027bar\u0027\r\n}];\r\n\r\n// Add your Plotly layout settings here (optional)\r\nvar plotlyLayout \u003d {};\r\n\r\n// Add your Plotly configuration settings here (optional)\r\nvar plotlyConfig \u003d {\r\n    showSendToCloud: false,\r\n    displaylogo: false,\r\n    showLink: false,\r\n    responsive: true\r\n};\r\n\r\n// Don\u0027t touch this line\r\nPlotly.newPlot(\"containerID\", plotlyData, plotlyLayout, plotlyConfig);\r\n", ChartType.CUSTOM, 7, ChartDisplayType.CUSTOM, ChartGroupType.NONE, null);
 			chart.setID(9);
 
 			assertThat(database.getCharts()).hasSize(1)
-- 
GitLab