Skip to content

Commit

Permalink
feat: Remake searchbar to reactive on input
Browse files Browse the repository at this point in the history
  • Loading branch information
pawelsa committed May 25, 2026
1 parent aa8af0a commit e4b98e9
Show file tree
Hide file tree
Showing 12 changed files with 127 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,18 @@ public ExchangeController(ExchangeModel model) {
List<Stock> initialStocksLoad = session.getExchange().getStocks();
stocksSorted.addAll(initialStocksLoad);
setStocksModel(initialStocksLoad);

initController();
}

/**
* Method for initializing controller.
* <p>
* Activates listener to searchbar query.
* </p>
*/
public void initController() {
model.searchQueryProperty().addListener((obs) -> handleSearchQuery());
}

/**
Expand Down Expand Up @@ -100,16 +112,16 @@ public void applyNewspaperGlow(StockComponent component) {
/**
* Method to handle searchbar query.
*
* @param query - Input from searchbar.
*/
public void handleSearchQuery(String query) {
if (query == null || query.isBlank()) {
public void handleSearchQuery() {
if (model.searchQueryProperty().get() == null || model.searchQueryProperty().get().isBlank()) {
setStocksModel(stocksSorted); // Get back to "no search"
return;
}

List<Stock> stocksFound = stocksSorted.stream()
.filter(stock -> stock.toString().toLowerCase().contains(query.toLowerCase())).toList();
.filter(stock -> stock.toString().toLowerCase().contains(model.searchQueryProperty().get().toLowerCase()))
.toList();

setStocksModel(stocksFound);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import edu.ntnu.idi.idatt.view.components.Model;
import edu.ntnu.idi.idatt.view.components.elements.StockComponent;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

Expand All @@ -11,6 +12,7 @@
public class ExchangeModel implements Model {

private final ObservableList<StockComponent> stockList = FXCollections.observableArrayList();
private final SimpleStringProperty searchQueryProperty = new SimpleStringProperty();

/**
* Getter for the stock list.
Expand All @@ -21,4 +23,13 @@ public ObservableList<StockComponent> getStockList() {
return stockList;
}

/**
* Getter for search query property.
*
* @return SimpleStringProperty;
*/
public SimpleStringProperty searchQueryProperty() {
return searchQueryProperty;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import java.util.List;
import java.util.function.Consumer;

import edu.ntnu.idi.idatt.session.UserSession;
import edu.ntnu.idi.idatt.view.SceneFactory;
import edu.ntnu.idi.idatt.view.SceneManager;
import edu.ntnu.idi.idatt.view.components.AbstractViewUI;
import edu.ntnu.idi.idatt.view.components.ui.UIFactory;
import edu.ntnu.idi.idatt.view.primary.exchange.ExchangeController.SortAction;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
Expand All @@ -22,8 +22,8 @@
*/
public class ExchangeView extends AbstractViewUI {

Consumer<String> searchQueryHandler;
Consumer<SortAction> sortHandle;
private SimpleStringProperty searchQueryProperty;
private Consumer<SortAction> sortHandle;
private VBox root;

/**
Expand Down Expand Up @@ -58,7 +58,7 @@ public Parent createContent() {
@Override
public Parent createNavigation() {
return UIFactory.createNavigation(
UserSession.getInstance().getExchange().getName(),
"Exchange",
List.of());
}

Expand All @@ -69,8 +69,8 @@ public Parent createNavigation() {
*/
@Override
public Parent createHeader() {
return UIFactory.createHeader("Search for stocks",
query -> searchQueryHandler.accept(query),
return UIFactory.createHeader("Search for stocks..",
queryProperty -> searchQueryProperty = queryProperty,
List.of(
"None",
"New news",
Expand Down Expand Up @@ -101,7 +101,7 @@ public Parent createToolbar() {
@Override
public Parent createMenu() {
return UIFactory.createMenu("Account",
List.of("Portfolio", "Transactions"),
List.of("Portfolio", "Transactions"),
() -> SceneManager.switchTo(SceneFactory.createPortfolioView()),
() -> SceneManager.switchTo(SceneFactory.createTransactionView()));

Expand All @@ -117,6 +117,7 @@ public Parent createMenu() {
*/
public void setModel(ExchangeModel model) {
Bindings.bindContent(root.getChildren(), model.getStockList());
model.searchQueryProperty().bind(searchQueryProperty);
}

/**
Expand All @@ -128,7 +129,6 @@ public void setModel(ExchangeModel model) {
* @param controller - ExchangeController instance.
*/
public void setController(ExchangeController controller) {
searchQueryHandler = (query) -> controller.handleSearchQuery(query);
sortHandle = (sortAction) -> controller.sortStocksBy(sortAction);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public Parent createToolbar() {
@Override
public Parent createMenu() {
return UIFactory.createMenu("Account",
List.of("Portfolio", "Transactions"),
List.of("Portfolio", "Transactions"),
() -> SceneManager.switchTo(SceneFactory.createPortfolioView()),
() -> SceneManager.switchTo(SceneFactory.createTransactionView()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,14 @@ public void setShareModel(List<Share> shareList) {

/**
* Method for initializing controller dependencies.
* <p>
* Sets up initial model values and activates listener.
* </p>
*/
public void initController() {

setupPlayerInfo();

model.searchQueryProperty().addListener((obs) -> handleSearchQuery());
}

/**
Expand Down Expand Up @@ -192,16 +194,42 @@ public void setupPlayerInfo() {
* Sets share list model to found after name.
* </p>
*
* @param query - Input in searchbar.
*/
public void handleSearchQuery(String query) {
if (query == null || query.isBlank()) {
public void handleSearchQuery() {
if (model.searchQueryProperty().get() == null || model.searchQueryProperty().get().isBlank()) {
setShareModel(sharesSorted); // Get back to "no search"
return;
}

List<Share> sharesFound = sharesSorted.stream()
.filter(share -> share.getStock().toString().toLowerCase()
.contains(model.searchQueryProperty().get().toLowerCase()))
.toList();

setShareModel(sharesFound);

}

/**
* Overloaded method for handeling searchbar search.
*
* <p>
* Sets share list model to found after name.
* </p>
*
* @param initialSearch - initial search input.
*
*/
public void handleSearchQuery(String initialSearch) {
if (initialSearch == null || initialSearch.isBlank()) {
setShareModel(sharesSorted); // Get back to "no search"
return;
}

List<Share> sharesFound = sharesSorted.stream()
.filter(share -> share.getStock().toString().toLowerCase().contains(query.toLowerCase())).toList();
.filter(share -> share.getStock().toString().toLowerCase()
.contains(initialSearch.toLowerCase()))
.toList();

setShareModel(sharesFound);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import edu.ntnu.idi.idatt.view.components.elements.ShareComponent;
import edu.ntnu.idi.idatt.view.primary.portfolio.viewmodel.PlayerInfoModel;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
Expand All @@ -15,6 +16,7 @@
public class PortfolioModel implements Model {

private final ObservableList<ShareComponent> shareList = FXCollections.observableArrayList();
private final SimpleStringProperty searchQueryProperty = new SimpleStringProperty();
private final PlayerInfoModel playerInfoModel = new PlayerInfoModel();

/**
Expand All @@ -26,6 +28,15 @@ public ObservableList<ShareComponent> getShareList() {
return shareList;
}

/**
* Getter for search query property.
*
* @return SimpleStringProperty;
*/
public SimpleStringProperty searchQueryProperty() {
return searchQueryProperty;
}

/**
* Getter for the playerInfoModel.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import edu.ntnu.idi.idatt.view.primary.portfolio.sections.PlayerInfoSection;
import edu.ntnu.idi.idatt.view.primary.portfolio.viewmodel.PlayerInfoModel;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.scene.Parent;
import javafx.scene.control.ScrollPane;
Expand All @@ -21,8 +22,8 @@
*/
public class PortfolioView extends AbstractViewUI {

Consumer<String> searchQueryHandler;
Consumer<SortAction> sortHandle;
private SimpleStringProperty searchQueryProperty;
private Consumer<SortAction> sortHandle;

private VBox shareList;
private PlayerInfoSection playerInfoSection;
Expand Down Expand Up @@ -70,7 +71,7 @@ public Parent createNavigation() {
@Override
public Parent createHeader() {
return UIFactory.createHeader("Search after holdings..",
query -> searchQueryHandler.accept(query),
queryProperty -> searchQueryProperty = queryProperty,
List.of(
"Oldest first",
"Newest first",
Expand Down Expand Up @@ -101,7 +102,7 @@ public Parent createToolbar() {
@Override
public Parent createMenu() {
return UIFactory.createMenu("Account",
List.of("Portfolio", "Transactions"),
List.of("Portfolio", "Transactions"),
() -> {
},
() -> SceneManager.switchTo(SceneFactory.createTransactionView()));
Expand All @@ -117,6 +118,7 @@ public Parent createMenu() {
*/
public void setModel(PortfolioModel model) {
Bindings.bindContent(shareList.getChildren(), model.getShareList());
model.searchQueryProperty().bind(searchQueryProperty);

setPlayerInfoSectionModel(model.playerInfoModel());

Expand Down Expand Up @@ -152,7 +154,6 @@ public void setPlayerInfoSectionModel(PlayerInfoModel model) {
* @param controller - PortfolioController instance.
*/
public void setController(PortfolioController controller) {
searchQueryHandler = (query) -> controller.handleSearchQuery(query);
sortHandle = (sortAction) -> controller.sortSharesBy(sortAction);
playerInfoSection.finishButtonClicked(() -> controller.eventFinishGame());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public PlayerInfoSection() {
List<Label> labels = List.of(netWorth, playerStatus, totalSharesOwned);
labels.forEach(l -> l.getStyleClass().add("portfolio-box-text"));

// Override
netWorthTotalChange.getStyleClass().clear();
netWorthTotalChange.getStyleClass().add("portfolio-box-text");

finishGameButton = new Button("Finish game");
finishGameButton.getStyleClass().add("button");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public Parent createNavigation() {
return UIFactory.createNavigation(title = new Label(),
List.of(
"Home",
"Newspaper"),
"Newspaper"),
() -> SceneManager.switchTo(SceneFactory.createExchangeView(true)),
() -> SceneManager.switchTo(SceneFactory.createNewspaperView(stockSymbol)));
}
Expand Down Expand Up @@ -110,7 +110,7 @@ public Parent createToolbar() {
@Override
public Parent createMenu() {
return UIFactory.createMenu("Account",
List.of("Portfolio", "Transactions"),
List.of("Portfolio", "Transactions"),
() -> SceneManager.switchTo(SceneFactory.createPortfolioView()),
() -> SceneManager.switchTo(SceneFactory.createTransactionView()));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,18 @@ public TransactionController(TransactionModel model) {
List<Transaction> initialTransactionLoad = session.getPlayer().getTransactionArchive().getTransactions();
transactionsSorted.addAll(initialTransactionLoad);
setTransactionModel(initialTransactionLoad);

initController();
}

/**
* Method for initializing controller.
* <p>
* Activates listener to searchbar query.
* </p>
*/
public void initController() {
model.searchQueryProperty().addListener((obs) -> handleSearchQuery());
}

/**
Expand All @@ -74,14 +86,15 @@ public void setTransactionModel(List<Transaction> list) {
*
* @param query - Searchbar input.
*/
public void handleSearchQuery(String query) {
if (query == null || query.isBlank()) {
public void handleSearchQuery() {
if (model.searchQueryProperty().get() == null || model.searchQueryProperty().get().isBlank()) {
setTransactionModel(transactionsSorted);
return;
}

List<Transaction> transactionsFound = transactionsSorted.stream()
.filter(transaction -> transaction.getShare().getStock().toString().toLowerCase().contains(query.toLowerCase()))
.filter(transaction -> transaction.getShare().getStock().toString().toLowerCase()
.contains(model.searchQueryProperty().get().toLowerCase()))
.toList();

setTransactionModel(transactionsFound);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import edu.ntnu.idi.idatt.view.components.Model;
import edu.ntnu.idi.idatt.view.components.elements.TransactionComponent;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

Expand All @@ -11,6 +12,7 @@
public class TransactionModel implements Model {

private final ObservableList<TransactionComponent> transactionList = FXCollections.observableArrayList();
private final SimpleStringProperty searchQueryProperty = new SimpleStringProperty();

/**
* Getter for the transactionList.
Expand All @@ -21,4 +23,13 @@ public ObservableList<TransactionComponent> getTransactionList() {
return transactionList;
}

/**
* Getter for search query property.
*
* @return SimpleStringProperty;
*/
public SimpleStringProperty searchQueryProperty() {
return searchQueryProperty;
}

}
Loading

0 comments on commit e4b98e9

Please sign in to comment.