-
18 Oct 2009 6:27 AM #1
Add new tab button in tab strip
Add new tab button in tab strip
Usage:
Obviously it just creates a new defaultType (whatever you configure that to for your TabPanel - defaults to Ext.Panel). It's up to you to access the newly added item and manipulate it.Code:plugins: [ Ext.ux.AddTabButton ], createTab: function() { // Optional function which the plugin uses to create new tabs return { title: 'New Tab', closable: true }; },
Code:Ext.ux.AddTabButton = (function() { function onTabPanelRender() { this.addTab = this.itemTpl.insertBefore(this.edge, { id: this.id + 'addTabButton', cls: 'add-tab', text: this.addTabText || ' ', iconCls: '' }, true); this.addTab.child('em.x-tab-left').setStyle('padding-right', '6px'); this.addTab.child('a.x-tab-right').setStyle('padding-left', '6px'); new Ext.ToolTip({ target: this.addTab, bodyCfg: { html: 'Add new tab' } }); this.addTab.on({ mousedown: stopEvent, click: onAddTabClick, scope: this }); } function createScrollers() { this.scrollerWidth = (this.scrollRightWidth = this.scrollRight.getWidth()) + this.scrollLeft.getWidth(); } function autoScrollTabs() { var scrollersVisible = (this.scrollLeft && this.scrollLeft.isVisible()), pos = this.tabPosition == 'top' ? 'header' : 'footer'; if (scrollersVisible) { if (this.addTab.dom.parentNode === this.strip.dom) { if (this.addTabWrap) { this.addTabWrap.show(); } else { this.addTabWrap = this[pos].createChild({ cls: 'x-tab-strip-wrap', style: { position: 'absolute', right: (this.scrollRightWidth + 1) + 'px', top: 0, width: '30px', margin: 0 }, cn: { tag: 'ul', cls: 'x-tab-strip x-tab-strip-' + this.tabPosition, style: { width: 'auto' } } }); this.addTabWrap.setVisibilityMode(Ext.Element.DISPLAY); this.addTabUl = this.addTabWrap.child('ul'); } this.addTabUl.dom.appendChild(this.addTab.dom); this.addTab.setStyle('float', 'none'); } this.stripWrap.setWidth(this[pos].getWidth(true) - (this.scrollerWidth + 31)); this.stripWrap.setStyle('margin-right', (this.scrollRightWidth + 31) + 'px'); } else { // if ((this.addTab.dom.parentNode !== this.strip.dom)) { var notEnoughSpace = (((this[pos].getWidth(true) - this.edge.getOffsetsTo(this.stripWrap)[0])) < 33) this.addTabWrap.hide(); this.addTab.setStyle('float', ''); this.strip.dom.insertBefore(this.addTab.dom, this.edge.dom); this.stripWrap.setWidth(this.stripWrap.getWidth() + 31); if (notEnoughSpace) { this.autoScrollTabs(); } } } } function autoSizeTabs() { this.addTab.child('.x-tab-strip-inner').setStyle('width', '14px'); } function stopEvent(e) { e.stopEvent(); } function onAddTabClick() { this.setActiveTab(this.add(this.createTab? this.createTab() : { title: 'New Tab' })); } return { init: function(tp) { if (tp instanceof Ext.TabPanel) { tp.onRender = tp.onRender.createSequence(onTabPanelRender); tp.createScrollers = tp.createScrollers.createSequence(createScrollers); tp.autoScrollTabs = tp.autoScrollTabs.createSequence(autoScrollTabs); tp.autoSizeTabs = tp.autoSizeTabs.createSequence(autoSizeTabs); } } }; })();Search the forum: http://www.google.com/coop/cse?cx=01...%3Az7of1ufqccu
Read the docs too: http://extjs.com/deploy/dev/docs/
Scope: http://extjs.com/forum/showthread.ph...642#post257642
-
18 Oct 2009 9:12 AM #2Sencha - Community Support Team
- Join Date
- Mar 2007
- Location
- Frederick MD, NYC, DC
- Posts
- 16,169
- Vote Rating
- 28
excellent dude.


Jay Garcia @ModusJesus || Modus Create co-founder
Ext JS in Action author
Sencha Touch in Action author
Get in touch for Ext JS & Sencha Touch Touch Training
We are also working on Video-based Sencha Touch training: Check it out here.
-
5 Nov 2009 1:12 AM #3
thank you, thats sooo cool, but how can i use iconCls: 'add' ?
-
6 Nov 2009 1:26 AM #4
OK, now you can configure your TabPabel with
To use text in the add tab button.Code:addTabText: '+'
Or, use the class to give it an icon eg
To giveCode:div.x-tab-strip-wrap .add-tab a span.x-tab-strip-inner { background: url(../../resources/images/default/dd/drop-add.gif) no-repeat center center; }
Search the forum: http://www.google.com/coop/cse?cx=01...%3Az7of1ufqccu
Read the docs too: http://extjs.com/deploy/dev/docs/
Scope: http://extjs.com/forum/showthread.ph...642#post257642
-
20 Nov 2009 12:46 PM #5
Hi Animal,
There is a way to add buttons with right aligment, independent of the aligment of the tabs. I mean, all the tabs would be with left aligment and the new tab buttons with right aligment??
-
4 Mar 2010 6:30 AM #6
Animal, very nice
The tab was very narrow so I changed the css to:
Thanks, MartyHTML Code:div.x-tab-strip-wrap .add-tab a span.x-tab-strip-inner { width:26px; background: url(../../resources/images/default/dd/drop-add.gif) no-repeat center center; }
-
12 Sep 2010 6:47 PM #7
Hi Animal,
this is great. I would like to replicate the example from the screenshot you posted, however, there is a small rendering problem now. I'm using ext 3.2.1. I can display the whole icon by setting a higher width in css, but there is still something weird going on between the tabs and the '+' button. Could you maybe take a quick look? Other than that, fantastic work!

-
12 Sep 2010 9:35 PM #8
Poke it with Firebug and see what styles it needs.
Search the forum: http://www.google.com/coop/cse?cx=01...%3Az7of1ufqccu
Read the docs too: http://extjs.com/deploy/dev/docs/
Scope: http://extjs.com/forum/showthread.ph...642#post257642
-
12 Sep 2010 11:24 PM #9
Ah I just found out that it is not because of the ext version but because of the tabPosition: 'bottom'.
-
15 Sep 2010 6:28 AM #10
Cheers Animal!
I've cut down what you done as I just needed the button to allow someone to click it which calls a callback function that adds a new tab to the tabpanel. I think it is correct ..
Which uses the config options in the tabpanel:PHP Code:Ext.ux.AddTabButton = (function() {
function onTabPanelRender() {
this.addTab = this.itemTpl.insertBefore(this.edge, {
id: this.id + 'addTabButton',
cls: 'add-tab',
text: this.addTabText || ' ',
iconCls: ''
}, true);
this.addTab.child('em.x-tab-left').setStyle('padding-right', '6px');
this.addTab.child('a.x-tab-right').setStyle('padding-left', '6px');
new Ext.ToolTip({
target: this.addTab,
bodyCfg: {
html: 'New tab'
}
});
this.addTab.on({
click: this.onAddTabClick,
scope: this
});
}
return {
init: function(tp) {
if (tp instanceof Ext.TabPanel) {
tp.onRender = tp.onRender.createSequence(onTabPanelRender);
}
}
};
})();
PHP Code:plugins: [ Ext.ux.AddTabButton ],
onAddTabClick : function(){ someFunctionThatAddsNewTab(); }


Reply With Quote