Skip to content

Commit

Permalink
Feat: Inbox works and some minor fixes to stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrianBalunan committed Apr 20, 2026
1 parent dc0737a commit 23f53a9
Show file tree
Hide file tree
Showing 6 changed files with 223 additions and 210 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ntnu.systemutvikling.team6.controller.components;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import ntnu.systemutvikling.team6.models.Charity;
import ntnu.systemutvikling.team6.models.user.Message;

public class InboxCardController extends BaseController{
@FXML private Label messageFrom;
@FXML private Label messageTitle;
@FXML private Label messageContent;
@FXML private Label messageDate;

private Message message;

@Override
protected void authTokenisSet() {

}

public void setMessage(Message message) {
this.message = message;

messageFrom.setText(message.getFrom().getName());
messageTitle.setText(message.getTitle());
messageContent.setStyle(message.getContent());
messageDate.setText(message.getTimeAndDate().toString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package ntnu.systemutvikling.team6.controller.profileUser;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import ntnu.systemutvikling.team6.controller.components.*;
import ntnu.systemutvikling.team6.database.DAO.FavouritesDAO;
import ntnu.systemutvikling.team6.database.DatabaseConnection;
import ntnu.systemutvikling.team6.models.Charity;
import ntnu.systemutvikling.team6.models.user.Inbox;
import ntnu.systemutvikling.team6.models.user.Message;
import ntnu.systemutvikling.team6.models.user.Settings;
import ntnu.systemutvikling.team6.models.user.User;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class profileUserInboxController extends BaseController {
@FXML private NavbarController navbarController;
@FXML private FlowPane cardsContainer;
@FXML private Label nameLabel;
@FXML private Label shortNameLabel;

@Override
protected void authTokenisSet() {
if (!isLoggedin()){
showAlert(Alert.AlertType.ERROR, "Not logged inn", "You need to be logged inn to donate.");
Platform.runLater(() -> {
Stage stage = (Stage) Stage.getWindows().stream()
.filter(w -> w.isShowing())
.findFirst()
.orElse(null);
if (stage != null) {
LoaderScene.LoadScene("loginSite", stage, null, null, authToken);
}
});
}
navbarController.setAuthToken(authToken);
populateFields();
}

public void populateFields() {
User user = authToken.getCurrentUser();
// Names
nameLabel.setText(user.getUsername());
shortNameLabel.setText(user.getUsername().substring(0, 2).toUpperCase().trim());

// Messages
Inbox inbox = authToken.getCurrentUser().getInbox();
displayInbox(inbox);
}

private void displayInbox(Inbox inbox) {
cardsContainer.getChildren().clear();
List<Message> messages = inbox.getMessages();
if(messages.isEmpty()){
Label empty = new Label("You have no messages");
empty.setStyle("-fx-text-fill: #777777; -fx-font-size: 14;");
cardsContainer.getChildren().add(empty);
}

for (Message message : messages) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/components/inboxCard.fxml"));
Parent card = loader.load();
InboxCardController cardController = loader.getController();
cardController.setMessage(message);
cardController.setAuthToken(authToken);
cardsContainer.getChildren().add(card);
} catch (IOException e) {
throw new RuntimeException("Could not load organization card.", e);
}
}
}

// Sidebar Methods
@FXML
private void handleLogout(ActionEvent event){
authToken.logout();
showAlert(Alert.AlertType.INFORMATION, "Logging out", "Logging out...");
LoaderScene.LoadScene("FrontPage", event, null, null, authToken);
}

@FXML
private void switchToFrontPage(ActionEvent event){
LoaderScene.LoadScene("FrontPage", event, null, null, authToken);
}

@FXML
private void switchToInterestPage(ActionEvent event){
LoaderScene.LoadScene("profile_user_interests", event, null, null, authToken);
}

@FXML
private void switchToHistoryPage(ActionEvent event){
LoaderScene.LoadScene("profile_user_history", event, null, null, authToken);
}

@FXML
private void switchToSettingsPage(ActionEvent event){
LoaderScene.LoadScene("profile_user_settings", event, null, null, authToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,9 @@ public void populateFields() {
private void displayFavourites(ArrayList<Charity> favourites) {
cardsContainer.getChildren().clear();
if(favourites.isEmpty()){
Charity noCharityMessageCharity = new Charity(
UUID.randomUUID().toString(),
"osdawdwa.com",
"You have no Favourites",
false,
"Verified"
);
favourites.add(noCharityMessageCharity);
Label empty = new Label("You have no messages");
empty.setStyle("-fx-text-fill: #777777; -fx-font-size: 14;");
cardsContainer.getChildren().add(empty);
}

for (Charity charity : favourites) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.UUID;
import ntnu.systemutvikling.team6.database.DatabaseConnection;
Expand Down Expand Up @@ -39,8 +38,7 @@ public boolean isEmailTaken(String email){
throw new IllegalArgumentException(
"Email cannot be null or blank," + " and must contain '@' and '.'");
}
try (Connection conn = connection.getMySqlConnection();
Statement stmt = conn.createStatement()) {
try (Connection conn = connection.getMySqlConnection()) {

String mysql =
"""
Expand Down Expand Up @@ -95,11 +93,11 @@ public User getUserFromDBEmailAndPassword(String email, String password) {
s.UUID_user, s.isAnonymous, s.language, s.lightmode,
m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id,
cv.charity_name, cv.charity_link, cv.description, cv.logoURL, cv.key_values, cv.logoBLOB,
c.UUID_charities, c.org_number, c.pre_approved, c.status,
c.UUID_charities, c.org_number, c.pre_approved, c.status
FROM User u
LEFT JOIN Settings s ON u.UUID_User = s.UUID_user
LEFT JOIN Messages m ON u.UUID_User = m.user_id
LEFT JOIN Charity c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN Charities c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN CharityVanity cv ON c.UUID_charities = cv.UUID_charity
WHERE u.user_email = ?;
""";
Expand All @@ -109,7 +107,7 @@ public User getUserFromDBEmailAndPassword(String email, String password) {


ResultSet rs = stmt.executeQuery();
ArrayList<String> addedMessageIds = new ArrayList<>();
HashSet<String> addedMessageIds = new HashSet<>();
while (rs.next()) {
String userId = rs.getString("UUID_User");
System.out.println(rs.getString("user_name"));
Expand Down Expand Up @@ -201,11 +199,11 @@ public User getUserFromDBUuid(String user_id) {
s.UUID_user, s.isAnonymous, s.language, s.lightmode,
m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id,
cv.charity_name, cv.charity_link, cv.description, cv.logoURL, cv.key_values, cv.logoBLOB,
c.UUID_charities, c.org_number, c.pre_approved, c.status,
c.UUID_charities, c.org_number, c.pre_approved, c.status
FROM User u
LEFT JOIN Settings s ON u.UUID_User = s.UUID_user
LEFT JOIN Messages m ON u.UUID_User = m.user_id
LEFT JOIN Charity c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN Charities c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN CharityVanity cv ON c.UUID_charities = cv.UUID_charity
WHERE u.UUID_User = ?;
""";
Expand All @@ -214,7 +212,7 @@ public User getUserFromDBUuid(String user_id) {
ResultSet rs = stmt.executeQuery();

String lastUserid = null;
ArrayList<String> addedMessageIds = new ArrayList<>();
HashSet<String> addedMessageIds = new HashSet<>();
while (rs.next()) {
String userId = rs.getString("UUID_User");
if (lastUserid == null || !userId.equals(lastUserid)) {
Expand Down Expand Up @@ -300,19 +298,19 @@ public UserRegistry getUsersFromDB() {
s.UUID_user, s.isAnonymous, s.language, s.lightmode,
m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id,
cv.charity_name, cv.charity_link, cv.description, cv.logoURL, cv.key_values, cv.logoBLOB,
c.UUID_charities, c.org_number, c.pre_approved, c.status,
c.UUID_charities, c.org_number, c.pre_approved, c.status
FROM User u
LEFT JOIN Settings s ON u.UUID_User = s.UUID_user
LEFT JOIN Messages m ON u.UUID_User = m.user_id
LEFT JOIN Charity c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN Charities c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN CharityVanity cv ON c.UUID_charities = cv.UUID_charity
""";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql_query);

User currentUser = null;
String lastUserid = null;
ArrayList<String> addedMessageIds = new ArrayList<>();
HashSet<String> addedMessageIds = new HashSet<>();

while (rs.next()) {
String userId = rs.getString("UUID_User");
Expand Down Expand Up @@ -395,7 +393,7 @@ public Settings getSettingsForUser(String user_id) {
conn = connection.getMySqlConnection();
String sql_query =
"""
SELECT User_UUID_User, isAnonymous, language, lightmode FROM Settings
SELECT UUID_user, isAnonymous, language, lightmode FROM Settings
WHERE UUID_user = ?;
""";
PreparedStatement stmt = conn.prepareStatement(sql_query);
Expand Down Expand Up @@ -441,11 +439,10 @@ public Inbox getInboxForUser(String user_id) {
SELECT
m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id,
cv.charity_name, cv.charity_link, cv.description, cv.logoURL, cv.key_values, cv.logoBLOB,
c.UUID_charities, c.org_number, c.pre_approved, c.status,
c.UUID_charities, c.org_number, c.pre_approved, c.status
FROM Messages m
LEFT JOIN Charity c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN Charities c ON m.sender_charity_id = c.UUID_charities
LEFT JOIN CharityVanity cv ON c.UUID_charities = cv.UUID_charity
SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Messages
WHERE user_id = ?;
""";
PreparedStatement stmt = conn.prepareStatement(sql_query);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>

<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="400.0" spacing="16.0" style="-fx-background-color: #1E1E1E; -fx-border-color: #333333; -fx-border-width: 1.2; -fx-border-radius: 16; -fx-background-radius: 16; -fx-padding: 16 22 16 22;" xmlns="http://javafx.com/javafx/25" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ntnu.systemutvikling.team6.controller.components.InboxCardController">
<children>

<!-- Avatar circle -->
<Circle fill="#3A3A3A" radius="26.0" />

<!-- Text content -->
<VBox alignment="CENTER_LEFT" spacing="4.0" HBox.hgrow="ALWAYS">
<children>

<!-- Sender name -->
<Label fx:id="messageFrom" style="-fx-text-fill: #FFFFFF; -fx-font-weight: bold;" text="Something">
<font><Font size="13.0" /></font>
</Label>

<!-- Subject -->
<Label fx:id="messageTitle" style="-fx-text-fill: #CCCCCC;" text="Something">
<font><Font size="13.0" /></font>
</Label>

<!-- Preview -->
<Label fx:id="messageContent" style="-fx-text-fill: #777777;" text="Something">
<font><Font size="11.0" /></font>
</Label>

</children>
</VBox>

<!-- Date pushed to the right -->
<Label fx:id="messageDate" style="-fx-text-fill: #555555;" text="Something" HBox.hgrow="NEVER">
<font><Font size="10.0" /></font>
</Label>

</children>
</HBox>
Loading

0 comments on commit 23f53a9

Please sign in to comment.