diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java b/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java index d0832eeee764b025b3ae4f7b125bd2c476119763..4f96ea1fe712ab19107c5c37da78107ab2b11872 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java +++ b/src/main/java/de/deadlocker8/budgetmaster/charts/Chart.java @@ -2,7 +2,9 @@ package de.deadlocker8.budgetmaster.charts; import com.google.gson.annotations.Expose; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.util.Objects; @@ -27,14 +29,16 @@ public class Chart private int version; private ChartDisplayType displayType; + private ChartGroupType groupType; - public Chart(String name, String script, ChartType type, int version, ChartDisplayType displayType) + public Chart(String name, String script, ChartType type, int version, ChartDisplayType displayType, ChartGroupType groupType) { this.name = name; this.script = script; this.type = type; this.version = version; this.displayType = displayType; + this.groupType = groupType; } public Chart() @@ -101,6 +105,16 @@ public class Chart this.displayType = displayType; } + public ChartGroupType getGroupType() + { + return groupType; + } + + public void setGroupType(ChartGroupType chartGroupType) + { + this.groupType = chartGroupType; + } + @Override public String toString() { @@ -111,6 +125,7 @@ public class Chart ", type=" + type + ", version=" + version + ", displayType=" + displayType + + ", chartGroupType=" + groupType + '}'; } @@ -120,12 +135,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; + 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; } @Override public int hashCode() { - return Objects.hash(ID, name, script, type, version, displayType); + return Objects.hash(ID, name, script, type, version, displayType, groupType); } } \ No newline at end of file diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java index e2e8b06a66b061d49c033bb54398bd3b628e2fa3..5618486561500bb2d5d9ce8b26f9693327c3e7d4 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java @@ -124,15 +124,9 @@ public class ChartController extends BaseController ChartValidator userValidator = new ChartValidator(); userValidator.validate(chart, bindingResult); - if(chart.getType() == null) - { - chart.setType(ChartType.CUSTOM); - } - - if(chart.getDisplayType() == null) - { - chart.setDisplayType(ChartDisplayType.CUSTOM); - } + chart.setType(ChartType.CUSTOM); + chart.setDisplayType(ChartDisplayType.CUSTOM); + chart.setGroupType(ChartGroupType.NONE); if(bindingResult.hasErrors()) { diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartGroupType.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartGroupType.java new file mode 100644 index 0000000000000000000000000000000000000000..578f173c3f098b9f0899cd2abceb63e88ec0f8aa --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartGroupType.java @@ -0,0 +1,8 @@ +package de.deadlocker8.budgetmaster.charts; + +public enum ChartGroupType +{ + NONE, + MONTH, + YEAR +} diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java index b1431f9729d11a3598801f2b6c834b87bcf74e62..e479e0f2b2bfc1ebf5952330148c728ed57602da 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java +++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartService.java @@ -72,6 +72,7 @@ public class ChartService implements Resettable, AccessAllEntities<Chart> currentChart.setVersion(chart.getVersion()); currentChart.setScript(chart.getScript()); currentChart.setDisplayType(chart.getDisplayType()); + currentChart.setGroupType(chart.getGroupType()); chartRepository.save(currentChart); } } @@ -89,6 +90,13 @@ public class ChartService implements Resettable, AccessAllEntities<Chart> } private void updateUserCharts() + { + updateContainerIdUsage(); + + updateMissingAttributes(); + } + + private void updateContainerIdUsage() { final List<Chart> userCharts = getRepository().findAllByType(ChartType.CUSTOM); for(Chart userChart : userCharts) @@ -96,7 +104,7 @@ public class ChartService implements Resettable, AccessAllEntities<Chart> String script = userChart.getScript(); if(script.contains(PATTERN_OLD_CONTAINER_ID)) { - LOGGER.debug(MessageFormat.format("Updating user chart ''{0}'' with ID {1}", userChart.getName(), userChart.getID())); + LOGGER.debug(MessageFormat.format("Updating container id usage for user chart ''{0}'' with ID {1}", userChart.getName(), userChart.getID())); script = script.replace(PATTERN_OLD_CONTAINER_ID, PATTERN_DYNAMIC_CONTAINER_ID); userChart.setScript(script); getRepository().save(userChart); @@ -104,6 +112,31 @@ public class ChartService implements Resettable, AccessAllEntities<Chart> } } + private void updateMissingAttributes() + { + final List<Chart> userCharts = getRepository().findAllByType(ChartType.CUSTOM); + for(Chart userChart : userCharts) + { + boolean changed = false; + if(userChart.getDisplayType() == null) + { + userChart.setDisplayType(ChartDisplayType.CUSTOM); + changed = true; + } + if(userChart.getGroupType() == null) + { + userChart.setGroupType(ChartGroupType.NONE); + changed = true; + } + + if(changed) + { + LOGGER.debug(MessageFormat.format("Updating missing attributes for user chart ''{0}'' with ID {1}", userChart.getName(), userChart.getID())); + getRepository().save(userChart); + } + } + } + @Override public List<Chart> getAllEntitiesAsc() { diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java index e7b357f008c2683b4b0db31f3f5462a3853e1a19..40838aa2e87cfcd566714078817f8f5ad0219a68 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); + ChartType.CUSTOM, -1, ChartDisplayType.CUSTOM, ChartGroupType.NONE); private static final Chart CHART_ACCOUNT_SUM_PER_DAY = new Chart("charts.default.accountSumPerDay", getChartFromFile("charts/AccountSumPerDay.js"), - ChartType.DEFAULT, 8, ChartDisplayType.LINE); + ChartType.DEFAULT, 10, ChartDisplayType.LINE, ChartGroupType.NONE); private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BAR = new Chart("charts.default.incomesAndExpendituresPerMonthBar", getChartFromFile("charts/IncomesAndExpendituresPerMonthBar.js"), - ChartType.DEFAULT, 8, ChartDisplayType.BAR); + ChartType.DEFAULT, 10, ChartDisplayType.BAR, ChartGroupType.MONTH); private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_LINE = new Chart("charts.default.incomesAndExpendituresPerMonthLine", getChartFromFile("charts/IncomesAndExpendituresPerMonthLine.js"), - ChartType.DEFAULT, 8, ChartDisplayType.LINE); + ChartType.DEFAULT, 10, ChartDisplayType.LINE, ChartGroupType.MONTH); private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_BAR = new Chart("charts.default.incomesAndExpendituresByCategoryBar", getChartFromFile("charts/IncomesAndExpendituresByCategoryBar.js"), - ChartType.DEFAULT, 3, ChartDisplayType.BAR); + ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.NONE); private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_PIE = new Chart("charts.default.incomesAndExpendituresByCategoryPie", getChartFromFile("charts/IncomesAndExpendituresByCategoryPie.js"), - ChartType.DEFAULT, 4, ChartDisplayType.PIE); + ChartType.DEFAULT, 6, ChartDisplayType.PIE, ChartGroupType.NONE); private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BY_CATEGORIES = new Chart("charts.default.incomesAndExpendituresPerMonthByCategories", getChartFromFile("charts/IncomesAndExpendituresPerMonthByCategories.js"), - ChartType.DEFAULT, 18, ChartDisplayType.BAR); + ChartType.DEFAULT, 20, ChartDisplayType.BAR, ChartGroupType.MONTH); private static final Chart CHART_REST_PER_MONTH = new Chart("charts.default.restPerMonth", getChartFromFile("charts/RestPerMonth.js"), - ChartType.DEFAULT, 4, ChartDisplayType.BAR); + ChartType.DEFAULT, 6, ChartDisplayType.BAR, ChartGroupType.MONTH); private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_YEAR_BAR = new Chart("charts.default.incomesAndExpendituresPerYearBar", getChartFromFile("charts/IncomesAndExpendituresPerYearBar.js"), - ChartType.DEFAULT, 3, ChartDisplayType.BAR); + ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.YEAR); private DefaultCharts() { diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java index a2dddcfa40202cd0dc5c544f64b7b69d21b91841..fb0bf54e3d008979d0b0ce76675747e9cd6b585d 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java +++ b/src/main/java/de/deadlocker8/budgetmaster/database/model/converter/ChartConverter.java @@ -2,6 +2,7 @@ package de.deadlocker8.budgetmaster.database.model.converter; import de.deadlocker8.budgetmaster.charts.Chart; import de.deadlocker8.budgetmaster.charts.ChartDisplayType; +import de.deadlocker8.budgetmaster.charts.ChartGroupType; import de.deadlocker8.budgetmaster.database.model.Converter; import de.deadlocker8.budgetmaster.database.model.v5.BackupChart_v5; @@ -21,6 +22,7 @@ public class ChartConverter implements Converter<Chart, BackupChart_v5> chart.setVersion(backupChart.getVersion()); chart.setScript(backupChart.getScript()); chart.setDisplayType(ChartDisplayType.CUSTOM); + chart.setGroupType(ChartGroupType.NONE); return chart; } diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java index b3bfee969ceffcb3b45a6143b20c450741e77b70..6174a6655790f4e05ca3987f6fbf748720aa9a4d 100644 --- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java +++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseExportTest.java @@ -242,6 +242,7 @@ class DatabaseExportTest chart.setVersion(7); chart.setScript("/* 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"); chart.setDisplayType(ChartDisplayType.CUSTOM); + chart.setGroupType(ChartGroupType.NONE); ChartRepository chartRepositoryMock = Mockito.mock(ChartRepository.class); Mockito.when(chartRepositoryMock.findAllByType(Mockito.any())).thenReturn(List.of(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 532319e80c0660bb29891a8e31ecf4564f0f1644..e1d829406f91c839ac9d461469f588860c17c963 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 @@ -6,6 +6,7 @@ import de.deadlocker8.budgetmaster.categories.Category; import de.deadlocker8.budgetmaster.categories.CategoryType; import de.deadlocker8.budgetmaster.charts.Chart; import de.deadlocker8.budgetmaster.charts.ChartDisplayType; +import de.deadlocker8.budgetmaster.charts.ChartGroupType; import de.deadlocker8.budgetmaster.charts.ChartType; import de.deadlocker8.budgetmaster.database.DatabaseParser_v7; import de.deadlocker8.budgetmaster.database.InternalDatabase; @@ -67,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); + 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); chart.setID(9); assertThat(database.getCharts()).hasSize(1)