diff --git a/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java b/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java index f31efdc..61155b7 100644 --- a/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java +++ b/src/main/java/edu/group5/app/model/organization/OrganizationRepository.java @@ -50,7 +50,8 @@ public OrganizationRepository(Object[] input, OrganizationScraper scraper) { boolean trusted = "approved".equalsIgnoreCase((String) contentMap.get("status")); String websiteURL = (String) contentMap.get("url"); boolean isPreApproved = Boolean.TRUE.equals(contentMap.get("is_pre_approved")); - String description = scraper.fetchDescription(websiteURL) != null ? scraper.fetchDescription(websiteURL) : "Information about " + name; + String description = scraper.fetchDescription(websiteURL); + description = description != null ? description : "Information about " + name; Organization org = new Organization(orgNumber, name, trusted, websiteURL, isPreApproved, description, null); grandMap.put(org.orgNumber(), org); diff --git a/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java b/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java index edb41fd..c2c7f3b 100644 --- a/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java +++ b/src/main/java/edu/group5/app/model/organization/OrganizationScraper.java @@ -3,6 +3,9 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jsoup.nodes.TextNode; +import org.jsoup.select.Elements; + import java.util.stream.Collectors; import java.util.HashMap; @@ -47,18 +50,22 @@ public String fetchDescription(String pageUrl) { Element section = doc.selectFirst("section.information"); if (section != null) { - // Try to get all

tags (skip first one if multiple exist) - String description = section.select("p").stream() - .skip(1) // Skip first paragraph (usually a heading) + section.select("div.extra-info").remove(); + section.select("a.read-more").remove(); + + // Extract all

tags and

elements as separate paragraphs + String description = section.select("p, div").stream() + .filter(el -> !el.hasClass("extra-info") && !el.hasClass("logo")) .map(Element::text) + .map(text -> text.replace("Les mer", "").trim()) .filter(text -> !text.isBlank()) - .map(String::trim) .collect(Collectors.joining("\n\n")); - // Fallback: if no paragraphs after first, get all text from section + // Fallback: if no paragraphs found, get all text from section if (description.isBlank()) { description = section.text().trim(); } + description = description.replace("Les mer", "").trim(); // Only cache and return if we found something meaningful if (!description.isBlank()) { 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 2d10328..f9dbd22 100644 --- a/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java +++ b/src/main/java/edu/group5/app/view/organizationpage/OrganizationPageView.java @@ -99,19 +99,30 @@ private VBox createOrgInfoSection() { VBox descriptionBox = new VBox(); descriptionBox.setSpacing(15); descriptionBox.setId("description-container"); + descriptionBox.setMaxWidth(750); if (org != null && org.description() != null) { - String[] paragraphs = org.description().split("\n\n"); - for (String para : paragraphs) { - if (!para.isBlank()) { - Label paragraph = new Label(para.trim()); + String[] rawParagraphs = org.description().split("\n{2,}"); + + for (String para : rawParagraphs) { + String cleaned = para.trim(); + if (!cleaned.isBlank()) { + Label paragraph = new Label(cleaned); + paragraph.setId("description-paragraph"); paragraph.setWrapText(true); descriptionBox.getChildren().add(paragraph); } } } - orgNameAndDescription.getChildren().addAll(orgName, descriptionBox); + ScrollPane descriptionScroll = new ScrollPane(descriptionBox); + descriptionScroll.setId("description-scroll"); + descriptionScroll.setFitToWidth(true); + descriptionScroll.setStyle("-fx-focus-color: transparent; -fx-faint-focus-color: transparent;"); + descriptionScroll.setPrefHeight(400); + descriptionScroll.setMaxHeight(400); + + orgNameAndDescription.getChildren().addAll(orgName, descriptionScroll); Button donateBtn = new Button("Donate"); donateBtn.setId("donate-button"); diff --git a/src/main/resources/organizationpage/organizationpage.css b/src/main/resources/organizationpage/organizationpage.css index e5263f2..17d2b0c 100644 --- a/src/main/resources/organizationpage/organizationpage.css +++ b/src/main/resources/organizationpage/organizationpage.css @@ -13,19 +13,21 @@ } #description-container { - -fx-padding: 30 0 30 0; - -fx-spacing: 25; + -fx-padding: 30; + -fx-spacing: 22; + -fx-max-width: 750; + -fx-background-color: #f8f9fa; + -fx-border-radius: 8; } #description-paragraph { - -fx-font-size: 16; - -fx-text-fill: #222; + -fx-font-size: 18; + -fx-text-fill: #333; -fx-font-family: "Segoe UI", Arial, sans-serif; - -fx-padding: 15 50 15 50; - -fx-line-spacing: 6; + -fx-line-spacing: 13; -fx-text-alignment: Left; -fx-wrap-text: true; - + -fx-padding: 10 0 10 0; } #donate-button { @@ -42,4 +44,22 @@ #donate-button:hover { -fx-background-color: #c02020; +} + +#description-scroll { + -fx-control-inner-background: #f8f9fa; + -fx-padding: 0; +} + +#description-scroll .scroll-bar:vertical { + -fx-pref-width: 8; +} + +#description-scroll .scroll-bar:vertical .thumb { + -fx-background-radius: 4; + -fx-background-color: #cccccc; +} + +#description-scroll .scroll-bar:vertical .thumb:hover { + -fx-background-color: #999999; } \ No newline at end of file