9 * @class Roo.bootstrap.NavItem
10 * @extends Roo.bootstrap.Component
11 * Bootstrap Navbar.NavItem class
12 * @cfg {String} href link to
13 * @cfg {String} button_weight (default | primary | secondary | success | info | warning | danger | link ) default none
15 * @cfg {String} html content of button
16 * @cfg {String} badge text inside badge
17 * @cfg {String} badgecls (bg-green|bg-red|bg-yellow)the extra classes for the badge
18 * @cfg {String} glyphicon DEPRICATED - use fa
19 * @cfg {String} icon DEPRICATED - use fa
20 * @cfg {String} fa - Fontawsome icon name (can add stuff to it like fa-2x)
21 * @cfg {Boolean} active Is item active
22 * @cfg {Boolean} disabled Is item disabled
24 * @cfg {Boolean} preventDefault (true | false) default false
25 * @cfg {String} tabId the tab that this item activates.
26 * @cfg {String} tagtype (a|span) render as a href or span?
27 * @cfg {Boolean} animateRef (true|false) link to element default false
30 * Create a new Navbar Item
31 * @param {Object} config The config object
33 Roo.bootstrap.NavItem = function(config){
34 Roo.bootstrap.NavItem.superclass.constructor.call(this, config);
39 * The raw click event for the entire grid.
40 * @param {Roo.EventObject} e
45 * Fires when the active item active state changes
46 * @param {Roo.bootstrap.NavItem} this
47 * @param {boolean} state the new state
53 * Fires when scroll to element
54 * @param {Roo.bootstrap.NavItem} this
55 * @param {Object} options
56 * @param {Roo.EventObject} e
64 Roo.extend(Roo.bootstrap.NavItem, Roo.bootstrap.Component, {
73 preventDefault : false,
84 getAutoCreate : function(){
93 cfg.cls = typeof(cfg.cls) == 'undefined' ? 'active' : cfg.cls + ' active';
96 cfg.cls += ' disabled';
99 if (this.href || this.html || this.glyphicon || this.icon || this.fa) {
103 href : this.href || "#",
104 html: this.html || ''
107 if (this.tagtype == 'a') {
108 cfg.cn[0].cls = 'nav-link';
111 cfg.cn[0].html = '<i class="'+this.icon+'"></i> <span>' + cfg.cn[0].html + '</span>'
114 cfg.cn[0].html = '<i class="fa fas fa-'+this.fa+'"></i> <span>' + cfg.cn[0].html + '</span>'
117 cfg.cn[0].html = '<span class="glyphicon glyphicon-' + this.glyphicon + '"></span> ' + cfg.cn[0].html;
122 cfg.cn[0].html += " <span class='caret'></span>";
126 if (this.badge !== '') {
128 cfg.cn[0].html += ' <span class="badge badge-secondary">' + this.badge + '</span>';
136 onRender : function(ct, position)
138 // Roo.log("Call onRender: " + this.xtype);
139 if (Roo.bootstrap.version == 4 && ct.dom.type != 'ul') {
143 var ret = Roo.bootstrap.NavItem.superclass.onRender.call(this, ct, position);
144 this.navLink = this.el.select('.nav-link',true).first();
149 initEvents: function()
151 if (typeof (this.menu) != 'undefined') {
152 this.menu.parentType = this.xtype;
153 this.menu.triggerEl = this.el;
154 this.menu = this.addxtype(Roo.apply({}, this.menu));
157 this.el.select('a',true).on('click', this.onClick, this);
159 if(this.tagtype == 'span'){
160 this.el.select('span',true).on('click', this.onClick, this);
163 // at this point parent should be available..
164 this.parent().register(this);
167 onClick : function(e)
169 if (e.getTarget('.dropdown-menu-item')) {
170 // did you click on a menu itemm.... - then don't trigger onclick..
175 this.preventDefault ||
178 Roo.log("NavItem - prevent Default?");
186 var tg = Roo.bootstrap.TabGroup.get(this.navId);
187 if (tg && tg.transition) {
188 Roo.log("waiting for the transitionend");
194 //Roo.log("fire event clicked");
195 if(this.fireEvent('click', this, e) === false){
199 if(this.tagtype == 'span'){
203 //Roo.log(this.href);
204 var ael = this.el.select('a',true).first();
207 if(ael && this.animateRef && this.href.indexOf('#') > -1){
208 //Roo.log(["test:",ael.dom.href.split("#")[0], document.location.toString().split("#")[0]]);
209 if (ael.dom.href.split("#")[0] != document.location.toString().split("#")[0]) {
210 return; // ignore... - it's a 'hash' to another page.
212 Roo.log("NavItem - prevent Default?");
214 this.scrollToElement(e);
218 var p = this.parent();
220 if (['tabs','pills'].indexOf(p.type)!==-1) {
221 if (typeof(p.setActiveItem) !== 'undefined') {
222 p.setActiveItem(this);
226 // if parent is a navbarheader....- and link is probably a '#' page ref.. then remove the expanded menu.
227 if (p.parentType == 'NavHeaderbar' && !this.menu) {
228 // remove the collapsed menu expand...
229 p.parent().el.select('.navbar-collapse',true).removeClass('in');
233 isActive: function () {
236 setActive : function(state, fire, is_was_active)
238 if (this.active && !state && this.navId) {
239 this.was_active = true;
240 var nv = Roo.bootstrap.NavGroup.get(this.navId);
242 nv.clearWasActive(this);
249 this.el.removeClass('active');
250 this.navLink ? this.navLink.removeClass('active') : false;
251 } else if (!this.el.hasClass('active')) {
253 this.el.addClass('active');
254 if (Roo.bootstrap.version == 4 && this.navLink ) {
255 this.navLink.addClass('active');
260 this.fireEvent('changed', this, state);
263 // show a panel if it's registered and related..
265 if (!this.navId || !this.tabId || !state || is_was_active) {
269 var tg = Roo.bootstrap.TabGroup.get(this.navId);
273 var pan = tg.getPanelByName(this.tabId);
277 // if we can not flip to new panel - go back to old nav highlight..
278 if (false == tg.showPanel(pan)) {
279 var nv = Roo.bootstrap.NavGroup.get(this.navId);
281 var onav = nv.getWasActive();
283 onav.setActive(true, false, true);
292 // this should not be here...
293 setDisabled : function(state)
295 this.disabled = state;
297 this.el.removeClass('disabled');
298 } else if (!this.el.hasClass('disabled')) {
299 this.el.addClass('disabled');
305 * Fetch the element to display the tooltip on.
306 * @return {Roo.Element} defaults to this.el
308 tooltipEl : function()
310 return this.el.select('' + this.tagtype + '', true).first();
313 scrollToElement : function(e)
315 var c = document.body;
318 * Firefox / IE places the overflow at the html level, unless specifically styled to behave differently.
320 if(Roo.isFirefox || Roo.isIE || Roo.isIE11){
321 c = document.documentElement;
324 var target = Roo.get(c).select('a[name=' + this.href.split('#')[1] +']', true).first();
330 var o = target.calcOffsetsTo(c);
337 this.fireEvent('scrollto', this, options, e);
339 Roo.get(c).scrollTo('top', options.value, true);