From 2700002df0930bffed8b6a8091ea5ddf118f15df Mon Sep 17 00:00:00 2001 From: = Date: Tue, 19 May 2026 15:09:48 +0200 Subject: [PATCH] Feat: Refreshing, combobox Implemented a refresh method that is called when changing to the transactions view. This method ensures that the view is updated automatically. Also changed the week selection text field to a combobox that only gives a selection range of weeks where transactions have taken place. --- .../ntnu/idi/idatt2003/g40/mappe/Main.java | 5 +- .../g40/mappe/engine/TransactionArchive.java | 9 +++ .../idatt2003/g40/mappe/view/ViewManager.java | 2 - .../view/widgets/topbar/TopBarController.java | 5 +- .../transactions/TransactionsActions.java | 4 ++ .../transactions/TransactionsController.java | 56 +++++++++++++++---- .../transactions/TransactionsView.java | 36 +++++++++--- src/main/resources/styles.css | 13 ++++- 8 files changed, 101 insertions(+), 29 deletions(-) diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java index 4ecf25b..d86e8d9 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java @@ -119,7 +119,7 @@ public void start(final Stage stage) throws Exception { stocksInFile); TransactionsView transactionsView = new TransactionsView(); - new TransactionsController( + TransactionsController transactionsController = new TransactionsController( transactionsView, eventManager, player.getTransactionArchive()); @@ -133,7 +133,8 @@ public void start(final Stage stage) throws Exception { inGameView::changeCenterView, dashBoardView.getRootPane(), marketView.getRootPane(), - transactionsView.getRootPane() + transactionsView.getRootPane(), + transactionsController::refresh ); // Register all views diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java index 20ca02b..dadc496 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java @@ -59,6 +59,15 @@ public List getTransactions(final int week) { return result; } + /** + * Returns all transactions. + * + * @return list of transactions from the given week + */ + public List getTransactions() { + return transactions; + } + /** * Returns all purchase transactions from a given week. * diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ViewManager.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ViewManager.java index 51eb63f..b3ce064 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ViewManager.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ViewManager.java @@ -4,9 +4,7 @@ import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventManager; import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventSubscriber; import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventType; - import java.util.EnumMap; -import java.util.HashMap; import java.util.Map; import javafx.scene.Scene; import javafx.stage.Stage; diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/topbar/TopBarController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/topbar/TopBarController.java index e19e0ab..9909b1d 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/topbar/TopBarController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/topbar/TopBarController.java @@ -62,12 +62,12 @@ protected void initInteractions() { * {@code inGameView::changeCenterView}). * @param dashboardCenter root pane of the dashboard widget. * @param marketCenter root pane of the market widget. - * @param transactionsCenter root pane of the transactions widget. + * @param transactionsCenter root pane of the transactions' widget. * */ public void setMarketIntegration(final Consumer centerSwitcher, final Node dashboardCenter, final Node marketCenter, - final Node transactionsCenter) { + final Node transactionsCenter, final Runnable onTransactionUpdate) { getViewElement().setOnAction(TopBarActions.EXIT, () -> { if (inMarketView || inTransactionsView) { centerSwitcher.accept(dashboardCenter); @@ -95,6 +95,7 @@ public void setMarketIntegration(final Consumer centerSwitcher, getViewElement().setOnAction(TopBarActions.TRANSACTIONS, () -> { centerSwitcher.accept(transactionsCenter); + onTransactionUpdate.run(); getViewElement().setQuitText("Back"); inMarketView = false; inTransactionsView = true; diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsActions.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsActions.java index bbaad49..d278745 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsActions.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsActions.java @@ -1,4 +1,8 @@ package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.transactions; +/** + * Enum representing actions to be done in a {@link TransactionsView} element. + * */ public enum TransactionsActions { + // Empty, no interactable buttons in transactions page. } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java index 89c30fc..3069e8c 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java @@ -2,10 +2,16 @@ import edu.ntnu.idi.idatt2003.g40.mappe.engine.TransactionArchive; import edu.ntnu.idi.idatt2003.g40.mappe.model.Sale; +import edu.ntnu.idi.idatt2003.g40.mappe.model.Transaction; import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventManager; import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewController; -import javafx.scene.control.TextFormatter; +import java.util.List; +/** + * Controller for a {@link TransactionsView} element. + * + *

extends {@link ViewController}

+ * */ public class TransactionsController extends ViewController { private final TransactionArchive transactionArchive; @@ -20,25 +26,27 @@ public TransactionsController(final TransactionsView viewElement, @Override protected void initInteractions() { - getViewElement().getWeekField().setTextFormatter(new TextFormatter<>(change -> { - if (change.getControlNewText().matches("([0-9]*(\\.[0-9]*)?)?")) { - return change; - } - return null; - })); - getViewElement().getWeekField().focusedProperty().addListener((observable, wasFocused, isNowFocused) -> { - if (!isNowFocused && getViewElement().getWeekField().getText().trim().isEmpty()) { - getViewElement().getWeekField().setText("1"); + getViewElement().getWeekSelectBox().setOnAction(event -> { + try { + Integer selectedWeek = Integer.parseInt(getViewElement().getWeekSelectBox().getValue()); + filterData(getViewElement().getSearchField().getText(), selectedWeek); + } catch (NumberFormatException _) { + filterData(getViewElement().getSearchField().getText(), 1); } - filterData(getViewElement().getSearchField().getText(), Integer.parseInt(getViewElement().getWeekField().getText())); }); getViewElement().getSearchField().textProperty().addListener((observable, oldValue, newValue) -> { - filterData(newValue, Integer.parseInt(getViewElement().getWeekField().getText())); + filterData(newValue, Integer.parseInt(getViewElement().getWeekSelectBox().getValue())); }); } + /** + * Method used for updating the list of transactions based on a search and target week. + * + * @param searchKeyword the keyword to search for stocks with. + * @param weekTarget the week used when searching for transactions. + * */ private void filterData(final String searchKeyword, final Integer weekTarget) { getViewElement().clearCards(); transactionArchive.getTransactions(weekTarget).forEach(t -> { @@ -64,4 +72,28 @@ private void filterData(final String searchKeyword, final Integer weekTarget) { } }); } + + private List getUniqueTransactionWeeks(final List transactionList) { + return transactionList.stream() + .map(Transaction::getWeek) + .distinct() + .sorted() + .toList(); + } + + public void refresh() { + List activeWeeks = getUniqueTransactionWeeks(transactionArchive.getTransactions()); + getViewElement().setWeekSelectBoxOptions(activeWeeks); + + if (activeWeeks.contains(Integer.parseInt(getViewElement().getWeekSelectBox().getValue()))) { + getViewElement().getWeekSelectBox().setValue(getViewElement().getWeekSelectBox().getValue()); + } else if (!activeWeeks.isEmpty()) { + getViewElement().getWeekSelectBox().setValue(activeWeeks.getFirst().toString()); + } + + filterData( + getViewElement().getSearchField().getText(), + Integer.parseInt(getViewElement().getWeekSelectBox().getValue()) + ); + } } \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsView.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsView.java index 6d9f77a..632b8b0 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsView.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsView.java @@ -1,6 +1,7 @@ package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.transactions; import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewElement; +import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; @@ -8,6 +9,7 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; +import java.util.List; /** * View for displaying a history of all transactions for the active player. @@ -25,7 +27,7 @@ public final class TransactionsView /** * Week input field. * */ - private TextField weekField; + private ComboBox weekSelectBox; /** * Container element for cards. @@ -70,13 +72,14 @@ protected void initLayout() { HBox.setHgrow(searchField, Priority.ALWAYS); weekLabel = new Label("Week:"); - weekField = new TextField("2"); + weekSelectBox = new ComboBox<>(); + weekSelectBox.setPromptText("All"); searchBar.getChildren().addAll( searchLabel, searchField, weekLabel, - weekField + weekSelectBox ); // Horizontal scroll pane: @@ -149,6 +152,23 @@ public void addTransactionCard(final String type, cardWeekLabel.getStyleClass().add("transactions-cardText"); } + /** + * Helper method for setting the options for the week selection combo box. + * + * @param options a list of integers representing the different options. + * */ + public void setWeekSelectBoxOptions(final List options) { + weekSelectBox.getItems().clear(); + options.forEach(i -> weekSelectBox.getItems().add(i.toString())); + + if (!options.isEmpty()) { + weekSelectBox.setValue(options.getFirst().toString()); + } else { + weekSelectBox.getItems().add("1"); + weekSelectBox.setValue("1"); + } + } + /** * Clears the displayed list of cards. * */ @@ -166,12 +186,12 @@ public TextField getSearchField() { } /** - * Getter method for the week filter field. + * Getter method for the week selection box. * - * @return week filter field. + * @return week selection box. * */ - public TextField getWeekField() { - return weekField; + public ComboBox getWeekSelectBox() { + return weekSelectBox; } @Override @@ -181,7 +201,7 @@ protected void initStyling() { searchLabel.getStyleClass().add("transactions-searchLabel"); searchField.getStyleClass().add("transactions-searchField"); weekLabel.getStyleClass().add("transactions-searchLabel"); - weekField.getStyleClass().add("transactions-weekField"); + weekSelectBox.getStyleClass().add("transactions-weekField"); scrollPane.getStyleClass().add("transactions-scrollPane"); cardsContainer.getStyleClass().add("transactions-cardsContainer"); } diff --git a/src/main/resources/styles.css b/src/main/resources/styles.css index a6c00d5..05ec5ed 100644 --- a/src/main/resources/styles.css +++ b/src/main/resources/styles.css @@ -595,11 +595,18 @@ } .transactions-weekField { - -fx-pref-width: 50; - -fx-alignment: CENTER; + -fx-pref-width: 75px; + -fx-min-width: 75px; -fx-background-color: white; -fx-border-color: #000000; - -fx-border-width: 1.5; + -fx-border-width: 1.5px; + -fx-alignment: CENTER; +} + +.transactions-weekField .list-cell { + -fx-text-fill: black; + -fx-font-weight: bold; + -fx-alignment: center; } .transactions-transactionCard {