From b9f57bc5580304b53d0aebc728ef0ffd73f2a673 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 16 Apr 2020 08:54:17 +0200
Subject: [PATCH] OO-4635: enhance portfolio's toc's link to course to open in
 new window

---
 .../gui/components/link/LinkRenderer.java     |  2 +-
 .../ui/TableOfContentController.java          | 42 +++++++++++++++----
 .../ui/_content/table_of_contents.html        |  4 +-
 3 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java b/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java
index 75eb66c7a5f..0761f9234d6 100644
--- a/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java
@@ -214,7 +214,7 @@ public class LinkRenderer extends DefaultComponentRenderer {
 			} else {
 				 // a link may force a non ajax-mode and a custom targ
 				boolean iframePostEnabled = flags.isIframePostEnabled() && link.isAjaxEnabled() && link.getTarget() == null;
-				ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, !link.isSuppressDirtyFormWarning(), true,
+				ubu.buildHrefAndOnclick(sb, link.getUrl(), null, iframePostEnabled, !link.isSuppressDirtyFormWarning(), true,
 						new NameValuePair(VelocityContainer.COMMAND_ID, command));
 			}
 			
diff --git a/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java b/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java
index 678f7375c13..debe917bf60 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/TableOfContentController.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.olat.NewControllerFactory;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingDefaultSecurityCallback;
@@ -57,9 +58,9 @@ import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.gui.control.generic.spacesaver.ToggleBoxController;
 import org.olat.core.gui.control.winmgr.ScrollTopCommand;
 import org.olat.core.gui.media.MediaResource;
-import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
@@ -108,9 +109,18 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class TableOfContentController extends BasicController implements TooledController, Activateable2 {
 	
-	private Link newSectionTool, newSectionButton, newEntryLink, newAssignmentLink,
-		editBinderMetadataLink, moveToTrashBinderLink, deleteBinderLink, restoreBinderLink,
-		exportBinderAsCpLink, printLink, exportBinderAsPdfLink;
+	private Link printLink;
+	private Link newEntryLink;
+	private Link newSectionTool;
+	private Link deleteBinderLink;
+	private Link newSectionButton;
+	private Link restoreBinderLink;
+	private Link newAssignmentLink;
+	private Link toReferenceEntryLink;
+	private Link editBinderMetadataLink;
+	private Link moveToTrashBinderLink;
+	private Link exportBinderAsCpLink;
+	private Link exportBinderAsPdfLink;
 	
 	private final VelocityContainer mainVC;
 	private final TooledStackedPanel stackPanel;
@@ -122,12 +132,14 @@ public class TableOfContentController extends BasicController implements TooledC
 	private SectionEditController newSectionCtrl;
 	private SectionEditController editSectionCtrl;
 	private AssignmentEditController newAssignmentCtrl;
+	private DialogBoxController confirmCloseSectionCtrl;
+	private DialogBoxController confirmReopenSectionCtrl;
+	private DialogBoxController confirmDeleteSectionCtrl;
+	private DialogBoxController confirmRestoreBinderCtrl;
 	private ConfirmDeleteBinderController deleteBinderCtrl;
 	private SectionDatesEditController editSectionDatesCtrl;
 	private BinderMetadataEditController binderMetadataCtrl;
 	private ConfirmMoveBinderToTrashController moveBinderToTrashCtrl;
-	private DialogBoxController confirmCloseSectionCtrl, confirmReopenSectionCtrl,
-				confirmDeleteSectionCtrl, confirmRestoreBinderCtrl;
 	
 	private PageRunController pageCtrl;
 	private PageMetadataEditController newPageCtrl;
@@ -172,9 +184,14 @@ public class TableOfContentController extends BasicController implements TooledC
 
 		RepositoryEntry repoEntry = binder.getEntry();
 		if (repoEntry != null) {
-			mainVC.contextPut("referenceEntryName", repoEntry.getDisplayname());
-			String url = Settings.getServerContextPathURI() + "/url/RepositoryEntry/" + repoEntry.getKey();
-			mainVC.contextPut("referenceEntryUrl", url);
+			String repoEntryPath = "[RepositoryEntry:" + repoEntry.getKey() + "]";
+			String url = BusinessControlFactory.getInstance().getURLFromBusinessPathString(repoEntryPath);
+			String name = translate("binder.entry.name") + ": " + StringHelper.escapeHtml(repoEntry.getDisplayname());
+			toReferenceEntryLink = LinkFactory.createLink("to.ref.entry", "to.ref.entry", "to.ref.rentry", name, getTranslator(), mainVC, this, Link.NONTRANSLATED);
+			toReferenceEntryLink.setDomReplacementWrapperRequired(false);
+			toReferenceEntryLink.setIconLeftCSS("o_icon o_CourseModule_icon");
+			toReferenceEntryLink.setElementCssClass("small");
+			toReferenceEntryLink.setUrl(url);
 		}
 		
 		summaryComp = TextFactory.createTextComponentFromString("summaryCmp" + CodeHelper.getRAMUniqueID(), "", null,
@@ -656,6 +673,8 @@ public class TableOfContentController extends BasicController implements TooledC
 			doPrint(ureq);
 		} else if(exportBinderAsPdfLink == source) {
 			doExportBinderAsPdf(ureq);
+		} else if(toReferenceEntryLink == source) {
+			doOpenReferenceEntry(ureq);
 		} else if(stackPanel == source) {
 			if(event instanceof PopEvent && pageCtrl != null && ((PopEvent)event).getController() == pageCtrl && pageCtrl.getSection() != null) {
 				stackPanel.popUserObject(new TOCSection(pageCtrl.getSection()));
@@ -840,6 +859,11 @@ public class TableOfContentController extends BasicController implements TooledC
 		return pageCtrl;
 	}
 	
+	private void doOpenReferenceEntry(UserRequest ureq) {
+		String businessPath = "[RepositoryEntry:" + binder.getEntry().getKey() + "]";
+		NewControllerFactory.getInstance().launch(businessPath, ureq, getWindowControl());
+	}
+	
 	private void doCreateNewEntry(UserRequest ureq) {
 		if(guardModalController(newPageCtrl)) return;
 		
diff --git a/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html b/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html
index 847cc3d28ad..c44b0783d93 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html
+++ b/src/main/java/org/olat/modules/portfolio/ui/_content/table_of_contents.html
@@ -7,8 +7,8 @@
 		$r.contextHelpWithWrapper("Portfolio task and assignment: Collecting and editing")
 	#end
 	<h2>$r.translate("table.of.contents", $binderTitle) #if($owners && !$owners.isEmpty())<small>$r.translate("binder.by",$owners)</small>#end </h2>
-	#if($r.isNotNull($referenceEntryName))
-		<div class="o_portfolio_repo_link o_block_bottom o_block_move_up_small"><a href="$referenceEntryUrl" class="small"><i class="o_icon o_CourseModule_icon"> </i> $r.translate("binder.entry.name"): $r.escapeHtml($referenceEntryName)</a></div>
+	#if($r.available("to.ref.entry"))
+		<div class="o_portfolio_repo_link o_block_bottom o_block_move_up_small">$r.render("to.ref.entry")</div>
 	#end
 	#if($r.available("summary"))
 		$r.render("summary")
-- 
GitLab