/* * - LGPL * * row * */ /** * @class Roo.bootstrap.NavItem * @extends Roo.bootstrap.Component * Bootstrap Navbar.NavItem class * @cfg {String} href link to * @cfg {String} html content of button * @cfg {String} badge text inside badge * @cfg {String} badgecls (bg-green|bg-red|bg-yellow)the extra classes for the badge * @cfg {String} glyphicon name of glyphicon * @cfg {String} icon name of font awesome icon * @cfg {Boolean} active Is item active * @cfg {Boolean} disabled Is item disabled * @cfg {Boolean} preventDefault (true | false) default false * @cfg {String} tabId the tab that this item activates. * @cfg {String} tagtype (a|span) render as a href or span? * @cfg {Boolean} animateRef (true|false) link to element default false * @constructor * Create a new Navbar Item * @param {Object} config The config object */ Roo.bootstrap.NavItem = function(config){ Roo.bootstrap.NavItem.superclass.constructor.call(this, config); this.addEvents({ // raw events /** * @event click * The raw click event for the entire grid. * @param {Roo.EventObject} e */ "click" : true, /** * @event changed * Fires when the active item active state changes * @param {Roo.bootstrap.NavItem} this * @param {boolean} state the new state */ 'changed': true, /** * @event scrollto * Fires when scroll to element * @param {Roo.bootstrap.NavItem} this * @param {Object} options * @param {Roo.EventObject} e */ 'scrollto': true }); }; Roo.extend(Roo.bootstrap.NavItem, Roo.bootstrap.Component, { href: false, html: '', badge: '', icon: false, glyphicon: false, active: false, preventDefault : false, tabId : false, tagtype : 'a', disabled : false, animateRef : false, was_active : false, getAutoCreate : function(){ var cfg = { tag: 'li', cls: 'nav-item' } if (this.active) { cfg.cls = typeof(cfg.cls) == 'undefined' ? 'active' : cfg.cls + ' active'; } if (this.disabled) { cfg.cls += ' disabled'; } if (this.href || this.html || this.glyphicon || this.icon) { cfg.cn = [ { tag: this.tagtype, href : this.href || "#", html: this.html || '' } ]; if (this.icon) { cfg.cn[0].html = '<i class="'+this.icon+'"></i> <span>' + cfg.cn[0].html + '</span>' } if(this.glyphicon) { cfg.cn[0].html = '<span class="glyphicon glyphicon-' + this.glyphicon + '"></span> ' + cfg.cn[0].html; } if (this.menu) { cfg.cn[0].html += " <span class='caret'></span>"; } if (this.badge !== '') { cfg.cn[0].html += ' <span class="badge">' + this.badge + '</span>'; } } return cfg; }, initEvents: function() { if (typeof (this.menu) != 'undefined') { this.menu.parentType = this.xtype; this.menu.triggerEl = this.el; this.menu = this.addxtype(Roo.apply({}, this.menu)); } this.el.select('a',true).on('click', this.onClick, this); if(this.tagtype == 'span'){ this.el.select('span',true).on('click', this.onClick, this); } // at this point parent should be available.. this.parent().register(this); }, onClick : function(e) { if( this.preventDefault || this.href == '#' ){ e.preventDefault(); } if (this.disabled) { return; } var tg = Roo.bootstrap.TabGroup.get(this.navId); if (tg && tg.transition) { Roo.log("waiting for the transitionend"); return; } //Roo.log("fire event clicked"); if(this.fireEvent('click', this, e) === false){ return; }; if(this.tagtype == 'span'){ return; } //Roo.log(this.href); var ael = this.el.select('a',true).first(); //Roo.log(ael); if(ael && this.animateRef && this.href.indexOf('#') > -1){ //Roo.log(["test:",ael.dom.href.split("#")[0], document.location.toString().split("#")[0]]); if (ael.dom.href.split("#")[0] != document.location.toString().split("#")[0]) { return; // ignore... - it's a 'hash' to another page. } e.preventDefault(); this.scrollToElement(e); } var p = this.parent(); if (['tabs','pills'].indexOf(p.type)!==-1) { if (typeof(p.setActiveItem) !== 'undefined') { p.setActiveItem(this); } } // if parent is a navbarheader....- and link is probably a '#' page ref.. then remove the expanded menu. if (p.parentType == 'NavHeaderbar' && !this.menu) { // remove the collapsed menu expand... p.parent().el.select('.navbar-collapse',true).removeClass('in'); } }, isActive: function () { return this.active }, setActive : function(state, fire, is_was_active) { if (this.active && !state && this.navId) { this.was_active = true; var nv = Roo.bootstrap.NavGroup.get(this.navId); if (nv) { nv.clearWasActive(this); } } this.active = state; if (!state ) { this.el.removeClass('active'); } else if (!this.el.hasClass('active')) { this.el.addClass('active'); } if (fire) { this.fireEvent('changed', this, state); } // show a panel if it's registered and related.. if (!this.navId || !this.tabId || !state || is_was_active) { return; } var tg = Roo.bootstrap.TabGroup.get(this.navId); if (!tg) { return; } var pan = tg.getPanelByName(this.tabId); if (!pan) { return; } // if we can not flip to new panel - go back to old nav highlight.. if (false == tg.showPanel(pan)) { var nv = Roo.bootstrap.NavGroup.get(this.navId); if (nv) { var onav = nv.getWasActive(); if (onav) { onav.setActive(true, false, true); } } } }, // this should not be here... setDisabled : function(state) { this.disabled = state; if (!state ) { this.el.removeClass('disabled'); } else if (!this.el.hasClass('disabled')) { this.el.addClass('disabled'); } }, /** * Fetch the element to display the tooltip on. * @return {Roo.Element} defaults to this.el */ tooltipEl : function() { return this.el.select('' + this.tagtype + '', true).first(); }, scrollToElement : function(e) { var c = document.body; /* * Firefox / IE places the overflow at the html level, unless specifically styled to behave differently. */ if(Roo.isFirefox || Roo.isIE || Roo.isIE11){ c = document.documentElement; } var target = Roo.get(c).select('a[name=' + this.href.split('#')[1] +']', true).first(); if(!target){ return; } var o = target.calcOffsetsTo(c); var options = { target : target, value : o[1] } this.fireEvent('scrollto', this, options, e); Roo.get(c).scrollTo('top', options.value, true); return; } });