TreeGridSorter.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:4k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. Ext.ns('Ext.ux.tree');
  8. /**
  9.  * @class Ext.ux.tree.TreeGridSorter
  10.  * @extends Ext.tree.TreeSorter
  11.  */
  12. Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, {
  13.     /**
  14.      * @cfg {Array} sortClasses The CSS classes applied to a header when it is sorted. (defaults to <tt>['sort-asc', 'sort-desc']</tt>)
  15.      */
  16.     sortClasses : ['sort-asc', 'sort-desc'],
  17.     /**
  18.      * @cfg {String} sortAscText The text displayed in the 'Sort Ascending' menu item (defaults to <tt>'Sort Ascending'</tt>)
  19.      */
  20.     sortAscText : 'Sort Ascending',
  21.     /**
  22.      * @cfg {String} sortDescText The text displayed in the 'Sort Descending' menu item (defaults to <tt>'Sort Descending'</tt>)
  23.      */
  24.     sortDescText : 'Sort Descending',
  25.     constructor : function(tree, config) {
  26.         if(!Ext.isObject(config)) {
  27.             config = {
  28.                 property: tree.columns[0].dataIndex || 'text',
  29.                 folderSort: true
  30.             }
  31.         }
  32.         Ext.ux.tree.TreeGridSorter.superclass.constructor.apply(this, arguments);
  33.         this.tree = tree;
  34.         tree.on('headerclick', this.onHeaderClick, this);
  35.         tree.ddAppendOnly = true;
  36.         me = this;
  37.         this.defaultSortFn = function(n1, n2){
  38.             var dsc = me.dir && me.dir.toLowerCase() == 'desc';
  39.             var p = me.property || 'text';
  40.             var sortType = me.sortType;
  41.             var fs = me.folderSort;
  42.             var cs = me.caseSensitive === true;
  43.             var leafAttr = me.leafAttr || 'leaf';
  44.             if(fs){
  45.                 if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){
  46.                     return 1;
  47.                 }
  48.                 if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){
  49.                     return -1;
  50.                 }
  51.             }
  52.          var v1 = sortType ? sortType(n1.attributes[p]) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());
  53.          var v2 = sortType ? sortType(n2.attributes[p]) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());
  54.          if(v1 < v2){
  55.      return dsc ? +1 : -1;
  56.      }else if(v1 > v2){
  57.      return dsc ? -1 : +1;
  58.             }else{
  59.           return 0;
  60.             }
  61.         };
  62.         tree.on('afterrender', this.onAfterTreeRender, this, {single: true});
  63.         tree.on('headermenuclick', this.onHeaderMenuClick, this);
  64.     },
  65.     onAfterTreeRender : function() {
  66.         var hmenu = this.tree.hmenu;
  67.         hmenu.insert(0,
  68.             {itemId:'asc', text: this.sortAscText, cls: 'xg-hmenu-sort-asc'},
  69.             {itemId:'desc', text: this.sortDescText, cls: 'xg-hmenu-sort-desc'}
  70.         );
  71.         this.updateSortIcon(0, 'asc');
  72.     },
  73.     onHeaderMenuClick : function(c, id, index) {
  74.         if(id === 'asc' || id === 'desc') {
  75.             this.onHeaderClick(c, null, index);
  76.             return false;
  77.         }
  78.     },
  79.     onHeaderClick : function(c, el, i) {
  80.         if(c && !this.tree.headersDisabled){
  81.             var me = this;
  82.             me.property = c.dataIndex;
  83.             me.dir = c.dir = (c.dir === 'desc' ? 'asc' : 'desc');
  84.             me.sortType = c.sortType;
  85.             me.caseSensitive === Ext.isBoolean(c.caseSensitive) ? c.caseSensitive : this.caseSensitive;
  86.             me.sortFn = c.sortFn || this.defaultSortFn;
  87.             this.tree.root.cascade(function(n) {
  88.                 if(!n.isLeaf()) {
  89.                     me.updateSort(me.tree, n);
  90.                 }
  91.             });
  92.             this.updateSortIcon(i, c.dir);
  93.         }
  94.     },
  95.     // private
  96.     updateSortIcon : function(col, dir){
  97.         var sc = this.sortClasses;
  98.         var hds = this.tree.innerHd.select('td').removeClass(sc);
  99.         hds.item(col).addClass(sc[dir == 'desc' ? 1 : 0]);
  100.     }
  101. });