From eae8aae1e6a764dcf196f74e2de27d5d227addd8 Mon Sep 17 00:00:00 2001
From: uhensler <none@none>
Date: Fri, 21 Apr 2017 09:59:36 +0200
Subject: [PATCH] OO-2699: preview button in the course node configuration ***

---
 .../course/nodes/Card2BrainCourseNode.java    |  2 +-
 .../Card2BrainConfigController.java           | 51 ++++++++++++++-----
 .../nodes/card2brain/Card2BrainContext.java   | 33 +++---------
 .../card2brain/Card2BrainEditController.java  | 18 +++----
 .../card2brain/Card2BrainRunController.java   | 39 +++-----------
 .../_i18n/LocalStrings_de.properties          |  3 +-
 .../_i18n/LocalStrings_en.properties          |  1 +
 .../olat/ims/lti/manager/LTIManagerImpl.java  |  2 +-
 .../manager/Card2BrainManagerImpl.java        |  2 +-
 .../ui/_i18n/LocalStrings_de.properties       |  4 +-
 10 files changed, 69 insertions(+), 86 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java b/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java
index 96bab9d545a..b0e2c5f265f 100644
--- a/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java
@@ -92,7 +92,7 @@ public class Card2BrainCourseNode extends AbstractAccessableCourseNode {
 			String message = trans.translate("guestnoaccess.message");
 		    runCtrl = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
 		} else {
-			runCtrl = new Card2BrainRunController(ureq, wControl, userCourseEnv, this);
+			runCtrl = new Card2BrainRunController(ureq, wControl, this.getModuleConfiguration());
 		}
 		Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, runCtrl, this, "o_card2brain_icon");
 		return new NodeRunConstructionResult(ctrl);
diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainConfigController.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainConfigController.java
index 54d0ca380b7..898387a72a2 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainConfigController.java
+++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainConfigController.java
@@ -19,9 +19,11 @@
  */
 package org.olat.course.nodes.card2brain;
 
+import org.olat.core.commons.fullWebApp.LayoutMain3ColsPreviewController;
 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.elements.MultipleSelectionElement;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
