How can I add tools in a tab of an Extjs TabPanel?
How can I add the buttons (tools) in the header of each tab, in a TabControl?
I just could add tools in the TabPanel, but I want to add in the tabs.
Image
I also tried this, but no success:
var lTabPanel = Ext.create('Ext.tab.Panel', {
width: 400,
height: 400,
renderTo: document.body,
items: [{
title: 'Home',
html: 'Home',
itemId: 'home'
}, {
title: 'Users',
html: 'Users',
itemId: 开发者_高级运维'users',
hidden: true
}, {
title : 'Tickets',
html : 'Tickets',
itemId : 'tickets',
tools:[{
type:'gear',
tooltip: 'Options',
handler: function(event, toolEl, panel){
// Some code.
}
}]
}]
});
Any idea?
Thanks!
Quite tough actually.
If you check their source code, Ext.tab.Panel
is in fact using Card Layout and for each tab, they used Ext.tab.Tab
to do the tab buttons.
Then if you check the source code of Ext.tab.Tab
, it's in fact extending Ext.button.Button
, which is just a modified button.
So if you need to add tools, I afraid the best way is to extend Ext.tab.Tab
and write your own tab buttons. You might want to check out how they create closeable
buttons in line 233 of /src/tab/Tab.js
.
(Ext-4.0.2a)
Cheers
EDIT
So we know Ext.tab.Tab
is extending Ext.button.Button
, we can make use of this fact, and I have came out with this solution, check this out at fiddle: http://jsfiddle.net/uBxqY/4/
Basically, I have extended Ext.tab.Tab
, and modified the buttonWrapper class so to have the arrow css added. Nothing fancy, everything work out of the box.
Also I have overrided the onClick
function so the menu won't be expanded when the user click on the tab itself. A little bit dirty, but it works (borrowed prototype.onClick
from Ext.button.Split
.
Working example: http://jsfiddle.net/uBxqY/4/, or source:
Ext.define('Ext.ux.tab.Tab', {
extend: 'Ext.tab.Tab',
alias: 'widget.ux.menutab',
requires: [
//We just need the onClick from Split button
'Ext.button.Split'
],
/**
* Menu align, if you need to hack the menu alignment
*/
menuAlign: 'tl-bl?',
constructor: function() {
this.callParent(arguments);
//Kind of harsh, we need the click action from
//split button instead.
//Or if you preferred, you can always override this
//function and write your own handler.
this.onClick = Ext.button.Split.prototype.onClick;
},
/**
* Hack the default css class and add
* some resonable padding so to make it looks
* great :)
*/
onRender: function() {
this.callParent(arguments);
//We change the button wrap class here! (HACK!)
this.btnWrap.replaceCls('x-tab-arrow x-tab-arrow-right',
'x-btn-split x-btn-split-right')
.setStyle('padding-right', '20px !important');
}
});
Ext.create('Ext.tab.Panel', {
renderTo: Ext.getBody(),
style: 'margin:10px;',
defaults: {
bodyStyle: 'padding:10px;'
},
plain: true,
items: [{
title: 'Split Tab',
//tabConfig is taken up during tab formation
tabConfig: {
//We use our own custom tab!
xtype: 'ux.menutab',
menu: [{
text: 'Menu item 1'
},{
text: 'Menu item 2'
}]
},
html: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
},{
title: 'Normal Tab',
html: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
}]
});
Thank you for sharing solution! This is my way (based on yours):
Ext.define('CB.view.ux.TabMenu', {
extend: 'Ext.tab.Tab',
alias: 'widget.tabmenu',
requires: [
'Ext.button.Split'
],
menuAlign: 'tl-bl?',
constructor: function() {
this.callParent(arguments);
this.onClick = Ext.button.Split.prototype.onClick;
},
onRender: function() {
this.callParent(arguments);
this.btnWrap.insertSibling({
tag: 'a',
cls: 'arrow-inside-tab',
href: '#'
}, 'after');
this.btnWrap.addCls(['pdr10']); //padding-right: 10px; to make some place for arrow
}
});
CSS:
.arrow-inside-tab {
display: block;
position: absolute;
width: 11px;
height: 11px;
top: 5px;
right: 4px;
background: url("../js/extjs/resources/ext-theme-classic/images/button/arrow.gif") 1px 0 no-repeat;
}
精彩评论