From c23690b1d541a194e5f2d796b3505fe8c4aff7df Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Thu, 13 Aug 2020 14:12:05 +0200
Subject: [PATCH] OO-4836: Show Opencast content inline

---
 .../olat/course/nodes/OpencastCourseNode.java |   4 +-
 .../ui/OpencastDisplayController.java         | 150 ------------------
 .../opencast/ui/OpencastRunController.java    | 119 ++++++++++++++
 .../nodes/opencast/ui/_content/display.html   |  20 ---
 .../nodes/opencast/ui/_content/run.html       |  23 +++
 5 files changed, 144 insertions(+), 172 deletions(-)
 delete mode 100644 src/main/java/org/olat/course/nodes/opencast/ui/OpencastDisplayController.java
 create mode 100644 src/main/java/org/olat/course/nodes/opencast/ui/OpencastRunController.java
 delete mode 100644 src/main/java/org/olat/course/nodes/opencast/ui/_content/display.html
 create mode 100644 src/main/java/org/olat/course/nodes/opencast/ui/_content/run.html

diff --git a/src/main/java/org/olat/course/nodes/OpencastCourseNode.java b/src/main/java/org/olat/course/nodes/OpencastCourseNode.java
index 0a068c314e1..a043fb5bb49 100644
--- a/src/main/java/org/olat/course/nodes/OpencastCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/OpencastCourseNode.java
@@ -36,8 +36,8 @@ import org.olat.course.editor.ConditionAccessEditConfig;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.StatusDescription;
-import org.olat.course.nodes.opencast.ui.OpencastDisplayController;
 import org.olat.course.nodes.opencast.ui.OpencastEditController;
+import org.olat.course.nodes.opencast.ui.OpencastRunController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
 import org.olat.course.run.userview.CourseNodeSecurityCallback;
 import org.olat.course.run.userview.UserCourseEnvironment;
@@ -95,7 +95,7 @@ public class OpencastCourseNode extends AbstractAccessableCourseNode {
 			String message = trans.translate("freezenoaccess.message");
 			runCtrl = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
 		} else {
-			runCtrl = new OpencastDisplayController(ureq, wControl, this, userCourseEnv);
+			runCtrl = new OpencastRunController(ureq, wControl, this, userCourseEnv);
 		}
 		Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, runCtrl, this, ICON_CSS);
 		return new NodeRunConstructionResult(ctrl);
