gbegley
gbegley

Reputation: 2679

In an ExtJS Grid, how do I get access to the data store fields that are part of the sort set

How do I get access to the columns/datastore fields that are part of the sort set.

I am looking to modify the a grid's sort parameters for remote sorting. I need the remote sort param's sort key to match the column's field's mapping property. I need these things to happen though the normal 'column header click sorts the data' functionality.

Upvotes: 2

Views: 2374

Answers (2)

user1636522
user1636522

Reputation:

Remote sorting and field mapping (ExtJS 4.1)

This functionality seems not to be implemented in ExtJS. Here is a solution using the encodeSorters function provided since ExtJS 4. Accessing fields map throught the model's prototype is a bit dirty but it does the job :

var store = Ext.create('Ext.data.Store', {
    ...,
    proxy: {
        ...,
        encodeSorters: function (sorters) {
            var model = store.proxy.model,
                map = model.prototype.fields.map;
            return Ext.encode(Ext.Array.map(sorters, function (sorter) {
                return {
                    property : map[sorter.property].mapping || sorter.property,
                    direction: sorter.direction
                };
            }));
        }
    }
});

However, it would be more relevant to override the original method :

Ext.data.proxy.Server.override({
    encodeSorters: function(sorters) {
        var min, map = this.model.prototype.fields.map;
        min = Ext.Array.map(sorters, function (sorter) {
            return {
                property : map[sorter.property].mapping || sorter.property,
                direction: sorter.direction
            };
        });
        return this.applyEncoding(min);
    }
});

Upvotes: 2

ssinganamalla
ssinganamalla

Reputation: 1280

Assuming you are using simpleSortMode, you could do something like this in your store.

listeners: {
        beforeload: function( store, operation, eOpts ) {
            if (store.sorters.length > 0) {


                var sorter = store.sorters.getAt(0),
                dir = sorter.direction,
                prop = sorter.property,
                fields = store.model.getFields(),
                i,
                applyProp = prop;

                for (i = 0; i < fields.length; i++) {
                    if (fields[i].name == prop) {
                        applyProp = fields[i].mapping || prop;
                        break;
                    }
                } 

                //clearing the sorters since the simpleSortMode is true so there will be only one sorter
                store.sorters.clear();
                store.sorters.insert(0, applyProp, new Ext.util.Sorter({
                     property : applyProp,
                     direction: dir
                 }));
            }

        }

    },

Upvotes: 0

Related Questions