From 26bd699e28fbbac1478fbb490ffd7813fb74dcad Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 16 Oct 2014 14:12:27 +0200
Subject: [PATCH] OO-1258: add landing page as an option for the logo url

---
 .../olat/admin/landingpages/model/Rule.java   |  8 +-
 .../olat/admin/landingpages/model/Rules.java  | 17 ++--
 .../admin/layout/LayoutAdminController.java   | 54 ++++++++++---
 .../org/olat/admin/layout/LayoutModule.java   | 15 ++++
 .../olat/admin/layout/LogoInformations.java   | 81 +++++++++++++++++--
 .../org/olat/admin/layout/LogoURLType.java    | 32 ++++++++
 .../admin/layout/_content/layoutadmin.html    |  4 +-
 .../layout/_i18n/LocalStrings_de.properties   |  3 +
 .../controllers/resume/ResumeController.java  |  2 +-
 .../fullWebApp/BaseFullWebappController.java  |  4 +-
 .../fullWebApp/_content/fullwebapplayout.html |  4 +-
 .../olat/modules/coach/CoachingModule.java    |  2 +
 12 files changed, 191 insertions(+), 35 deletions(-)
 create mode 100644 src/main/java/org/olat/admin/layout/LogoURLType.java

diff --git a/src/main/java/org/olat/admin/landingpages/model/Rule.java b/src/main/java/org/olat/admin/landingpages/model/Rule.java
index e12ccbe1c8c..53fbf2e4b48 100644
--- a/src/main/java/org/olat/admin/landingpages/model/Rule.java
+++ b/src/main/java/org/olat/admin/landingpages/model/Rule.java
@@ -19,10 +19,10 @@
  */
 package org.olat.admin.landingpages.model;
 
