From 9717fff0a33786ebfbb872d46f6a6b30c396e2ca Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Wed, 15 Mar 2017 20:28:07 +0100 Subject: [PATCH] Fixed #50 - add tooltip for category in payment tab, moved categoryBudget creation from client to server --- .../budgetmaster/logic/Helpers.java | 46 ------- .../budgetmaster/logic/ServerConnection.java | 25 ++++ .../budgetmaster/ui/Controller.java | 3 +- .../budgetmaster/ui/cells/PaymentCell.java | 5 + .../server/SparkServer.java | 4 + .../categorybudget/CategoryBudgetGet.java | 112 ++++++++++++++++++ 6 files changed, 147 insertions(+), 48 deletions(-) create mode 100644 src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java diff --git a/src/de/deadlocker8/budgetmaster/logic/Helpers.java b/src/de/deadlocker8/budgetmaster/logic/Helpers.java index 2f72888eb..a3761e796 100644 --- a/src/de/deadlocker8/budgetmaster/logic/Helpers.java +++ b/src/de/deadlocker8/budgetmaster/logic/Helpers.java @@ -5,10 +5,6 @@ import java.net.URLEncoder; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; public class Helpers { @@ -35,46 +31,4 @@ public class Helpers DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return date.format(formatter); } - - public static ArrayList<CategoryBudget> getCategoryBudgets(CategoryHandler categoryHandler, ArrayList<Payment> payments) - { - ArrayList<CategoryBudget> budgets = new ArrayList<>(); - - for(Category currentCategory : categoryHandler.getCategories()) - { - budgets.add(new CategoryBudget(currentCategory.getName(), currentCategory.getColor(), 0)); - CategoryBudget currentBudget = budgets.get(budgets.size() - 1); - for(Payment currentPayment : payments) - { - //filter rest - if(currentCategory.getID() != 2) - { - if(currentCategory.getID() == currentPayment.getCategoryID()) - { - currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount()); - } - } - } - } - - //filter empty categories - Iterator<CategoryBudget> iterator = budgets.iterator(); - while(iterator.hasNext()) - { - if(iterator.next().getBudget() == 0) - { - iterator.remove(); - } - } - - Collections.sort(budgets, new Comparator<CategoryBudget>() { - @Override - public int compare(CategoryBudget budget1, CategoryBudget budget2) - { - return Double.compare(budget1.getBudget(), budget2.getBudget()); - } - }); - - return budgets; - } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java index f7e9f6e43..1792a896e 100644 --- a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java +++ b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java @@ -257,6 +257,31 @@ public class ServerConnection reader.close(); } + /* + * CATEGORYBUDGET + */ + public ArrayList<CategoryBudget> getCategoryBudgets(int year, int month) throws Exception + { + URL url = new URL(settings.getUrl() + "/categorybudget?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&year=" + year + "&month=" + month); + HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection(); + httpsCon.setDoOutput(true); + httpsCon.setRequestMethod("GET"); + + if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK) + { + String result = Read.getStringFromInputStream(httpsCon.getInputStream()); + // required by GSON + Type listType = new TypeToken<ArrayList<CategoryBudget>>() + { + }.getType(); + return gson.fromJson(result, listType); + } + else + { + return null; + } + } + /* * REST */ diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java index 409f3e0a4..2175ef471 100644 --- a/src/de/deadlocker8/budgetmaster/ui/Controller.java +++ b/src/de/deadlocker8/budgetmaster/ui/Controller.java @@ -11,7 +11,6 @@ import org.joda.time.DateTime; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.CategoryHandler; -import de.deadlocker8.budgetmaster.logic.Helpers; import de.deadlocker8.budgetmaster.logic.NormalPayment; import de.deadlocker8.budgetmaster.logic.Payment; import de.deadlocker8.budgetmaster.logic.ServerConnection; @@ -284,7 +283,7 @@ public class Controller implements Refreshable categoryHandler = new CategoryHandler(connection.getCategories()); - categoryBudgets = Helpers.getCategoryBudgets(categoryHandler, payments); + categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear()); } catch(Exception e) { diff --git a/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java b/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java index f352121fa..8a6b95791 100644 --- a/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java +++ b/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java @@ -22,6 +22,7 @@ import javafx.scene.control.ButtonBar.ButtonData; import javafx.scene.control.ButtonType; import javafx.scene.control.Label; import javafx.scene.control.ListCell; +import javafx.scene.control.Tooltip; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.Region; @@ -102,7 +103,11 @@ public class PaymentCell extends ListCell<Payment> labelCircle.getStyleClass().add("greylabel"); String textColor = ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(category.getColor())); labelCircle.setStyle("-fx-background-color: " + ConvertTo.toRGBHex(category.getColor()) + "; -fx-background-radius: 50%; -fx-text-fill: " + textColor + "; -fx-font-weight: bold; -fx-font-size: 20;"); + Tooltip tooltip = new Tooltip(categoryName); + tooltip.setStyle("-fx-font-size: 14"); + labelCircle.setTooltip(tooltip); hbox.getChildren().add(labelCircle); + Label labelName = new Label(item.getName()); labelName.setPrefHeight(HEIGHT); diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java index c8957581e..4c9951379 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java +++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java @@ -20,6 +20,7 @@ import de.deadlocker8.budgetmasterserver.server.category.CategoryDelete; import de.deadlocker8.budgetmasterserver.server.category.CategoryGet; import de.deadlocker8.budgetmasterserver.server.category.CategoryGetAll; import de.deadlocker8.budgetmasterserver.server.category.CategoryUpdate; +import de.deadlocker8.budgetmasterserver.server.categorybudget.CategoryBudgetGet; import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentAdd; import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentDelete; import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentGet; @@ -85,6 +86,9 @@ public class SparkServer post("/repeatingpayment", new RepeatingPaymentAdd(handler)); delete("/repeatingpayment", new RepeatingPaymentDelete(handler)); + // CategoryBudget + get("/categorybudget", new CategoryBudgetGet(handler, gson)); + // Rest get("/rest", new RestGet(handler, gson)); diff --git a/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java new file mode 100644 index 000000000..0b0859c69 --- /dev/null +++ b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java @@ -0,0 +1,112 @@ +package de.deadlocker8.budgetmasterserver.server.categorybudget; + +import static spark.Spark.halt; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; + +import com.google.gson.Gson; + +import de.deadlocker8.budgetmaster.logic.Category; +import de.deadlocker8.budgetmaster.logic.CategoryBudget; +import de.deadlocker8.budgetmaster.logic.Payment; +import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; +import spark.Request; +import spark.Response; +import spark.Route; + +public class CategoryBudgetGet implements Route +{ + private DatabaseHandler handler; + private Gson gson; + + public CategoryBudgetGet(DatabaseHandler handler, Gson gson) + { + this.handler = handler; + this.gson = gson; + } + + @Override + public Object handle(Request req, Response res) throws Exception + { + if(!req.queryParams().contains("year") || !req.queryParams().contains("month")) + { + halt(400, "Bad Request"); + } + + int year = 0; + int month = 0; + + try + { + year = Integer.parseInt(req.queryMap("year").value()); + month = Integer.parseInt(req.queryMap("month").value()); + + if(year < 0 || month < 1 || month > 12) + { + halt(400, "Bad Request"); + } + + try + { + ArrayList<Payment> payments = new ArrayList<>(); + payments.addAll(handler.getPayments(year, month)); + payments.addAll(handler.getRepeatingPayments(year, month)); + Collections.sort(payments, new Comparator<Payment>() { + @Override + public int compare(Payment payment1, Payment payment2) + { + return payment2.getDate().compareTo(payment1.getDate()); + } + }); + + ArrayList<CategoryBudget> budgets = new ArrayList<>(); + + for(Category currentCategory : handler.getCategories()) + { + budgets.add(new CategoryBudget(currentCategory.getName(), currentCategory.getColor(), 0)); + CategoryBudget currentBudget = budgets.get(budgets.size() - 1); + for(Payment currentPayment : payments) + { + if(currentCategory.getID() == currentPayment.getCategoryID()) + { + currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount()); + } + } + } + + //filter empty categories + Iterator<CategoryBudget> iterator = budgets.iterator(); + while(iterator.hasNext()) + { + if(iterator.next().getBudget() == 0) + { + iterator.remove(); + } + } + + Collections.sort(budgets, new Comparator<CategoryBudget>() { + @Override + public int compare(CategoryBudget budget1, CategoryBudget budget2) + { + return Double.compare(budget1.getBudget(), budget2.getBudget()); + } + }); + + return gson.toJson(budgets); + } + catch(IllegalStateException ex) + { + halt(500, "Internal Server Error"); + } + } + catch(Exception e) + { + halt(400, "Bad Request"); + } + + return null; + } +} \ No newline at end of file -- GitLab