diff --git a/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java b/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java index 8561a439..1ab0ffbe 100644 --- a/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java +++ b/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java @@ -21,6 +21,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import javafx.util.StringConverter; + import java.util.*; import java.util.stream.Collectors; @@ -62,6 +63,12 @@ public class AnalyticsController { @FXML private BarChart chartEmployeePerformance; + private static final String SALES_COLOR = "#ff6b35"; + private static final String REVENUE_COLOR = "#4ecdc4"; + private static final String QUANTITY_COLOR = "#ff9f1c"; + private static final String EMPLOYEE_COLOR = "#1a759f"; + private static final List PIE_COLORS = List.of("#ff6b35", "#4ecdc4", "#1a759f", "#ff9f1c", "#577590", "#90be6d"); + private final NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CANADA); private final NumberFormat wholeNumber = NumberFormat.getIntegerInstance(); private final DateTimeFormatter chartDateFormatter = DateTimeFormatter.ofPattern("MMM d", Locale.CANADA); @@ -191,6 +198,7 @@ public class AnalyticsController { axisSalesDate.setUpperBound(upperBound); chartSalesOverTime.getData().clear(); chartSalesOverTime.getData().add(series); + applyLineChartColor(chartSalesOverTime, SALES_COLOR); } private String formatChartDate(String date) { @@ -217,6 +225,7 @@ public class AnalyticsController { chartTopRevenue.getData().clear(); chartTopRevenue.getData().add(series); + applyBarChartColor(chartTopRevenue, REVENUE_COLOR); } private void loadTopProductsByQuantity(DashboardResponse dashboard) throws Exception { @@ -231,6 +240,7 @@ public class AnalyticsController { chartTopQuantity.getData().clear(); chartTopQuantity.getData().add(series); + applyBarChartColor(chartTopQuantity, QUANTITY_COLOR); } private void loadPaymentMethodDistribution(List sales) throws Exception { @@ -243,7 +253,11 @@ public class AnalyticsController { chartPaymentMethods.getData().clear(); - for (Map.Entry entry : paymentMethodCount.entrySet()) { + List> paymentEntries = paymentMethodCount.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .toList(); + + for (Map.Entry entry : paymentEntries) { PieChart.Data slice = new PieChart.Data( entry.getKey() + " (" + entry.getValue() + ")", entry.getValue() @@ -252,6 +266,7 @@ public class AnalyticsController { } chartPaymentMethods.setLabelsVisible(false); + applyPieChartColors(); } private void loadEmployeePerformance(List sales) throws Exception { @@ -266,12 +281,55 @@ public class AnalyticsController { XYChart.Series series = new XYChart.Series<>(); series.setName("Revenue"); - for (Map.Entry entry : employeeRevenue.entrySet()) { + List> employeeEntries = employeeRevenue.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .toList(); + + for (Map.Entry entry : employeeEntries) { series.getData().add(new XYChart.Data<>(entry.getKey(), entry.getValue())); } chartEmployeePerformance.getData().clear(); chartEmployeePerformance.getData().add(series); + applyBarChartColor(chartEmployeePerformance, EMPLOYEE_COLOR); + } + + private void applyLineChartColor(LineChart chart, String color) { + Platform.runLater(() -> { + for (XYChart.Series series : chart.getData()) { + if (series.getNode() != null) { + series.getNode().setStyle("-fx-stroke: " + color + ";"); + } + for (XYChart.Data data : series.getData()) { + if (data.getNode() != null) { + data.getNode().setStyle("-fx-background-color: white, " + color + ";"); + } + } + } + }); + } + + private void applyBarChartColor(XYChart chart, String color) { + Platform.runLater(() -> { + for (XYChart.Series series : chart.getData()) { + for (XYChart.Data data : series.getData()) { + if (data.getNode() != null) { + data.getNode().setStyle("-fx-bar-fill: " + color + ";"); + } + } + } + }); + } + + private void applyPieChartColors() { + Platform.runLater(() -> { + for (int i = 0; i < chartPaymentMethods.getData().size(); i++) { + PieChart.Data slice = chartPaymentMethods.getData().get(i); + if (slice.getNode() != null) { + slice.getNode().setStyle("-fx-pie-color: " + PIE_COLORS.get(i % PIE_COLORS.size()) + ";"); + } + } + }); } @FXML