Hello,

we are using ExtJs 4.0.1.com and have a problem with the rowexpander plugin for grids.
As it seems everythings works when the plugin is used on a Ext.grid.Panel directly but not when used
in a inherited widget. The following is a simple modification of the original grid-plugins.js

Code:
Ext.Loader.setConfig({
    enabled: true
});
Ext.Loader.setPath('Ext.ux', '../ux');

Ext.require([
    'Ext.grid.*',
    'Ext.data.*',
    'Ext.ux.RowExpander',
    'Ext.selection.CheckboxModel'
]);


Ext.onReady(function(){
    Ext.define('Company', {
        extend: 'Ext.data.Model',
        fields: [
            {name: 'company'},
            {name: 'price', type: 'float'},
            {name: 'change', type: 'float'},
            {name: 'pctChange', type: 'float'},
            {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'},
            {name: 'industry'},
            {name: 'desc'}
         ]
    });
    // Array data for the grids
    Ext.grid.dummyData = [
        ['3m Co',71.72,0.02,0.03,'9/1 12:00am', 'Manufacturing'],
        ['Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am', 'Manufacturing'],
        ['Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am', 'Manufacturing'],
        ['American Express Company',52.55,0.01,0.02,'9/1 12:00am', 'Finance'],
        ['American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am', 'Services']
    ];

    var getLocalStore = function() {
        return Ext.create('Ext.data.ArrayStore', {
        	groupField: 'company',
        	model: 'Company',
            data: Ext.grid.dummyData
        });
    };
    
    Ext.define('myGridPanel', {
        extend: 'Ext.grid.Panel',
        alias: 'widget.myGridPanel',
        
        initComponent: function(){
        
            var _self = this;
            
    		// -----------------------------------------------------
            // Public Interface 
            // -----------------------------------------------------
            
            // -----------------------------------------------------
            Ext.apply(this, {
            		
            		store: getLocalStore(),
    	            
    	            columns: [{
    	                header: 'company',
    	                dataIndex: 'company'
    	            }, {
    	                header: 'price',
    	                dataIndex: 'price'
    	            }, {
    	                header: 'change',
    	                dataIndex: 'change'
    	            }],
    	            
    	            plugins: [{
    	                ptype: 'rowexpander',
    	                rowBodyTpl : [
    	                    '<p>{company}</p>'
    	                ]
    	            }],
    	            
    	            features: [{
    	                ftype: 'grouping',
    					enableGroupingMenu: false,
    	                groupHeaderTpl: '{name} ({rows.length})', //print the number of items in the group
    	                startCollapsed: false // start all groups collapsed
    	            }]    	            
            }); 

            // call parent
            myGridPanel.superclass.initComponent.apply(this, arguments);
        },
        
        onRender: function(){
            myGridPanel.superclass.onRender.apply(this, arguments);
        }
    });

    Ext.create('Ext.Viewport', {
        layout: {
            type: 'fit',
            padding: 5
        },
        items: {
        	id: 'myGridPanel',
        	xtype: 'myGridPanel'
        }
    });
});
In the constructor of Ext.AbstractComponent I found the following:

Code:
...
if (me.plugins) {
    me.plugins = [].concat(me.plugins);
    for (i = 0, len = me.plugins.length; i < len; i++) {
        me.plugins[i] = me.constructPlugin(me.plugins[i]);  // too early ?, wait for initComponent
    }
}

me.initComponent(); // plugin is configured here via Ext.apply

// ititComponent gets a chance to change the id property before registering
Ext.ComponentManager.register(me);

// Dont pass the config so that it is not applied to 'this' again
me.mixins.observable.constructor.call(me);
me.mixins.state.constructor.call(me, config);

// Move this into Observable?
if (me.plugins) {
    me.plugins = [].concat(me.plugins);
    for (i = 0, len = me.plugins.length; i < len; i++) {
        me.plugins[i] = me.initPlugin(me.plugins[i]); // Exception is thrown here
    }
}  
...
as the plugins in the example are configured in the me.initComponent() call
the loop with the constructPlugin comes too early.
The exception is thrown in initPlugin as there is no "init" method.

If this is not a bug, could someone give an example to fix this using i.e.
the new Component inheritance mechanism ?

We now use a workaround with an intermediate panel wrapping the grid.
Ugly but works.

Regards
Steve