diff --git a/ccm-cms-default-theme/src/main/resources/themes/librecms/templates/contentitems/org.librecms.contenttypes.MultiPartArticle.html.ftl b/ccm-cms-default-theme/src/main/resources/themes/librecms/templates/contentitems/org.librecms.contenttypes.MultiPartArticle.html.ftl new file mode 100644 index 000000000..6ba7a2bbc --- /dev/null +++ b/ccm-cms-default-theme/src/main/resources/themes/librecms/templates/contentitems/org.librecms.contenttypes.MultiPartArticle.html.ftl @@ -0,0 +1,21 @@ +<#macro details> +

${CmsPagesCategorizedItemModel.title}

+

${CmsPagesCategorizedItemModel.description}

+ +

${CmsPagesMultiPartArticleModel.currentSectionTitle}

+
+ + ${CmsPagesMultiPartArticleModel.currentSectionText} +
+ \ No newline at end of file diff --git a/ccm-cms-default-theme/src/main/scss/_custom.scss b/ccm-cms-default-theme/src/main/scss/_custom.scss index dd5d1895c..ca6725969 100644 --- a/ccm-cms-default-theme/src/main/scss/_custom.scss +++ b/ccm-cms-default-theme/src/main/scss/_custom.scss @@ -11,5 +11,5 @@ a.navbar-brand { } .item-description { - white-space: pre; + white-space: pre-wrap; } \ No newline at end of file diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/MultiPartArticleModel.java b/ccm-cms/src/main/java/org/librecms/pages/models/MultiPartArticleModel.java index 5f9972cdc..f9b224bc5 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/models/MultiPartArticleModel.java +++ b/ccm-cms/src/main/java/org/librecms/pages/models/MultiPartArticleModel.java @@ -18,11 +18,6 @@ */ package org.librecms.pages.models; -import org.libreccm.l10n.GlobalizationHelper; -import org.librecms.contentsection.ContentItem; -import org.librecms.contenttypes.MultiPartArticle; -import org.librecms.contenttypes.MultiPartArticleSection; - import java.util.Collections; import java.util.List; import java.util.Optional; @@ -35,6 +30,13 @@ import javax.transaction.Transactional; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.contentsection.ContentItem; +import org.librecms.contenttypes.MultiPartArticle; +import org.librecms.contenttypes.MultiPartArticleSection; + +import java.util.ArrayList; + /** * * @author Jens Pelzetter @@ -60,6 +62,8 @@ public class MultiPartArticleModel implements ProcessesContentItem { private List sectionTitles; + private List sectionLinks; + private String currentSectionTitle; private String currentSectionText; @@ -91,6 +95,13 @@ public class MultiPartArticleModel implements ProcessesContentItem { return Collections.unmodifiableList(sectionTitles); } + @Transactional(Transactional.TxType.REQUIRED) + public List getSectionLinks() { + contentItemModel.init(); + + return Collections.unmodifiableList(sectionLinks); + } + @Transactional(Transactional.TxType.REQUIRED) public String getCurrentSectionTitle() { contentItemModel.init(); @@ -142,8 +153,10 @@ public class MultiPartArticleModel implements ProcessesContentItem { ) .orElse(Collections.emptyList()); + sectionLinks = buildSectionLinks(); + final int currentSection = readCurrentSection(); - if (mpa.getSections().size() > currentSection) { + if (mpa.getSections().size() < currentSection) { throw new WebApplicationException( Response .status(Response.Status.NOT_FOUND) @@ -212,4 +225,45 @@ public class MultiPartArticleModel implements ProcessesContentItem { return model; } + @Transactional(Transactional.TxType.REQUIRED) + private List buildSectionLinks() { + final String pathWithoutSections; + if (pageUrlModel.getPath().matches(".*/@sections/[0-9]*$")) { + final String path = pageUrlModel.getPath(); + pathWithoutSections = path.substring( + 0, + path.lastIndexOf("/@sections") + 1 + ); + } else { + pathWithoutSections = pageUrlModel.getPath(); + } + + final List sectionLinksList = new ArrayList<>(); + for (int i = 0; i < sectionTitles.size(); i++) { + sectionLinksList.add( + String.format( + "%s/@sections/%d?%s", + pathWithoutSections, + i, + pageUrlModel + .getQueryParameters() + .entrySet() + .stream() + .map( + entry -> String.format( + "%s=%s", + entry.getKey(), + entry.getValue() + ) + ) + .collect( + Collectors.joining("&") + ) + ) + ); + } + + return sectionLinksList; + } + }