3 * Copyright(c) 2006-2009 Ext JS, LLC
5 * http://www.extjs.com/license
10 * @class Ext.ux.tree.TreeGridSorter
11 * @extends Ext.tree.TreeSorter
13 Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, {
15 * @cfg {Array} sortClasses The CSS classes applied to a header when it is sorted. (defaults to <tt>['sort-asc', 'sort-desc']</tt>)
17 sortClasses : ['sort-asc', 'sort-desc'],
19 * @cfg {String} sortAscText The text displayed in the 'Sort Ascending' menu item (defaults to <tt>'Sort Ascending'</tt>)
21 sortAscText : 'Sort Ascending',
23 * @cfg {String} sortDescText The text displayed in the 'Sort Descending' menu item (defaults to <tt>'Sort Descending'</tt>)
25 sortDescText : 'Sort Descending',
27 constructor : function(tree, config) {
28 if(!Ext.isObject(config)) {
30 property: tree.columns[0].dataIndex || 'text',
35 Ext.ux.tree.TreeGridSorter.superclass.constructor.apply(this, arguments);
38 tree.on('headerclick', this.onHeaderClick, this);
39 tree.ddAppendOnly = true;
42 this.defaultSortFn = function(n1, n2){
44 var dsc = me.dir && me.dir.toLowerCase() == 'desc';
45 var p = me.property || 'text';
46 var sortType = me.sortType;
47 var fs = me.folderSort;
48 var cs = me.caseSensitive === true;
49 var leafAttr = me.leafAttr || 'leaf';
52 if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){
55 if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){
59 var v1 = sortType ? sortType(n1.attributes[p]) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());
60 var v2 = sortType ? sortType(n2.attributes[p]) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());
70 tree.on('afterrender', this.onAfterTreeRender, this, {single: true});
71 tree.on('headermenuclick', this.onHeaderMenuClick, this);
74 onAfterTreeRender : function() {
75 var hmenu = this.tree.hmenu;
77 {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'},
78 {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
80 this.updateSortIcon(0, 'asc');
83 onHeaderMenuClick : function(c, id, index) {
84 if(id === 'asc' || id === 'desc') {
85 this.onHeaderClick(c, null, index);
90 onHeaderClick : function(c, el, i) {
91 if(c && !this.tree.headersDisabled){
94 me.property = c.dataIndex;
95 me.dir = c.dir = (c.dir === 'desc' ? 'asc' : 'desc');
96 me.sortType = c.sortType;
97 me.caseSensitive === Ext.isBoolean(c.caseSensitive) ? c.caseSensitive : this.caseSensitive;
98 me.sortFn = c.sortFn || this.defaultSortFn;
100 this.tree.root.cascade(function(n) {
102 me.updateSort(me.tree, n);
106 this.updateSortIcon(i, c.dir);
111 updateSortIcon : function(col, dir){
112 var sc = this.sortClasses;
113 var hds = this.tree.innerHd.select('td').removeClass(sc);
114 hds.item(col).addClass(sc[dir == 'desc' ? 1 : 0]);