Question

I have a grid with a checkbox selection model.

Ext.define('Mb.view.ship.OrdersGrid', {
    extend: 'Ext.grid.Panel',
    selType: 'checkboxmodel',
    selModel: {
        injectCheckbox: 0,
        pruneRemoved: false
    },
    ...

There are some rows that shold not be selectable, based on a value in a field.

In a normal column, I can intervene in the display with renderer and hide the cell content with css (metadata.tdCls), but for the auto generated checkbox column, I cannot find a method to disable or hide the checkbox on a row basis.

Does anyone have an idea how to do this ?

Was it helpful?

Solution

You simply use the beforeselect event of the grid. Returning false, will not allow the selection. Check the documentation.

Ext.define('Mb.view.ship.OrdersGrid', {
    extend: 'Ext.grid.Panel',
    selType: 'checkboxmodel',
    selModel: {
        injectCheckbox: 0,
        pruneRemoved: false
    },

    listeners: {

        beforeselect: function(grid, record, index, eOpts) {
            if (record.get('yourProperty')) {//replace this with your logic.
                return false;
            }
        }

}
..........

If you really want to hide the checkbox, you could add CSS classes for your grid rows, and using them you could may be hide them. Check this answer for a solution.

OTHER TIPS

In ExtJS 6 overriding renderer will not work.

You can get around that by defining viewConfig with getRowClass:

            getRowClass: function(record) {
                var classes = '';
                if (!record.get('available')) {
                    classes += ' selection-disabled';
                }
                return classes;
            }

Then in your CSS add this:

.selection-disabled .x-selmodel-column {
    visibility: hidden;
}

That will hide selection checkbox.

Now to disable selection by clicking on a row use the standard method. I.e. add a beforeselect to listeners to selModel:

        selModel: {
            selType: 'checkboxmodel',
            showHeaderCheckbox: false,
            listeners: {
                beforeselect: function(grid, record) {
                    if (!record.get('available')) {
                        return false;
                    }
                }
            }
        },

CheckboxSelectionModel also has a renderer.

var sm = new Ext.grid.CheckboxSelectionModel({
        checkOnly : true,
        renderer : function(v,p,record) {
        // First condition : show
        if (record.data.XXX == 'YYYY') return '<div class="x-grid3-row-checker">&nbsp;</div>';
        // else hide 
        else return '';
    },
    header: ''
});

https://www.sencha.com/forum/showthread.php?122496-How-to-hide-certain-checkbox-in-a-CheckboxSelectionModel

Returning empty '' also disables checkbox selection, not only by hiding it but also adding unselectable="on" to the parent div.

Don't know about doing it inside an Ext.define (never had the need to extend) , but seems feasible.

UPDATE: Despite having unselectable="on", clicking on the row (if enabled), or using the header checkbox (select-all) will select "disabled" rows. It may be a good idea to implement a listener then.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top