@@ -51,6 +53,8 @@ public class Card2BrainConfigController extends FormBasicController {
 	private MultipleSelectionElement enablePrivateLoginEl;
 	private TextElement privateKeyEl;
 	private TextElement privateSecretEl;
+	private FormLink previewButton;
+	private LayoutMain3ColsPreviewController previewLayoutCtr;
 	
 	private final ModuleConfiguration config;
 	
@@ -59,10 +63,10 @@ public class Card2BrainConfigController extends FormBasicController {
 	@Autowired
 	private Card2BrainManager card2BrainManager;
 	
-	public Card2BrainConfigController(UserRequest ureq, WindowControl wControl, Card2BrainCourseNode card2BrainCourseNode) {
+	public Card2BrainConfigController(UserRequest ureq, WindowControl wControl, ModuleConfiguration config) {
 		super(ureq, wControl);
-		
-		this.config = card2BrainCourseNode.getModuleConfiguration();
+
+		this.config = config;
 		
 		initForm(ureq);
 	}
@@ -76,7 +80,10 @@ public class Card2BrainConfigController extends FormBasicController {
 		flashcardAliasEl = uifactory.addTextElement("edit.flashcard.alias", "edit.flashcard.alias", 128, falshcardAlias, formLayout);
 		flashcardAliasEl.setMandatory(true);
 		flashcardAliasEl.setHelpTextKey("edit.FlashcardHelpText", null);
-
+		
+		previewButton = uifactory.addFormLink("edit.preview", formLayout, "btn btn-default o_xsmall");
+		previewButton.setIconLeftCSS("o_icon o_icon_preview");
+		
 		uifactory.addSpacerElement("Spacer", formLayout, false);
 		
 		boolean enablePrivateLogin = config.getBooleanSafe(Card2BrainCourseNode.CONFIG_ENABLE_PRIVATE_LOGIN);
@@ -118,6 +125,13 @@ public class Card2BrainConfigController extends FormBasicController {
 			setFormWarning(null);
 		}
 	}
+	
+	/**
+	 * Show or hide the preview button.
+	 */
+	private void showHidePreviewButton(boolean show) {
+		previewButton.setVisible(show);	
+	}
 
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) { 
@@ -125,6 +139,9 @@ public class Card2BrainConfigController extends FormBasicController {
 		
 		allOk &= validateFlashcardAlias(parseAlias(flashcardAliasEl.getValue()));	
 		allOk &= validateLogin();
+		
+		// Show the preview button only when the configuration is valid.
+		showHidePreviewButton(allOk);
 
 		return allOk;
 	}
@@ -135,9 +152,7 @@ public class Card2BrainConfigController extends FormBasicController {
 		if (!StringHelper.containsNonWhitespace(alias)) {
 			flashcardAliasEl.setErrorKey(FORM_MISSING_MANDATORY, null);
 			allOk &= false;
-		}
-		
-		if (!card2BrainManager.checkSetOfFlashcards(alias)) {
+		} else if (!card2BrainManager.checkSetOfFlashcards(alias)) {
 			flashcardAliasEl.setErrorKey("edit.warning.aliasCheckFailed", null);
 			allOk &= false;
 		}
@@ -170,13 +185,26 @@ public class Card2BrainConfigController extends FormBasicController {
 	
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if (enablePrivateLoginEl == source) {
+		if (source == enablePrivateLoginEl) {
 			showHidePrivateLoginFields();
-		}
-		
+		} else if (source == previewButton) {
+			Controller card2brainRunCtr = new Card2BrainRunController(ureq, getWindowControl(), config);
+			previewLayoutCtr = new LayoutMain3ColsPreviewController(ureq, getWindowControl(), null, card2brainRunCtr.getInitialComponent(), null);
+			previewLayoutCtr.addDisposableChildController(card2brainRunCtr);
+			previewLayoutCtr.activate();
+			listenTo(previewLayoutCtr);
+		}		
 		super.formInnerEvent(ureq, source, event);
 	}
 	
+	@Override
+	public void event(UserRequest ureq, Controller source, Event event) {
+		if (source == previewLayoutCtr ) {
+			removeAsListenerAndDispose(previewLayoutCtr);
+		}
+		super.event(ureq, source, event);
+	}
+	
 	protected ModuleConfiguration getUpdatedConfig() {
 		config.set(Card2BrainCourseNode.CONFIG_FLASHCARD_ALIAS, parseAlias(flashcardAliasEl.getValue()));
 		if (isPrivateLoginEnabled()) {
@@ -220,8 +248,7 @@ public class Card2BrainConfigController extends FormBasicController {
 	 * @return the parsed String
 	 */
 	private String parseAlias(String alias) {
-		return alias.replace("https://card2brain.ch/box/", "");
-		
+		return alias.replace("https://card2brain.ch/box/", "");	
 	}
 	
 }
diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainContext.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainContext.java
index 6711e3d01d4..b6ab82fc496 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainContext.java
+++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainContext.java
@@ -20,8 +20,6 @@
 package org.olat.course.nodes.card2brain;
 
 import org.olat.core.id.Identity;
-import org.olat.course.nodes.CourseNode;
-import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.ims.lti.LTIContext;
 import org.olat.ims.lti.LTIDisplayOptions;
 
@@ -37,60 +35,45 @@ public class Card2BrainContext implements LTIContext {
 	private static final String HEIGTH = "auto";
 	private static final String WIDTH = "auto";
 	private static final LTIDisplayOptions TARGET = LTIDisplayOptions.iframe;
-	
-	private final String sourcedId;
-	private final String backMapperUri;
-	private final String outcomeMapperUri;
-	private final CourseNode courseNode;
-	private final CourseEnvironment courseEnv;
-	
-	public Card2BrainContext(CourseEnvironment courseEnv, CourseNode courseNode,
-			String sourcedId, String backMapperUri, String outcomeMapperUri) {
-		this.sourcedId = sourcedId;
-		this.courseEnv = courseEnv;
-		this.courseNode = courseNode;
-		this.backMapperUri = backMapperUri;
-		this.outcomeMapperUri = outcomeMapperUri;
-	}
 
 	@Override
 	public String getSourcedId() {
-		return sourcedId;
+		return null;
 	}
 
 	@Override
 	public String getTalkBackMapperUri() {
-		return backMapperUri;
+		return null;
 	}
 	
 	@Override
 	public String getOutcomeMapperUri() {
-		return outcomeMapperUri;
+		return null;
 	}
 
 	@Override
 	public String getResourceId() {
-		return courseNode.getIdent();
+		return null;
 	}
 
 	@Override
 	public String getResourceTitle() {
-		return courseNode.getShortTitle();
+		return null;
 	}
 
 	@Override
 	public String getResourceDescription() {
-		return courseNode.getLongTitle();
+		return null;
 	}
 
 	@Override
 	public String getContextId() {
-		return courseEnv.getCourseResourceableId().toString();
+		return null;
 	}
 
 	@Override
 	public String getContextTitle() {
-		return courseEnv.getCourseTitle();
+		return null;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainEditController.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainEditController.java
index 202fb4df610..8833779ca25 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainEditController.java
+++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainEditController.java
@@ -53,18 +53,18 @@ public class Card2BrainEditController extends ActivateableTabbableDefaultControl
 	private ConditionEditController accessibilityCondContr;
 	private TabbedPane tabPane;
 	
-	public Card2BrainEditController(UserRequest ureq, WindowControl wControl, Card2BrainCourseNode card2BrainCourseNode,
-			ICourse course, UserCourseEnvironment userCourseEnv) {
+	public Card2BrainEditController(UserRequest ureq, WindowControl wControl, 
+			Card2BrainCourseNode card2BrainCourseNode, ICourse course, UserCourseEnvironment userCourseEnv) {
 		super(ureq, wControl);
-		
-		card2BrainConfigController = new Card2BrainConfigController(ureq, wControl, card2BrainCourseNode);
+
+		card2BrainConfigController = new Card2BrainConfigController(ureq, wControl, card2BrainCourseNode.getModuleConfiguration());
 		listenTo(card2BrainConfigController);
-		
+
 		Condition accessCondition = card2BrainCourseNode.getPreConditionAccess();
-		accessibilityCondContr = new ConditionEditController(ureq, wControl, userCourseEnv,
-				accessCondition, AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), card2BrainCourseNode));
+		accessibilityCondContr = new ConditionEditController(ureq, wControl, userCourseEnv, accessCondition,
+				AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), card2BrainCourseNode));
 		listenTo(accessibilityCondContr);
-		
+
 		editVc = createVelocityContainer("edit");
 		editVc.put("configForm", card2BrainConfigController.getInitialComponent());
 	}
@@ -105,6 +105,4 @@ public class Card2BrainEditController extends ActivateableTabbableDefaultControl
 		//
 	}
 
-
-
 }
diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainRunController.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainRunController.java
index a858421e598..7061f74b709 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainRunController.java
+++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainRunController.java
@@ -21,7 +21,6 @@ package org.olat.course.nodes.card2brain;
 
 import java.util.Map;
 
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -30,17 +29,10 @@ 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.helpers.Settings;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
 import org.olat.course.nodes.Card2BrainCourseNode;
-import org.olat.course.nodes.CourseNode;
-import org.olat.course.run.environment.CourseEnvironment;
-import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.ims.lti.LTIContext;
 import org.olat.ims.lti.LTIManager;
 import org.olat.ims.lti.ui.PostDataMapper;
-import org.olat.ims.lti.ui.TalkBackMapper;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.card2brain.Card2BrainModule;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -56,23 +48,17 @@ public class Card2BrainRunController extends BasicController {
 
 	private Panel main;
 
-	private CourseNode courseNode;
 	private final ModuleConfiguration config;
-	private final CourseEnvironment courseEnv;
-
-	private final LTIManager ltiManager;
 
 	@Autowired
 	private Card2BrainModule card2BrainModule;
+	@Autowired
+	private LTIManager ltiManager;
 
-	public Card2BrainRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
-			Card2BrainCourseNode card2BrainCourseNode) {
+	public Card2BrainRunController(UserRequest ureq, WindowControl wControl, ModuleConfiguration config) {
 		super(ureq, wControl);
 
-		this.courseNode = card2BrainCourseNode;
-		this.config = card2BrainCourseNode.getModuleConfiguration();
-		this.courseEnv = userCourseEnv.getCourseEnvironment();
-		ltiManager = CoreSpringFactory.getImpl(LTIManager.class);
+		this.config = config;
 
 		main = new Panel("card2brainPanel");
 		runCard2Brain(ureq);
@@ -95,19 +81,7 @@ public class Card2BrainRunController extends BasicController {
 			oauth_secret = card2BrainModule.getEnterpriseSecret();
 		}
 
-		String serverUri = Settings.createServerURI();
-		String sourcedId = courseEnv.getCourseResourceableId() + "_" + courseNode.getIdent() + "_"
-				+ getIdentity().getKey();
-		container.contextPut("sourcedId", sourcedId);
-
-		Mapper talkbackMapper = new TalkBackMapper(getLocale(),
-				getWindowControl().getWindowBackOffice().getWindow().getGuiTheme().getBaseURI());
-		String backMapperUrl = registerCacheableMapper(ureq, sourcedId + "_talkback", talkbackMapper);
-		String backMapperUri = serverUri + backMapperUrl + "/";
-		String outcomeMapperUri = null;
-
-		LTIContext context = new Card2BrainContext(courseEnv, courseNode, sourcedId, backMapperUri, outcomeMapperUri);
-
+		LTIContext context = new Card2BrainContext();
 		Map<String, String> unsignedProps = ltiManager.forgeLTIProperties(getIdentity(), getLocale(), context, true,
 				true);
 
@@ -120,8 +94,7 @@ public class Card2BrainRunController extends BasicController {
 
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
-		// TODO Auto-generated method stub
-
+		//
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_de.properties
index f11f6859316..16a08ee39fe 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_de.properties
@@ -7,9 +7,10 @@ edit.access.enablePrivateLogin=Privates Login verwenden
 edit.access.privateKey=Schl\u00FCssel
 edit.access.privateSecret=Passwort
 edit.flashcard.alias=Alias der Lernkartei
+edit.preview=Vorschau
 edit.title=Lernkartei konfigurieren
 edit.warning.aliasCheckFailed=Das Alias konnte nicht verifiziert werden. Existiert eine Kartenkartei mit diesem Alias?
-edit.warning.enterpriseLoginDisabled=Dieser Kartenstapel wurde mit einem Enterprise Login konfiguriert. Das Enterprise Login wurde in der Zwischenzeit durch den Administrator deaktiviert. Geben Sie bitte die Angaben zum privaten Login ein.
+edit.warning.enterpriseLoginDisabled=Diese Lernkartei wurde mit einem Enterprise Login konfiguriert. Das Enterprise Login wurde in der Zwischenzeit durch den Administrator deaktiviert. Geben Sie bitte die Angaben zum privaten Login ein.
 edit.warning.enterpriseLoginDisabled.short=Das Enterprise Login ist deaktiviert.
 link.text=card2brain Lernkarten
 pane.tab.accessibility=Zugang
diff --git a/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_en.properties
index d26d6fd5984..015d21528fb 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/card2brain/_i18n/LocalStrings_en.properties
@@ -7,6 +7,7 @@ edit.access.enablePrivateLogin=Use private login
 edit.access.privateKey=Key
 edit.access.privateSecret=Password
 edit.flashcard.alias=Alias of flashcards
+edit.preview=Preview
 edit.title=Flashcard Configuration
 edit.warning.aliasCheckFailed=The alias could not be verified. Does a set of flashcard with that alias exist?
 edit.warning.enterpriseLoginDisabled=That set of flashcard was configured with a enterprise login. The enterprise login was disabled by the administrator in the meantime. Please fill in a private login.
diff --git a/src/main/java/org/olat/ims/lti/manager/LTIManagerImpl.java b/src/main/java/org/olat/ims/lti/manager/LTIManagerImpl.java
index 3956a5b7d39..c3e2368237d 100644
--- a/src/main/java/org/olat/ims/lti/manager/LTIManagerImpl.java
+++ b/src/main/java/org/olat/ims/lti/manager/LTIManagerImpl.java
@@ -152,7 +152,7 @@ public class LTIManagerImpl implements LTIManager {
 		final String firstName = u.getProperty(UserConstants.FIRSTNAME, loc);
 		final String email = u.getProperty(UserConstants.EMAIL, loc);
 
-		Map<String,String> props = new HashMap<String,String>();
+		Map<String,String> props = new HashMap<>();
 		setProperty(props, "resource_link_id", context.getResourceId());
 		setProperty(props, "resource_link_title", context.getResourceTitle());
 		setProperty(props, "resource_link_description", context.getResourceDescription());
diff --git a/src/main/java/org/olat/modules/card2brain/manager/Card2BrainManagerImpl.java b/src/main/java/org/olat/modules/card2brain/manager/Card2BrainManagerImpl.java
index ecc4e9d9c0e..a4fe772ee83 100644
--- a/src/main/java/org/olat/modules/card2brain/manager/Card2BrainManagerImpl.java
+++ b/src/main/java/org/olat/modules/card2brain/manager/Card2BrainManagerImpl.java
@@ -62,7 +62,7 @@ public class Card2BrainManagerImpl implements Card2BrainManager {
 			log.error("", e);
 		}
 		
-		log.info(new StringBuilder("Check set of flaschcards (").append(url).append("): ").append(setOfFlashcardExists).toString());
+		log.info(new StringBuilder("Check card2brain set of flaschcards (").append(url).append("): ").append(setOfFlashcardExists).toString());
 		return setOfFlashcardExists;
 	}
 
diff --git a/src/main/java/org/olat/modules/card2brain/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/card2brain/ui/_i18n/LocalStrings_de.properties
index 498d6e5edaf..2543eb85927 100644
--- a/src/main/java/org/olat/modules/card2brain/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/card2brain/ui/_i18n/LocalStrings_de.properties
@@ -1,6 +1,6 @@
 #Wed Apr 19 14:49:46 CEST 2017
 admin.baseUrl=URL LTI Ressource
-admin.baseUrlHelpText=Als Platzhalter f\u00FCr das Alias des Kartenstapels ist '%s' zu verwenden.
+admin.baseUrlHelpText=Als Platzhalter f\u00FCr das Alias der Lernkartei ist '%s' zu verwenden.
 admin.description=card2brain ist die Multi-Channel-Application zum systematischen Lernen in allen Wissensgebieten. Auf card2brain.ch kannst du Lernkarten erstellen und nach dem bekannten F\u00FCnf-F\u00E4cher-Prinzip von Sebastian Leitner lernen. Weitere Informationen sind auf der <a href\="http\://card2brain.ch" target\=_blank>Webseite</a> von card2brain zu finden.
 admin.enabled=Modul "card2brain"
 admin.enterpriseKey=Schl\u00FCssel
@@ -12,5 +12,5 @@ admin.expertSettings=Experteneinstellungen
 admin.menu.title=card2brain
 admin.menu.title.alt=card2brain
 admin.peekViewUrl=URL der Vorschau
-admin.peekViewUrlHelpText=Als Platzhalter f\u00FCr das Alias des Kartenstapels ist '%s' zu verwenden.
+admin.peekViewUrlHelpText=Als Platzhalter f\u00FCr das Alias der Lernkartei ist '%s' zu verwenden.
 admin.title=Konfiguration
-- 
GitLab