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