diff --git a/src/main/java/org/olat/course/nodes/opencast/ui/OpencastDisplayController.java b/src/main/java/org/olat/course/nodes/opencast/ui/OpencastDisplayController.java
deleted file mode 100644
index 3ef28f6b969..00000000000
--- a/src/main/java/org/olat/course/nodes/opencast/ui/OpencastDisplayController.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * <a href="http://www.openolat.org">
- * OpenOLAT - Online Learning and Training</a><br>
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); <br>
- * you may not use this file except in compliance with the License.<br>
- * You may obtain a copy of the License at the
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
- * <p>
- * Unless required by applicable law or agreed to in writing,<br>
- * software distributed under the License is distributed on an "AS IS" BASIS, <br>
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
- * See the License for the specific language governing permissions and <br>
- * limitations under the License.
- * <p>
- * Initial code contributed and copyrighted by<br>
- * frentix GmbH, http://www.frentix.com
- * <p>
- */
-package org.olat.course.nodes.opencast.ui;
-
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.form.flexible.FormItem;
-import org.olat.core.gui.components.form.flexible.FormItemContainer;
-import org.olat.core.gui.components.form.flexible.elements.FormLink;
-import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
-import org.olat.core.gui.components.form.flexible.impl.FormEvent;
-import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
-import org.olat.core.gui.components.link.Link;
-import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.winmgr.CommandFactory;
-import org.olat.core.util.Formatter;
-import org.olat.course.nodes.OpencastCourseNode;
-import org.olat.course.run.userview.UserCourseEnvironment;
-import org.olat.modules.ModuleConfiguration;
-import org.olat.modules.opencast.OpencastEvent;
-import org.olat.modules.opencast.OpencastModule;
-import org.olat.modules.opencast.OpencastSeries;
-import org.olat.modules.opencast.OpencastService;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * 
- * Initial date: 12 Aug 2020<br>
- * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
- *
- */
-public class OpencastDisplayController extends FormBasicController {
-	
-	private FormLink seriesButton;
-	private FormLink eventButton;
-
-	private final ModuleConfiguration config;
-	private final String roles;
-	
-	@Autowired
-	private OpencastModule opencastModule;
-	@Autowired
-	private OpencastService opencastService;
-
-	public OpencastDisplayController(UserRequest ureq, WindowControl wControl, OpencastCourseNode courseNode,
-			UserCourseEnvironment userCourseEnv) {
-		super(ureq, wControl, "display");
-		config = courseNode.getModuleConfiguration();
-		roles = initRoles(userCourseEnv);
-		
-		initForm(ureq);
-	}
-
-	private String initRoles(UserCourseEnvironment userCourseEnv) {
-		if (userCourseEnv.isAdmin()) {
-			return opencastModule.getRolesAdmin();
-		} else if (userCourseEnv.isCoach()) {
-			return opencastModule.getRolesCoach();
-		}
-		return opencastModule.getRolesParticipant();
-	}
-
-	@Override
-	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		if (formLayout instanceof FormLayoutContainer) {
-			FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout;
-			
-			String title = config.getStringValue(OpencastCourseNode.CONFIG_TITLE);
-			layoutCont.contextPut("title", title);
-			
-			if (config.has(OpencastCourseNode.CONFIG_SERIES_IDENTIFIER)) {
-				String seriesIdentifier = config.getStringValue(OpencastCourseNode.CONFIG_SERIES_IDENTIFIER);
-				OpencastSeries series = opencastService.getSeries(seriesIdentifier);
-				if (series != null) {
-					layoutCont.contextPut("title", series.getTitle());
-					seriesButton = uifactory.addFormLink("start.series", formLayout, Link.BUTTON_LARGE);
-					seriesButton.setNewWindow(true, true);
-					seriesButton.setUserObject(series);
-				} else {
-					layoutCont.contextPut("error", translate("error.series.not.found", new String[] {title}));
-				}
-			} else {
-				String eventIdentifier = config.getStringValue(OpencastCourseNode.CONFIG_EVENT_IDENTIFIER);
-				OpencastEvent event = opencastService.getEvent(eventIdentifier);
-				if (event != null) {
-					layoutCont.contextPut("title", event.getTitle());
-					String start = Formatter.getInstance(getLocale()).formatDateAndTime(event.getStart());
-					layoutCont.contextPut("start", start);
-					layoutCont.contextPut("creator", event.getCreator());
-					
-					eventButton = uifactory.addFormLink("start.event", formLayout, Link.BUTTON_LARGE);
-					eventButton.setNewWindow(true, true);
-					eventButton.setUserObject(event);
-				} else {
-					layoutCont.contextPut("error", translate("error.event.not.found", new String[] {title}));
-				}
-			}
-		}
-	}
-
-	@Override
-	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if (source == seriesButton) {
-			OpencastSeries opencastSeries = (OpencastSeries)seriesButton.getUserObject();
-			doStartSeries(ureq, opencastSeries);
-		} else if (source == eventButton) {
-			OpencastEvent opencastEvent = (OpencastEvent)eventButton.getUserObject();
-			doStartEvent(ureq, opencastEvent);
-		}
-		super.formInnerEvent(ureq, source, event);
-	}
-
-	private void doStartSeries(UserRequest ureq, OpencastSeries opencastSeries) {
-		String url = opencastService.getLtiSeriesMapperUrl(ureq.getUserSession(), opencastSeries, roles);
-		getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowRedirectTo(url));
-	}
-
-	private void doStartEvent(UserRequest ureq, OpencastEvent opencastEvent) {
-		String url = opencastService.getLtiEventMapperUrl(ureq.getUserSession(), opencastEvent.getIdentifier(), roles);
-		getWindowControl().getWindowBackOffice().sendCommandTo(CommandFactory.createNewWindowRedirectTo(url));
-	}
-
-	@Override
-	protected void formOK(UserRequest ureq) {
-		//
-	}
-
-	@Override
-	protected void doDispose() {
-		//
-	}
-
-}
diff --git a/src/main/java/org/olat/course/nodes/opencast/ui/OpencastRunController.java b/src/main/java/org/olat/course/nodes/opencast/ui/OpencastRunController.java
new file mode 100644
index 00000000000..7078188e9c5
--- /dev/null
+++ b/src/main/java/org/olat/course/nodes/opencast/ui/OpencastRunController.java
@@ -0,0 +1,119 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.nodes.opencast.ui;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.htmlheader.jscss.JSAndCSSComponent;
+import org.olat.core.gui.components.velocity.VelocityContainer;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.util.Formatter;
+import org.olat.course.nodes.OpencastCourseNode;
+import org.olat.course.run.userview.UserCourseEnvironment;
+import org.olat.modules.ModuleConfiguration;
+import org.olat.modules.opencast.OpencastEvent;
+import org.olat.modules.opencast.OpencastModule;
+import org.olat.modules.opencast.OpencastSeries;
+import org.olat.modules.opencast.OpencastService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 13 Aug 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class OpencastRunController extends BasicController {
+	
+	private final ModuleConfiguration config;
+	private final String roles;
+	
+	@Autowired
+	private OpencastModule opencastModule;
+	@Autowired
+	private OpencastService opencastService;
+
+	public OpencastRunController(UserRequest ureq, WindowControl wControl, OpencastCourseNode courseNode, UserCourseEnvironment userCourseEnv) {
+		super(ureq, wControl);
+		config = courseNode.getModuleConfiguration();
+		roles = initRoles(userCourseEnv);
+		
+		VelocityContainer mainVC = createVelocityContainer("run");
+		
+		String url = null;
+		String title = config.getStringValue(OpencastCourseNode.CONFIG_TITLE);
+		mainVC.contextPut("title", title);
+		
+		if (config.has(OpencastCourseNode.CONFIG_SERIES_IDENTIFIER)) {
+			String seriesIdentifier = config.getStringValue(OpencastCourseNode.CONFIG_SERIES_IDENTIFIER);
+			OpencastSeries series = opencastService.getSeries(seriesIdentifier);
+			if (series != null) {
+				mainVC.contextPut("title", series.getTitle());
+				url = opencastService.getLtiSeriesMapperUrl(ureq.getUserSession(), series, roles);
+			} else {
+				mainVC.contextPut("error", translate("error.series.not.found", new String[] {title}));
+			}
+		} else {
+			String eventIdentifier = config.getStringValue(OpencastCourseNode.CONFIG_EVENT_IDENTIFIER);
+			OpencastEvent event = opencastService.getEvent(eventIdentifier);
+			if (event != null) {
+				mainVC.contextPut("title", event.getTitle());
+				String start = Formatter.getInstance(getLocale()).formatDateAndTime(event.getStart());
+				mainVC.contextPut("start", start);
+				mainVC.contextPut("creator", event.getCreator());
+				url = opencastService.getLtiEventMapperUrl(ureq.getUserSession(), event.getIdentifier(), roles);
+			} else {
+				mainVC.contextPut("error", translate("error.event.not.found", new String[] {title}));
+			}
+		}
+		
+		if (url != null) {
+			mainVC.contextPut("mapperUri", url + "/");
+			
+			JSAndCSSComponent js = new JSAndCSSComponent("js", new String[] { "js/openolat/iFrameResizerHelper.js" }, null);
+			mainVC.put("js", js);
+		}
+		
+		putInitialPanel(mainVC);
+	}
+	
+	private String initRoles(UserCourseEnvironment userCourseEnv) {
+		if (userCourseEnv.isAdmin()) {
+			return opencastModule.getRolesAdmin();
+		} else if (userCourseEnv.isCoach()) {
+			return opencastModule.getRolesCoach();
+		}
+		return opencastModule.getRolesParticipant();
+	}
+
+
+	@Override
+	protected void event(UserRequest ureq, Component source, Event event) {
+		//
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+
+}
diff --git a/src/main/java/org/olat/course/nodes/opencast/ui/_content/display.html b/src/main/java/org/olat/course/nodes/opencast/ui/_content/display.html
deleted file mode 100644
index dec36daf911..00000000000
--- a/src/main/java/org/olat/course/nodes/opencast/ui/_content/display.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<div>
-<h3>$r.escapeHtml($title)</h3>
-#if($r.isNotEmpty($errorMessage))
-	<div class="o_error">$errorMessage</div>
-#end
-#if($r.isNotNull($start))
-<div><i class="o_icon o_icon-fw o_icon_lifecycle_date"> </i> $start</div>
-#end
-#if($r.isNotEmpty($creator))
-<div><i class="o_icon o_icon-fw o_icon_user"> </i> $r.escapeHtml($creator)</div>
-#end
-<div class="o_button_group">
-#if($r.available("start.series") && $r.visible("start.series"))
-	$r.render("start.series")
-#end
-#if($r.available("start.event") && $r.visible("start.event"))
-	$r.render("start.event")
-#end
-</div>
-</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/opencast/ui/_content/run.html b/src/main/java/org/olat/course/nodes/opencast/ui/_content/run.html
new file mode 100644
index 00000000000..7eca555a3be
--- /dev/null
+++ b/src/main/java/org/olat/course/nodes/opencast/ui/_content/run.html
@@ -0,0 +1,23 @@
+<div>
+<h3>$r.escapeHtml($title)</h3>
+#if($r.isNotEmpty($errorMessage))
+	<div class="o_error">$errorMessage</div>
+#end
+#if($r.isNotNull($start))
+	<div><i class="o_icon o_icon-fw o_icon_lifecycle_date"> </i> $start</div>
+#end
+#if($r.isNotEmpty($creator))
+	<div><i class="o_icon o_icon-fw o_icon_user"> </i> $r.escapeHtml($creator)</div>
+#end
+</div>
+#if($r.isNotNull($mapperUri))
+	<div class="o_iframedisplay">
+		<iframe id="OpencastIFrame" src="${mapperUri}?$r.uuid" marginwidth="0" marginheight="0" frameborder="0" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe>
+	</div>
+	<script>
+	/* <![CDATA[ */ 
+		jQuery(function() {b_resizeIframeToMainMaxHeight("OpencastIFrame");});
+		registerIFrameAndObserve("OpencastIFrame", false);
+	/* ]]> */
+	</script>
+#end
\ No newline at end of file
-- 
GitLab