Fix analytics chart

This commit is contained in:
2026-03-11 08:45:01 -06:00
parent c3a318c6cc
commit cb92ca6e26
2 changed files with 55 additions and 8 deletions

View File

@@ -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<String, Number> chartSalesOverTime;
private LineChart<Number, Number> chartSalesOverTime;
@FXML
private NumberAxis axisSalesDate;
@FXML
private BarChart<Number, String> 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<String> 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> dailySales = dashboard.getDailySales() != null ? dashboard.getDailySales() : new ArrayList<>();
XYChart.Series<String, Number> series = new XYChart.Series<>();
XYChart.Series<Number, Number> 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<TopProduct> topProducts = dashboard.getTopProducts() != null ? dashboard.getTopProducts() : new ArrayList<>();
XYChart.Series<Number, String> series = new XYChart.Series<>();

View File

@@ -2,7 +2,6 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.chart.BarChart?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.LineChart?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.chart.PieChart?>
@@ -125,7 +124,7 @@
</Label>
<LineChart fx:id="chartSalesOverTime" animated="true" legendSide="BOTTOM" prefHeight="380.0">
<xAxis>
<CategoryAxis label="Date" side="BOTTOM" />
<NumberAxis fx:id="axisSalesDate" label="Date" side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis label="Revenue" side="LEFT" />