-import org.olat.core.gui.UserRequest;
 import org.olat.core.id.Roles;
 import org.olat.core.id.User;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.UserSession;
 
 /**
  * 
@@ -76,12 +76,12 @@ public class Rule {
 		this.landingPath = landingPath;
 	}
 	
-	public boolean match(UserRequest ureq) {
+	public boolean match(UserSession userSession) {
 		boolean match = true;
 		
 		//match the role?
 		if(!"none".equals(role) && StringHelper.containsNonWhitespace(role)) {
-			Roles roles = ureq.getUserSession().getRoles();
+			Roles roles = userSession.getRoles();
 			switch(role) {
 				case AUTHOR: match &= roles.isAuthor(); break;
 				case USER_MGR: match &= roles.isUserManager(); break;
@@ -96,7 +96,7 @@ public class Rule {
 		}
 		
 		if(StringHelper.containsNonWhitespace(userAttributeKey)) {
-			User user = ureq.getUserSession().getIdentity().getUser();
+			User user = userSession.getIdentity().getUser();
 			String value = user.getProperty(userAttributeKey, null);
 			if(!StringHelper.containsNonWhitespace(value) && !StringHelper.containsNonWhitespace(userAttributeValue)) {
 				// ok, both are null or empty
diff --git a/src/main/java/org/olat/admin/landingpages/model/Rules.java b/src/main/java/org/olat/admin/landingpages/model/Rules.java
index 9c7189a0304..46d73ed7346 100644
--- a/src/main/java/org/olat/admin/landingpages/model/Rules.java
+++ b/src/main/java/org/olat/admin/landingpages/model/Rules.java
@@ -23,10 +23,10 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.List;
 
-import org.olat.core.gui.UserRequest;
 import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.UserSession;
 import org.olat.core.util.WebappHelper;
 
 /**
@@ -47,23 +47,26 @@ public class Rules {
 		this.rules = rules;
 	}
 	
-	public Rule matchRule(UserRequest ureq) {
-		Roles roles = ureq.getUserSession().getRoles();
-		if(roles.isGuestOnly() || roles.isInvitee() || rules == null || rules.isEmpty()) {
+	public Rule matchRule(UserSession userSession) {
+		if(userSession == null) {
+			return null;
+		}
+		Roles roles =  userSession.getRoles();
+		if(roles == null || roles.isGuestOnly() || roles.isInvitee() || rules == null || rules.isEmpty()) {
 			return null;
 		}
 		
 		for(Rule rule:rules) {
-			if(rule.match(ureq)) {
+			if(rule.match(userSession)) {
 				return rule;
 			}
 		}
 		return null;
 	}
 	
-	public String match(UserRequest ureq) {
+	public String match(UserSession userSession) {
 		String bc = null;
-		Rule rule = matchRule(ureq);
+		Rule rule = matchRule(userSession);
 		if(rule != null && StringHelper.containsNonWhitespace(rule.getLandingPath())) {
 			String path = cleanUpLandingPath(rule.getLandingPath());
 			if(StringHelper.containsNonWhitespace(path)) {
diff --git a/src/main/java/org/olat/admin/layout/LayoutAdminController.java b/src/main/java/org/olat/admin/layout/LayoutAdminController.java
index 7934f664d76..7bea1a0fc1b 100644
--- a/src/main/java/org/olat/admin/layout/LayoutAdminController.java
+++ b/src/main/java/org/olat/admin/layout/LayoutAdminController.java
@@ -69,10 +69,13 @@ public class LayoutAdminController extends FormBasicController {
 		imageMimeTypes.add("image/png");
 	}
 	private FormLink deleteLogo;
-	private TextElement logoAlt, logoUrl; 
+	private TextElement logoAltEl, logoUrlEl;
+	private SingleSelection logoLinkTypeEl;
 	private TextElement footerLine, footerUrl;
 	private SingleSelection themeSelection;
 	private FileElement logoUpload;
+	
+	private static final String[] logoUrlTypeKeys = new String[]{ LogoURLType.landingpage.name(), LogoURLType.custom.name() };
 
 	@Autowired
 	private LayoutModule layoutModule;
@@ -131,15 +134,36 @@ public class LayoutAdminController extends FormBasicController {
 			logoUpload.setInitialFile(logo);
 		}
 		logoUpload.limitToMimeType(imageMimeTypes, null, null);
-
 		
-		String oldLogoUrl = layoutModule.getLogoLinkUri();
-		logoUrl = uifactory.addTextElement("linkUrl", "linkUrl.description", 256, oldLogoUrl, logoCont);
-		logoUrl.setPlaceholderKey("linkUrl.default", null);
+		String[] logoUrlTypeValues = new String[]{
+			translate("customizing.logo.link.landingpage"),
+			translate("customizing.logo.link.custom")
+		};
+		logoLinkTypeEl = uifactory.addDropdownSingleselect("logo.url.type", "customizing.logo.link.type", logoCont,
+				logoUrlTypeKeys, logoUrlTypeValues, null);
+		logoLinkTypeEl.addActionListener(FormEvent.ONCHANGE);
+		String linkType = layoutModule.getLogoLinkType();
+		if(StringHelper.containsNonWhitespace(linkType)) {
+			for(String key:logoUrlTypeKeys) {
+				if(key.equals(linkType)) {
+					logoLinkTypeEl.select(key, true);
+				}
+			}
+		}
+		
+		String customUrl = layoutModule.getLogoLinkUri();
+		if(StringHelper.containsNonWhitespace(customUrl) && !StringHelper.containsNonWhitespace(linkType)) {
+			logoLinkTypeEl.select(LogoURLType.custom.name(), true);
+		}
+		
+		logoUrlEl = uifactory.addTextElement("linkUrl", "linkUrl.description", 256, customUrl, logoCont);
+		logoUrlEl.setPlaceholderKey("linkUrl.default", null);
+		boolean custom = logoLinkTypeEl.isOneSelected() && "custom".equals(logoLinkTypeEl.getSelectedKey());
+		logoUrlEl.setVisible(custom);
 		
 		String oldLogoAlt = layoutModule.getLogoAlt();
-		logoAlt = uifactory.addTextElement("logoAlt", "logoAlt.description", 256, oldLogoAlt, logoCont);
-		logoAlt.setPlaceholderKey("logoAlt.default", null);
+		logoAltEl = uifactory.addTextElement("logoAlt", "logoAlt.description", 256, oldLogoAlt, logoCont);
+		logoAltEl.setPlaceholderKey("logoAlt.default", null);
 
 		//footer
 		FormLayoutContainer footerCont = FormLayoutContainer.createDefaultFormLayout("customizing", getTranslator());
@@ -167,7 +191,7 @@ public class LayoutAdminController extends FormBasicController {
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
-		allOk &= validateUrl(logoUrl);
+		allOk &= validateUrl(logoUrlEl);
 		allOk &= validateUrl(footerUrl);
 		return allOk & super.validateFormLogic(ureq);
 	}
@@ -201,6 +225,9 @@ public class LayoutAdminController extends FormBasicController {
 				Windows.getWindows(ureq).getChiefController().wishReload(true);
 				
 			}
+		} else if(logoLinkTypeEl == source) {
+			boolean custom = logoLinkTypeEl.isOneSelected() && "custom".equals(logoLinkTypeEl.getSelectedKey());
+			logoUrlEl.setVisible(custom);
 		} else if(deleteLogo == source) {
 			layoutModule.removeLogo();
 			logoUpload.reset();
@@ -222,10 +249,17 @@ public class LayoutAdminController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
+		if(logoLinkTypeEl.isOneSelected()) {
+			layoutModule.setLogoLinkType(logoLinkTypeEl.getSelectedKey());
+		}
 		//Logo-Link URI
-		layoutModule.setLogoLinkUri(logoUrl.getValue());
+		if(logoUrlEl.isVisible()) {
+			layoutModule.setLogoLinkUri(logoUrlEl.getValue());
+		} else {
+			layoutModule.setLogoLinkUri("");
+		}
 		//Logo Alternative Text
-		layoutModule.setLogoAlt(logoAlt.getValue());
+		layoutModule.setLogoAlt(logoAltEl.getValue());
 		//FooterLine (large property -> text)
 		layoutModule.setFooterLinkUri(footerUrl.getValue());
 		layoutModule.setFooterLine(footerLine.getValue());
diff --git a/src/main/java/org/olat/admin/layout/LayoutModule.java b/src/main/java/org/olat/admin/layout/LayoutModule.java
index ef1e51d8865..d022bc13b1e 100644
--- a/src/main/java/org/olat/admin/layout/LayoutModule.java
+++ b/src/main/java/org/olat/admin/layout/LayoutModule.java
@@ -49,6 +49,7 @@ public class LayoutModule extends AbstractSpringModule  {
 
 	private static final String LOGO_FILENAME = "logo.filename";
 	private static final String LOGO_ALT = "logo.alt";
+	private static final String LOGO_LINK_TYPE = "logo.link.type";
 	private static final String LOGO_URI = "logo.uri";
 	private static final String FOOTER_URI = "footer.uri";
 	private static final String FOOTER_LINE = "footer.line";
@@ -57,6 +58,8 @@ public class LayoutModule extends AbstractSpringModule  {
 	private String logoFilename;
 	@Value("${logo.alt:}")
 	private String logoAlt;
+	@Value("${logo.link.type:}")
+	private String logoLinkType;
 	@Value("${logo.uri:}")
 	private String logoLinkUri;
 	@Value("${footer.line:}")
@@ -83,6 +86,10 @@ public class LayoutModule extends AbstractSpringModule  {
 		if(StringHelper.containsNonWhitespace(logoAltObj)) {
 			logoAlt = logoAltObj;
 		}
+		String logoLinkTypeObj = getStringPropertyValue(LOGO_LINK_TYPE, true);
+		if(StringHelper.containsNonWhitespace(logoLinkTypeObj)) {
+			logoLinkType = logoLinkTypeObj;
+		}
 		String logoUriObj = getStringPropertyValue(LOGO_URI, true);
 		if(StringHelper.containsNonWhitespace(logoUriObj)) {
 			logoLinkUri = logoUriObj;
@@ -162,6 +169,14 @@ public class LayoutModule extends AbstractSpringModule  {
 		setStringProperty(LOGO_ALT, alt, true);
 	}
 
+	public String getLogoLinkType() {
+		return logoLinkType;
+	}
+
+	public void setLogoLinkType(String type) {
+		setStringProperty(LOGO_LINK_TYPE, type, true);
+	}
+
 	public String getLogoLinkUri() {
 		return logoLinkUri;
 	}
diff --git a/src/main/java/org/olat/admin/layout/LogoInformations.java b/src/main/java/org/olat/admin/layout/LogoInformations.java
index 2388142756f..09248ed0751 100644
--- a/src/main/java/org/olat/admin/layout/LogoInformations.java
+++ b/src/main/java/org/olat/admin/layout/LogoInformations.java
@@ -19,8 +19,18 @@
  */
 package org.olat.admin.layout;
 
