From 4cecbe4c76d9f2b2cac22de04608de8a54055b04 Mon Sep 17 00:00:00 2001 From: emilfa Date: Tue, 24 Mar 2026 16:11:49 +0100 Subject: [PATCH] refactor: changed view to work with new controller structure --- src/main/java/edu/group5/app/view/Header.java | 16 +++--- .../app/view/causespage/CausesPageView.java | 52 ++++++++++++------- .../app/view/causespage/OrganizationCard.java | 15 ++++-- .../view/donationpage/DonationPageView.java | 22 +++++--- .../donationpage/PaymentCompletePageView.java | 11 ++-- .../app/view/homepage/HomePageView.java | 16 +++--- .../app/view/loginpage/LoginPageView.java | 31 +++++++---- .../app/view/loginpage/SignInPageView.java | 33 +++++++++--- .../OrganizationPageView.java | 21 +++++--- .../app/view/userpage/UserPageView.java | 52 +++++++++++-------- 10 files changed, 169 insertions(+), 100 deletions(-) diff --git a/src/main/java/edu/group5/app/view/Header.java b/src/main/java/edu/group5/app/view/Header.java index 4bc8284..35472e1 100644 --- a/src/main/java/edu/group5/app/view/Header.java +++ b/src/main/java/edu/group5/app/view/Header.java @@ -1,6 +1,6 @@ package edu.group5.app.view; -import edu.group5.app.control.PageController; +import edu.group5.app.control.NavigationController; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.image.Image; @@ -8,9 +8,9 @@ import javafx.scene.layout.*; public class Header extends BorderPane { - private final PageController controller; + private final NavigationController controller; - public Header(PageController controller) { + public Header(NavigationController controller) { this.controller = controller; getStylesheets().add(getClass().getResource("/header/header.css").toExternalForm()); setId("header"); @@ -24,7 +24,7 @@ private StackPane getLogoSection() { StackPane logoSection = new StackPane(); logoSection.setId("logo-section"); logoSection.setAlignment(Pos.CENTER); - logoSection.setOnMouseClicked(e -> controller.handleHomeBtn()); + logoSection.setOnMouseClicked(e -> controller.showHomePage()); logoSection.setStyle("-fx-cursor: hand;"); ImageView logo = new ImageView( @@ -44,15 +44,15 @@ private HBox getNavBar() { navbar.setSpacing(10); Button home = new Button("Home"); - home.setOnAction(e -> controller.handleHomeBtn()); + home.setOnAction(e -> controller.showHomePage()); home.setStyle("-fx-cursor: hand;"); Button causes = new Button("Causes"); - causes.setOnAction(e -> controller.handleCausesBtn()); + causes.setOnAction(e -> controller.showCausesPage()); causes.setStyle("-fx-cursor: hand;"); Button about = new Button("About us"); - about.setOnAction(e -> controller.handleAboutBtn()); + about.setOnAction(e -> controller.showAboutUsPage()); about.setStyle("-fx-cursor: hand;"); navbar.getChildren().addAll(home, causes, about); @@ -63,7 +63,7 @@ private StackPane getProfileSection() { StackPane profileSection = new StackPane(); profileSection.setId("profile-section"); profileSection.setAlignment(Pos.CENTER); - profileSection.setOnMouseClicked(e -> controller.handleProfileBtn()); + profileSection.setOnMouseClicked(e -> controller.showUserPage()); profileSection.setStyle("-fx-cursor: hand;"); ImageView avatar = new ImageView( diff --git a/src/main/java/edu/group5/app/view/causespage/CausesPageView.java b/src/main/java/edu/group5/app/view/causespage/CausesPageView.java index d19b735..4784bcd 100644 --- a/src/main/java/edu/group5/app/view/causespage/CausesPageView.java +++ b/src/main/java/edu/group5/app/view/causespage/CausesPageView.java @@ -1,21 +1,30 @@ -package edu.group5.app.view.browsepage; +package edu.group5.app.view.causespage; -import edu.group5.app.control.PageController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.control.OrganizationController; +import edu.group5.app.model.AppState; import edu.group5.app.model.organization.Organization; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; import javafx.scene.layout.*; +import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; -public class BrowsePageView extends BorderPane { - private final PageController controller; +public class CausesPageView extends BorderPane { + private final AppState appState; + private final NavigationController nav; + private final OrganizationController orgController; + private GridPane organizationGrid; private Map allOrganizations; - public BrowsePageView(PageController controller) { - this.controller = controller; + public CausesPageView(AppState appState, NavigationController nav, OrganizationController orgController) { + this.appState = appState; + this.nav = nav; + this.orgController = orgController; + getStylesheets().add(getClass().getResource("/browsepage/browsepage.css").toExternalForm()); setCenter(createBody()); } @@ -62,30 +71,33 @@ private GridPane createOrganizationSection(String searchTerm) { grid.setMaxWidth(Double.MAX_VALUE); if (allOrganizations == null) { - System.out.println("Controller: " + controller.getMainController().getOrganizationService()); - allOrganizations = controller.getMainController().getOrganizationService().getTrustedOrganizations(); + allOrganizations = orgController.getTrustedOrgs(); } - // Filter organizations by search term - Map organizations = filterOrganizations(searchTerm); + Map organizations = new HashMap<>(); + if (searchTerm != null) { + // Filter organizations by search term + organizations = filterOrganizations(searchTerm); + } else { + organizations = allOrganizations; + } int column = 0; int row = 0; - for (int i = 0; i < 16; i++) { - for (Organization org : organizations.values()) { - String defaultImg = "/browsepage/images/children_of_shambala.png"; - BrowseCard card = new BrowseCard(controller, org, defaultImg); + for (Organization org : organizations.values()) { + String defaultImg = "/browsepage/images/children_of_shambala.png"; + OrganizationCard card = new OrganizationCard(appState, nav, org, defaultImg); - grid.add(card, column, row); + grid.add(card, column, row); - column++; + column++; - if (column == 4) { - column = 0; - row++; - } + if (column == 4) { + column = 0; + row++; } } + for (int i = 0; i < 4; i++) { ColumnConstraints col = new ColumnConstraints(); col.setPercentWidth(25); diff --git a/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java b/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java index ccdb76a..389b934 100644 --- a/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java +++ b/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java @@ -1,5 +1,7 @@ package edu.group5.app.view.causespage; +import edu.group5.app.control.NavigationController; +import edu.group5.app.model.AppState; import edu.group5.app.model.organization.Organization; import javafx.geometry.Pos; import javafx.scene.image.Image; @@ -8,12 +10,14 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; -public class OrgCard extends VBox { +public class OrganizationCard extends VBox { + private final AppState appState; private final Organization organization; - private final PageController controller; + private final NavigationController nav; - public OrgCard(PageController controller, Organization org, String img) { - this.controller = controller; + public OrganizationCard(AppState appstate, NavigationController nav, Organization org, String img) { + this.appState = appstate; + this.nav = nav; this.organization = org; setId("mainContainer"); getStylesheets().add(getClass().getResource("/browsepage/browse_org.css").toExternalForm()); @@ -25,7 +29,8 @@ public OrgCard(PageController controller, Organization org, String img) { ); setOnMouseClicked(e -> { - controller.handleBrowseCardClick(organization); + appstate.setCurrentOrganization(organization); + nav.showOrganizationPage(); }); setSpacing(10); diff --git a/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java b/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java index 31919f4..5087267 100644 --- a/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java +++ b/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java @@ -1,6 +1,8 @@ package edu.group5.app.view.donationpage; -import edu.group5.app.control.PageController; +import edu.group5.app.control.DonationController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.model.AppState; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -20,12 +22,18 @@ import java.util.Map; public class DonationPageView extends BorderPane { - private final PageController controller; + private final AppState appState; + private final NavigationController nav; + private final DonationController donationController; + private final List allDonationElements = new ArrayList<>(); private final Map elementAmounts = new HashMap<>(); - public DonationPageView(PageController controller) { - this.controller = controller; + public DonationPageView(AppState appState, NavigationController nav, DonationController donationController) { + this.appState = appState; + this.nav = nav; + this.donationController = donationController; + getStylesheets().add(getClass().getResource("/donationpage/donation.css").toExternalForm()); VBox content = new VBox(); @@ -94,7 +102,6 @@ private VBox createCustomButton() { box.setAlignment(Pos.CENTER); box.getStyleClass().add("donation-button"); - box.setOnMouseClicked(e -> { try { BigDecimal amount = new BigDecimal(amountField.getText().trim()); @@ -103,7 +110,6 @@ private VBox createCustomButton() { } catch (NumberFormatException exception) { System.err.println("Invalid custom donation amount: " + amountField.getText()); } - }); allDonationElements.add(box); @@ -112,7 +118,7 @@ private VBox createCustomButton() { private HBox createDonateSection() { Button donateBtn = new Button("Donate"); donateBtn.getStyleClass().add("donate-button"); - donateBtn.setOnAction(e -> controller.handleDonationBtn()); + donateBtn.setOnAction(e -> donationController.handleDonate()); HBox section = new HBox(donateBtn); section.setAlignment(Pos.CENTER); @@ -135,7 +141,7 @@ private void selectDonationElement(Node element) { private void extractAndStoreAmount(Node element) { BigDecimal amount = elementAmounts.get(element); if (amount != null) { - controller.setCurrentDonationAmount(amount); + appState.setCurrentDonationAmount(amount); } else { System.err.println("Error: No amount found for selected element"); } diff --git a/src/main/java/edu/group5/app/view/donationpage/PaymentCompletePageView.java b/src/main/java/edu/group5/app/view/donationpage/PaymentCompletePageView.java index 2cd407b..fcefe97 100644 --- a/src/main/java/edu/group5/app/view/donationpage/PaymentCompletePageView.java +++ b/src/main/java/edu/group5/app/view/donationpage/PaymentCompletePageView.java @@ -1,6 +1,6 @@ package edu.group5.app.view.donationpage; -import edu.group5.app.control.PageController; +import edu.group5.app.control.NavigationController; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -9,14 +9,13 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; -import java.awt.*; import java.util.Objects; public class PaymentCompletePageView extends BorderPane { - private final PageController controller; + private final NavigationController nav; - public PaymentCompletePageView(PageController controller) { - this.controller = controller; + public PaymentCompletePageView(NavigationController nav) { + this.nav = nav; getStylesheets().add(getClass().getResource("/donationpage/paymentcomplete.css").toExternalForm()); VBox content = new VBox(20); @@ -40,7 +39,7 @@ public VBox getImageSection() { public Button getHomeBtn() { Button home = new Button("Home"); - home.setOnAction(e -> controller.handleHomeBtn()); + home.setOnAction(e -> nav.showHomePage()); home.setId("home-button"); return home; } diff --git a/src/main/java/edu/group5/app/view/homepage/HomePageView.java b/src/main/java/edu/group5/app/view/homepage/HomePageView.java index e61c484..6d398fb 100644 --- a/src/main/java/edu/group5/app/view/homepage/HomePageView.java +++ b/src/main/java/edu/group5/app/view/homepage/HomePageView.java @@ -1,6 +1,7 @@ package edu.group5.app.view.homepage; -import edu.group5.app.control.PageController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.model.AppState; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; @@ -10,10 +11,13 @@ import javafx.scene.text.Text; public class HomePageView extends BorderPane { - private final PageController controller; + private final AppState appState; + private final NavigationController nav; + + public HomePageView(AppState appState, NavigationController nav) { + this.appState = appState; + this.nav = nav; - public HomePageView(PageController controller) { - this.controller = controller; getStylesheets().add(getClass().getResource("/homepage/homepage.css").toExternalForm()); setCenter(createBody()); } @@ -42,10 +46,10 @@ private VBox createIntroductionSection() { h2.setId("h2"); Button donateToACauseBtn = new Button("Donate to a cause"); - donateToACauseBtn.setOnAction(e -> controller.handleDonateToACauseBtn()); + donateToACauseBtn.setOnAction(e -> nav.showCausesPage()); Button aboutUsBtn = new Button("About us"); - aboutUsBtn.setOnAction(e -> controller.handleAboutUsBtn()); + aboutUsBtn.setOnAction(e -> nav.showAboutUsPage()); introductionSection.getChildren().addAll(h1, h2, donateToACauseBtn, aboutUsBtn); return introductionSection; diff --git a/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java b/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java index 0e5f0a6..bedb796 100644 --- a/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java @@ -1,7 +1,8 @@ package edu.group5.app.view.loginpage; - -import edu.group5.app.control.PageController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.control.UserController; +import edu.group5.app.model.AppState; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -12,15 +13,18 @@ import java.util.Objects; public class LoginPageView extends BorderPane { - private final PageController controller; + private final AppState appState; + private final NavigationController nav; + private final UserController userController; + private TextField emailField; private PasswordField passwordField; private Label errorLabel; - public LoginPageView(PageController controller) { - this.controller = controller; - LoginHeader loginHeaderView = new LoginHeader(); - setTop(loginHeaderView); + public LoginPageView(AppState appState, NavigationController nav, UserController userController) { + this.appState = appState; + this.nav = nav; + this.userController = userController; HBox content = new HBox(); content.setFillHeight(true); @@ -55,6 +59,7 @@ private VBox getOuterSection() { outerSection.getChildren().addAll(getLoginBox(), getRegisterBtn()); return outerSection; } + private VBox getLoginBox() { VBox loginSection = new VBox(12); loginSection.setAlignment(Pos.CENTER); @@ -78,6 +83,7 @@ private VBox getEmailBox() { emailBox.getChildren().addAll(new Label("Email"), emailField); return emailBox; } + private VBox getPasswordBox() { VBox passwordBox = new VBox(); passwordBox.setMaxWidth(300); @@ -86,20 +92,27 @@ private VBox getPasswordBox() { passwordBox.getChildren().addAll(new Label("Password"), passwordField); return passwordBox; } + private Button getLoginBtn() { Button loginBtn = new Button("Log In"); loginBtn.setMaxWidth(300); loginBtn.setId("login-btn"); - loginBtn.setOnMouseClicked(e -> controller.handleLoginBtn()); + loginBtn.setOnMouseClicked(e -> userController.handleLogin( + this, + getEmail(), + getPassword() + )); return loginBtn; } + public Button getRegisterBtn() { Button registerBtn = new Button("Don't have an account? Sign In"); registerBtn.setMaxWidth(300); - registerBtn.setOnMouseClicked(e -> controller.handleRegisterBtn()); + registerBtn.setOnMouseClicked(e -> nav.showSignInPage()); registerBtn.setId("register-btn"); return registerBtn; } + private StackPane getImageSection() { StackPane imageSection = new StackPane(); imageSection.setId("image-section"); diff --git a/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java b/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java index 7f147dd..0103870 100644 --- a/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java @@ -1,6 +1,8 @@ package edu.group5.app.view.loginpage; -import edu.group5.app.control.PageController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.control.UserController; +import edu.group5.app.model.AppState; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -12,16 +14,20 @@ public class SignInPageView extends BorderPane { - private final PageController controller; + private final AppState appState; + private final NavigationController nav; + private final UserController userController; + private TextField nameField; private TextField surnameField; private TextField emailField; private PasswordField passwordField; private Label errorLabel; - public SignInPageView(PageController controller) { - this.controller = controller; - setTop(new LoginHeader()); + public SignInPageView(AppState appState, NavigationController nav, UserController userController) { + this.appState = appState; + this.nav = nav; + this.userController = userController; HBox content = new HBox(); content.setFillHeight(true); @@ -37,7 +43,6 @@ public SignInPageView(PageController controller) { } - public String getFirstName() { return nameField.getText(); } @@ -66,6 +71,7 @@ private VBox getOuterSection() { outerSection.getChildren().addAll(getSignInBox(), getBackToLoginBtn()); return outerSection; } + private VBox getSignInBox() { VBox signInSection = new VBox(12); signInSection.setAlignment(Pos.CENTER); @@ -100,6 +106,7 @@ private HBox getNameRow() { return nameRow; } + private VBox getEmailBox() { VBox emailBox = new VBox(); emailBox.setMaxWidth(300); @@ -109,6 +116,7 @@ private VBox getEmailBox() { emailBox.getChildren().addAll(new Label("Email"), emailField); return emailBox; } + private VBox getPasswordBox() { VBox passwordBox = new VBox(); passwordBox.setMaxWidth(300); @@ -117,20 +125,29 @@ private VBox getPasswordBox() { passwordBox.getChildren().addAll(new Label("Password"), passwordField); return passwordBox; } + private Button getSignInBtn() { Button signInBtn = new Button("Sign In"); signInBtn.setMaxWidth(300); signInBtn.setId("login-btn"); - signInBtn.setOnMouseClicked(e -> controller.handleSignInBtn()); + signInBtn.setOnMouseClicked(e -> userController.handleSignIn( + this, + getFirstName(), + getLastName(), + getEmail(), + getPassword() + )); return signInBtn; } + public Button getBackToLoginBtn() { Button backBtn = new Button("Already have an account? Log in"); backBtn.setMaxWidth(300); - backBtn.setOnMouseClicked(e -> controller.handleLoginBtn()); + backBtn.setOnMouseClicked(e -> nav.showLoginPage()); backBtn.setId("register-btn"); return backBtn; } + private StackPane getImageSection() { StackPane imageSection = new StackPane(); imageSection.setId("image-section"); diff --git a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java index 2d2aee6..93cace6 100644 --- a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java +++ b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java @@ -1,6 +1,8 @@ package edu.group5.app.view.organizationpage; -import edu.group5.app.control.PageController; +import edu.group5.app.control.DonationController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.model.AppState; import edu.group5.app.model.organization.Organization; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -15,10 +17,15 @@ import javafx.scene.text.Text; public class OrganizationPageView extends BorderPane { - private final PageController controller; + private final AppState appState; + private final NavigationController nav; + private final DonationController donationController; + + public OrganizationPageView(AppState appState, NavigationController nav, DonationController donationController) { + this.appState = appState; + this.nav = nav; + this.donationController = donationController; - public OrganizationPageView(PageController controller) { - this.controller = controller; getStylesheets().add(getClass().getResource("/organizationpage/organizationpage.css").toExternalForm()); setCenter(createBody()); } @@ -55,7 +62,7 @@ private StackPane createImageContainer() { imageContainer.setPrefWidth(120); imageContainer.setMaxWidth(Double.MAX_VALUE); - Organization org = controller.getCurrentOrganization(); + Organization org = appState.getCurrentOrganization(); String imagePath = "/browsepage/images/children_of_shambala.png"; ImageView logo = new ImageView( @@ -71,7 +78,7 @@ private StackPane createImageContainer() { } private VBox createOrgInfoSection() { - Organization org = controller.getCurrentOrganization(); + Organization org = appState.getCurrentOrganization(); VBox orgInfoSection = new VBox(); orgInfoSection.setSpacing(50); @@ -88,7 +95,7 @@ private VBox createOrgInfoSection() { Button donateBtn = new Button("Donate"); donateBtn.setId("donate-button"); - donateBtn.setOnAction(e -> controller.handleDonateClick()); + donateBtn.setOnAction(e -> nav.showDonationPage()); orgInfoSection.getChildren().addAll(orgNameAndDescription, donateBtn); return orgInfoSection; diff --git a/src/main/java/edu/group5/app/view/userpage/UserPageView.java b/src/main/java/edu/group5/app/view/userpage/UserPageView.java index a538f4d..6fce42c 100644 --- a/src/main/java/edu/group5/app/view/userpage/UserPageView.java +++ b/src/main/java/edu/group5/app/view/userpage/UserPageView.java @@ -1,7 +1,10 @@ package edu.group5.app.view.userpage; -import edu.group5.app.control.PageController; -import edu.group5.app.model.user.Customer; +import edu.group5.app.control.DonationController; +import edu.group5.app.control.NavigationController; +import edu.group5.app.control.OrganizationController; +import edu.group5.app.control.UserController; +import edu.group5.app.model.AppState; import edu.group5.app.model.donation.Donation; import edu.group5.app.model.organization.Organization; import edu.group5.app.model.user.User; @@ -16,18 +19,23 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; +import java.util.*; public class UserPageView extends BorderPane { - private final PageController controller; - private final User currentUser; + private final AppState appState; + private final NavigationController nav; + private final UserController userController; + private final DonationController donationController; + private final OrganizationController organizationController; + + public UserPageView(AppState appState, NavigationController nav, UserController userController, DonationController donationController, OrganizationController organizationController) { + this.appState = appState; + this.nav = nav; + this.userController = userController; + this.donationController = donationController; + this.organizationController = organizationController; - public UserPageView(PageController controller, Customer customer) { - this.controller = controller; - this.currentUser = controller.getCurrentUser(); getStylesheets().add(getClass().getResource("/userpage/userpage.css").toExternalForm()); VBox content = new VBox(30); @@ -37,12 +45,14 @@ public UserPageView(PageController controller, Customer customer) { } private HBox createProfileSection() { - ImageView avatar = new ImageView(new Image(getClass().getResourceAsStream("/userpage/account_circle.png"))); + ImageView avatar = new ImageView(new Image(Objects.requireNonNull(getClass().getResourceAsStream("/userpage/account_circle.png")))); avatar.setFitWidth(150); avatar.setFitHeight(150); avatar.setPreserveRatio(true); avatar.setId("avatar"); + User currentUser = appState.getCurrentUser(); + Text name = new Text(currentUser.getFirstName() + " " + currentUser.getLastName()); name.setId("profile-name"); @@ -54,7 +64,7 @@ private HBox createProfileSection() { Button logoutBtn = new Button("Logout"); logoutBtn.getStyleClass().add("logout-button"); - logoutBtn.setOnAction(e -> controller.logout()); + logoutBtn.setOnAction(e -> userController.handleLogout()); VBox info = new VBox(10, name, email, location, logoutBtn); info.setAlignment(Pos.CENTER_LEFT); @@ -72,13 +82,9 @@ private VBox createCausesSection() { causesBox.getStyleClass().add("section-box"); causesBox.setPadding(new Insets(10)); - HashMap userDonations = controller.getDonationService() - .getDonationRepository().filterByUser(currentUser.getUserId()); + User currentUser = appState.getCurrentUser(); - Set uniqueOrgs = new HashSet<>(); - for (Donation donation : userDonations.values()) { - uniqueOrgs.add(donation.organizationId()); - } + Set uniqueOrgs = donationController.getUniqueOrgs(); if (uniqueOrgs.isEmpty()) { Label noCauses = new Label("No causes supported yet"); @@ -86,7 +92,7 @@ private VBox createCausesSection() { causesBox.getChildren().add(noCauses); } else { for (int orgId : uniqueOrgs) { - Organization org = controller.getOrganizationService().findByOrgNumber(orgId); + Organization org = organizationController.getOrgById(orgId); if (org != null) { Label causeLabel = new Label("• " + org.name()); causesBox.getChildren().add(causeLabel); @@ -105,8 +111,9 @@ private VBox createDonationsSection() { donationsBox.getStyleClass().add("section-box"); donationsBox.setPadding(new Insets(10)); - HashMap userDonations = controller.getDonationService() - .getDonationRepository().filterByUser(currentUser.getUserId()); + User currentUser = appState.getCurrentUser(); + + Map userDonations = donationController.getUserDonations(currentUser.getUserId()); if (userDonations.isEmpty()) { Label noDonations = new Label("No donations yet"); @@ -114,8 +121,7 @@ private VBox createDonationsSection() { donationsBox.getChildren().add(noDonations); } else { for (Donation donation : userDonations.values()) { - Organization org = controller.getOrganizationService() - .findByOrgNumber(donation.organizationId()); + Organization org = organizationController.getOrgById(donation.organizationId()); String orgName = (org != null) ? org.name() : "Unknown Organization"; Label donationLabel = new Label(