diff --git a/src/main/webapp/static/js/jquery/openolat/jquery.navbar.js b/src/main/webapp/static/js/jquery/openolat/jquery.navbar.js index f729d9c40f10a07d1a1d7795d754bb26fd002e73..df79e9e6532def40b72b034fe745de941d7419b2 100644 --- a/src/main/webapp/static/js/jquery/openolat/jquery.navbar.js +++ b/src/main/webapp/static/js/jquery/openolat/jquery.navbar.js @@ -25,6 +25,7 @@ +function ($) { 'use strict'; var Navbar = function() { + var tabsExist = !!$('#o_navbar_container .o_navbar_tabs li:last-child').length; this.state = { rightVisible: false, toggleVisible: false, @@ -40,7 +41,8 @@ sitesExtended: true, sitesDirty : false, tabsW : 0, - tabsOffCanvas : false, + tabsCollapsed : !tabsExist, + tabsExtended : tabsExist, tabsDirty : false, personalToolsW : 0, personalToolsOffCanvas : false, @@ -103,8 +105,9 @@ Navbar.prototype.onDOMreplacementCallback = function() { if (!this.state.busy && (this.state.staticDirty || this.state.sitesDirty || this.state.tabsDirty || this.state.personalToolsDirty)) { this.state.busy = true; - //offcanvas sites need to be cleared, otherwise they are duplicated + //offcanvas sites and tabs need to be cleared, otherwise they are duplicated $('.o_sites_offcanvas').empty(); + $('.o_tabs_offcanvas').empty(); this.calculateWidth(); this.optimize(); this.state.sitesDirty = false; @@ -128,10 +131,8 @@ if (!this.state.staticOffCanvas) { this.state.staticW = $('.o_navbar_static').outerWidth(true); } - this.state.sitesW = $('.o_navbar_sites').outerWidth(true); - if (!this.state.tabsOffCanvas) { - this.state.tabsW = $('.o_navbar_tabs').outerWidth(true); - } + this.state.sitesW = $('#o_navbar_container .o_navbar_sites').outerWidth(true); + this.state.tabsW = $('#o_navbar_container .o_navbar_tabs').outerWidth(true); if (!this.state.personalToolsOffCanvas) { //don't include margin, because left and right margins on this element are negative this.state.personalToolsW = $('#o_navbar_tools_personal').outerWidth(false); @@ -147,37 +148,37 @@ o -= this.state.staticW; } o -= this.state.sitesW; - if (!this.state.tabsOffCanvas) { - o -= this.state.tabsW; - } + o -= this.state.tabsW; if (!this.state.personalToolsOffCanvas) { o -= this.state.personalToolsW; } - if (this.state.personalToolsOffCanvas || this.state.tabsOffCanvas || this.state.staticOffCanvas) { + if (this.state.personalToolsOffCanvas || this.state.staticOffCanvas || !this.state.sitesExtended || !this.state.tabsExtended) { // subtract the space used for toggle only when toggle is actually used o -= this.state.toggleW; } // always subtract the space used by brand and the permanent tools o -= this.state.brandW; o -= this.state.permanentToolW; + + //element widths can sometimes be off by 1px, so we need a small buffer on o + o -= 20; + return -o; } - Navbar.prototype.optimize = function(e) { + Navbar.prototype.optimize = function(e) { var o = this.getOverflow(); // console.log('optimize o:' + o); // Move from toolbar to offcanvas - //outerWidth can be off by 1px, so we need a small buffer on o - while (o + 20 > 0 && (!this.state.personalToolsOffCanvas || !this.state.tabsOffCanvas || !this.state.sitesCollapsed || !this.state.staticOffCanvas)) { + while (o > 0 && (!this.state.personalToolsOffCanvas || !this.state.tabsCollapsed || !this.state.sitesCollapsed || !this.state.staticOffCanvas)) { if (!this.state.personalToolsOffCanvas) { // console.log('collapse tools ' + o); $('#o_navbar_tools_personal').prependTo('#o_offcanvas_right_container'); this.state.personalToolsOffCanvas = true; - } - else if (!this.state.tabsOffCanvas) { + } + else if (!this.state.tabsCollapsed) { // console.log('collapse tabs ' + o); - $('.o_navbar_tabs').prependTo('#o_offcanvas_right_container'); - this.state.tabsOffCanvas = true; + this.collapseTabs(); } else if (!this.state.sitesCollapsed) { // console.log('collapse sites ' + o); @@ -193,7 +194,7 @@ o = this.getOverflow(); } // Move from offcanvas to toolbar - while (o < 0 && (this.state.personalToolsOffCanvas || this.state.tabsOffCanvas || !this.state.sitesExtended || this.state.staticOffCanvas)) { + while (o < 0 && (this.state.personalToolsOffCanvas || !this.state.tabsExtended || !this.state.sitesExtended || this.state.staticOffCanvas)) { if (this.state.staticOffCanvas) { if (-o < this.state.staticW) { break; @@ -204,22 +205,18 @@ this.state.staticOffCanvas = false; } else if (!this.state.sitesExtended) { - if(triedToExtend){ +// console.log('extend sites ' + o); + var siteFit = this.extendSites(); + if(!siteFit){ break; } - -// console.log('extend sites ' + o); - this.extendSites(); - var triedToExtend = true; } - else if (this.state.tabsOffCanvas) { - if (-o < this.state.tabsW) { + else if (!this.state.tabsExtended) { +// console.log('extend tabs ' + o); + var tabFit = this.extendTabs(); + if(!tabFit) { break; } - -// console.log('uncollapse tabs ' + o); - $('.o_navbar_tabs').appendTo('#o_navbar_container .o_navbar-collapse'); - this.state.tabsOffCanvas = false; } else if (this.state.personalToolsOffCanvas) { if (-o < this.state.personalToolsW) { @@ -235,7 +232,7 @@ o = this.getOverflow(); } - if (this.state.personalToolsOffCanvas || this.state.tabsOffCanvas || !this.state.sitesExtended) { + if (this.state.personalToolsOffCanvas || !this.state.tabsExtended || !this.state.sitesExtended) { this.showToggle(); } else { this.hideToggle(); @@ -248,32 +245,23 @@ * Collapse sites into 'more' one by one */ Navbar.prototype.collapseSites = function(e) { - var sites = $('.o_navbar_sites'); + var sites = $('#o_navbar_container .o_navbar_sites'); var sitesOffcanvas = $('.o_sites_offcanvas'); - var more = $('.o_site_more'); - if(more.length == 0){ - /* as long as 'more' has no function, don't display it - */ - more = $('<li class=" o_site_more" style="display:none;"><a href=""><span>More</span></a></li>'); - more.appendTo(sites); - more.bind('click', this.showMoreSites); - } if(sitesOffcanvas.length == 0){ sitesOffcanvas = $('<ul>', { - 'class': 'nav o_navbar-nav o_sites_offcanvas' + 'class': 'nav o_navbar-nav o_navbar_sites o_sites_offcanvas' }); sitesOffcanvas.prependTo('#o_offcanvas_right_container'); } - var secondLast = sites.find('li:nth-last-child(2)'); - if(secondLast.length){ -// console.log('collapsing site '+secondLast.attr('class').match('o_site_[a-z]*')); - secondLast.appendTo(sitesOffcanvas); + var site = sites.find('li:last-child'); + if(site.length){ +// console.log('collapsing site '+site.attr('class').match('o_site_[a-z]*')); + site.appendTo(sitesOffcanvas); } - if(sites.children().length == 1){ - //only 'more' button left + if(sites.children().length == 0){ this.state.sitesCollapsed = true; } @@ -284,33 +272,110 @@ * Extend sites by taking them out of 'more' one by one */ Navbar.prototype.extendSites = function(e) { - var sites = $('.o_navbar_sites'); + var sites = $('#o_navbar_container .o_navbar_sites'); var sitesOffcanvas = $('.o_sites_offcanvas'); - var more = $('.o_site_more'); + var siteFit = true; var site = sitesOffcanvas.find('li:last-child'); if(site.length){ -// console.log('extending site '+site.attr('class').match('o_site_[a-z]*')); - site.insertBefore(more); + site.appendTo(sites); //if site doesn't fit move it back var o = this.getOverflow(); if(-o < site.outerWidth(true)){ -// console.log('site doesn\'t fit'); site.appendTo(sitesOffcanvas); + siteFit = false; + } else { +// console.log('extending site '+site.attr('class').match('o_site_[a-z]*')); } } if(sitesOffcanvas.children().length == 0){ this.state.sitesExtended = true; sitesOffcanvas.remove(); - more.remove(); } this.state.sitesCollapsed = false; + + return siteFit; } - Navbar.prototype.showMoreSites = function(e) { + /* + * Collapse tabs one by one + */ + Navbar.prototype.collapseTabs = function(e) { + var tabs = $('#o_navbar_container .o_navbar_tabs'); + var tabsOffcanvas = $('.o_tabs_offcanvas'); + + if(tabsOffcanvas.length == 0){ + tabsOffcanvas = $('<ul>', { + 'class': 'nav o_navbar-nav o_navbar_tabs o_tabs_offcanvas' + }); + tabsOffcanvas.prependTo('#o_offcanvas_right_container'); + } + + var tab = tabs.find('li:last-child'); + if(tab.length){ +// console.log('collapsing tab '+tab.children(0).attr('title')); + tab.appendTo(tabsOffcanvas); + } + + if(tabs.children().length == 0){ + this.state.tabsCollapsed = true; + } + + this.state.tabsExtended = false; + } + + /* + * Extend tabs one by one + */ + Navbar.prototype.extendTabs = function(e) { + var tabs = $('#o_navbar_container .o_navbar_tabs'); + var tabsOffcanvas = $('.o_tabs_offcanvas'); + var tabFit = true; + + var tab = tabsOffcanvas.find('li:last-child'); + if(tab.length){ + tab.appendTo(tabs); + //if tab doesn't fit move it back + var o = this.getOverflow(); + if(-o < tab.outerWidth(true)){ + tab.appendTo(tabsOffcanvas); + tabFit = false; + } else { +// console.log('extending tab '+tab.children(0).attr('title')); + } + } + + if(tabsOffcanvas.children().length == 0){ + this.state.tabsExtended = true; + tabsOffcanvas.remove(); + } + this.state.tabsCollapsed = false; + + return tabFit; + } + + /* + * Get or create the 'more' navbar element. + * A button to display collapsed elements. + */ + Navbar.prototype.getOrCreateMoreButton = function() { + var collapse = $('#o_navbar_container .o_navbar-collapse'); + var more = $('.o_navbar_more'); + if(more.length == 0){ + /* as long as 'more' has no function, don't display it: + * style="display:none;" + */ + more = $('<ul class="o_navbar_more nav o_navbar-nav" style="display:none;"><li><a href="">more</a></li></ul>'); + more.appendTo(collapse); + more.bind('click', this.showMoreSites); + } + } + + Navbar.prototype.showMoreSites = function(e) { + console.log('more'); } Navbar.prototype.showToggle = function() {