From cb92ca6e263dde417a1d4e9c28c67b6d12ef7131 Mon Sep 17 00:00:00 2001 From: Harkamal Randhawa Date: Wed, 11 Mar 2026 08:45:01 -0600 Subject: [PATCH] Fix analytics chart --- .../controllers/AnalyticsController.java | 60 +++++++++++++++++-- .../modelviews/analytics-view.fxml | 3 +- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java b/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java index 8a3a0428..1935bc25 100644 --- a/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java +++ b/src/main/java/org/example/petshopdesktop/controllers/AnalyticsController.java @@ -17,7 +17,10 @@ import org.example.petshopdesktop.util.ActivityLogger; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; +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; @@ -42,7 +45,10 @@ public class AnalyticsController { private Label lblTotalItems; @FXML - private LineChart chartSalesOverTime; + private LineChart chartSalesOverTime; + + @FXML + private NumberAxis axisSalesDate; @FXML private BarChart chartTopRevenue; @@ -58,6 +64,8 @@ public class AnalyticsController { private final NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CANADA); private final NumberFormat wholeNumber = NumberFormat.getIntegerInstance(); + private final DateTimeFormatter chartDateFormatter = DateTimeFormatter.ofPattern("MMM d", Locale.CANADA); + private final List salesDateLabels = new ArrayList<>(); @FXML public void initialize() { @@ -75,7 +83,30 @@ public class AnalyticsController { } private void configureCharts() { - chartSalesOverTime.setAnimated(true); + chartSalesOverTime.setAnimated(false); + axisSalesDate.setAnimated(false); + axisSalesDate.setAutoRanging(false); + axisSalesDate.setForceZeroInRange(false); + axisSalesDate.setMinorTickVisible(false); + axisSalesDate.setTickUnit(1); + axisSalesDate.setTickLabelRotation(-45); + axisSalesDate.setTickLabelFormatter(new StringConverter<>() { + @Override + public String toString(Number value) { + int index = value.intValue(); + if (index < 0 || index >= salesDateLabels.size()) { + return ""; + } + int labelStep = Math.max(1, (salesDateLabels.size() + 14) / 15); + boolean showLabel = index == 0 || index == salesDateLabels.size() - 1 || index % labelStep == 0; + return showLabel ? salesDateLabels.get(index) : ""; + } + + @Override + public Number fromString(String string) { + return 0; + } + }); chartTopRevenue.setAnimated(true); chartTopQuantity.setAnimated(true); chartPaymentMethods.setAnimated(true); @@ -142,19 +173,36 @@ public class AnalyticsController { private void loadSalesOverTime(DashboardResponse dashboard) throws Exception { List dailySales = dashboard.getDailySales() != null ? dashboard.getDailySales() : new ArrayList<>(); - XYChart.Series series = new XYChart.Series<>(); + XYChart.Series series = new XYChart.Series<>(); series.setName("Daily Revenue"); - for (DailySales dailySale : dailySales) { - String dateStr = dailySale.getDate(); + salesDateLabels.clear(); + for (int i = 0; i < dailySales.size(); i++) { + DailySales dailySale = dailySales.get(i); + salesDateLabels.add(formatChartDate(dailySale.getDate())); BigDecimal revenue = dailySale.getRevenue() != null ? dailySale.getRevenue() : BigDecimal.ZERO; - series.getData().add(new XYChart.Data<>(dateStr, revenue)); + series.getData().add(new XYChart.Data<>(i, revenue)); } + int upperBound = Math.max(0, salesDateLabels.size() - 1); + axisSalesDate.setLowerBound(0); + axisSalesDate.setUpperBound(upperBound); chartSalesOverTime.getData().clear(); chartSalesOverTime.getData().add(series); } + private String formatChartDate(String date) { + if (date == null || date.isBlank()) { + return ""; + } + + try { + return LocalDate.parse(date).format(chartDateFormatter); + } catch (DateTimeParseException ignored) { + return date; + } + } + private void loadTopProductsByRevenue(DashboardResponse dashboard) throws Exception { List topProducts = dashboard.getTopProducts() != null ? dashboard.getTopProducts() : new ArrayList<>(); XYChart.Series series = new XYChart.Series<>(); diff --git a/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml b/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml index 5aa4acb4..cdfda10e 100644 --- a/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml +++ b/src/main/resources/org/example/petshopdesktop/modelviews/analytics-view.fxml @@ -2,7 +2,6 @@ - @@ -125,7 +124,7 @@ - +