How can I add tools in a tab of an Extjs TabPanel?

Roberto Schuster picture Roberto Schuster · Jul 19, 2011 · Viewed 10.7k times · Source

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!

Answer

Lionel Chan picture Lionel Chan · Jul 20, 2011

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.'
    }]
});