diff --git a/src/main/java/edu/group5/app/App.java b/src/main/java/edu/group5/app/App.java index b59c6ef..b9d67da 100644 --- a/src/main/java/edu/group5/app/App.java +++ b/src/main/java/edu/group5/app/App.java @@ -1,8 +1,6 @@ package edu.group5.app; 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; @@ -11,6 +9,8 @@ import edu.group5.app.model.organization.OrganizationService; import edu.group5.app.model.user.UserRepository; import edu.group5.app.model.user.UserService; +import edu.group5.app.model.wrapper.DbWrapper; +import edu.group5.app.model.wrapper.OrgApiWrapper; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; diff --git a/src/main/java/edu/group5/app/control/DonationController.java b/src/main/java/edu/group5/app/control/DonationController.java index 907caa3..8e965ed 100644 --- a/src/main/java/edu/group5/app/control/DonationController.java +++ b/src/main/java/edu/group5/app/control/DonationController.java @@ -46,6 +46,7 @@ public void requestDonationConfirmation() { User currentUser = appState.getCurrentUser(); Organization currentOrg = appState.getCurrentOrganization(); BigDecimal amount = appState.getCurrentDonationAmount(); + String paymentMethod = appState.getCurrentPaymentMethod(); // Validate before showing dialog if (currentUser == null) { @@ -92,17 +93,21 @@ private void handleDonate() { System.err.println("Error: Only customers can donate"); return; } + if (paymentMethod == null) { + System.out.println("Error: Invalid payment method"); + return; + } // Create donation via service boolean success = service.donate( customer, currentOrg.orgNumber(), amount, - "Online" + paymentMethod ); if (success) { - System.out.println("Donation created: " + amount + " kr to " + currentOrg.name()); + System.out.println("Donation created: " + amount + " kr to " + currentOrg.name() + ", with payment method: " + paymentMethod); } else { System.err.println("Failed to create donation"); } diff --git a/src/main/java/edu/group5/app/model/AppState.java b/src/main/java/edu/group5/app/model/AppState.java index d8dd03a..73d5cfc 100644 --- a/src/main/java/edu/group5/app/model/AppState.java +++ b/src/main/java/edu/group5/app/model/AppState.java @@ -9,6 +9,7 @@ public class AppState { private User currentUser; private BigDecimal currentDonationAmount; private Organization currentOrganization; + private String currentDonation; public User getCurrentUser() { return this.currentUser; @@ -33,4 +34,12 @@ public BigDecimal getCurrentDonationAmount() { public void setCurrentDonationAmount(BigDecimal amount) { this.currentDonationAmount = amount; } + + public String getCurrentPaymentMethod() { + return this.currentDonation; + } + + public void setCurrentPaymentMethod(String paymentMethod){ + this.currentDonation = paymentMethod; + } } diff --git a/src/main/java/edu/group5/app/control/wrapper/DbWrapper.java b/src/main/java/edu/group5/app/model/wrapper/DbWrapper.java similarity index 99% rename from src/main/java/edu/group5/app/control/wrapper/DbWrapper.java rename to src/main/java/edu/group5/app/model/wrapper/DbWrapper.java index 7e3adc0..073fd81 100644 --- a/src/main/java/edu/group5/app/control/wrapper/DbWrapper.java +++ b/src/main/java/edu/group5/app/model/wrapper/DbWrapper.java @@ -1,4 +1,4 @@ -package edu.group5.app.control.wrapper; +package edu.group5.app.model.wrapper; import java.math.BigDecimal; import java.sql.Connection; diff --git a/src/main/java/edu/group5/app/control/wrapper/OrgApiWrapper.java b/src/main/java/edu/group5/app/model/wrapper/OrgApiWrapper.java similarity index 98% rename from src/main/java/edu/group5/app/control/wrapper/OrgApiWrapper.java rename to src/main/java/edu/group5/app/model/wrapper/OrgApiWrapper.java index 39ac283..910b110 100644 --- a/src/main/java/edu/group5/app/control/wrapper/OrgApiWrapper.java +++ b/src/main/java/edu/group5/app/model/wrapper/OrgApiWrapper.java @@ -1,4 +1,4 @@ -package edu.group5.app.control.wrapper; +package edu.group5.app.model.wrapper; import java.io.IOException; import java.net.URI; diff --git a/src/main/java/edu/group5/app/control/wrapper/Wrapper.java b/src/main/java/edu/group5/app/model/wrapper/Wrapper.java similarity index 95% rename from src/main/java/edu/group5/app/control/wrapper/Wrapper.java rename to src/main/java/edu/group5/app/model/wrapper/Wrapper.java index 992b7a9..85d8dc8 100644 --- a/src/main/java/edu/group5/app/control/wrapper/Wrapper.java +++ b/src/main/java/edu/group5/app/model/wrapper/Wrapper.java @@ -1,4 +1,4 @@ -package edu.group5.app.control.wrapper; +package edu.group5.app.model.wrapper; /** * An abstract class for all Wrappers of datasets. 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 bbc1666..4e4b616 100644 --- a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java +++ b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java @@ -4,6 +4,7 @@ import edu.group5.app.control.NavigationController; import edu.group5.app.model.AppState; import edu.group5.app.model.organization.Organization; +import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -17,6 +18,8 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Text; +import java.util.Objects; + public class OrganizationPageView extends BorderPane { private final AppState appState; private final NavigationController nav; @@ -27,24 +30,34 @@ public OrganizationPageView(AppState appState, NavigationController nav, Donatio this.nav = nav; this.donationController = donationController; - getStylesheets().add(getClass().getResource("/organizationpage/organizationpage.css").toExternalForm()); - setCenter(createBody()); + getStylesheets().add(Objects.requireNonNull(getClass().getResource("/organizationpage/organizationpage.css")).toExternalForm()); + + VBox content = new VBox(); + content.getChildren().addAll(createBackButton(), createBody()); + setCenter(content); } private ScrollPane createBody() { ScrollPane body = new ScrollPane(); body.setFitToWidth(true); - body.setFitToHeight(true) - ; + body.setFitToHeight(true); + VBox vBox = new VBox(); vBox.setId("main-container"); - vBox.getChildren().addAll( - createOrgSection() - ); + vBox.getChildren().addAll(createOrgSection()); body.setContent(vBox); return body; } + private HBox createBackButton() { + Button backBtn = new Button("←"); + backBtn.getStyleClass().add("back-button"); + backBtn.setOnAction(e -> nav.showCausesPage()); + + HBox container = new HBox(backBtn); + container.setPadding(new Insets(10, 0, 0, 10)); + return container; + } private HBox createOrgSection() { HBox orgSection = new HBox(); 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 08600f9..7dc82a2 100644 --- a/src/main/java/edu/group5/app/view/userpage/UserPageView.java +++ b/src/main/java/edu/group5/app/view/userpage/UserPageView.java @@ -24,6 +24,7 @@ import javafx.scene.text.Text; import java.text.SimpleDateFormat; +import java.math.RoundingMode; import java.util.*; @@ -78,7 +79,6 @@ private HBox createProfileSection() { profile.setAlignment(Pos.CENTER_LEFT); return profile; } - private VBox createCausesSection() { Text title = new Text("YOUR SUPPORTED CAUSES"); title.getStyleClass().add("section-title"); @@ -101,12 +101,15 @@ private VBox createCausesSection() { for (int orgId : uniqueOrgs) { Organization org = organizationController.getOrgById(orgId); if (org != null) { - causesFlow.getChildren().add(createCauseChip(org)); // SRP: delegate to helper + causesFlow.getChildren().add(createCauseChip(org)); } } } - + ScrollPane scrollPane = new ScrollPane(causesBox); + scrollPane.setFitToWidth(true); + scrollPane.setPrefHeight(150); scrollPane.setContent(causesFlow); + return new VBox(10, title, scrollPane); } @@ -175,11 +178,15 @@ private VBox createDonationsSection() { } else { for (Donation donation : userDonations.values()) { donationsBox.getChildren().add(createDonationCard(donation)); + } } - + ScrollPane scrollPane = new ScrollPane(donationsBox); + scrollPane.setFitToWidth(true); + scrollPane.setPrefHeight(200); scrollPane.setContent(donationsBox); return new VBox(10, title, searchBox, scrollPane); + } diff --git a/src/main/resources/donationpage/donation.css b/src/main/resources/donationpage/donation.css index edacdd3..18680e3 100644 --- a/src/main/resources/donationpage/donation.css +++ b/src/main/resources/donationpage/donation.css @@ -19,12 +19,26 @@ -fx-border-color: #111; } +.donation-button-selected:hover { + -fx-background-color: #222; + -fx-border-color: #222; +} + +.donation-button-selected Text, +.donation-button-selected .donation-input { + -fx-fill: white; + -fx-border-color: transparent transparent white transparent; + -fx-text-fill: white; + -fx-prompt-text-fill: #ccc; +} + .donation-title { -fx-font-size: 18px; -fx-font-weight: bold; -fx-fill: #111; } + .donation-amount { -fx-font-size: 18px; -fx-fill: #111; @@ -90,7 +104,46 @@ -fx-text-fill: white; } + .donation-button-selected .donation-input:focused { -fx-text-fill: white; -fx-border-color: transparent transparent white transparent; + +.payment-method-button { + -fx-background-color: #111; + -fx-text-fill: white; + -fx-font-size: 16px; + -fx-font-weight: bold; + -fx-pref-width: 180px; + -fx-pref-height: 45px; + -fx-background-radius: 6; + -fx-border-radius: 6; + -fx-cursor: hand; +} +.payment-method-button:hover { + -fx-background-color: #222; +} +.payment-method-selected, +.payment-method-selected:hover { + -fx-background-color: #e03030; +} +.donation-button-selected .donation-title, +.donation-button-selected .donation-amount { + -fx-fill: white; +} +.back-button { + -fx-background-color: white; + -fx-text-fill: black; + -fx-font-weight: bold; + -fx-font-size: 20px; + -fx-background-radius: 50; + -fx-padding: 4px 10px; + -fx-cursor: hand; + -fx-border-radius: 50; + -fx-border-color: black; + -fx-border-width: 2px; +} +.back-button:hover { + -fx-background-color: #333; + -fx-border-color:#333; } \ No newline at end of file diff --git a/src/main/resources/organizationpage/organizationpage.css b/src/main/resources/organizationpage/organizationpage.css index 17d2b0c..20a9ad8 100644 --- a/src/main/resources/organizationpage/organizationpage.css +++ b/src/main/resources/organizationpage/organizationpage.css @@ -62,4 +62,20 @@ #description-scroll .scroll-bar:vertical .thumb:hover { -fx-background-color: #999999; +} +.back-button { + -fx-background-color: white; + -fx-text-fill: black; + -fx-font-weight: bold; + -fx-font-size: 20px; + -fx-background-radius: 50; + -fx-padding: 4px 10px; + -fx-cursor: hand; + -fx-border-radius: 50; + -fx-border-color: black; + -fx-border-width: 2px; +} +.back-button:hover { + -fx-background-color: #333; + -fx-border-color:#333; } \ No newline at end of file diff --git a/src/test/java/edu/group5/app/control/wrapper/DbWrapperDonationsTest.java b/src/test/java/edu/group5/app/model/wrapper/DbWrapperDonationsTest.java similarity index 99% rename from src/test/java/edu/group5/app/control/wrapper/DbWrapperDonationsTest.java rename to src/test/java/edu/group5/app/model/wrapper/DbWrapperDonationsTest.java index 8c401c4..cf76092 100644 --- a/src/test/java/edu/group5/app/control/wrapper/DbWrapperDonationsTest.java +++ b/src/test/java/edu/group5/app/model/wrapper/DbWrapperDonationsTest.java @@ -1,4 +1,4 @@ -package edu.group5.app.control.wrapper; +package edu.group5.app.model.wrapper; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -16,6 +16,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import edu.group5.app.model.wrapper.DbWrapper; + public class DbWrapperDonationsTest { private Object[] johnDonation; private List users; diff --git a/src/test/java/edu/group5/app/control/wrapper/DbWrapperUserTest.java b/src/test/java/edu/group5/app/model/wrapper/DbWrapperUserTest.java similarity index 98% rename from src/test/java/edu/group5/app/control/wrapper/DbWrapperUserTest.java rename to src/test/java/edu/group5/app/model/wrapper/DbWrapperUserTest.java index 10c514f..7aca3c0 100644 --- a/src/test/java/edu/group5/app/control/wrapper/DbWrapperUserTest.java +++ b/src/test/java/edu/group5/app/model/wrapper/DbWrapperUserTest.java @@ -1,4 +1,4 @@ -package edu.group5.app.control.wrapper; +package edu.group5.app.model.wrapper; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import edu.group5.app.model.wrapper.DbWrapper; import javafx.util.converter.BigDecimalStringConverter; public class DbWrapperUserTest { diff --git a/src/test/java/edu/group5/app/control/wrapper/OrgApiWrapperTest.java b/src/test/java/edu/group5/app/model/wrapper/OrgApiWrapperTest.java similarity index 97% rename from src/test/java/edu/group5/app/control/wrapper/OrgApiWrapperTest.java rename to src/test/java/edu/group5/app/model/wrapper/OrgApiWrapperTest.java index 23b30ec..0a643f2 100644 --- a/src/test/java/edu/group5/app/control/wrapper/OrgApiWrapperTest.java +++ b/src/test/java/edu/group5/app/model/wrapper/OrgApiWrapperTest.java @@ -1,4 +1,4 @@ -package edu.group5.app.control.wrapper; +package edu.group5.app.model.wrapper; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -9,6 +9,8 @@ import java.lang.IllegalArgumentException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + +import edu.group5.app.model.wrapper.OrgApiWrapper; import tools.jackson.core.exc.StreamReadException; /**