From 16bdc50f0efcad77c272e0cc63abd3a35e51da8b Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Mon, 26 Jul 2021 21:18:04 +0200 Subject: [PATCH] Setting target for related link. --- ccm-cms/src/main/java/org/librecms/Cms.java | 2 +- .../contentsection/rs/ContentItems.java | 2 + .../relatedinfo/RelatedInfoStep.java | 188 ++++++++++++++++-- .../documents/relatedinfo-link-details.xhtml | 4 +- .../documents/relatedinfo.xhtml | 8 +- .../documents/target-bookmark-not-found.xhtml | 39 ++++ .../documents/target-item-not-found.xhtml | 2 +- .../ui/DefaultAuthoringStepsBundle.properties | 3 + .../DefaultAuthoringStepsBundle_de.properties | 3 + .../main/scss/content-sections/cms-admin.scss | 6 +- .../content-sections/cms-contentitempicker.ts | 2 + 11 files changed, 230 insertions(+), 29 deletions(-) create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-bookmark-not-found.xhtml diff --git a/ccm-cms/src/main/java/org/librecms/Cms.java b/ccm-cms/src/main/java/org/librecms/Cms.java index 40764489b..464e03a96 100644 --- a/ccm-cms/src/main/java/org/librecms/Cms.java +++ b/ccm-cms/src/main/java/org/librecms/Cms.java @@ -82,7 +82,7 @@ import java.util.Properties; descBundle = CmsConstants.CONTENT_SECTION_DESC_BUNDLE, creator = ContentSectionCreator.class, servletPath = "/templates/servlet/content-section", - applicationController = ContentSectionApplicationController.class + applicationController = ContentSectionApplicationController.class ), @ApplicationType( name = "org.librecms.pages.Pages", diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/rs/ContentItems.java b/ccm-cms/src/main/java/org/librecms/contentsection/rs/ContentItems.java index 8b0189488..097572c3f 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/rs/ContentItems.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/rs/ContentItems.java @@ -152,6 +152,8 @@ public class ContentItems { } else { result.put("place", ""); } + + result.put("uuid", item.getUuid()); return result; } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/relatedinfo/RelatedInfoStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/relatedinfo/RelatedInfoStep.java index aae04d70b..f9ffc887c 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/relatedinfo/RelatedInfoStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/documents/relatedinfo/RelatedInfoStep.java @@ -26,6 +26,7 @@ import org.libreccm.l10n.LocalizedTextsUtil; import org.libreccm.security.PermissionChecker; import org.libreccm.ui.BaseUrl; import org.librecms.assets.AssetTypesManager; +import org.librecms.assets.Bookmark; import org.librecms.assets.RelatedLink; import org.librecms.contentsection.Asset; import org.librecms.contentsection.AssetManager; @@ -135,13 +136,13 @@ public class RelatedInfoStep extends AbstractMvcAuthoringStep { @Inject private BaseUrl baseUrl; - + @Inject private DocumentUi documentUi; @Context private HttpServletRequest request; - + /** * Model for the details view of an internal {@link RelatedLink}. */ @@ -1165,7 +1166,7 @@ public class RelatedInfoStep extends AbstractMvcAuthoringStep { } else { linkDetailsModel.setLinkType("--none--"); } - + linkDetailsModel.setBaseUrl(baseUrl.getBaseUrl(request)); final LocalizedTextsUtil textsUtil = globalizationHelper @@ -1222,23 +1223,23 @@ public class RelatedInfoStep extends AbstractMvcAuthoringStep { } /** - * Updates the target of a link.. + * Updates to target of a related link and sets it to the provided target + * item, making the link an internal link. * * @param sectionIdentifier * @param documentPath - * @param listIdentifierParam The identifier of the {@link AttachmentList} - * to which the link belongs. - * @param linkUuid The UUID of the link. - * @param targetItemUuid The UUID of the new target item. + * @param listIdentifierParam The identifier of the {@link AttachmentList} + * to which the link belongs. + * @param linkUuid The UUID of the link. + * @param targetItemIdentifier The UUID of the new target item. * - * @return A redirect to the details view of the link. + * @return A redirect to the details page of the link. */ @POST @Path( - "/attachmentlists/{attachmentListIdentifier}/links/{linkUuid}" - ) + "/attachmentlists/{attachmentListIdentifier}/links/{linkUuid}/details/@set-target-item") @Transactional(Transactional.TxType.REQUIRED) - public String updateLinkTarget( + public String setTargetItem( @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) final String sectionIdentifier, @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) @@ -1247,8 +1248,8 @@ public class RelatedInfoStep extends AbstractMvcAuthoringStep { final String listIdentifierParam, @PathParam("linkUuid") final String linkUuid, - @FormParam("targetItemUuid") - final String targetItemUuid + @FormParam("targetItemIdentifier") + final String targetItemIdentifier ) { try { init(); @@ -1269,14 +1270,34 @@ public class RelatedInfoStep extends AbstractMvcAuthoringStep { } final AttachmentList list = listResult.get(); - final Optional itemResult = itemRepo.findByUuid( - targetItemUuid + final Optional itemResult; + final Identifier itemIdentifier = identifierParser.parseIdentifier( + targetItemIdentifier ); - if (!itemResult.isPresent()) { - models.put("targetItemUuid", targetItemUuid); - return "org/librecms/ui/contentsection/documents/target-item-not-found.xhtml"; + switch (itemIdentifier.getType()) { + case ID: + itemResult = itemRepo.findById( + Long.parseLong(itemIdentifier.getIdentifier()) + ); + break; + case UUID: + itemResult = itemRepo.findByUuid( + itemIdentifier.getIdentifier() + ); + break; + default: + itemResult = itemRepo.findByPath( + getContentSection(), + itemIdentifier.getIdentifier() + ); + break; + } + if (!itemResult.isPresent()) { + models.put("targetItemIdentifier", targetItemIdentifier); + return "org/librecms/ui/contentsection/documents/target-item-not-found.xhtml"; + } final Optional linkResult = list .getAttachments() .stream() @@ -1294,11 +1315,138 @@ public class RelatedInfoStep extends AbstractMvcAuthoringStep { } final RelatedLink link = linkResult.get(); + link.setBookmark(null); link.setTargetItem(itemResult.get()); assetRepo.save(link); return buildRedirectPathForStep( - String.format("/attachmentlists/%s/@details", list.getName()) + String.format( + "/attachmentlists/%s/links/%s/@details", + list.getName(), + link.getUuid() + ) + ); + + } else { + return documentUi.showAccessDenied( + getContentSection(), + getDocument(), + getLabel() + ); + } + } + + /** + * Updates to target of a related link and sets it to the provided bookmark, + * making the link an external link. + * + * @param sectionIdentifier + * @param documentPath + * @param listIdentifierParam The identifier of the + * {@link AttachmentList} to which the link + * belongs. + * @param linkUuid The UUID of the link. + * @param targetBookmarkIdentifier The UUID of the new target bookmark. + * + * @return A redirect to the details page of the link. + */ + @POST + @Path( + "/attachmentlists/{attachmentListIdentifier}/links/{linkUuid}/details/@set-target-bookmark") + @Transactional(Transactional.TxType.REQUIRED) + public String setTargetBookmark( + @PathParam(MvcAuthoringSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAuthoringSteps.DOCUMENT_PATH_PATH_PARAM_NAME) + final String documentPath, + @PathParam("attachmentListIdentifier") + final String listIdentifierParam, + @PathParam("linkUuid") + final String linkUuid, + @FormParam("targetBookmarkIdentifier") + final String targetBookmarkIdentifier + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (DocumentNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (permissionChecker.isPermitted( + ItemPrivileges.EDIT, getDocument() + )) { + final Optional listResult = findAttachmentList( + listIdentifierParam + ); + if (!listResult.isPresent()) { + return showAttachmentListNotFound(listIdentifierParam); + } + final AttachmentList list = listResult.get(); + + final Optional bookmarkResult; + final Identifier bookmarkIdentifer = identifierParser + .parseIdentifier(targetBookmarkIdentifier); + switch (bookmarkIdentifer.getType()) { + case ID: + bookmarkResult = assetRepo + .findById( + Long.parseLong( + bookmarkIdentifer.getIdentifier() + ), + Bookmark.class + ); + break; + case UUID: + bookmarkResult = assetRepo + .findByUuidAndType( + bookmarkIdentifer.getIdentifier(), + Bookmark.class + ); + break; + default: + bookmarkResult = assetRepo + .findByPath( + getContentSection(), + bookmarkIdentifer.getIdentifier() + ) + .filter(asset -> asset instanceof Bookmark) + .map(asset -> (Bookmark) asset); + } + + if (!bookmarkResult.isPresent()) { + models.put("targetBookmarkIdentifier", targetBookmarkIdentifier); + return "org/librecms/ui/contentsection/documents/target-bookmark-not-found.xhtml"; + } + + final Optional linkResult = list + .getAttachments() + .stream() + .map(ItemAttachment::getAsset) + .filter(asset -> asset instanceof RelatedLink) + .map(asset -> (RelatedLink) asset) + .filter(link -> link.getUuid().equals(linkUuid)) + .findAny(); + + if (!linkResult.isPresent()) { + models.put("contentItem", getDocumentPath()); + models.put("listIdentifier", listIdentifierParam); + models.put("linkUuid", linkUuid); + return "org/librecms/ui/contentsection/documents/link-asset-not-found.xhtml"; + } + + final RelatedLink link = linkResult.get(); + link.setTargetItem(null); + link.setBookmark(bookmarkResult.get()); + assetRepo.save(link); + + return buildRedirectPathForStep( + String.format( + "/attachmentlists/%s/links/%s/@details", + list.getName(), + link.getUuid() + ) ); } else { return documentUi.showAccessDenied( diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo-link-details.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo-link-details.xhtml index 9698bfa3f..df53397ca 100644 --- a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo-link-details.xhtml +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo-link-details.xhtml @@ -90,7 +90,7 @@ contentItemPickerId="item-picker" baseUrl="#{CmsLinkDetailsModel.baseUrl}" contentSection="#{CmsLinkDetailsModel.sectionName}" - formParamName="itemIdentifier" + formParamName="targetItemIdentifier" /> @@ -125,7 +125,7 @@ assetPickerId="bookmark-picker" baseUrl="#{CmsLinkDetailsModel.baseUrl}" contentSection="#{CmsLinkDetailsModel.sectionName}" - formParamName="bookmarkIdentifier" + formParamName="targetBookmarkIdentifier" /> diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo.xhtml index bb6bdc990..52dd356e4 100644 --- a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo.xhtml +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/relatedinfo.xhtml @@ -424,19 +424,19 @@ data-target="#attachmentlist-#{list.name}-add-attachment-dialog" data-toggle="modal" type="button"> - - #{CmsDefaultStepsMessageBundle['relatedinfo.attachmentlists.attachment.add.label']} + + #{CmsDefaultStepsMessageBundle['relatedinfo.attachmentlists.attachment.add.label']} - + #{CmsDefaultStepsMessageBundle['relatedinfo.attachmentlists.link.add.label']} diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-bookmark-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-bookmark-not-found.xhtml new file mode 100644 index 000000000..6388d5078 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-bookmark-not-found.xhtml @@ -0,0 +1,39 @@ +]> + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + + + + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-item-not-found.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-item-not-found.xhtml index b771df19f..d1976e50c 100644 --- a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-item-not-found.xhtml +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/documents/target-item-not-found.xhtml @@ -19,7 +19,7 @@
diff --git a/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties index cb3249a0c..be99d95db 100644 --- a/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties +++ b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle.properties @@ -218,3 +218,6 @@ relatedinfo.link.details.target.not_set=Target for link has not been set yet. relatedinfo.link.details.target.type=Type relatedinfo.link.details.target.item_name=Target relatedinfo.link.details.target.bookmark_name=Bookmark +relatedinfo.target_bookmark.not_found.title=Bookmark not found +relatedinfo.target_bookmark.not_found.message=The bookmark {0} selected as target was not found. +contentsection.document.relatedlinfo.breadcrumb=Related Information diff --git a/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties index a25149fa3..f534f76fe 100644 --- a/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/ui/DefaultAuthoringStepsBundle_de.properties @@ -218,3 +218,6 @@ relatedinfo.link.details.target.not_set=Es wurde noch kein Ziel f\u00fcr den Lin relatedinfo.link.details.target.type=Typ relatedinfo.link.details.target.item_name=Ziel relatedinfo.link.details.target.bookmark_name=Lesezeichen +relatedinfo.target_bookmark.not_found.title=Lesezeichen nicht gefunden +relatedinfo.target_bookmark.not_found.message=Das als Ziel ausgew\u00e4hlte Lesezeichen {0} ist nicht verf\u00fcgbar. +contentsection.document.relatedlinfo.breadcrumb=Weiterf\u00fchrende Information diff --git a/ccm-cms/src/main/scss/content-sections/cms-admin.scss b/ccm-cms/src/main/scss/content-sections/cms-admin.scss index 4c04ef71d..6795fc8fd 100644 --- a/ccm-cms/src/main/scss/content-sections/cms-admin.scss +++ b/ccm-cms/src/main/scss/content-sections/cms-admin.scss @@ -1,2 +1,6 @@ @import "custom"; -@import "../../../../node_modules/bootstrap/scss/bootstrap"; \ No newline at end of file +@import "../../../../node_modules/bootstrap/scss/bootstrap"; + +button.btn.cms-sort-handle:hover { + cursor: move; +} \ No newline at end of file diff --git a/ccm-cms/src/main/typescript/content-sections/cms-contentitempicker.ts b/ccm-cms/src/main/typescript/content-sections/cms-contentitempicker.ts index 460af46a9..1b2aeff9e 100644 --- a/ccm-cms/src/main/typescript/content-sections/cms-contentitempicker.ts +++ b/ccm-cms/src/main/typescript/content-sections/cms-contentitempicker.ts @@ -104,6 +104,8 @@ async function selectItem(event: Event, itemPickerElem: Element) { return; } + console.log(`itemUuid = ${itemUuid}`); + const itemPickerParam = itemPickerElem.querySelector( ".contentitempicker-param" ) as HTMLInputElement;