Skip to main content

Grid RowExpander plugin: expandOnlyOne, to auto collapse the last expanded row

RowExpander Addon: expandOnlyOne

It's just a little addon for RowExpander plugin which adds two features: the ability to only have one expanded row and to collapse the last expanded row.


Code:
GridPanel definition:
Ext.require([
     'Ext.data.*', 
'Ext.grid.*',
 'Ext.ux.RowExpanderPlus'
]);


Ext.define('MyApp.view.MyGridPane', {
extend : 'Ext.grid.Panel',

......
plugins: [{
            ptype: 'rowexpanderplus',
            selectRowOnExpand : true, //true to select a row when clicking on the expander icon
            expandOnDblClick: true, //true to toggle a row between expanded/collapsed when double clicked
            rowBodyTpl : [  ]

]}

.....
....

]);

ux/RowExpanderPlus.js
MVC pattern  : paste this js code in above path and declare in path  in loader.js \
General App :  import this js file path in your jsp

/**
 * @class Ext.ux.RowExpanderPlus
 * @extends Ext.ux.RowExpander
 * Plugin (ptype = 'rowexpanderplus') s just a little addon for 
 * {@link Ext.ux.RowExpander RowExpander} plugin which adds two features: 
 * the ability to only have one expanded row 
 * and to collapse the last expanded row.
 *
 * @ptype rowexpanderplus
 */
Ext.define('Ext.ux.RowExpanderPlus', {
    extend: 'Ext.ux.RowExpander',

    alias: 'plugin.rowexpanderplus',
    
    /**
     * @cfg {Boolean} expandOnlyOne
     * true to allow only one expanded row
     * (defaults to true).
     */
    expandOnlyOne: true,
    
    lastExpandedRowIdx: null,
    
    // Overwrite RowExpander.toggleRow(rowIdx)
    toggleRow: function(rowIdx) {
        var row = Ext.get(this.view.getNode(rowIdx));
        if (row.hasCls(this.rowCollapsedCls)) {
            if (this.lastExpandedRowIdx != null && this.expandOnlyOne == true) {
                this.collapseRow(this.lastExpandedRowIdx);
            }
            this.expandRow(rowIdx);
            this.lastExpandedRowIdx = rowIdx;
        } else {
            this.collapseRow(rowIdx);
            this.lastExpandedRowIdx = null;
        }
    },
    
    expandRow: function(rowIdx) {
        var view = this.view,
            rowNode = view.getNode(rowIdx),
            row = Ext.get(rowNode),
            nextBd = Ext.get(row).down(this.rowBodyTrSelector),
            record = view.getRecord(rowNode);

            row.removeCls(this.rowCollapsedCls);
            nextBd.removeCls(this.rowBodyHiddenCls);
            this.recordsExpanded[record.internalId] = true;
            view.refreshSize();
            view.fireEvent('expandbody', rowNode, record, nextBd.dom);
    },
    
    collapseRow: function(rowIdx) {
        var view = this.view,
            rowNode = view.getNode(rowIdx),
            row = Ext.get(rowNode),
            nextBd = Ext.get(row).down(this.rowBodyTrSelector),
            record = view.getRecord(rowNode);

            row.addCls(this.rowCollapsedCls);
            nextBd.addCls(this.rowBodyHiddenCls);
            this.recordsExpanded[record.internalId] = false;
            view.refreshSize();
            view.fireEvent('collapsebody', rowNode, record, nextBd.dom);
    },
    
    /**
     * @method
     * Collapse the last expanded row.
     */
    collapseLastRow: function() {
        this.collapseRow(this.lastExpandedRowIdx);
    }
    
});



Comments

Post a Comment

Popular posts from this blog

Ext4 Apply Store Filtering

In extjs4.1: There are many way for store filtering . Some of code i give here Filtering by single field: store . filter ( 'eyeColor' , 'Brown' );   Alternatively, if filters are configured with an  id , then existing filters store may be  replaced by new filters having the same  id . Filtering by single field: store . filter ( "email" , /\.com$/ );   Using multiple filters: store . filter ([ { property : "email" , value : /\.com$/ }, { filterFn : function ( item ) { return item . get ( "age" ) > 10 ; }} ]);   Using  Ext.util.Filter  instances instead of config objects (note that we need to specify the root config option in this case): store . filter ([ Ext . create ( ' Ext.util.Filter ' , {   property : "email" , value : /\.com$/ , root : 'data' }),   Ext . create ( ' Ext.util.Filter ' , {   filterFn : function ( item ) {   return item . get ( &

ExtJS - Grid panel features

What can we do with ExtJS GridPanel? I have to develop a lot of applications in my web app and I see that grid component of ExtJS may fit in. However, I am not aware of what all things I can do with the - off the shelf available framework pieces - available plug-ins in the marketplace and - custom development through my own developers This is a typical question that we hear from the business users who wants to design an application by keeping the framework’s capability in perspective. In this article I have tried to put the list of stuff you can do with grid and hopefully that shall enable you to take advantage of the beauty of ExtJS. Pre-requisites This article assumes that you are familiar with basics of ExtJS What are the available options? In this section I will be taking you through some of the commonly seen usage of ExtJS grid panel. While covering all the capabilities of grid may not be possible, I am sure it will be helpful for the business users who want to

EXTJS - Way to get a reference to the viewport from any controller

An easy way to get a reference to the viewport from any controller Here's an easy way to get a reference to your viewport from any controller: Ext.application({ launch: function(){ this.viewport = Ext.ComponentQuery.query('viewport')[0]; this.centerRegion = this.viewport.down('[region=center]'); } }); then, inside say, a controller, you can call this: this.application.viewport to get a reference to the viewport.