+import java.util.List;
+
+import org.olat.admin.landingpages.LandingPagesModule;
+import org.olat.admin.landingpages.model.Rules;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.WindowManager;
 import org.olat.core.helpers.Settings;
+import org.olat.core.id.context.BusinessControlFactory;
+import org.olat.core.id.context.ContextEntry;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.UserSession;
+import org.olat.core.util.prefs.Preferences;
 
 /**
  * 
@@ -32,10 +42,14 @@ import org.olat.core.util.StringHelper;
  */
 public class LogoInformations {
 
-	private LayoutModule layoutModule;
+	private final UserSession userSession;
+	private final LayoutModule layoutModule;
+	private final LandingPagesModule landingPagesModule;
 	
-	public LogoInformations(LayoutModule layoutModule) {
+	public LogoInformations(UserRequest ureq, LayoutModule layoutModule, LandingPagesModule landingPagesModule) {
 		this.layoutModule = layoutModule;
+		this.landingPagesModule = landingPagesModule;
+		userSession = ureq.getUserSession();
 	}
 	
 	public boolean isLogo() {
@@ -51,6 +65,11 @@ public class LogoInformations {
 		return logoAlt;
 	}
 	
+	public String getLogoLinkType() {
+		String logoLinkType = layoutModule.getLogoLinkType();
+		return logoLinkType;
+	}
+	
 	public String getLogoUri() {
 		String logo = layoutModule.getLogoFilename();
 		String logoUri;
@@ -62,11 +81,59 @@ public class LogoInformations {
 		return logoUri;
 	}
 
-	public String getLogoLinkUri() {
-		String logoLinkUri = layoutModule.getLogoLinkUri();
-		if(!StringHelper.containsNonWhitespace(logoLinkUri)) {
-			logoLinkUri = Settings.getApplicationName();
+	public LogoLinkURI getLogoLinkUri() {
+		String logoLinkUri = null;
+		String logoLinkType = layoutModule.getLogoLinkType();
+		if(LogoURLType.landingpage.name().equals(logoLinkType)) {
+			if(userSession != null && userSession.getGuiPreferences() != null) {
+				Preferences prefs =  userSession.getGuiPreferences();
+				String landingPage = (String)prefs.get(WindowManager.class, "landing-page");
+				if(StringHelper.containsNonWhitespace(landingPage)) {
+					logoLinkUri = Settings.getServerContextPathURI() + "/url/" + Rules.cleanUpLandingPath(landingPage);
+				}
+			}
+			
+			if(!StringHelper.containsNonWhitespace(logoLinkUri)) {
+				String landingBc = landingPagesModule.getRules().match(userSession);
+				if(StringHelper.containsNonWhitespace(landingBc)) {
+					List<ContextEntry> ces = BusinessControlFactory.getInstance().createCEListFromString(landingBc);
+					logoLinkUri = BusinessControlFactory.getInstance().getAsURIString(ces, true);
+				}
+			}
+		} else {
+			logoLinkUri = layoutModule.getLogoLinkUri();
+		}
+		if(StringHelper.containsNonWhitespace(logoLinkUri)) {
+			String serverURI = Settings.createServerURI();
+			if(logoLinkUri.startsWith(serverURI)) {
+				logoLinkUri = logoLinkUri.substring(serverURI.length());
+				if(!logoLinkUri.startsWith("/")) {
+					logoLinkUri = "/" + logoLinkUri;
+				}
+			}
+		} else {
+			logoLinkUri = "";
+		}
+		String target = logoLinkUri.startsWith("http") ? "_blank" : null;
+		return new LogoLinkURI(logoLinkUri, target);
+	}
+	
+	public static class LogoLinkURI {
+		
+		private final String uri;
+		private final String target;
+		
+		public LogoLinkURI(String uri, String target) {
+			this.uri = uri;
+			this.target = target;
+		}
+
+		public String getUri() {
+			return uri;
+		}
+
+		public String getTarget() {
+			return target;
 		}
-		return logoLinkUri;
 	}
 }
diff --git a/src/main/java/org/olat/admin/layout/LogoURLType.java b/src/main/java/org/olat/admin/layout/LogoURLType.java
new file mode 100644
index 00000000000..51b111df28b
--- /dev/null
+++ b/src/main/java/org/olat/admin/layout/LogoURLType.java
@@ -0,0 +1,32 @@
+/**
+ * <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.admin.layout;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public enum LogoURLType {
+	
+	landingpage,
+	custom
+
+}
diff --git a/src/main/java/org/olat/admin/layout/_content/layoutadmin.html b/src/main/java/org/olat/admin/layout/_content/layoutadmin.html
index add58cd5fb4..916e8578ab9 100644
--- a/src/main/java/org/olat/admin/layout/_content/layoutadmin.html
+++ b/src/main/java/org/olat/admin/layout/_content/layoutadmin.html
@@ -1,8 +1,6 @@
 <fieldset>
 	<legend>$r.translate("layout.title")</legend>
-	<p>
-		$r.translate("layout.intro").
-	</p>
+	<p>$r.translate("layout.intro").</p>
 	<div class="o_form">
 		$r.render("themeAdminFormContainer")
 	</div>	
diff --git a/src/main/java/org/olat/admin/layout/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/layout/_i18n/LocalStrings_de.properties
index 1668553544a..063d718654c 100644
--- a/src/main/java/org/olat/admin/layout/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/layout/_i18n/LocalStrings_de.properties
@@ -12,6 +12,9 @@ LayoutAdminControllerWithPersist.menu.title.alt=W
 customizing.title = Detailanpassungen in Layout 
 customizing.logo = Firmen- oder Institutionslogo  
 customizing.settings=Fusszeile Eigenschaften
+customizing.logo.link.type=Ziel-URL für Klicks auf das Logo angeben (optional)
+customizing.logo.link.landingpage=Startseite
+customizing.logo.link.custom=Custom
 linkUrl.description=Ziel-URL für Klicks auf das Logo angeben (optional)
 linkUrl.default=http://www.frentix.com
 linkUrl.invalid=Diese URL ist keine gültige Adresse.
diff --git a/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java b/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java
index 2cb2dad448e..ffe200243a8 100644
--- a/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java
+++ b/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java
@@ -210,7 +210,7 @@ public class ResumeController extends FormBasicController implements SupportsAft
 				return BusinessControlFactory.getInstance().formatFromURI(path);
 			}
 		}
-		return lpModule.getRules().match(ureq);
+		return lpModule.getRules().match(ureq.getUserSession());
 	}
 	
 	private void launch(UserRequest ureq, BusinessControl bc) {
diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
index cb4a21f3b61..ef80ddc6b12 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import org.olat.admin.landingpages.LandingPagesModule;
 import org.olat.admin.layout.LayoutModule;
 import org.olat.admin.layout.LogoInformations;
 import org.olat.basesecurity.BaseSecurityModule;
@@ -340,7 +341,8 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 		mainVc.contextPut("screenMode", screenMode);
 
 		LayoutModule layoutModule = CoreSpringFactory.getImpl(LayoutModule.class);
-		LogoInformations logoInfos = new LogoInformations(layoutModule);
+		LandingPagesModule landingPagesModule = CoreSpringFactory.getImpl(LandingPagesModule.class);
+		LogoInformations logoInfos = new LogoInformations(ureq, layoutModule, landingPagesModule);
 		mainVc.contextPut("logoInfos", logoInfos);
 		
 		// use separate container for navigation to prevent full page refresh in ajax mode on site change
diff --git a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
index e3da00078cd..ac3148e3fe8 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
+++ b/src/main/java/org/olat/core/commons/fullWebApp/_content/fullwebapplayout.html
@@ -208,8 +208,8 @@ $r.renderForce("development")
 		  <span class="icon-bar"></span>
 		  <span class="icon-bar"></span>
 		  <span class="icon-bar"></span>
-		</button>
-		<a class="o_navbar-brand #if($logoInfos.logo) o_custom_navbar-brand #end" href="$logoInfos.logoLinkUri" title="$logoInfos.logoAlt"></a>
+		</button>#set($logoLinkUri = $logoInfos.logoLinkUri)
+		<a class="o_navbar-brand #if($logoInfos.logo) o_custom_navbar-brand #end" href="$logoLinkUri.uri" title="$logoInfos.logoAlt" #if($logoLinkUri.target) target="$logoLinkUri.target" #end></a>
 		
 		<div class="o_collapse o_navbar-collapse">
 			## sites and tabs
diff --git a/src/main/java/org/olat/modules/coach/CoachingModule.java b/src/main/java/org/olat/modules/coach/CoachingModule.java
index 513dbd8549f..b635599214b 100644
--- a/src/main/java/org/olat/modules/coach/CoachingModule.java
+++ b/src/main/java/org/olat/modules/coach/CoachingModule.java
@@ -60,6 +60,8 @@ public class CoachingModule  extends AbstractOLATModule implements ConfigOnOff {
 		// Add controller factory extension point to launch groups
 		NewControllerFactory.getInstance().addContextEntryControllerCreator("coaching",
 				new CoachContextEntryControllerCreator());
+		NewControllerFactory.getInstance().addContextEntryControllerCreator("CoachSite",
+				new CoachContextEntryControllerCreator());
 
 		//portfolio enabled/disabled
 		String enabledObj = getStringPropertyValue("coaching.enabled", true);
-- 
GitLab