From 050f5921363d06e137d2e171d6661ac377633668 Mon Sep 17 00:00:00 2001 From: emilfa Date: Fri, 20 Mar 2026 12:49:35 +0100 Subject: [PATCH 1/8] refactor: replaced all the page controllers with one PageController --- src/main/java/edu/group5/app/App.java | 11 ++- .../app/control/BrowseCardController.java | 14 ---- .../app/control/BrowsePageController.java | 9 --- .../group5/app/control/HeaderController.java | 28 ------- .../app/control/HomePageController.java | 19 ----- .../app/control/LoginPageController.java | 13 ---- .../group5/app/control/MainController.java | 46 +++++------ .../control/OrganizationPageController.java | 13 ---- .../group5/app/control/PageController.java | 66 ++++++++++++++++ .../app/control/SignInPageController.java | 17 ---- .../donationpage/DonationPageController.java | 16 ---- .../PaymentCompleteController.java | 15 ---- src/main/java/edu/group5/app/view/Header.java | 6 +- .../java/edu/group5/app/view/MainView.java | 78 ++++++++++--------- .../app/view/browsepage/BrowseCard.java | 1 - .../app/view/browsepage/BrowsePageView.java | 17 +--- .../view/donationpage/DonationPageView.java | 1 - .../app/view/homepage/HomePageView.java | 12 +-- .../app/view/loginpage/LoginHeader.java | 1 - .../app/view/loginpage/LoginPageView.java | 3 - .../app/view/loginpage/SignInPageView.java | 2 - .../OrganizationPageView.java | 2 - .../app/view/userpage/UserPageView.java | 1 - 23 files changed, 147 insertions(+), 244 deletions(-) delete mode 100644 src/main/java/edu/group5/app/control/BrowseCardController.java delete mode 100644 src/main/java/edu/group5/app/control/BrowsePageController.java delete mode 100644 src/main/java/edu/group5/app/control/HeaderController.java delete mode 100644 src/main/java/edu/group5/app/control/HomePageController.java delete mode 100644 src/main/java/edu/group5/app/control/LoginPageController.java delete mode 100644 src/main/java/edu/group5/app/control/OrganizationPageController.java create mode 100644 src/main/java/edu/group5/app/control/PageController.java delete mode 100644 src/main/java/edu/group5/app/control/SignInPageController.java delete mode 100644 src/main/java/edu/group5/app/control/donationpage/DonationPageController.java delete mode 100644 src/main/java/edu/group5/app/control/donationpage/PaymentCompleteController.java diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index 6704bd2..b9f0db4 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,6 +1,9 @@ package edu.group5.app; import edu.group5.app.control.MainController; +import edu.group5.app.control.wrapper.DbWrapper; +import edu.group5.app.control.wrapper.OrgApiWrapper; +import edu.group5.app.model.organization.OrganizationRepository; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; @@ -11,11 +14,15 @@ */ public class App extends Application { @Override - public void start(Stage stage) { + public void start(Stage stage) throws InterruptedException { + OrgApiWrapper orgApiWrapper = new OrgApiWrapper("https://app.innsamlingskontrollen.no/api/public/v1/all"); + orgApiWrapper.importData(); + OrganizationRepository organizationRepository = new OrganizationRepository(orgApiWrapper.getData()); + MainController controller = new MainController(); Scene scene = controller.getMainView().getScene(); - controller.showLoginPage(); + controller.showHomePage(); stage.getIcons().add(new Image(getClass().getResource("/header/images/hmh-logo.png").toExternalForm())); stage.setTitle("Help-Me-Help"); diff --git a/src/main/java/edu/group5/app/control/BrowseCardController.java b/src/main/java/edu/group5/app/control/BrowseCardController.java deleted file mode 100644 index 297ba9f..0000000 --- a/src/main/java/edu/group5/app/control/BrowseCardController.java +++ /dev/null @@ -1,14 +0,0 @@ -package edu.group5.app.control; - -public class BrowseCardController { - private final MainController controller; - - public BrowseCardController(MainController mainController) { - this.controller = mainController; - } - - public void handleCardClick() { - System.out.println("Browse Card Clicked"); - controller.showOrganizationPage(); - } -} diff --git a/src/main/java/edu/group5/app/control/BrowsePageController.java b/src/main/java/edu/group5/app/control/BrowsePageController.java deleted file mode 100644 index 0922e68..0000000 --- a/src/main/java/edu/group5/app/control/BrowsePageController.java +++ /dev/null @@ -1,9 +0,0 @@ -package edu.group5.app.control; - -public class BrowsePageController { - private final MainController controller; - - public BrowsePageController(MainController mainController) { - this.controller = mainController; - } -} diff --git a/src/main/java/edu/group5/app/control/HeaderController.java b/src/main/java/edu/group5/app/control/HeaderController.java deleted file mode 100644 index 0a1e424..0000000 --- a/src/main/java/edu/group5/app/control/HeaderController.java +++ /dev/null @@ -1,28 +0,0 @@ -package edu.group5.app.control; - -public class HeaderController { - private final MainController controller; - - public HeaderController(MainController controller) { - this.controller = controller; - } - - public void handleHomeBtn() { - System.out.println("Home button pressed"); - controller.showHomePage(); - } - - public void handleCausesBtn() { - System.out.println("Causes button pressed"); - controller.showBrowsePage(); - } - - public void handleAboutBtn() { - System.out.println("About button pressed"); - } - - public void handleProfileBtn() { - System.out.println("profileSection"); - controller.showUserPage(); - } -} diff --git a/src/main/java/edu/group5/app/control/HomePageController.java b/src/main/java/edu/group5/app/control/HomePageController.java deleted file mode 100644 index 10d3fbf..0000000 --- a/src/main/java/edu/group5/app/control/HomePageController.java +++ /dev/null @@ -1,19 +0,0 @@ -package edu.group5.app.control; - -public class HomePageController { - private final MainController controller; - - public HomePageController(MainController controller) { - this.controller = controller; - } - - public void handleDonateToACauseBtn() { - System.out.println("Donate to a cause button pressed"); - controller.showBrowsePage(); - } - - public void handleAboutUsBtn() { - System.out.println("About us button pressed"); - controller.showAboutUsPage(); - } -} diff --git a/src/main/java/edu/group5/app/control/LoginPageController.java b/src/main/java/edu/group5/app/control/LoginPageController.java deleted file mode 100644 index a06d135..0000000 --- a/src/main/java/edu/group5/app/control/LoginPageController.java +++ /dev/null @@ -1,13 +0,0 @@ -package edu.group5.app.control; - -public class LoginPageController { - private final MainController controller; - - public LoginPageController(MainController controller) { - this.controller = controller; - } - public void handleRegisterBtn() { - System.out.println("Sign in button pressed"); - controller.showSignInPage(); - } -} diff --git a/src/main/java/edu/group5/app/control/MainController.java b/src/main/java/edu/group5/app/control/MainController.java index 8106975..7f48f19 100644 --- a/src/main/java/edu/group5/app/control/MainController.java +++ b/src/main/java/edu/group5/app/control/MainController.java @@ -1,49 +1,41 @@ package edu.group5.app.control; -import edu.group5.app.control.donationpage.DonationPageController; import edu.group5.app.model.user.User; import edu.group5.app.view.MainView; -import edu.group5.app.view.donationpage.DonationPageView; public class MainController { private final MainView view; - private final HeaderController headerController; - private final HomePageController homePageController; - private final BrowsePageController browsePageController; - private final BrowseCardController browseCardController; - private final OrganizationPageController organizationPageController; - private final DonationPageController donationPageController; + private final PageController pageController; private User currentUser; public MainController() { this.view = new MainView(this); - this.headerController = new HeaderController(this); - this.homePageController = new HomePageController(this); - this.browsePageController = new BrowsePageController(this); - this.browseCardController = new BrowseCardController(this); - this.organizationPageController = new OrganizationPageController(this); - this.donationPageController = new DonationPageController(this); + this.pageController = new PageController(this); } - public void setCurrentUser(User user) { - this.currentUser = user; + public PageController getPageController() { + return this.pageController; } - public User getCurrentUser() { - return this.currentUser; - } - - public void logout() { - currentUser = null; - showLoginPage(); - } +// public void setCurrentUser(User user) { +// this.currentUser = user; +// } +// +// public User getCurrentUser() { +// return this.currentUser; +// } +// +// public void logout() { +// currentUser = null; +// showLoginPage(); +// } public MainView getMainView() { return view; } public void showHomePage() { - view.showHomePage(homePageController, headerController); + view.showHomePage(); } public void showLoginPage() { @@ -56,11 +48,11 @@ public void showPaymentCompletePage() { view.showPaymentCompletePage(); } public void showBrowsePage() { - view.showBrowsePage(browsePageController, browseCardController, headerController); + view.showBrowsePage(); } public void showOrganizationPage() { - view.showOrganizationPage(organizationPageController, headerController); + view.showOrganizationPage(); } public void showDonationPage() { diff --git a/src/main/java/edu/group5/app/control/OrganizationPageController.java b/src/main/java/edu/group5/app/control/OrganizationPageController.java deleted file mode 100644 index dd8f1bf..0000000 --- a/src/main/java/edu/group5/app/control/OrganizationPageController.java +++ /dev/null @@ -1,13 +0,0 @@ -package edu.group5.app.control; - -public class OrganizationPageController { - private final MainController controller; - - public OrganizationPageController(MainController controller) { - this.controller = controller; - } - - public void handleDonateClick() { - controller.showDonationPage(); - } -} diff --git a/src/main/java/edu/group5/app/control/PageController.java b/src/main/java/edu/group5/app/control/PageController.java new file mode 100644 index 0000000..0f52eb7 --- /dev/null +++ b/src/main/java/edu/group5/app/control/PageController.java @@ -0,0 +1,66 @@ +package edu.group5.app.control; + +public class PageController { + private final MainController controller; + + public PageController(MainController controller) { + this.controller = controller; + } + + public void handleHomeBtn() { + System.out.println("Home button pressed"); + controller.showHomePage(); + } + + public void handleCausesBtn() { + System.out.println("Causes button pressed"); + controller.showBrowsePage(); + } + + public void handleAboutBtn() { + System.out.println("About button pressed"); + } + + public void handleProfileBtn() { + System.out.println("profileSection"); + controller.showUserPage(); + } + + public void handleDonateToACauseBtn() { + System.out.println("Donate to a cause button pressed"); + controller.showBrowsePage(); + } + + public void handleRegisterBtn() { + System.out.println("Sign in button pressed"); + controller.showSignInPage(); + } + + public void handleDonateClick() { + controller.showDonationPage(); + } + + + public void handleAboutUsBtn() { + System.out.println("About us button pressed"); + controller.showAboutUsPage(); + } + + public void handleBrowseCardClick() { + controller.showDonationPage(); + } + + public void handleSignInBtn() { + System.out.println("Sign in button pressed"); + controller.showHomePage(); + } + public void handleLoginBtn() { + System.out.println("Back to login button pressed"); + controller.showLoginPage(); + } + + public void handleDonationBtn() { + System.out.println("Donating"); + controller.showPaymentCompletePage(); + } +} diff --git a/src/main/java/edu/group5/app/control/SignInPageController.java b/src/main/java/edu/group5/app/control/SignInPageController.java deleted file mode 100644 index a51e4d5..0000000 --- a/src/main/java/edu/group5/app/control/SignInPageController.java +++ /dev/null @@ -1,17 +0,0 @@ -package edu.group5.app.control; - -public class SignInPageController { - private final MainController controller; - - public SignInPageController(MainController controller) { - this.controller = controller; - } - public void handleSignInBtn() { - System.out.println("Sign in button pressed"); - controller.showHomePage(); - } - public void handleLoginBtn() { - System.out.println("Back to login button pressed"); - controller.showLoginPage(); - } -} diff --git a/src/main/java/edu/group5/app/control/donationpage/DonationPageController.java b/src/main/java/edu/group5/app/control/donationpage/DonationPageController.java deleted file mode 100644 index 248c4a1..0000000 --- a/src/main/java/edu/group5/app/control/donationpage/DonationPageController.java +++ /dev/null @@ -1,16 +0,0 @@ -package edu.group5.app.control.donationpage; - -import edu.group5.app.control.MainController; - -public class DonationPageController { - private final MainController controller; - - public DonationPageController(MainController controller) { - this.controller = controller; - } - public void handleDonationBtn() { - System.out.println("Donating"); - controller.showPaymentCompletePage(); - } - -} diff --git a/src/main/java/edu/group5/app/control/donationpage/PaymentCompleteController.java b/src/main/java/edu/group5/app/control/donationpage/PaymentCompleteController.java deleted file mode 100644 index d1bc3a5..0000000 --- a/src/main/java/edu/group5/app/control/donationpage/PaymentCompleteController.java +++ /dev/null @@ -1,15 +0,0 @@ -package edu.group5.app.control.donationpage; - -import edu.group5.app.control.MainController; - -public class PaymentCompleteController { - private final MainController controller; - - public PaymentCompleteController(MainController controller) { - this.controller = controller; - } - public void handleHomeBtn() { - System.out.println("Home button pressed"); - controller.showHomePage(); - } -} diff --git a/src/main/java/edu/group5/app/view/Header.java b/src/main/java/edu/group5/app/view/Header.java index 1edc5e4..4bc8284 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.HeaderController; +import edu.group5.app.control.PageController; 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 HeaderController controller; + private final PageController controller; - public Header(HeaderController controller) { + public Header(PageController controller) { this.controller = controller; getStylesheets().add(getClass().getResource("/header/header.css").toExternalForm()); setId("header"); diff --git a/src/main/java/edu/group5/app/view/MainView.java b/src/main/java/edu/group5/app/view/MainView.java index 27eeac5..42999ff 100644 --- a/src/main/java/edu/group5/app/view/MainView.java +++ b/src/main/java/edu/group5/app/view/MainView.java @@ -1,6 +1,7 @@ package edu.group5.app.view; import edu.group5.app.control.*; +import edu.group5.app.model.organization.OrganizationRepository; import edu.group5.app.view.browsepage.BrowsePageView; import edu.group5.app.control.*; import edu.group5.app.control.donationpage.DonationPageController; @@ -16,60 +17,65 @@ import javafx.scene.Scene; import javafx.scene.layout.BorderPane; -public class MainView { - private final HeaderController headerController; - private final HomePageController homePageController; - private final LoginPageController loginPageController; - private final SignInPageController signInPageController; - private final DonationPageController donationPageController; - private final PaymentCompleteController paymentCompleteController; - private final Scene scene; - private final BorderPane root; +public class MainView extends BorderPane { + private final MainController controller; + private final HomePageView homePageView; + private final LoginPageView loginPageView; + private final SignInPageView signInPageView; + private final BrowsePageView browsePageView; + private final OrganizationPageView organizationPageView; + private final DonationPageView donationPageView; + private final PaymentCompletePageView paymentCompletePageView; + private final UserPageView userPageView; - public MainView(MainController mainController) { - this.headerController = new HeaderController(mainController); - this.homePageController = new HomePageController(mainController); - this.loginPageController = new LoginPageController(mainController); - this.signInPageController = new SignInPageController(mainController); - this.donationPageController = new DonationPageController(mainController); - this.paymentCompleteController = new PaymentCompleteController(mainController); - this.root = new BorderPane(); - this.scene = new Scene(root, 1280, 720); - } + public MainView(MainController controller) { + this.controller = controller; + Header header = new Header(controller.getPageController()); + this.homePageView = new HomePageView(); + this.loginPageView = new LoginPageView(); + this.signInPageView = new SignInPageView(); + this.browsePageView = new BrowsePageView(); + this.organizationPageView = new OrganizationPageView(); + this.donationPageView = new DonationPageView(); + this.paymentCompletePageView = new PaymentCompletePageView(); + this.userPageView = new UserPageView(); - public Scene getScene() { - return this.scene; - } + Scene root = new Scene(this, 1280, 720); + + setTop(header); - public Scene createView() { - root.setCenter(new LoginPageView(loginPageController)); - return new Scene(root, 1280, 720); +// this.headerController = new HeaderController(mainController); +// this.homePageController = new HomePageController(mainController); +// this.loginPageController = new LoginPageController(mainController); +// this.signInPageController = new SignInPageController(mainController); +// this.donationPageController = new DonationPageController(mainController); +// this.paymentCompleteController = new PaymentCompleteController(mainController); } - public void showHomePage(HomePageController homePageController, HeaderController headerController) { - root.setCenter(new HomePageView(homePageController, headerController)); + public void showHomePage() { + setCenter(this.homePageView); } public void showLoginPage() { - root.setCenter(new LoginPageView(loginPageController)); + setCenter(this.loginPageView); } - public void showBrowsePage(BrowsePageController browsePageController, BrowseCardController browseCardController, HeaderController headerController) { - root.setCenter(new BrowsePageView(getScene(), browsePageController, browseCardController, headerController)); + public void showBrowsePage() { + setCenter(this.browsePageView); } - public void showOrganizationPage(OrganizationPageController organizationController, HeaderController headerController) { - root.setCenter(new OrganizationPageView(organizationController, headerController)); + public void showOrganizationPage() { + setCenter(this.organizationPageView); } public void showSignInPage() { - root.setCenter(new SignInPageView(signInPageController)); + setCenter(this.signInPageView); } public void showDonationPage() { - root.setCenter(new DonationPageView(donationPageController, headerController)); + setCenter(this.donationPageView); } public void showPaymentCompletePage() { - root.setCenter(new PaymentCompletePageView(paymentCompleteController)); + setCenter(this.paymentCompletePageView); } public void showAboutUsPage() {} @@ -82,6 +88,6 @@ public void showUserPage() { "aurafarmer@gmail.com", "hashedpassword" ); - root.setCenter(new UserPageView(headerController, testCustomer)); + setCenter(this.userPageView); } } diff --git a/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java b/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java index 02cc094..5184614 100644 --- a/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java +++ b/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java @@ -1,6 +1,5 @@ package edu.group5.app.view.browsepage; -import edu.group5.app.control.BrowseCardController; import javafx.geometry.Pos; import javafx.scene.image.Image; import javafx.scene.image.ImageView; diff --git a/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java b/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java index 4cb54b2..5ecce7e 100644 --- a/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java +++ b/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java @@ -1,27 +1,18 @@ package edu.group5.app.view.browsepage; -import edu.group5.app.control.BrowseCardController; -import edu.group5.app.control.BrowsePageController; -import edu.group5.app.control.HeaderController; -import edu.group5.app.view.Header; import javafx.geometry.Pos; -import javafx.scene.Scene; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; import javafx.scene.layout.*; public class BrowsePageView extends BorderPane { - private final Scene scene; private final BrowsePageController controller; - private final BrowseCardController orgController; + private final BrowseCardController browseCardController; - public BrowsePageView(Scene mainScene, BrowsePageController browsePageController, BrowseCardController browseCardController, HeaderController headerController) { - this.scene = mainScene; + public BrowsePageView(BrowsePageController browsePageController, BrowseCardController browseCardController) { this.controller = browsePageController; - this.orgController = browseCardController; + this.browseCardController = browseCardController; getStylesheets().add(getClass().getResource("/browsepage/browsepage.css").toExternalForm()); - Header headerView = new Header(headerController); - setTop(headerView); setCenter(createBody()); } @@ -57,7 +48,7 @@ private GridPane createOrganizationSection() { int column = 0; int row = 0; for (int i = 0; i < 16; i++) { - BrowseCard card = new BrowseCard(orgController, "/browsepage/images/children_of_shambala.png", "Shambala Foundation"); + BrowseCard card = new BrowseCard(browseCardController, "/browsepage/images/children_of_shambala.png", "Shambala Foundation"); GridPane.setFillWidth(card, true); grid.setAlignment(Pos.CENTER); 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 5cf7171..49b0d7b 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,5 @@ package edu.group5.app.view.donationpage; -import edu.group5.app.control.HeaderController; import edu.group5.app.control.donationpage.DonationPageController; import edu.group5.app.view.Header; import javafx.geometry.Insets; 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 5510daa..e61c484 100644 --- a/src/main/java/edu/group5/app/view/homepage/HomePageView.java +++ b/src/main/java/edu/group5/app/view/homepage/HomePageView.java @@ -1,8 +1,6 @@ package edu.group5.app.view.homepage; -import edu.group5.app.control.HeaderController; -import edu.group5.app.control.HomePageController; -import edu.group5.app.view.Header; +import edu.group5.app.control.PageController; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; @@ -12,13 +10,11 @@ import javafx.scene.text.Text; public class HomePageView extends BorderPane { - private final HomePageController controller; + private final PageController controller; - public HomePageView(HomePageController homePageController, HeaderController headerController) { - this.controller = homePageController; + public HomePageView(PageController controller) { + this.controller = controller; getStylesheets().add(getClass().getResource("/homepage/homepage.css").toExternalForm()); - Header headerView = new Header(headerController); - setTop(headerView); setCenter(createBody()); } diff --git a/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java b/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java index decd5a1..793edb9 100644 --- a/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java +++ b/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java @@ -1,6 +1,5 @@ package edu.group5.app.view.loginpage; -import edu.group5.app.control.HeaderController; import javafx.geometry.Pos; import javafx.scene.image.Image; import javafx.scene.image.ImageView; 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 d555301..b08423c 100644 --- a/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java @@ -1,9 +1,6 @@ package edu.group5.app.view.loginpage; -import edu.group5.app.control.HeaderController; -import edu.group5.app.control.LoginPageController; -import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; 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 1c5ddae..462a1a5 100644 --- a/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java @@ -1,7 +1,5 @@ package edu.group5.app.view.loginpage; -import edu.group5.app.control.HeaderController; -import edu.group5.app.control.SignInPageController; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; 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 4155ccd..ca0d8e6 100644 --- a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java +++ b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java @@ -1,7 +1,5 @@ package edu.group5.app.view.organizationpage; -import edu.group5.app.control.HeaderController; -import edu.group5.app.control.OrganizationPageController; import edu.group5.app.view.Header; import javafx.geometry.Pos; import javafx.scene.control.Button; 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 547b812..152c281 100644 --- a/src/main/java/edu/group5/app/view/userpage/UserPageView.java +++ b/src/main/java/edu/group5/app/view/userpage/UserPageView.java @@ -1,6 +1,5 @@ package edu.group5.app.view.userpage; -import edu.group5.app.control.HeaderController; import edu.group5.app.model.user.Customer; import edu.group5.app.view.Header; import javafx.geometry.Insets; From c3b2cacf9565290cc99bb074eb05c76caf6e0730 Mon Sep 17 00:00:00 2001 From: emilfa Date: Fri, 20 Mar 2026 12:52:31 +0100 Subject: [PATCH 2/8] refactor: made application run with new controller structure --- .../java/edu/group5/app/view/MainView.java | 19 ++++++++----------- .../app/view/browsepage/BrowseCard.java | 9 +++++---- .../app/view/browsepage/BrowsePageView.java | 11 +++++------ .../view/donationpage/DonationPageView.java | 12 ++++-------- .../donationpage/PaymentCompletePageView.java | 8 ++++---- .../app/view/loginpage/LoginPageView.java | 7 ++++--- .../app/view/loginpage/SignInPageView.java | 7 ++++--- .../OrganizationPageView.java | 7 +++---- .../app/view/userpage/UserPageView.java | 8 ++++---- 9 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/main/java/edu/group5/app/view/MainView.java b/src/main/java/edu/group5/app/view/MainView.java index 42999ff..3ebf457 100644 --- a/src/main/java/edu/group5/app/view/MainView.java +++ b/src/main/java/edu/group5/app/view/MainView.java @@ -1,11 +1,8 @@ package edu.group5.app.view; import edu.group5.app.control.*; -import edu.group5.app.model.organization.OrganizationRepository; import edu.group5.app.view.browsepage.BrowsePageView; import edu.group5.app.control.*; -import edu.group5.app.control.donationpage.DonationPageController; -import edu.group5.app.control.donationpage.PaymentCompleteController; import edu.group5.app.model.user.Customer; import edu.group5.app.view.donationpage.DonationPageView; import edu.group5.app.view.donationpage.PaymentCompletePageView; @@ -31,14 +28,14 @@ public class MainView extends BorderPane { public MainView(MainController controller) { this.controller = controller; Header header = new Header(controller.getPageController()); - this.homePageView = new HomePageView(); - this.loginPageView = new LoginPageView(); - this.signInPageView = new SignInPageView(); - this.browsePageView = new BrowsePageView(); - this.organizationPageView = new OrganizationPageView(); - this.donationPageView = new DonationPageView(); - this.paymentCompletePageView = new PaymentCompletePageView(); - this.userPageView = new UserPageView(); + this.homePageView = new HomePageView(controller.getPageController()); + this.loginPageView = new LoginPageView(controller.getPageController()); + this.signInPageView = new SignInPageView(controller.getPageController()); + this.browsePageView = new BrowsePageView(controller.getPageController()); + this.organizationPageView = new OrganizationPageView(controller.getPageController()); + this.donationPageView = new DonationPageView(controller.getPageController()); + this.paymentCompletePageView = new PaymentCompletePageView(controller.getPageController()); + this.userPageView = new UserPageView(controller.getPageController(), new Customer(1, "John", "Pedersen", "jh@gmail.com", "1234")); Scene root = new Scene(this, 1280, 720); diff --git a/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java b/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java index 5184614..3a46244 100644 --- a/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java +++ b/src/main/java/edu/group5/app/view/browsepage/BrowseCard.java @@ -1,5 +1,6 @@ package edu.group5.app.view.browsepage; +import edu.group5.app.control.PageController; import javafx.geometry.Pos; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -8,10 +9,10 @@ import javafx.scene.text.Text; public class BrowseCard extends VBox { - private final BrowseCardController controller; + private final PageController controller; - public BrowseCard(BrowseCardController browseCardController, String img, String name) { - this.controller = browseCardController; + public BrowseCard(PageController controller, String img, String name) { + this.controller = controller; setId("mainContainer"); getStylesheets().add(getClass().getResource("/browsepage/browse_org.css").toExternalForm()); @@ -22,7 +23,7 @@ public BrowseCard(BrowseCardController browseCardController, String img, String ); setOnMouseClicked(e -> { - controller.handleCardClick(); + controller.handleBrowseCardClick(); }); setSpacing(20); diff --git a/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java b/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java index 5ecce7e..b529765 100644 --- a/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java +++ b/src/main/java/edu/group5/app/view/browsepage/BrowsePageView.java @@ -1,17 +1,16 @@ package edu.group5.app.view.browsepage; +import edu.group5.app.control.PageController; import javafx.geometry.Pos; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; import javafx.scene.layout.*; public class BrowsePageView extends BorderPane { - private final BrowsePageController controller; - private final BrowseCardController browseCardController; + private final PageController controller; - public BrowsePageView(BrowsePageController browsePageController, BrowseCardController browseCardController) { - this.controller = browsePageController; - this.browseCardController = browseCardController; + public BrowsePageView(PageController controller) { + this.controller = controller; getStylesheets().add(getClass().getResource("/browsepage/browsepage.css").toExternalForm()); setCenter(createBody()); } @@ -48,7 +47,7 @@ private GridPane createOrganizationSection() { int column = 0; int row = 0; for (int i = 0; i < 16; i++) { - BrowseCard card = new BrowseCard(browseCardController, "/browsepage/images/children_of_shambala.png", "Shambala Foundation"); + BrowseCard card = new BrowseCard(controller, "/browsepage/images/children_of_shambala.png", "Shambala Foundation"); GridPane.setFillWidth(card, true); grid.setAlignment(Pos.CENTER); 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 49b0d7b..f521657 100644 --- a/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java +++ b/src/main/java/edu/group5/app/view/donationpage/DonationPageView.java @@ -1,7 +1,6 @@ package edu.group5.app.view.donationpage; -import edu.group5.app.control.donationpage.DonationPageController; -import edu.group5.app.view.Header; +import edu.group5.app.control.PageController; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -14,15 +13,12 @@ import javafx.scene.text.TextAlignment; public class DonationPageView extends BorderPane { - private final DonationPageController controller; + private final PageController controller; - public DonationPageView(DonationPageController donationPageController, HeaderController headerController) { - this.controller = donationPageController; + public DonationPageView(PageController controller) { + this.controller = controller; getStylesheets().add(getClass().getResource("/donationpage/donation.css").toExternalForm()); - Header headerView = new Header(headerController); - setTop(headerView); - VBox content = new VBox(); content.getChildren().addAll(createDonationGrid(), createDonateSection()); setCenter(content); 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 d563fef..2cd407b 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.donationpage.PaymentCompleteController; +import edu.group5.app.control.PageController; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -13,10 +13,10 @@ import java.util.Objects; public class PaymentCompletePageView extends BorderPane { - private final PaymentCompleteController controller; + private final PageController controller; - public PaymentCompletePageView(PaymentCompleteController paymentCompleteController) { - this.controller = paymentCompleteController; + public PaymentCompletePageView(PageController controller) { + this.controller = controller; getStylesheets().add(getClass().getResource("/donationpage/paymentcomplete.css").toExternalForm()); VBox content = new VBox(20); 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 b08423c..ba306ee 100644 --- a/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/LoginPageView.java @@ -1,6 +1,7 @@ package edu.group5.app.view.loginpage; +import edu.group5.app.control.PageController; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -11,10 +12,10 @@ import java.util.Objects; public class LoginPageView extends BorderPane { - private final LoginPageController controller; + private final PageController controller; - public LoginPageView(LoginPageController loginPageController) { - this.controller = loginPageController; + public LoginPageView(PageController controller) { + this.controller = controller; LoginHeader loginHeaderView = new LoginHeader(); setTop(loginHeaderView); 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 462a1a5..01b0a44 100644 --- a/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java @@ -1,5 +1,6 @@ package edu.group5.app.view.loginpage; +import edu.group5.app.control.PageController; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -11,10 +12,10 @@ public class SignInPageView extends BorderPane { - private final SignInPageController controller; + private final PageController controller; - public SignInPageView(SignInPageController signInPageController) { - this.controller = signInPageController; + public SignInPageView(PageController controller) { + this.controller = controller; setTop(new LoginHeader()); HBox content = new HBox(); 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 ca0d8e6..24ee8f7 100644 --- a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java +++ b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java @@ -1,5 +1,6 @@ package edu.group5.app.view.organizationpage; +import edu.group5.app.control.PageController; import edu.group5.app.view.Header; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -14,13 +15,11 @@ import javafx.scene.text.Text; public class OrganizationPageView extends BorderPane { - private final OrganizationPageController controller; + private final PageController controller; - public OrganizationPageView(OrganizationPageController controller, HeaderController headerController) { + public OrganizationPageView(PageController controller) { this.controller = controller; getStylesheets().add(getClass().getResource("/organizationpage/organizationpage.css").toExternalForm()); - Header headerView = new Header(headerController); - setTop(headerView); setCenter(createBody()); } 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 152c281..2678ae8 100644 --- a/src/main/java/edu/group5/app/view/userpage/UserPageView.java +++ b/src/main/java/edu/group5/app/view/userpage/UserPageView.java @@ -1,5 +1,6 @@ package edu.group5.app.view.userpage; +import edu.group5.app.control.PageController; import edu.group5.app.model.user.Customer; import edu.group5.app.view.Header; import javafx.geometry.Insets; @@ -15,15 +16,14 @@ public class UserPageView extends BorderPane { + private final PageController controller; private final Customer customer; - public UserPageView(HeaderController headerController, Customer customer) { + public UserPageView(PageController controller, Customer customer) { + this.controller = controller; this.customer = customer; getStylesheets().add(getClass().getResource("/userpage/userpage.css").toExternalForm()); - Header headerView = new Header(headerController); - setTop(headerView); - VBox content = new VBox(30); content.setPadding(new Insets(40)); content.getChildren().addAll(createProfileSection(), createCausesSection(), createDonationsSection()); From 7da35bf9de0af4c78a4d49c2ff4ec8f457461c06 Mon Sep 17 00:00:00 2001 From: emilfa Date: Tue, 24 Mar 2026 16:00:26 +0100 Subject: [PATCH 3/8] refactor: divided controllers into Navigation-, User-, Donation- and OrganizationController --- src/main/java/edu/group5/app/App.java | 12 ++- .../app/control/DonationController.java | 80 ++++++++++++++ .../app/control/NavigationController.java | 100 ++++++++---------- .../app/control/OrganizationController.java | 23 ++++ .../group5/app/control/UserController.java | 76 +++++++++++++ 5 files changed, 233 insertions(+), 58 deletions(-) diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index 782922c..c948b42 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,8 +1,9 @@ package edu.group5.app; -import edu.group5.app.control.MainController; +import edu.group5.app.control.NavigationController; import edu.group5.app.control.wrapper.DbWrapper; import edu.group5.app.control.wrapper.OrgApiWrapper; +import edu.group5.app.model.AppState; import edu.group5.app.model.donation.DonationRepository; import edu.group5.app.model.donation.DonationService; import edu.group5.app.model.organization.OrganizationRepository; @@ -12,6 +13,7 @@ import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; +import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import java.util.List; @@ -56,11 +58,13 @@ public void start(Stage stage) { DonationService donationService = new DonationService(donationRepository, organizationRepository); OrganizationService organizationService = new OrganizationService(organizationRepository); - MainController controller = new MainController(userService, donationService, organizationService); + BorderPane root = new BorderPane(); + AppState appState = new AppState(); + NavigationController nav = new NavigationController(root, appState, userService, donationService, organizationService); - Scene scene = controller.getMainView().getScene(); - controller.showLoginPage(); + nav.showLoginPage(); + Scene scene = new Scene(root, 1280, 720); stage.getIcons().add(new Image(getClass().getResource("/header/images/hmh-logo.png").toExternalForm())); stage.setTitle("Help-Me-Help"); stage.setScene(scene); diff --git a/src/main/java/edu/group5/app/control/DonationController.java b/src/main/java/edu/group5/app/control/DonationController.java index 89ac400..97a1c9d 100644 --- a/src/main/java/edu/group5/app/control/DonationController.java +++ b/src/main/java/edu/group5/app/control/DonationController.java @@ -1,4 +1,84 @@ package edu.group5.app.control; +import edu.group5.app.model.AppState; +import edu.group5.app.model.donation.Donation; +import edu.group5.app.model.donation.DonationService; +import edu.group5.app.model.organization.Organization; +import edu.group5.app.model.user.Customer; +import edu.group5.app.model.user.User; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class DonationController { + private final AppState appState; + private final NavigationController nav; + private final DonationService service; + + public DonationController(AppState appState, NavigationController nav, DonationService service) { + this.appState = appState; + this.nav = nav; + this.service = service; + } + + public Map getUserDonations(int userId) { + return service.getDonationRepository().filterByUser(userId); + } + + public Set getUniqueOrgs() { + Map userDonations = getUserDonations(appState.getCurrentUser().getUserId()); + + Set uniqueOrgs = new HashSet<>(); + for (Donation donation : userDonations.values()) { + uniqueOrgs.add(donation.organizationId()); + } + + return uniqueOrgs; + } + + public void handleDonate() { + // Get session data from MainController + User currentUser = appState.getCurrentUser(); + Organization currentOrg = appState.getCurrentOrganization(); + BigDecimal amount = appState.getCurrentDonationAmount(); + + if (currentUser == null) { + System.err.println("Error: No user logged in"); + return; + } + if (!(currentUser instanceof Customer customer)) { + System.err.println("Error: Only customers can donate"); + return; + } + if (currentOrg == null) { + System.err.println("Error: No organization selected"); + return; + } + if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) { + System.err.println("Error: Invalid donation amount"); + return; + } + + // Create donation via service + boolean success = service.donate( + customer, + currentOrg.orgNumber(), + amount, + "Online" + ); + + if (success) { + System.out.println("Donation created: " + amount + " kr to " + currentOrg.name()); + } else { + System.err.println("Failed to create donation"); + } + + // Clear donation session state + appState.setCurrentDonationAmount(null); + + // Navigate to payment complete + nav.showPaymentCompletePage(); + } } diff --git a/src/main/java/edu/group5/app/control/NavigationController.java b/src/main/java/edu/group5/app/control/NavigationController.java index 6a7b3c3..a54e4b6 100644 --- a/src/main/java/edu/group5/app/control/NavigationController.java +++ b/src/main/java/edu/group5/app/control/NavigationController.java @@ -1,99 +1,91 @@ package edu.group5.app.control; +import edu.group5.app.model.AppState; import edu.group5.app.model.donation.DonationService; -import edu.group5.app.model.organization.Organization; import edu.group5.app.model.organization.OrganizationService; -import edu.group5.app.model.user.User; import edu.group5.app.model.user.UserService; -import edu.group5.app.view.ViewManager; - -import java.math.BigDecimal; - -public class MainController { - private final ViewManager view; - +import edu.group5.app.view.Header; +import edu.group5.app.view.causespage.CausesPageView; +import edu.group5.app.view.donationpage.DonationPageView; +import edu.group5.app.view.donationpage.PaymentCompletePageView; +import edu.group5.app.view.homepage.HomePageView; +import edu.group5.app.view.loginpage.LoginHeader; +import edu.group5.app.view.loginpage.LoginPageView; +import edu.group5.app.view.loginpage.SignInPageView; +import edu.group5.app.view.organizationpage.OrganizationPageView; +import edu.group5.app.view.userpage.UserPageView; +import javafx.scene.layout.BorderPane; + +public class NavigationController { + private final BorderPane root; + private final Header header; + private final LoginHeader loginHeader; + + private final AppState appState; private final UserService userService; private final DonationService donationService; private final OrganizationService organizationService; private final UserController userController; + private final DonationController donationController; + private final OrganizationController organizationController; - private User currentUser; - private Organization currentOrganization; - private BigDecimal currentDonationAmount; + public NavigationController(BorderPane root, AppState appState, UserService userService, DonationService donationService, OrganizationService organizationService) { + this.root = root; + this.header = new Header(this); + this.loginHeader = new LoginHeader(); - public MainController(UserService userService, DonationService donationService, - OrganizationService organizationService) { + this.appState = appState; this.userService = userService; this.donationService = donationService; this.organizationService = organizationService; - this.userController = new UserController(this, userService, donationService, organizationService); - - this.view = new ViewManager(this); - } - - public ViewManager getMainView() { - return this.view; - } - - public User getCurrentUser() { - return this.currentUser; - } - - public void setCurrentUser(User user) { - this.currentUser = user; - } - - public Organization getCurrentOrganization() { - return this.currentOrganization; - } - - public void setCurrentOrganization(Organization organization) { - this.currentOrganization = organization; - } - - public BigDecimal getCurrentDonationAmount() { - return this.currentDonationAmount; - } - - public void setCurrentDonationAmount(BigDecimal amount) { - this.currentDonationAmount = amount; + this.userController = new UserController(appState, this, userService); + this.donationController = new DonationController(appState, this, donationService); + this.organizationController = new OrganizationController(appState, this, organizationService); } public void showHomePage() { - view.showHomePage(); + root.setTop(header); + root.setCenter(new HomePageView(appState, this)); } public void showLoginPage() { - view.showLoginPage(); + root.setTop(loginHeader); + root.setCenter(new LoginPageView(appState, this, userController)); } public void showSignInPage() { - view.showSignInPage(); + root.setTop(loginHeader); + root.setCenter(new SignInPageView(appState, this, userController)); } public void showPaymentCompletePage() { - view.showPaymentCompletePage(); + root.setTop(header); + root.setCenter(new PaymentCompletePageView(this)); } public void showCausesPage() { - view.showCausesPage(); + root.setTop(header); + root.setCenter(new CausesPageView(appState, this, organizationController)); } public void showOrganizationPage() { - view.showOrganizationPage(); + root.setTop(header); + root.setCenter(new OrganizationPageView(appState, this, donationController)); } public void showDonationPage() { - view.showDonationPage(); + root.setTop(header); + root.setCenter(new DonationPageView(appState, this, donationController)); } public void showAboutUsPage() { - view.showAboutUsPage(); + root.setTop(header); } public void showUserPage() { - view.showUserPage(); + root.setTop(header); + root.setCenter(new UserPageView(appState, this, userController, donationController, organizationController)); } } diff --git a/src/main/java/edu/group5/app/control/OrganizationController.java b/src/main/java/edu/group5/app/control/OrganizationController.java index 00d08b6..9cbfc7a 100644 --- a/src/main/java/edu/group5/app/control/OrganizationController.java +++ b/src/main/java/edu/group5/app/control/OrganizationController.java @@ -1,4 +1,27 @@ package edu.group5.app.control; +import edu.group5.app.model.AppState; +import edu.group5.app.model.organization.Organization; +import edu.group5.app.model.organization.OrganizationService; + +import java.util.Map; + public class OrganizationController { + private final AppState appState; + private final NavigationController nav; + private final OrganizationService service; + + public OrganizationController(AppState appState, NavigationController nav, OrganizationService service) { + this.appState = appState; + this.nav = nav; + this.service = service; + } + + public Organization getOrgById(int orgId) { + return service.findByOrgNumber(orgId); + } + + public Map getTrustedOrgs() { + return service.getTrustedOrganizations(); + } } diff --git a/src/main/java/edu/group5/app/control/UserController.java b/src/main/java/edu/group5/app/control/UserController.java index 2ee376c..c8d55dd 100644 --- a/src/main/java/edu/group5/app/control/UserController.java +++ b/src/main/java/edu/group5/app/control/UserController.java @@ -1,4 +1,80 @@ package edu.group5.app.control; +import edu.group5.app.model.AppState; +import edu.group5.app.model.donation.Donation; +import edu.group5.app.model.donation.DonationService; +import edu.group5.app.model.organization.Organization; +import edu.group5.app.model.organization.OrganizationService; +import edu.group5.app.model.user.Customer; +import edu.group5.app.model.user.User; +import edu.group5.app.model.user.UserService; +import edu.group5.app.view.loginpage.LoginPageView; +import edu.group5.app.view.loginpage.SignInPageView; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class UserController { + private final AppState appState; + private final NavigationController nav; + private final UserService userService; + + public UserController(AppState appState, NavigationController nav, UserService userService) { + this.appState = appState; + this.nav = nav; + this.userService = userService; + } + + public void handleSignIn(SignInPageView view, String firstName, String lastName, String email, char[] passwordChars) { + if (firstName == null || firstName.trim().isEmpty() || + lastName == null || lastName.trim().isEmpty() || + email == null || email.trim().isEmpty() || + passwordChars == null || passwordChars.length == 0) { + view.showError("All fields are required"); + return; + } + + String password = new String(passwordChars); + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + String hashedPassword = encoder.encode(password); + + boolean success = userService.registerUser( + "Customer", firstName, lastName, email, hashedPassword); + + if (success) { + User user = userService.getUserByEmail(email); + + appState.setCurrentUser(user); + nav.showHomePage(); + } else { + view.showError("Registration failed. Email may already be in use."); + } + } + + public void handleLogin(LoginPageView view, String email, char[] passwordChars) { + if (email == null || email.trim().isEmpty() || passwordChars == null || passwordChars.length == 0) { + view.showError("Email and password are required"); + return; + } + + User user = userService.login(email, passwordChars); + + if (user != null) { + appState.setCurrentUser(user); + nav.showHomePage(); + } else { + view.showError("Invalid email or password"); + } + } + + public void handleLogout() { + appState.setCurrentUser(null); + appState.setCurrentOrganization(null); + appState.setCurrentDonationAmount(null); + nav.showLoginPage(); + } } From 896ca24a35a0077f5eba137f17c7e82d024305fe Mon Sep 17 00:00:00 2001 From: emilfa Date: Tue, 24 Mar 2026 16:08:07 +0100 Subject: [PATCH 4/8] feat: created AppState to keep track of the state of the application --- .../java/edu/group5/app/model/AppState.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/edu/group5/app/model/AppState.java b/src/main/java/edu/group5/app/model/AppState.java index 96901b3..d8dd03a 100644 --- a/src/main/java/edu/group5/app/model/AppState.java +++ b/src/main/java/edu/group5/app/model/AppState.java @@ -1,4 +1,36 @@ package edu.group5.app.model; +import edu.group5.app.model.organization.Organization; +import edu.group5.app.model.user.User; + +import java.math.BigDecimal; + public class AppState { + private User currentUser; + private BigDecimal currentDonationAmount; + private Organization currentOrganization; + + public User getCurrentUser() { + return this.currentUser; + } + + public void setCurrentUser(User user) { + this.currentUser = user; + } + + public Organization getCurrentOrganization() { + return this.currentOrganization; + } + + public void setCurrentOrganization(Organization organization) { + this.currentOrganization = organization; + } + + public BigDecimal getCurrentDonationAmount() { + return this.currentDonationAmount; + } + + public void setCurrentDonationAmount(BigDecimal amount) { + this.currentDonationAmount = amount; + } } From 4cecbe4c76d9f2b2cac22de04608de8a54055b04 Mon Sep 17 00:00:00 2001 From: emilfa Date: Tue, 24 Mar 2026 16:11:49 +0100 Subject: [PATCH 5/8] 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( From e0ef5344cff750644b9eeb947dc49302dc876664 Mon Sep 17 00:00:00 2001 From: emilfa Date: Tue, 24 Mar 2026 16:21:30 +0100 Subject: [PATCH 6/8] fix: removed test css borders --- .../edu/group5/app/view/homepage/HomePageView.java | 2 ++ src/main/resources/header/header.css | 6 ------ src/main/resources/homepage/homepage.css | 11 ++++++++--- 3 files changed, 10 insertions(+), 9 deletions(-) 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 6d398fb..b40299a 100644 --- a/src/main/java/edu/group5/app/view/homepage/HomePageView.java +++ b/src/main/java/edu/group5/app/view/homepage/HomePageView.java @@ -46,9 +46,11 @@ private VBox createIntroductionSection() { h2.setId("h2"); Button donateToACauseBtn = new Button("Donate to a cause"); + donateToACauseBtn.setId("donate-to-cause-btn"); donateToACauseBtn.setOnAction(e -> nav.showCausesPage()); Button aboutUsBtn = new Button("About us"); + aboutUsBtn.setId("about-us-btn"); aboutUsBtn.setOnAction(e -> nav.showAboutUsPage()); introductionSection.getChildren().addAll(h1, h2, donateToACauseBtn, aboutUsBtn); diff --git a/src/main/resources/header/header.css b/src/main/resources/header/header.css index 28fcc59..23115eb 100644 --- a/src/main/resources/header/header.css +++ b/src/main/resources/header/header.css @@ -4,16 +4,10 @@ } #logo-section { - -fx-border-color: black; - -fx-border-width: 2px; } #navbar { - -fx-border-color: black; - -fx-border-width: 2px; } #profile-section { - -fx-border-color: black; - -fx-border-width: 2px; } \ No newline at end of file diff --git a/src/main/resources/homepage/homepage.css b/src/main/resources/homepage/homepage.css index 90b090c..2579557 100644 --- a/src/main/resources/homepage/homepage.css +++ b/src/main/resources/homepage/homepage.css @@ -1,6 +1,4 @@ #introduction-section { - -fx-border-color: black; - -fx-border-width: 2px; -fx-padding: 20px 0; } @@ -16,7 +14,6 @@ } #charity-image-section { - -fx-border-color: black; } #charity-image { @@ -24,4 +21,12 @@ -fx-background-position: center 55%; -fx-background-size: 100% auto; -fx-background-repeat: no-repeat; +} + +#donate-to-cause-btn { + -fx-cursor: hand; +} + +#about-us-btn { + -fx-cursor: hand; } \ No newline at end of file From c8341afbaab7c488be435a02bffc00a68b683f01 Mon Sep 17 00:00:00 2001 From: emilfa Date: Thu, 26 Mar 2026 09:18:17 +0100 Subject: [PATCH 7/8] refactor: removed unnessecary class variables --- .../java/edu/group5/app/control/NavigationController.java | 6 ------ .../java/edu/group5/app/view/loginpage/LoginHeader.java | 1 - 2 files changed, 7 deletions(-) diff --git a/src/main/java/edu/group5/app/control/NavigationController.java b/src/main/java/edu/group5/app/control/NavigationController.java index a54e4b6..2dd872a 100644 --- a/src/main/java/edu/group5/app/control/NavigationController.java +++ b/src/main/java/edu/group5/app/control/NavigationController.java @@ -22,9 +22,6 @@ public class NavigationController { private final LoginHeader loginHeader; private final AppState appState; - private final UserService userService; - private final DonationService donationService; - private final OrganizationService organizationService; private final UserController userController; private final DonationController donationController; @@ -36,9 +33,6 @@ public NavigationController(BorderPane root, AppState appState, UserService user this.loginHeader = new LoginHeader(); this.appState = appState; - this.userService = userService; - this.donationService = donationService; - this.organizationService = organizationService; this.userController = new UserController(appState, this, userService); this.donationController = new DonationController(appState, this, donationService); diff --git a/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java b/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java index 793edb9..ad6a412 100644 --- a/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java +++ b/src/main/java/edu/group5/app/view/loginpage/LoginHeader.java @@ -18,7 +18,6 @@ private StackPane getLogoSection() { StackPane logoSection = new StackPane(); logoSection.setId("logo-section"); logoSection.setAlignment(Pos.CENTER); - logoSection.setStyle("-fx-cursor: hand;"); ImageView logo = new ImageView( new Image(getClass().getResource("/header/images/hmh-logo.png").toExternalForm()) From 1fc75a755d8c846d7e68ac47672401c91e986949 Mon Sep 17 00:00:00 2001 From: emilfa Date: Thu, 26 Mar 2026 09:31:57 +0100 Subject: [PATCH 8/8] refactor: renamed UserController to LoginController --- .../{UserController.java => LoginController.java} | 15 ++------------- .../group5/app/control/NavigationController.java | 10 +++++----- .../group5/app/view/loginpage/LoginPageView.java | 10 +++++----- .../group5/app/view/loginpage/SignInPageView.java | 10 +++++----- .../group5/app/view/userpage/UserPageView.java | 10 +++++----- 5 files changed, 22 insertions(+), 33 deletions(-) rename src/main/java/edu/group5/app/control/{UserController.java => LoginController.java} (80%) diff --git a/src/main/java/edu/group5/app/control/UserController.java b/src/main/java/edu/group5/app/control/LoginController.java similarity index 80% rename from src/main/java/edu/group5/app/control/UserController.java rename to src/main/java/edu/group5/app/control/LoginController.java index c8d55dd..cdd5b5f 100644 --- a/src/main/java/edu/group5/app/control/UserController.java +++ b/src/main/java/edu/group5/app/control/LoginController.java @@ -1,29 +1,18 @@ package edu.group5.app.control; import edu.group5.app.model.AppState; -import edu.group5.app.model.donation.Donation; -import edu.group5.app.model.donation.DonationService; -import edu.group5.app.model.organization.Organization; -import edu.group5.app.model.organization.OrganizationService; -import edu.group5.app.model.user.Customer; import edu.group5.app.model.user.User; import edu.group5.app.model.user.UserService; import edu.group5.app.view.loginpage.LoginPageView; import edu.group5.app.view.loginpage.SignInPageView; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class UserController { +public class LoginController { private final AppState appState; private final NavigationController nav; private final UserService userService; - public UserController(AppState appState, NavigationController nav, UserService userService) { + public LoginController(AppState appState, NavigationController nav, UserService userService) { this.appState = appState; this.nav = nav; this.userService = userService; diff --git a/src/main/java/edu/group5/app/control/NavigationController.java b/src/main/java/edu/group5/app/control/NavigationController.java index 2dd872a..ddab7e2 100644 --- a/src/main/java/edu/group5/app/control/NavigationController.java +++ b/src/main/java/edu/group5/app/control/NavigationController.java @@ -23,7 +23,7 @@ public class NavigationController { private final AppState appState; - private final UserController userController; + private final LoginController loginController; private final DonationController donationController; private final OrganizationController organizationController; @@ -34,7 +34,7 @@ public NavigationController(BorderPane root, AppState appState, UserService user this.appState = appState; - this.userController = new UserController(appState, this, userService); + this.loginController = new LoginController(appState, this, userService); this.donationController = new DonationController(appState, this, donationService); this.organizationController = new OrganizationController(appState, this, organizationService); } @@ -46,12 +46,12 @@ public void showHomePage() { public void showLoginPage() { root.setTop(loginHeader); - root.setCenter(new LoginPageView(appState, this, userController)); + root.setCenter(new LoginPageView(appState, this, loginController)); } public void showSignInPage() { root.setTop(loginHeader); - root.setCenter(new SignInPageView(appState, this, userController)); + root.setCenter(new SignInPageView(appState, this, loginController)); } public void showPaymentCompletePage() { @@ -80,6 +80,6 @@ public void showAboutUsPage() { public void showUserPage() { root.setTop(header); - root.setCenter(new UserPageView(appState, this, userController, donationController, organizationController)); + root.setCenter(new UserPageView(appState, this, loginController, donationController, organizationController)); } } 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 bedb796..af972e0 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,7 @@ package edu.group5.app.view.loginpage; import edu.group5.app.control.NavigationController; -import edu.group5.app.control.UserController; +import edu.group5.app.control.LoginController; import edu.group5.app.model.AppState; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -15,16 +15,16 @@ public class LoginPageView extends BorderPane { private final AppState appState; private final NavigationController nav; - private final UserController userController; + private final LoginController loginController; private TextField emailField; private PasswordField passwordField; private Label errorLabel; - public LoginPageView(AppState appState, NavigationController nav, UserController userController) { + public LoginPageView(AppState appState, NavigationController nav, LoginController loginController) { this.appState = appState; this.nav = nav; - this.userController = userController; + this.loginController = loginController; HBox content = new HBox(); content.setFillHeight(true); @@ -97,7 +97,7 @@ private Button getLoginBtn() { Button loginBtn = new Button("Log In"); loginBtn.setMaxWidth(300); loginBtn.setId("login-btn"); - loginBtn.setOnMouseClicked(e -> userController.handleLogin( + loginBtn.setOnMouseClicked(e -> loginController.handleLogin( this, getEmail(), getPassword() 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 0103870..946dae4 100644 --- a/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java +++ b/src/main/java/edu/group5/app/view/loginpage/SignInPageView.java @@ -1,7 +1,7 @@ package edu.group5.app.view.loginpage; import edu.group5.app.control.NavigationController; -import edu.group5.app.control.UserController; +import edu.group5.app.control.LoginController; import edu.group5.app.model.AppState; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -16,7 +16,7 @@ public class SignInPageView extends BorderPane { private final AppState appState; private final NavigationController nav; - private final UserController userController; + private final LoginController loginController; private TextField nameField; private TextField surnameField; @@ -24,10 +24,10 @@ public class SignInPageView extends BorderPane { private PasswordField passwordField; private Label errorLabel; - public SignInPageView(AppState appState, NavigationController nav, UserController userController) { + public SignInPageView(AppState appState, NavigationController nav, LoginController loginController) { this.appState = appState; this.nav = nav; - this.userController = userController; + this.loginController = loginController; HBox content = new HBox(); content.setFillHeight(true); @@ -130,7 +130,7 @@ private Button getSignInBtn() { Button signInBtn = new Button("Sign In"); signInBtn.setMaxWidth(300); signInBtn.setId("login-btn"); - signInBtn.setOnMouseClicked(e -> userController.handleSignIn( + signInBtn.setOnMouseClicked(e -> loginController.handleSignIn( this, getFirstName(), getLastName(), 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 6fce42c..c5d886d 100644 --- a/src/main/java/edu/group5/app/view/userpage/UserPageView.java +++ b/src/main/java/edu/group5/app/view/userpage/UserPageView.java @@ -3,7 +3,7 @@ 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.control.LoginController; import edu.group5.app.model.AppState; import edu.group5.app.model.donation.Donation; import edu.group5.app.model.organization.Organization; @@ -25,14 +25,14 @@ public class UserPageView extends BorderPane { private final AppState appState; private final NavigationController nav; - private final UserController userController; + private final LoginController loginController; private final DonationController donationController; private final OrganizationController organizationController; - public UserPageView(AppState appState, NavigationController nav, UserController userController, DonationController donationController, OrganizationController organizationController) { + public UserPageView(AppState appState, NavigationController nav, LoginController loginController, DonationController donationController, OrganizationController organizationController) { this.appState = appState; this.nav = nav; - this.userController = userController; + this.loginController = loginController; this.donationController = donationController; this.organizationController = organizationController; @@ -64,7 +64,7 @@ private HBox createProfileSection() { Button logoutBtn = new Button("Logout"); logoutBtn.getStyleClass().add("logout-button"); - logoutBtn.setOnAction(e -> userController.handleLogout()); + logoutBtn.setOnAction(e -> loginController.handleLogout()); VBox info = new VBox(10, name, email, location, logoutBtn); info.setAlignment(Pos.CENTER_LEFT);