diff --git a/src/main/java/org/olat/core/commons/chiefcontrollers/_content/langchooser.html b/src/main/java/org/olat/core/commons/chiefcontrollers/_content/langchooser.html index 695ffbfeaa62edc291919f93012727ab2228fe1c..b0c3842f0c0206901b8effcaa899464909598dad 100644 --- a/src/main/java/org/olat/core/commons/chiefcontrollers/_content/langchooser.html +++ b/src/main/java/org/olat/core/commons/chiefcontrollers/_content/langchooser.html @@ -1,6 +1,4 @@ -<div class="b_float_left"> - $r.translate("select.language") -</div> -<div class="b_with_small_icon_left b_flag_${languageCode} b_float_left"> - $r.render("select.language") -</div> \ No newline at end of file +$r.translate("select.language") +<span class="o_flag o_flag_${languageCode}"></span> +$r.render("select.language") + 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 8d3160e64adfc94a991723a7d812e2d3a749ea6c..458979066cfab31cd640b6880e37abf1f907981a 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java +++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java @@ -811,11 +811,11 @@ public class BaseFullWebappController extends BasicController implements Generic link.setAccessKey("s"); // add close links Link calink = LinkFactory.createCustomLink("ca" + dtabCreateCounter, "ca" + dtabCreateCounter, "", Link.NONTRANSLATED, navVc, this); - calink.setCustomEnabledLinkCSS("b_nav_tab_close"); + calink.setCustomEnabledLinkCSS("o_navbar_tab_close"); calink.setTitle(translate("close")); calink.setUserObject(dt); Link cplink = LinkFactory.createCustomLink("cp" + dtabCreateCounter, "cp" + dtabCreateCounter, "", Link.NONTRANSLATED, navVc, this); - cplink.setCustomEnabledLinkCSS("b_nav_tab_close"); + cplink.setCustomEnabledLinkCSS("o_navbar_tab_close"); cplink.setTitle(translate("close")); cplink.setUserObject(dt); diff --git a/src/main/java/org/olat/core/commons/fullWebApp/_content/defaultfooter.html b/src/main/java/org/olat/core/commons/fullWebApp/_content/defaultfooter.html index 9c3f57880a753e85c0a71792425c619b84f65570..bb61dbf14a1ac9da7b72be6310173e58a7bcd8e5 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/_content/defaultfooter.html +++ b/src/main/java/org/olat/core/commons/fullWebApp/_content/defaultfooter.html @@ -1,18 +1,20 @@ -<div id="b_footer_user"> - #if($ajaxOn) - <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29" target="_blank" title="$r.translateInAttribute("footer.ajax.hover")" class="b_ajax"></a> - #end - #if ($loggedIn) - $r.translate("footer.logged.in.as", ["$username"]) Â ($userSessionsCnt $r.translate("footer.users.online")) - #else - $r.translate("footer.not.logged.in") ($userSessionsCnt $r.translate("footer.users.online")) - #end +<div class="container-fluid"> + <div id="b_footer_user" class="col-sm-4"> + #if($ajaxOn) + <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29" target="_blank" title="$r.translateInAttribute("footer.ajax.hover")" class="b_ajax"></a> + #end + #if ($loggedIn) + $r.translate("footer.logged.in.as", ["$username"]) Â ($userSessionsCnt $r.translate("footer.users.online")) + #else + $r.translate("footer.not.logged.in") ($userSessionsCnt $r.translate("footer.users.online")) + #end + </div> + + <div id="b_footer_version" class="col-sm-4"> + <a href="http://www.openolat.org" title="OpenOLAT" target="_blank">$olatversion</a> + </div> + + <div id="b_footer_powered" class="col-sm-4"> + <a href="http://www.openolat.org" target="_blank" title="OpenOLAT"><img border="0" src="$r.staticLink("images/openolat/openolat_powerd_by_120x30.png")" alt="Brasato framework" /></a> + </div> </div> - -<div id="b_footer_version"> - <a href="http://www.openolat.org" title="OpenOLAT" target="_blank">$olatversion</a> -</div> - -<div id="b_footer_powered"> - <a href="http://www.openolat.org" target="_blank" title="OpenOLAT"><img border="0" src="$r.staticLink("images/openolat/openolat_powerd_by_120x30.png")" alt="Brasato framework" /></a> -</div> \ No newline at end of file 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 af874f7aeaa13fbd9b9729bc95396e936ddcf9d4..49349f9a42915dac49e98cbd9bac1d90f3e4dbf4 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 @@ -1,59 +1,44 @@ -## ---- START #b_page_margins #b_page_wrapper -<div id="b_page_margins"><div id="b_page_wrapper"> -## special classes for border styling, see YAML book chapter 4.5.7 for more information -<div id="b_border-top"> - <div id="b_edge-lt"></div> - <div id="b_edge-rt"></div> +<a id='o_top' name="o_top"></a> +<div id="o_beta_logo"></div> + +## ---- START #o_header --- +<div id="o_header"> + <div id="o_logo"></div> + <div id="o_right_logo"></div> + + ## something to be displayed in the header, a logo, some ads, whatever + #if($r.available("headerComponent")) + $r.render("headerComponent") + #end </div> -## ---- START #b_page -<div id="b_page"> -<a id='b_top' name="b_top"></a> -<div id="b_beta_logo"></div> +## ---- END #o_header --- -## ---- START #b_header --- -<div id="b_header"> +## ---- START #o_navbar --- +<div id="o_navbar" class="navbar navbar-default" role="navigation"> + <div id="o_navbar_container" class="container-fluid"> -## ---- START Access keys to improve accessability -## not visible for normal browser -<span class="b_skip">$r.translate("accesskey.title")</span> -<a accesskey="0" class="b_skip" href="#b_top">0: $r.translate("accesskey.top")</a> -<a accesskey="n" class="b_skip" href="#b_nav">n: $r.translate("accesskey.nav")</a> -<span class="b_skip">$r.translate("accesskey.sites")</span> -<span class="b_skip">$r.translate("accesskey.tabs")</span> -<a accesskey="o" class="b_skip" href="#b_topnav">o: $r.translate("accesskey.topnav")</a> -<a accesskey="m" class="b_skip" href="#b_col1">m: $r.translate("accesskey.menu")</a> -<a accesskey="c" class="b_skip" href="#b_col3">c: $r.translate("accesskey.content")</a> -<a accesskey="t" class="b_skip" href="#b_col2">t: $r.translate("accesskey.tools")</a> -<a accesskey="a" class="b_skip" href="#b_table">a: $r.translate("accesskey.table")</a> -<a accesskey="d" class="b_skip" href="#b_modal">d: $r.translate("accesskey.modal")</a> -<span class="b_skip">b: $r.translate("accesskey.back")</span> -<span class="b_skip">$r.translate("accesskey.changes")</span> -## don't use numbers as access keys - reserved for the addressing of opened tabs -## ---- END Access keys + <div id="o_navbar_header" class="navbar-header"> + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="#"></a> + </div> -<div id="b_logo"></div> -<div id="b_right_logo"></div> -<!-- end diff --> -## something to be displayed in the header, a logo, some ads, whatever -#if($r.available("headerComponent")) - $r.render("headerComponent") -#end -## top nav usually placed top left. Previously named upperRightCorner -#if($r.available("topnavComponent")) - <div id="b_topnav"> - <a name="b_topnav"></a> - $r.render("topnavComponent") - </div> -#end -</div> -## ---- END #b_header --- -## ---- START #b_nav sites navigation -<div id="b_nav"> - <a name="b_nav"></a> - $r.render("navComponent") + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + ## sites and tabs + $r.render("navComponent") + ## tools + #if($r.available("topnavComponent")) + $r.render("topnavComponent") + #end + </div> + </div> </div> -## ---- END #b_nav --- +## ---- END #o_navbar --- #if($hasStickyMessage) <div id="b_msg_sticky"> @@ -63,30 +48,26 @@ </div> #end -## ------ START #b_main ----- - $r.render("main") -## END MAIN - -<a id="b_toplink" href="#b_top" onclick="jQuery('#b_body').scrollTop(0);" title="$r.translateInAttribute("top.alt")">$r.translate("top")</a> -</div> -## ---- END #b_page +## ------ START #o_main ----- +<div id="o_main"> + <div id="o_main_container" class="container-fluid"> + $r.render("main") + <a id="o_toplink" href="#o_top" onclick="jQuery('#b_body').scrollTop(0);" title="$r.translateInAttribute("top.alt")"> + <span class="glyphicon glyphicon-arrow-up"></span> + $r.translate("top") + </a> + </div> </div> -## ---- END #b_page_wrapper - +## END #o_main ----- ## ----- START #b_footer ---------- -<div id="b_footer" class="b_clearfix"> - <div class="b_floatbox"> +<div id="o_footer"> #if($r.available("footerComponent")) $r.render("footerComponent") #end - </div> </div> ## ---- END #b_footer --- -</div> -## ---- END #b_page_margins - ## ---- START #b_messages ## Messages are absolute positioned using EXT, thus it's ok to have them at the end of the page. ## This prevents an ugly IE bug that appears when the messages are at the top of the page. diff --git a/src/main/java/org/olat/core/commons/fullWebApp/_content/nav.html b/src/main/java/org/olat/core/commons/fullWebApp/_content/nav.html index 0e525b354d1797f85be3132ea03e899a41e41259..ca9293a51bac8d2b80fd83a6f50a3681be078d3c 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/_content/nav.html +++ b/src/main/java/org/olat/core/commons/fullWebApp/_content/nav.html @@ -1,42 +1,38 @@ -<div id="b_nav_main"> -<ul> ## ---- START sites tabs --- +<ul id="o_navbar_sites" class="nav navbar-nav"> #foreach ($site in $sites) #set ($siteEl = $r.getComponent("$site")) #set ($navel = $siteEl.userObject.getNavElement()) - <li class='b_nav_site #if($tabhelper.isSiteActive($siteEl.userObject)) b_nav_active #end $!navel.getIconCSSClass()'> - <div> ## div used for site icon - $r.render("$site") - </div> + <li class='#if($tabhelper.isSiteActive($siteEl.userObject)) active #end $!navel.getIconCSSClass()'> + $r.render("$site") </li> #end +</ul> ## ---- END sites tabs --- - <li id="b_nav_spacer"></li> ##spacer between sites and tabs + ## ---- START dynamic tabs --- +<ul id="o_navbar_tabs" class="nav navbar-nav"> #foreach ($dtab in $dtabs) #set ($navel = $dtab.getNavElement()) #set ($pos=${velocityCount} - 1) #set ($postfix=$dtabsLinkNames.get(${pos})) #if($tabhelper.isDTabActive($dtab)) - <li class="b_nav_tab b_nav_active $!navel.getIconCSSClass()"> - <div> ## div used for tab icon - $r.render("a$postfix") - #if($tabhelper.isCanCloseDTab($dtab)) - $r.render("cp$postfix") ## close link has class b_nav_tab_close - #end - </div> + <li class="active $!navel.getIconCSSClass()"> + $r.render("a$postfix") + #if($tabhelper.isCanCloseDTab($dtab)) + $r.render("cp$postfix") ## close link has class b_nav_tab_close + #end </li> #else - <li class="b_nav_tab $!navel.getIconCSSClass()"> - <div> ## div used for tab icon - $r.render("a$postfix") - $r.render("cp$postfix") ## close link has class b_nav_tab_close - </div> + <li class="$!navel.getIconCSSClass()"> + $r.render("a$postfix") + $r.render("cp$postfix") ## close link has class b_nav_tab_close </li> #end #end -## ---- END dynamic tabs --- </ul> +## ---- END dynamic tabs --- + #if($pageTitle) <script type="text/javascript"> /* <![CDATA[ */ @@ -44,4 +40,3 @@ /* ]]> */ </script> #end -</div> diff --git a/src/main/java/org/olat/gui/control/OlatTopNavController.java b/src/main/java/org/olat/gui/control/OlatTopNavController.java index 3f309e617503f81436b27f160ed9339d019be718..85659158a252270bdc995465a1b08bfb05b881db 100644 --- a/src/main/java/org/olat/gui/control/OlatTopNavController.java +++ b/src/main/java/org/olat/gui/control/OlatTopNavController.java @@ -46,9 +46,9 @@ 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.gui.control.creator.ControllerCreator; -import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; import org.olat.core.gui.control.generic.popup.PopupBrowserWindow; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.UserConstants; import org.olat.core.util.StringHelper; import org.olat.core.util.event.EventBus; import org.olat.core.util.event.GenericEventListener; @@ -65,6 +65,7 @@ import org.olat.search.SearchServiceUIFactory.DisplayOption; import org.olat.search.ui.SearchInputController; import org.olat.user.DisplayPortraitManager; import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.GenderPropertyHandler; /** * @@ -76,15 +77,15 @@ public class OlatTopNavController extends BasicController implements GenericEven private static final String ACTION_LOGOUT = "logout"; private SearchInputController searchC; - private Link helpLink, loginLink, impressumLink, myMenuLink; + private Link helpLink, loginLink, impressumLink; private VelocityContainer menuVC; private VelocityContainer topNavVC; private InstantMessagingMainController imController; - private CloseableCalloutWindowController calloutCtr; private EventBus singleUserEventCenter; private final DisplayPortraitManager portraitManager; + private final UserManager userManager; private OLATResourceable ass; public OlatTopNavController(UserRequest ureq, WindowControl wControl) { @@ -96,6 +97,7 @@ public class OlatTopNavController extends BasicController implements GenericEven topNavVC = createVelocityContainer("topnav"); portraitManager = DisplayPortraitManager.getInstance(); + userManager = UserManager.getInstance(); boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly(); boolean isInvitee = ureq.getUserSession().getRoles().isInvitee(); @@ -140,38 +142,35 @@ public class OlatTopNavController extends BasicController implements GenericEven singleUserEventCenter = ureq.getUserSession().getSingleUserEventCenter(); singleUserEventCenter.registerFor(this, getIdentity(), ass); - UserManager userManager = CoreSpringFactory.getImpl(UserManager.class); - - myMenuLink = LinkFactory.createButton("topnav.my.menu", topNavVC, this); - myMenuLink.setCustomDisplayText(userManager.getUserDisplayName(getIdentity())); - myMenuLink.setCustomEnabledLinkCSS("o_topnav_impressum"); - myMenuLink.setElementCssClass("o_sel_my_menu_open"); - - File image = portraitManager.getSmallPortrait(getIdentity().getName()); - if (image != null) { - // display only within 600x300 - everything else looks ugly - ImageComponent ic = new ImageComponent(ureq.getUserSession(), "image"); - ic.setSpanAsDomReplaceable(true); - ic.setMedia(image); - topNavVC.contextPut("hasPortrait", Boolean.TRUE); - topNavVC.put("portrait", ic); + Component menu = getMenuCmp(ureq); + topNavVC.put("myMenu", menu); + // the user profile + Component portrait = getPortraitCmp(ureq); + if (portrait != null) { + topNavVC.put("portrait", portrait); } else { - topNavVC.contextPut("hasPortrait", Boolean.FALSE); + GenderPropertyHandler genderHander = (GenderPropertyHandler) userManager.getUserPropertiesConfig().getPropertyHandler(UserConstants.GENDER); + String gender = genderHander.getInternalValue(getIdentity().getUser()); + topNavVC.contextPut("gender", (gender == null || gender.equals("-") ? "" : gender + "_")); } + + // the label to open the personal menu + String[] attr = new String[] {getIdentity().getUser().getProperty(UserConstants.FIRSTNAME, getLocale()), getIdentity().getUser().getProperty(UserConstants.LASTNAME, getLocale()), getIdentity().getName()}; + String myMenuText = translate("topnav.my.menu.label", attr); + topNavVC.contextPut("myMenuLabel", myMenuText); + + } putInitialPanel(topNavVC); } + @Override public void event(UserRequest ureq, Component source, Event event) { if (source == helpLink) { doOpenHelp(ureq) ; - } else if(source == myMenuLink) { - myMenuLink.setDirty(false); - doOpenMyMenu(ureq); } else if(source instanceof Link && source.getComponentName().startsWith("personal.tool.")) { - doCloseMyMenu(); doOpenPersonalTool(ureq, (Link)source); } else if (source == loginLink) { DispatcherModule.redirectToDefaultDispatcher(ureq.getHttpResp()); @@ -185,13 +184,6 @@ public class OlatTopNavController extends BasicController implements GenericEven } } - @Override - protected void event(UserRequest ureq, Controller source, Event event) { - if (source == calloutCtr) { - closePersonalMenu(); - } - } - private void doOpenPersonalTool(UserRequest ureq, Link link) { GenericActionExtension gAe = (GenericActionExtension)link.getUserObject(); String navKey = gAe.getNavigationKey(); @@ -199,32 +191,27 @@ public class OlatTopNavController extends BasicController implements GenericEven NewControllerFactory.getInstance().launch(businessPath, ureq, getWindowControl()); } - private void doCloseMyMenu() { - calloutCtr.deactivate(); - removeAsListenerAndDispose(calloutCtr); - calloutCtr = null; - } - - private void doOpenMyMenu(UserRequest ureq) { - removeAsListenerAndDispose(calloutCtr); - Component menu = getMenuCmp(ureq); - calloutCtr = new CloseableCalloutWindowController(ureq, getWindowControl(), menu, myMenuLink, "", true, null); - listenTo(calloutCtr); - calloutCtr.activate(); - } - - private void closePersonalMenu() { - removeAsListenerAndDispose(calloutCtr); - calloutCtr = null; - } - private Component getMenuCmp(UserRequest ureq) { VelocityContainer container = createVelocityContainer("menu"); + container.setDomReplacementWrapperRequired(false); // we do it ourself in menu.html file loadPersonalTools(ureq, container); menuVC = container; return menuVC; } + private Component getPortraitCmp(UserRequest ureq) { + File image = portraitManager.getSmallPortrait(getIdentity().getName()); + if (image != null) { + // display only within 600x300 - everything else looks ugly + ImageComponent ic = new ImageComponent(ureq.getUserSession(), "image"); + ic.setSpanAsDomReplaceable(true); + ic.setMedia(image); + topNavVC.put("portrait", ic); + return ic; + } + return null; + } + private void loadPersonalTools(UserRequest ureq, VelocityContainer container) { List<String> linksName = new ArrayList<String>(); List<String> configLinksName = new ArrayList<String>(); diff --git a/src/main/java/org/olat/gui/control/_content/dmztopnav.html b/src/main/java/org/olat/gui/control/_content/dmztopnav.html index 1ea41e261c62b44901f30fc78e013a86ede6769d..305d4cc6c14168e461deaef7a0c3dbf8353e7a4a 100644 --- a/src/main/java/org/olat/gui/control/_content/dmztopnav.html +++ b/src/main/java/org/olat/gui/control/_content/dmztopnav.html @@ -1,16 +1,16 @@ -<ul> +<ul id="o_navbar_tools" class="nav navbar-nav navbar-right"> #if($r.available("topnav.impressum")) - <li> + <li id="o_navbar_impress"> $r.render("topnav.impressum") </li> #end - <li id="o_topnav_langchooser"> + <li id="o_navbar_langchooser"> $r.render("languageChooser") </li> #if ($isContextHelpEnabled) - <li id="o_topnav_help"> + <li id="o_navbar_help"> <a href="javascript:contextHelpWindow('$r.relLink("help/${r.getLanguageCode()}/org.olat.login/dmz.html")')" title="$r.translateInAttribute("topnav.help.alt")"> - <span class="o_help_icon b_with_small_icon_right">$r.translate("topnav.help")</span> + <span></span>$r.translate("topnav.help") </a> </li> #end diff --git a/src/main/java/org/olat/gui/control/_content/menu.html b/src/main/java/org/olat/gui/control/_content/menu.html index 41bb50eb530e2705988441a2c68d98256a34780d..11776e107112f7a7b79e0a73084cd2910932a739 100644 --- a/src/main/java/org/olat/gui/control/_content/menu.html +++ b/src/main/java/org/olat/gui/control/_content/menu.html @@ -1,24 +1,21 @@ -<div class="o_topnav_my_menu"> - <span class="o_topnav_my_submenu">$r.translate("topnav.my.menu.tools")</span> - <ul> +## DOM replacement implemented via ID on UL element - bypass standard OO wrapper DIV +<ul id="$r.getCId()" class="dropdown-menu"> + <li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.tools")</li> #foreach($personalTool in $personalTools) <li>$r.render($personalTool)</li> #end - </ul> - <hr/> - <span class="o_topnav_my_submenu">$r.translate("topnav.my.menu.configurations")</span> - <ul> + <li role="presentation" class="divider"></li> + <li role="presentation" class="dropdown-header">$r.translate("topnav.my.menu.configurations")</li> #foreach($config in $configs) <li>$r.render($config)</li> #end - </ul> - <hr/> - <ul> - <li id="o_topnav_logout"> - ## make logout link very basic without onClick handler in case javaScript is broken it is still possible to log out - ## except for the onolatunload() method which must be executed to correctly finish SCORM modules (OLAT-6255) - ## must be on one line to work with inline translation tool - <a id="b_logout" href="$r.commandURI("logout")" title="$r.translateInAttribute("topnav.logout.alt")" onclick="if (window.olatonunload) {olatonunload();}"><span class="b_logout_icon">$r.translate("topnav.logout")</span></a> - </li> - </ul> -</div> \ No newline at end of file + <li role="presentation" class="divider"></li> + <li> + ## make logout link very basic without onClick handler in case javaScript is broken it is still possible to log out + ## except for the onolatunload() method which must be executed to correctly finish SCORM modules (OLAT-6255) + ## must be on one line to work with inline translation tool + <a href="$r.commandURI("logout")" title="$r.translateInAttribute("topnav.logout.alt")" onclick="if (window.olatonunload) {olatonunload();}"> + <span class="glyphicon glyphicon-off"></span> $r.translate("topnav.logout") + </a> + </li> +</ul> \ No newline at end of file diff --git a/src/main/java/org/olat/gui/control/_content/olatFooter.html b/src/main/java/org/olat/gui/control/_content/olatFooter.html index ca533a647bd3c65123b64e8be32a69ed72f6ae7a..eae4a971faf9a6c160b2ca64a89b30efce8b7e81 100644 --- a/src/main/java/org/olat/gui/control/_content/olatFooter.html +++ b/src/main/java/org/olat/gui/control/_content/olatFooter.html @@ -1,17 +1,21 @@ -<div id="b_footer_user"> - #if ($loggedIn) - <span id="b_username">$r.translate("footer.logged.in.as", ["$username"])</span> - #end - <span id="b_counter">($r.render("userCounter") $r.translate("other.users.online"))</span> -</div> -<div id="b_footer_version"> - <a href="http://www.openolat.org" title="Homepage of the Open Source LMS OpenOLAT $appVersion (Build $revisionNumber:$changeSet)" target="_blank">$appName $appVersion ($node)</a> -</div> -#if($r.available("shareLink")) - $r.render("shareLink") -#end -<div id="b_footer_powered"> - <a href="http://www.openolat.org" target="_blank" title="OpenOLAT - infinite learning"> - <img border="0" src="$r.staticLink("images/openolat/openolat_powerd_by_120x30.png")" alt="powered by OpenOLAT" width="120" height="30"/> - </a> -</div> +<div id="o_footer_container" class="container-fluid"> + <div class="row"> + <div id="o_footer_user" class="col-sm-5 clearfix"> + #if ($loggedIn) + <span id="o_username">$r.translate("footer.logged.in.as", ["$username"])</span> + #end + <span id="o_counter">($r.render("userCounter") $r.translate("other.users.online"))</span> + #if($r.available("shareLink")) + $r.render("shareLink") + #end + </div> + <div id="o_footer_powered" class="col-sm-2 clearfix"> + <a href="http://www.openolat.org" target="_blank" title="OpenOLAT - infinite learning"> + <img border="0" src="$r.staticLink("images/openolat/openolat_powerd_by_120x30.png")" alt="powered by OpenOLAT" width="120" height="30"/> + </a> + </div> + <div id="o_footer_version" class="col-sm-5 clearfix"> + <a href="http://www.openolat.org" title="Homepage of the Open Source LMS OpenOLAT $appVersion (Build $revisionNumber:$changeSet)" target="_blank">$appName $appVersion ($node)</a> + </div> + </div> +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/gui/control/_content/topnav.html b/src/main/java/org/olat/gui/control/_content/topnav.html index d2bad79f28e814990c928fc500244b94cbe03540..7b29a7516725a96540a6dd8848e420f021fb327c 100644 --- a/src/main/java/org/olat/gui/control/_content/topnav.html +++ b/src/main/java/org/olat/gui/control/_content/topnav.html @@ -1,36 +1,46 @@ -<ul> +<ul id="o_navbar_tools" class="nav navbar-nav navbar-right"> #if($r.available("topnav.impressum")) - <li> + <li id="o_navbar_impress"> $r.render("topnav.impressum") </li> #end - #if (!$inAssessment && $r.available("search_input")) - <li id="o_topnav_search"> - $r.render("search_input") + <li id="o_navbar_search_opener" class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown" title="$r.translate("search")"> + <span></span>## css placeholder + </a> + <ul class="dropdown-menu"> + <li id="o_navbar_search" class="navbar-form" role="search"> + $r.render("search_input") + </li> + </ul> </li> #end #if ($r.available("groupchatcontroller")) - <li id="o_topnav_imgroupclient"> + <li id="o_navbar_imgroupclient"> $r.render("groupchatcontroller") </li> #end #if ($r.available("imclient")) - <li id="o_topnav_imclient"> + <li id="o_navbar_imclient" class="clearfix"> $r.render("imclient") </li> #end #if (!$isGuest) - <li id="o_topnav_my_menu_link"> - <div class="o_topnav_portrait"> - #if($hasPortrait) - $r.render("portrait") - #end - </div> - $r.render("topnav.my.menu") + <li id="o_navbar_my_menu" class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + #if($r.available("portrait")) + $r.render("portrait") + #else + <img src="$r.staticLink("images/transparent.gif")" class="o_portrait_dummy_${gender}small"/> + #end + $myMenuLabel + <b class="caret"></b> + </a> + $r.render("myMenu") </li> #else - <li id="o_topnav_login"> + <li id="o_navbar_login"> $r.render("topnav.login") </li> #end diff --git a/src/main/java/org/olat/gui/control/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/gui/control/_i18n/LocalStrings_de.properties index 4d64a906b0836e09127d429442af620a3df6da09..ba4b350ffb7ce6377911708e657bc0c3bc7b0dbd 100644 --- a/src/main/java/org/olat/gui/control/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/gui/control/_i18n/LocalStrings_de.properties @@ -22,7 +22,7 @@ topnav.printview.alt=Diese Seite drucken topnav.search=Suche topnav.search.alt=Suchen Sie innerhalb von OLAT username=Eingeloggt als <i>{0}</i> -topnav.my.menu=My menu +topnav.my.menu.label={0} topnav.my.menu.tools=Persönliche Werkzeuge topnav.my.menu.configurations=Konfiguration diff --git a/src/main/java/org/olat/gui/control/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/gui/control/_i18n/LocalStrings_en.properties index cabe59028c9d0304c274300d2bea538dcadb5164..2bdd54165884582ee8bd01c26f7d59c8fa3f9547 100644 --- a/src/main/java/org/olat/gui/control/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/gui/control/_i18n/LocalStrings_en.properties @@ -22,3 +22,4 @@ topnav.printview.alt=Print this page topnav.search=Search topnav.search.alt=Search within OLAT username=Logged in as <i>{0}</i> +topnav.my.menu.label={0} diff --git a/src/main/java/org/olat/instantMessaging/ui/IMTopNavStatusController.java b/src/main/java/org/olat/instantMessaging/ui/IMTopNavStatusController.java index 7162d835610bce6765fc3c4a68b865b3af7286fb..23932ed32abfa1fe66d6b20ea95863231fb3f152 100644 --- a/src/main/java/org/olat/instantMessaging/ui/IMTopNavStatusController.java +++ b/src/main/java/org/olat/instantMessaging/ui/IMTopNavStatusController.java @@ -55,11 +55,11 @@ public class IMTopNavStatusController extends BasicController { mainVC = createVelocityContainer("status_changer"); available = LinkFactory.createLink("presence.available", mainVC, this); - available.setCustomEnabledLinkCSS("o_instantmessaging_available_icon"); + available.setCustomEnabledLinkCSS("o_im_available_icon"); dnd = LinkFactory.createLink("presence.dnd", mainVC, this); - dnd.setCustomEnabledLinkCSS("o_instantmessaging_dnd_icon"); + dnd.setCustomEnabledLinkCSS("o_im_dnd_icon"); unavailable = LinkFactory.createLink("presence.unavailable", mainVC, this); - unavailable.setCustomEnabledLinkCSS("o_instantmessaging_unavailable_icon"); + unavailable.setCustomEnabledLinkCSS("o_im_unavailable_icon"); putInitialPanel(mainVC); } diff --git a/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java b/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java index 719fa688522158954e6f2672ab32b6915088d81f..76fae862d144f47fd2ef2ac07cc429afab3e9552 100644 --- a/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java +++ b/src/main/java/org/olat/instantMessaging/ui/InstantMessagingMainController.java @@ -133,6 +133,7 @@ public class InstantMessagingMainController extends BasicController implements G onlineOfflineCount = LinkFactory.createCustomLink("onlineOfflineCount", "cmd.roster", "", Link.NONTRANSLATED, main, this); onlineOfflineCount.setTooltip(translate("im.roster.intro")); onlineOfflineCount.registerForMousePositionEvent(true); + onlineOfflineCount.setCustomEnabledLinkCSS("badge"); updateBuddyStats(); main.put("buddiesSummaryPanel", onlineOfflineCount); @@ -321,7 +322,7 @@ public class InstantMessagingMainController extends BasicController implements G imStatus = Presence.available.name(); imService.updateStatus(getIdentity(), imStatus); } - String cssClass = "o_instantmessaging_" + imStatus + "_icon"; + String cssClass = "o_im_" + imStatus + "_icon"; statusChangerLink.setCustomEnabledLinkCSS("b_small_icon " + cssClass); } @@ -412,7 +413,7 @@ public class InstantMessagingMainController extends BasicController implements G private Link createShowNewMessageLink(Buddy buddy) { Link link = LinkFactory.createCustomLink(buddy.getIdentityKey().toString(), ACTION_MSG, "", Link.NONTRANSLATED, newMsgIcon, this); link.registerForMousePositionEvent(true); - link.setCustomEnabledLinkCSS("b_small_icon o_instantmessaging_new_msg_icon"); + link.setCustomEnabledLinkCSS("o_im_new_msg_icon"); String buddyName = StringHelper.escapeHtml(buddy.getName()); link.setTooltip(translate("im.new.message", new String[]{ buddyName })); link.setUserObject(buddy); diff --git a/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html b/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html index 1cb7e939dc91704a0df8b74703f747bc2fc87556..ce917c9f66432b598ab314d8a34980d124273363 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html +++ b/src/main/java/org/olat/instantMessaging/ui/_content/newMsgIcon.html @@ -1,20 +1,22 @@ $r.render("chats") #if($iconsHolder.size() > 0) - <div id="o_sel_im_play_sound" style="display:none; width:1px; height:1px;"></div> - <script type="text/javascript"> - /* <![CDATA[ */ - ## Play sound using scriptaculous library. - ## Use jQuery.ready to deferre execution and prevent errors in IE - jQuery(function() { - BPlayer.playSound('$newMessageSoundURL','o_sel_im_play_sound'); - }); - document.title = "$r.translate('im.new.message.short')"; - /* ]]> */ - </script> - ## render the new message icon links - #foreach ($holder in $iconsHolder) - $r.render("${holder}") - #end + <div id="o_im_message"> + <div id="o_sel_im_play_sound" style="display:none; width:1px; height:1px;"></div> + <script type="text/javascript"> + /* <![CDATA[ */ + ## Play sound using scriptaculous library. + ## Use jQuery.ready to deferre execution and prevent errors in IE + jQuery(function() { + BPlayer.playSound('$newMessageSoundURL','o_sel_im_play_sound'); + }); + document.title = "$r.translate('im.new.message.short')"; + /* ]]> */ + </script> + ## render the new message icon links + #foreach ($holder in $iconsHolder) + $r.render("${holder}") + #end +</div> #end diff --git a/src/main/java/org/olat/instantMessaging/ui/_content/topnav.html b/src/main/java/org/olat/instantMessaging/ui/_content/topnav.html index 3da140976eff8bfcedf0385ca56e42bd95b9a668..fd1ed77255038b25bbf0c0f4b2c0c8503a788a6f 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_content/topnav.html +++ b/src/main/java/org/olat/instantMessaging/ui/_content/topnav.html @@ -1,13 +1,11 @@ #if(!$inAssessment) -<ul> - <li id="o_topnav_imclient_message">$r.render("newMsgPanel")</li> + $r.render("newMsgPanel") #if ($r.available("statusChangerPanel")) - <li id="o_topnav_imclient_status">$r.render("statusChangerPanel")</li> + <div id="o_im_status">$r.render("statusChangerPanel")</div> #end #if ($r.available("buddiesSummaryPanel")) - <li id="o_topnav_imclient_summary">$r.render("buddiesSummaryPanel")</li> + <div id="o_im_summary">$r.render("buddiesSummaryPanel")</div> #end -</ul> $r.render("rosterPanel") $r.render("statusPanel") #end \ No newline at end of file diff --git a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_de.properties index c3afdb2cb1e4902dac0da68d5262a067c38b87f4..541bb026b1590d856c8be599e882727aafd1252f 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_de.properties @@ -124,7 +124,8 @@ im.others.connected=Personen sind online im.refresh=Anzeige neu laden im.refresh.auto=Anzeige wird automatisch neu geladen. im.roster.intro=Welche meiner Bekannten aus meinen Gruppen sind in OpenOLAT eingeloggt?<br>W\u00E4hlen Sie eine Person aus, mit der Sie chatten m\u00F6chten. -im.roster.launch=Chat ({0}/{1}) +im.roster.launch={0}/{1} + im.show.groups=Zeige Gruppen im.show.offline.buddies=Zeige offline Kontakte im.show.online.buddies=Zeige Kontakte diff --git a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_en.properties index 73644787be724afecbca485516e676688be6eca1..72182afb62316580449ee93f8ac5b4949ead5552 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_en.properties @@ -125,7 +125,8 @@ im.others.connected=People are online im.refresh=Refresh display im.refresh.auto=Display will be reloaded automatically. im.roster.intro=Who else from my group colleagues are logged on to OpenOLAT?<br>Select one person you want to chat with. -im.roster.launch=Chat ({0}/{1}) +im.roster.launch={0}/{1} + im.show.groups=Show groups im.show.offline.buddies=Show offline contacts im.show.online.buddies=Show contacts diff --git a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_fr.properties index dc2e2aa4501c1686ddf68b4745ea7c4916f3c3d9..83ebcc2419b7e1c5f2746ffc5d8bc87efbb345f5 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_fr.properties @@ -133,7 +133,8 @@ im.others.connected=Utilisateurs OpenOLAT en ligne im.refresh=Rafra\u00EEchir l'affichage im.refresh.auto=L'affichage est rafra\u00EEchi automatiquement. im.roster.intro=Lesquels de mes copains de mes groupes sont connect\u00E9s sur OLAT?<br />S\u00E9lectionnez une personne avec laquelle vous souhaitez chatter. -im.roster.launch=Chat ({0}/{1}) +im.roster.launch={0}/{1} + im.show.groups=Montrer groupes im.show.offline.buddies=Montre contacts offline im.show.online.buddies=Montrer les contacts diff --git a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pl.properties index 63d90c93a732a541f8acdec1d5cc3cb69c3052e0..5338a7371c914b42b2a2722830ec07a7b97d2754 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pl.properties @@ -103,7 +103,8 @@ im.others.connected=u\u017Cytkownik\u00F3w OpenOLAT jest online im.refresh=Od\u015Bwie\u017C im.refresh.auto=Automatyczne od\u015Bwie\u017Canie jest aktywne. im.roster.intro=Kt\u00F3rzy znajomi z moich grup projekt\u00F3w s\u0105 zalogowani w OLAT?<br /> Wybierz osob\u0119 z kt\u00F3r\u0105 chcesz poczatowa\u0107. -im.roster.launch=Komunikator ({0}/{1}) +im.roster.launch={0}/{1} + im.show.groups=Poka\u017C grupy im.show.offline.buddies=Poka\u017C kontakty offline im.show.online.buddies=Poka\u017C kontakty diff --git a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pt_BR.properties index 76073cdb99241f605bd3b0a86cd5550ff9665319..572a5ebd6326ad88d25bcaa09a8b617c40fdd10d 100644 --- a/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/instantMessaging/ui/_i18n/LocalStrings_pt_BR.properties @@ -132,7 +132,8 @@ im.others.connected=Usu\u00E1rios do OpenOLAT est\u00E3o online im.refresh=Atualizar tela im.refresh.auto=A tela ser\u00E1 recarregada automaticamente. im.roster.intro=Quem de meu grupo est\u00E1 conectado ao OLAT?<br />Selecione uma pessoa para conversar. -im.roster.launch=Chat ({0}/{1}) +im.roster.launch={0}/{1} + im.show.groups=Exibir grupos im.show.offline.buddies=Exibir contatos off-line im.show.online.buddies=Mostrar contatos diff --git a/src/main/java/org/olat/social/shareLink/_content/shareLink.html b/src/main/java/org/olat/social/shareLink/_content/shareLink.html index 5be2c14e1c394f15febb84ebd0e44c7a34730818..db15f43066c7b886c343958f6b6ac6f006676168 100644 --- a/src/main/java/org/olat/social/shareLink/_content/shareLink.html +++ b/src/main/java/org/olat/social/shareLink/_content/shareLink.html @@ -2,55 +2,55 @@ <script type="text/javascript"> /* <![CDATA[ */ ## Called from Window.java to update the businesspath - function b_shareActiveSocialUrl() { - jQuery('#b_mail').attr('href','mailto:?subject=' + b_shareSocialTitle() + '&body=' + b_shareSocialUrl()); + function o_shareActiveSocialUrl() { + jQuery('#o_mail').attr('href','mailto:?subject=' + o_shareSocialTitle() + '&body=' + o_shareSocialUrl()); } ## Helper methods for buttons below - function b_shareSocialUrl() { + function o_shareSocialUrl() { if(o_info.businessPath && o_info.businessPath.length > 0) return o_info.businessPath; return '$baseURL'; } - function b_shareSocialTitle() { return document.title; } + function o_shareSocialTitle() { return document.title; } /* ]]> */ </script> -<div id="b_share"> +<div id="o_share"> #foreach ($link in $shareLinks) #if ($link == "twitter") - <a id="b_twitter" href="#" target="_blank" title="$r.translateInAttribute("share.twitter")" onclick="window.open('http://twitter.com/share?url='+b_shareSocialUrl()+'&text='+b_shareSocialTitle());return false;"></a> + <a id="o_twitter" href="#" target="_blank" title="$r.translateInAttribute("share.twitter")" onclick="window.open('http://twitter.com/share?url='+o_shareSocialUrl()+'&text='+o_shareSocialTitle());return false;"></a> #elseif ($link == "facebook") - <a id="b_facebook" href="#" target="_blank" title="$r.translateInAttribute("share.facebook")" onclick="window.open('http://www.facebook.com/sharer.php?u='+b_shareSocialUrl()+'&t='+b_shareSocialTitle());return false;"></a> + <a id="o_facebook" href="#" target="_blank" title="$r.translateInAttribute("share.facebook")" onclick="window.open('http://www.facebook.com/sharer.php?u='+o_shareSocialUrl()+'&t='+o_shareSocialTitle());return false;"></a> #elseif ($link == "google") - <a id="b_google" href="#" target="_blank" title="$r.translateInAttribute("share.google")" onclick="window.open('https://www.google.com/bookmarks/mark?op=add&bkmk='+b_shareSocialUrl()+'&title='+b_shareSocialTitle());return false;"></a> + <a id="o_google" href="#" target="_blank" title="$r.translateInAttribute("share.google")" onclick="window.open('https://www.google.com/bookmarks/mark?op=add&bkmk='+o_shareSocialUrl()+'&title='+o_shareSocialTitle());return false;"></a> #elseif ($link == "delicious") - <a id="b_delicious" href="#" target="_blank" title="$r.translateInAttribute("share.delicious")" onclick="window.open('http://www.delicious.com/save?url='+b_shareSocialUrl()+'&title='+b_shareSocialTitle());return false;"></a> + <a id="o_delicious" href="#" target="_blank" title="$r.translateInAttribute("share.delicious")" onclick="window.open('http://www.delicious.com/save?url='+o_shareSocialUrl()+'&title='+o_shareSocialTitle());return false;"></a> #elseif ($link == "digg") - <a id="b_digg" href="#" title="$r.translateInAttribute("share.digg")" onclick="window.open('http://digg.com/submit?url='+b_shareSocialUrl()+'&title='+b_shareSocialTitle());return false;"></a> + <a id="o_digg" href="#" title="$r.translateInAttribute("share.digg")" onclick="window.open('http://digg.com/submit?url='+o_shareSocialUrl()+'&title='+o_shareSocialTitle());return false;"></a> #elseif ($link == "mail") - <a id="b_mail" href="mailto:?body=$baseURL" title="$r.translateInAttribute("share.mail")"></a> + <a id="o_mail" href="mailto:?body=$baseURL" title="$r.translateInAttribute("share.mail")"></a> #elseif ($link == "link") - <a id="b_link" href="#" onclick="javascript:b_shareSocialLink();"></a> + <a id="o_link" href="#" onclick="javascript:o_shareSocialLink();"></a> <script type="text/javascript"> /* <![CDATA[ */ - function b_shareSocialLink() { + function o_shareSocialLink() { var callout = ''; - callout += '<div id="b_callout_sharesociallink" class="b_callout_area b_clearfix" style="z-index:101;"><div class="b_floatscrollbox"><a name="b_modal"></a><div class="b_callout"><div class="b_callout_top_left_arrow"></div><div class="b_callout_top_left_arrow-border"></div>'; - callout += '<div id="callout_layer_sharesociallink" class="b_callout_content"><div id="callout_layer_content_sharesociallink">'; - callout += '<p><span>$r.translate("share.link")</span>:<br/><input id="callout_share_link_in" type="text" name="cl_share_link" size="64" value="' + b_shareSocialUrl() + '" /></p>'; - callout += '</div></div></div></div></div><div id="b_callout_overlay_sharesociallink" class="b_callout_overlay" style="z-index:100;"></div>'; + callout += '<div id="o_callout_sharesociallink" class="o_callout_area b_clearfix" style="z-index:101;"><div class="b_floatscrollbox"><a name="b_modal"></a><div class="b_callout"><div class="o_callout_top_left_arrow"></div><div class="o_callout_top_left_arrow-border"></div>'; + callout += '<div id="callout_layer_sharesociallink" class="o_callout_content"><div id="callout_layer_content_sharesociallink">'; + callout += '<p><span>$r.translate("share.link")</span>:<br/><input id="callout_share_link_in" type="text" name="cl_share_link" size="64" value="' + o_shareSocialUrl() + '" /></p>'; + callout += '</div></div></div></div></div><div id="o_callout_overlay_sharesociallink" class="o_callout_overlay" style="z-index:100;"></div>'; jQuery('body').append(callout); jQuery('#callout_layer_sharesociallink').each(function(index, el) { - jQuery(el).parents('div.b_callout_area').next('div.b_callout_overlay').each(function(index2, el2) { + jQuery(el).parents('div.o_callout_area').next('div.o_callout_overlay').each(function(index2, el2) { jQuery(el2).click(function() { - jQuery('#b_callout_overlay_sharesociallink').remove(); - jQuery('#b_callout_sharesociallink').remove(); + jQuery('#o_callout_overlay_sharesociallink').remove(); + jQuery('#o_callout_sharesociallink').remove(); }); }); }); - jQuery('#b_callout_sharesociallink').each(function(index, el) { + jQuery('#o_callout_sharesociallink').each(function(index, el) { var targetEl = jQuery('#b_link'); var targetOffset = targetEl.offset(); if(targetOffset) {