diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java index 969528dd3104741518b4a369dfa36acb50f905e5..f13b838495e3b4d21a88b2068db3450ad42c17a7 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java @@ -273,11 +273,20 @@ public class ChartController extends BaseController { String title; final String clickedCategory = chartSettings.getClickedCategory(); - if(clickedCategory == null) + if(chartSettings.getClickedAmountType() == null) + { + for(FilterObject filterCategory : chartSettings.getFilterConfiguration().getFilterCategories()) + { + filterCategory.setInclude(filterCategory.getName().equals(clickedCategory)); + } + + title = Localization.getString("chart.matching.transactions.title.category", clickedCategory); + } + else { if(chartSettings.getClickedAmountType() == ChartAmountType.INCOME) { - title = Localization.getString("titles.incomes"); + title = Localization.getString("title.incomes"); chartSettings.getFilterConfiguration().setIncludeIncome(true); chartSettings.getFilterConfiguration().setIncludeExpenditure(false); } @@ -288,15 +297,6 @@ public class ChartController extends BaseController chartSettings.getFilterConfiguration().setIncludeExpenditure(true); } } - else - { - for(FilterObject filterCategory : chartSettings.getFilterConfiguration().getFilterCategories()) - { - filterCategory.setInclude(filterCategory.getName().equals(clickedCategory)); - } - - title = Localization.getString("chart.matching.transactions.title.category", clickedCategory); - } final List<Transaction> transactions = transactionService.getTransactionsForAccount(helpers.getCurrentAccount(), chartSettings.getStartDate(), chartSettings.getEndDate(), chartSettings.getFilterConfiguration()); final List<Transaction> convertedTransactions = convertTransferAmounts(transactions); diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java index 53f935e1c1c4261cdd5983b621043c58a19f71de..b67257ca1ad15cacaaac229cd0b1c95c9499af77 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java @@ -24,7 +24,7 @@ public class DefaultCharts private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BAR = new Chart("charts.default.incomesAndExpendituresPerMonthBar", getChartFromFile("charts/IncomesAndExpendituresPerMonthBar.js"), - ChartType.DEFAULT, 12, ChartDisplayType.BAR, ChartGroupType.MONTH, "incomesAndExpendituresPerMonthBar.png"); + ChartType.DEFAULT, 13, 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"), @@ -36,11 +36,11 @@ public class DefaultCharts private static final Chart CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_PIE = new Chart("charts.default.incomesAndExpendituresByCategoryPie", getChartFromFile("charts/IncomesAndExpendituresByCategoryPie.js"), - ChartType.DEFAULT, 9, ChartDisplayType.PIE, ChartGroupType.NONE, "incomesAndExpendituresByCategoryPie.png"); + ChartType.DEFAULT, 12, 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, 24, ChartDisplayType.BAR, ChartGroupType.MONTH, "incomesAndExpendituresPerMonthByCategories.png"); + ChartType.DEFAULT, 25, ChartDisplayType.BAR, ChartGroupType.MONTH, "incomesAndExpendituresPerMonthByCategories.png"); private static final Chart CHART_REST_PER_MONTH = new Chart("charts.default.restPerMonth", getChartFromFile("charts/RestPerMonth.js"), @@ -48,23 +48,23 @@ public class DefaultCharts private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_YEAR_BAR = new Chart("charts.default.incomesAndExpendituresPerYearBar", getChartFromFile("charts/IncomesAndExpendituresPerYearBar.js"), - ChartType.DEFAULT, 7, ChartDisplayType.BAR, ChartGroupType.YEAR, "incomesAndExpendituresPerYearBar.png"); + ChartType.DEFAULT, 10, ChartDisplayType.BAR, ChartGroupType.YEAR, "incomesAndExpendituresPerYearBar.png"); private static final Chart CHART_INCOMES_AND_EXPENDITURES_PER_YEAR_BY_CATEGORIES = new Chart("charts.default.incomesAndExpendituresPerYearByCategories", getChartFromFile("charts/IncomesAndExpendituresPerYearByCategories.js"), - ChartType.DEFAULT, 4, ChartDisplayType.BAR, ChartGroupType.YEAR, "incomesAndExpendituresPerYearByCategories.png"); + ChartType.DEFAULT, 5, ChartDisplayType.BAR, ChartGroupType.YEAR, "incomesAndExpendituresPerYearByCategories.png"); private static final Chart CHART_AVERAGE_TRANSACTION_AMOUNT_PER_CATEGORY = new Chart("charts.default.averageTransactionAmountPerCategory", getChartFromFile("charts/AverageTransactionAmountPerCategoryBar.js"), - ChartType.DEFAULT, 10, ChartDisplayType.BAR, ChartGroupType.NONE, "averageTransactionAmountPerCategory.png"); + ChartType.DEFAULT, 11, ChartDisplayType.BAR, ChartGroupType.NONE, "averageTransactionAmountPerCategory.png"); private static final Chart CHART_AVERAGE_MONTHLY_INCOMES_AND_EXPENDITURES_PER_YEAR_BAR = new Chart("charts.default.averageMonthlyIncomesAndExpendituresPerYearBar", getChartFromFile("charts/AverageMonthlyIncomesAndExpendituresPerYearBar.js"), - ChartType.DEFAULT, 10, ChartDisplayType.BAR, ChartGroupType.YEAR, "averageMonthlyIncomesAndExpendituresPerYearBar.png"); + ChartType.DEFAULT, 12, ChartDisplayType.BAR, ChartGroupType.YEAR, "averageMonthlyIncomesAndExpendituresPerYearBar.png"); private static final Chart CHART_AVERAGE_MONTHLY_INCOMES_AND_EXPENDITURES_PER_CATEGORY_BAR = new Chart("charts.default.averageMonthlyIncomesAndExpendituresPerCategoryBar", getChartFromFile("charts/AverageMonthlyIncomesAndExpendituresPerCategoryBar.js"), - ChartType.DEFAULT, 2, ChartDisplayType.BAR, ChartGroupType.NONE, "averageMonthlyIncomesAndExpendituresPerCategoryBar.png"); + ChartType.DEFAULT, 8, ChartDisplayType.BAR, ChartGroupType.NONE, "averageMonthlyIncomesAndExpendituresPerCategoryBar.png"); private DefaultCharts() { diff --git a/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerCategoryBar.js b/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerCategoryBar.js index b09348d31f5737274a09f8eed84254f2d3b92e2a..e4652d88599477d88e2c704aef813e011452ac11 100644 --- a/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerCategoryBar.js +++ b/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerCategoryBar.js @@ -105,6 +105,27 @@ var plotlyConfig = { Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); +REGEX_CATGEORY_NAME = new RegExp("(.*)\\s-?\\d+.\\d\\s€"); + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let hoverText = data.points[index].hovertext; + let match = hoverText.match(REGEX_CATGEORY_NAME); + if(match === null) + { + console.error('could not extract category name from: "' + hoverText + '"'); + return; + } + + getAndShowMatchingTransactions(null, match[1]); +}); + function addDPlotlyData(plotlyData, averageValue, categoryName, color, showLegend) { // add border if category color is white diff --git a/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerYearBar.js b/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerYearBar.js index 47470435bcc0b8a9b1ff0b1d0808cf741277e7fb..dd149b1dc987b0778a13c55f633bac2607a46b74 100644 --- a/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerYearBar.js +++ b/BudgetMasterServer/src/main/resources/charts/AverageMonthlyIncomesAndExpendituresPerYearBar.js @@ -128,6 +128,25 @@ var plotlyConfig = { Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let amountTypeText = data.points[index].data.name; + + let amountType = 'EXPENDITURE'; + if(amountTypeText === localizedData['traceName1']) + { + amountType = 'INCOME'; + } + + getAndShowMatchingTransactions(amountType, null); +}); + function prepareHoverText(value) { return value.toFixed(1) + ' ' + localizedCurrency; diff --git a/BudgetMasterServer/src/main/resources/charts/AverageTransactionAmountPerCategoryBar.js b/BudgetMasterServer/src/main/resources/charts/AverageTransactionAmountPerCategoryBar.js index b604e7b75f1761beeeae1fa45829674284e33b9b..ac1f4718fe059f195e86171ae4339a774cf57eca 100644 --- a/BudgetMasterServer/src/main/resources/charts/AverageTransactionAmountPerCategoryBar.js +++ b/BudgetMasterServer/src/main/resources/charts/AverageTransactionAmountPerCategoryBar.js @@ -97,6 +97,27 @@ var plotlyConfig = { Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); +REGEX_CATGEORY_NAME = new RegExp("(.*)\\s-?\\d+.\\d\\s€"); + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let hoverText = data.points[index].hovertext; + let match = hoverText.match(REGEX_CATGEORY_NAME); + if(match === null) + { + console.error('could not extract category name from: "' + hoverText + '"'); + return; + } + + getAndShowMatchingTransactions(null, match[1]); +}); + function calculateAverage(values) { var sum = 0; diff --git a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresByCategoryPie.js b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresByCategoryPie.js index 66d12bb4818398989fbbac548a6fa7b5af66b94a..f8193d0ff4f5bd52d16159fb16efa55d9f9649c2 100644 --- a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresByCategoryPie.js +++ b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresByCategoryPie.js @@ -159,6 +159,19 @@ var plotlyConfig = { Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + getAndShowMatchingTransactions(null, data.points[index].label); +}); + + function addSeries(sumHandler, column) { var plotlyData = []; diff --git a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthBar.js b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthBar.js index b0f0a346b28255332a92fbc05abb5b850dbbf179..91515689cf2a6f47f28dc08bf05ad6e40c03db00 100644 --- a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthBar.js +++ b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthBar.js @@ -102,4 +102,23 @@ var plotlyConfig = { }; // Don't touch this line -Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); \ No newline at end of file +Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let amountTypeText = data.points[index].data.name; + + let amountType = 'EXPENDITURE'; + if(amountTypeText === localizedData['traceName1']) + { + amountType = 'INCOME'; + } + + getAndShowMatchingTransactions(amountType, null); +}); \ No newline at end of file diff --git a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthByCategories.js b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthByCategories.js index 4bd71aea8845e46431394464b3e11fc42b1e0c6f..5d6acc00fdfa706df88e966ca11cec9e1f360b6f 100644 --- a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthByCategories.js +++ b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerMonthByCategories.js @@ -198,6 +198,27 @@ var plotlyConfig = { Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); +REGEX_CATGEORY_NAME = new RegExp("(.*)\\s\\d+.\\d%"); + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let hoverText = data.points[index].hovertext; + let match = hoverText.match(REGEX_CATGEORY_NAME); + if(match === null) + { + console.error('could not extract category name from: "' + hoverText + '"'); + return; + } + + getAndShowMatchingTransactions(null, match[1]); +}); + function prepareHoverText(categoryName, percentage, value) { value = value / 100; diff --git a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearBar.js b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearBar.js index d03e7f05f260c6994fcc2035dd9b889793b9ae15..674fb55fdc5cdef7cd543d85635b5d197ea0d8ca 100644 --- a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearBar.js +++ b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearBar.js @@ -102,4 +102,24 @@ var plotlyConfig = { }; // Don't touch this line -Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); \ No newline at end of file +Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); + + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let amountTypeText = data.points[index].data.name; + + let amountType = 'EXPENDITURE'; + if(amountTypeText === localizedData['traceName1']) + { + amountType = 'INCOME'; + } + + getAndShowMatchingTransactions(amountType, null); +}); \ No newline at end of file diff --git a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearByCategories.js b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearByCategories.js index dcb1e0b4c096099edae125526b5c7da3f76b3842..ff3413d9af530b322d050d2a186af9db432ed4b9 100644 --- a/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearByCategories.js +++ b/BudgetMasterServer/src/main/resources/charts/IncomesAndExpendituresPerYearByCategories.js @@ -198,6 +198,27 @@ var plotlyConfig = { Plotly.newPlot("containerID", plotlyData, plotlyLayout, plotlyConfig); +REGEX_CATGEORY_NAME = new RegExp("(.*)\\s\\d+.\\d%"); + +var plotContainer = document.getElementById('containerID'); +plotContainer.on('plotly_click', function(data){ + if(data.event.shiftKey !== true) + { + return; + } + + let index = data.points.length - 1; + let hoverText = data.points[index].hovertext; + let match = hoverText.match(REGEX_CATGEORY_NAME); + if(match === null) + { + console.error('could not extract category name from: "' + hoverText + '"'); + return; + } + + getAndShowMatchingTransactions(null, match[1]); +}); + function prepareHoverText(categoryName, percentage, value) { value = value / 100;