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 488a868..0bdddbc 100644 --- a/src/main/java/edu/group5/app/view/causespage/CausesPageView.java +++ b/src/main/java/edu/group5/app/view/causespage/CausesPageView.java @@ -38,6 +38,7 @@ public class CausesPageView extends BorderPane { private GridPane organizationGrid; private Map allOrganizations; + private Map cardCache = new HashMap<>(); public CausesPageView(NavigationController nav, OrganizationController orgController) { ParameterValidator.objectChecker(nav, "NavigationController"); @@ -205,18 +206,41 @@ private Map filterOrganizations(String searchTerm) { )); } + private void updateOrganizationGrid(String searchTerm) { - if (organizationGrid == null) { - return; + if (organizationGrid == null) return; + + // Save existing cards into cache before clearing + for (var node : organizationGrid.getChildren()) { + if (node instanceof OrganizationCard card) { + cardCache.put(card.getOrganization().orgNumber(), card); + } } - + + Map filtered = filterOrganizations(searchTerm); + organizationGrid.getChildren().clear(); organizationGrid.getColumnConstraints().clear(); - - // Rebuild grid with filtered organizations - GridPane updated = createOrganizationSection(searchTerm); - - organizationGrid.getChildren().addAll(updated.getChildren()); - organizationGrid.getColumnConstraints().addAll(updated.getColumnConstraints()); + + int column = 0; + int row = 0; + + for (Organization org : filtered.values()) { + OrganizationCard card = cardCache.get(org.orgNumber()); + if (card != null) { + organizationGrid.add(card, column, row); + column++; + if (column == 4) { + column = 0; + row++; + } + } + } + + for (int i = 0; i < 4; i++) { + ColumnConstraints col = new ColumnConstraints(); + col.setPercentWidth(25); + organizationGrid.getColumnConstraints().add(col); + } } } 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 4645d0b..483d0e7 100644 --- a/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java +++ b/src/main/java/edu/group5/app/view/causespage/OrganizationCard.java @@ -61,7 +61,7 @@ public void updateLogo(String logoUrl) { if (imageContainer == null) return; imageContainer.getChildren().clear(); if (logoUrl != null && !logoUrl.isBlank()) { - ImageView logo = new ImageView(new Image(logoUrl, true)); + ImageView logo = new ImageView(new Image(logoUrl, 80, 80, true, true, true)); logo.setId("logo"); logo.setSmooth(true); logo.setPreserveRatio(true); @@ -96,7 +96,7 @@ private StackPane createImageContainer(String img) { if (img != null && !img.isBlank()) { - ImageView logo = new ImageView(new Image(img, true)); + ImageView logo = new ImageView(new Image(img, 80, 80, true, true, true)); logo.setId("logo"); logo.setSmooth(true); logo.setPreserveRatio(true); 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 3bea2ff..f591d26 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.control.OrganizationController; import edu.group5.app.model.organization.Organization; +import javafx.application.Platform; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; @@ -90,23 +91,38 @@ private StackPane createImageContainer() { imageContainer.setMaxWidth(120); Organization org = organizationController.getCurrentOrganization(); + if (org != null && org.logoUrl() != null && !org.logoUrl().isBlank()) { - ImageView logo = new ImageView(new Image(org.logoUrl(), true)); - logo.setId("logo"); - logo.setSmooth(true); - logo.setPreserveRatio(true); - logo.setFitHeight(350); - logo.setFitWidth(350); - imageContainer.getChildren().add(logo); + // Load image in background thread to avoid blocking UI + new Thread(() -> { + try { + Image image = new Image(org.logoUrl(), 120, 120, true, true); + Platform.runLater(() -> { + ImageView logo = new ImageView(image); + logo.setId("logo"); + logo.setSmooth(true); + logo.setPreserveRatio(true); + logo.setFitHeight(350); + logo.setFitWidth(350); + imageContainer.getChildren().clear(); + imageContainer.getChildren().add(logo); + }); + } catch (Exception e) { + // Logo failed to load, show placeholder + Platform.runLater(() -> { + imageContainer.getChildren().clear(); + Text text = new Text("No image"); + text.setStyle("-fx-font-size: 10;"); + imageContainer.getChildren().add(text); + }); + } + }, "LogoLoader").start(); } else { - StackPane placeholder = new StackPane(); - Text text = new Text("No image"); text.setStyle("-fx-font-size: 10;"); - - placeholder.getChildren().add(text); - imageContainer.getChildren().add(placeholder); + imageContainer.getChildren().add(text); } + return imageContainer; }