初学Ext 谁有 GroupingSummary.js 和 RowExpand.js 文件?

各位老师:怎么才可以获得这两个js文件 急用

这些文件都在官方可以下载到的

路径是 ext-3.0.0/examples/ux/下面

GroupSummary.js
[code="js"]/*!

/**

  • @class Ext.ux.grid.GroupSummary
  • @extends Ext.util.Observable
  • A GridPanel plugin that enables dynamic column calculations and a dynamically
  • updated grouped summary row.
    /
    Ext.ux.grid.GroupSummary = Ext.extend(Ext.util.Observable, {
    /
    *

    • @cfg {Function} summaryRenderer Renderer example:
      
      summaryRenderer: function(v, params, data){
      return ((v === 0 || v > 1) ? '(' + v +' Tasks)' : '(1 Task)');
      },
    • / /*
    • @cfg {String} summaryType (Optional) The type of
    • calculation to be used for the column. For options available see
    • {@link #Calculations}. */

    constructor : function(config){
    Ext.apply(this, config);
    Ext.ux.grid.GroupSummary.superclass.constructor.call(this);
    },
    init : function(grid){
    this.grid = grid;
    this.cm = grid.getColumnModel();
    this.view = grid.getView();

    var v = this.view;
    v.doGroupEnd = this.doGroupEnd.createDelegate(this);
    
    v.afterMethod('onColumnWidthUpdated', this.doWidth, this);
    v.afterMethod('onAllColumnWidthsUpdated', this.doAllWidths, this);
    v.afterMethod('onColumnHiddenUpdated', this.doHidden, this);
    v.afterMethod('onUpdate', this.doUpdate, this);
    v.afterMethod('onRemove', this.doRemove, this);
    
    if(!this.rowTpl){
        this.rowTpl = new Ext.Template(
            '<div class="x-grid3-summary-row" style="{tstyle}">',
            '<table class="x-grid3-summary-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
                '<tbody><tr>{cells}</tr></tbody>',
            '</table></div>'
        );
        this.rowTpl.disableFormats = true;
    }
    this.rowTpl.compile();
    
    if(!this.cellTpl){
        this.cellTpl = new Ext.Template(
            '<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}">',
            '<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on">{value}</div>',
            "</td>"
        );
        this.cellTpl.disableFormats = true;
    }
    this.cellTpl.compile();
    

    },

    /**

    • Toggle the display of the summary row on/off
    • @param {Boolean} visible true to show the summary, false to hide the summary. */ toggleSummaries : function(visible){ var el = this.grid.getGridEl(); if(el){ if(visible === undefined){ visible = el.hasClass('x-grid-hide-summary'); } elvisible ? 'removeClass' : 'addClass'; } },

    renderSummary : function(o, cs){
    cs = cs || this.view.getColumnData();
    var cfg = this.cm.config;

    var buf = [], c, p = {}, cf, last = cs.length-1;
    for(var i = 0, len = cs.length; i < len; i++){
        c = cs[i];
        cf = cfg[i];
        p.id = c.id;
        p.style = c.style;
        p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
        if(cf.summaryType || cf.summaryRenderer){
            p.value = (cf.summaryRenderer || c.renderer)(o.data[c.name], p, o);
        }else{
            p.value = '';
        }
        if(p.value == undefined || p.value === "") p.value = "&#160;";
        buf[buf.length] = this.cellTpl.apply(p);
    }
    
    return this.rowTpl.apply({
        tstyle: 'width:'+this.view.getTotalWidth()+';',
        cells: buf.join('')
    });
    

    },

    /**

    • @private
    • @param {Object} rs
    • @param {Object} cs */ calculate : function(rs, cs){ var data = {}, r, c, cfg = this.cm.config, cf; for(var j = 0, jlen = rs.length; j < jlen; j++){ r = rs[j]; for(var i = 0, len = cs.length; i < len; i++){ c = cs[i]; cf = cfg[i]; if(cf.summaryType){ data[c.name] = Ext.ux.grid.GroupSummary.Calculationscf.summaryType; } } } return data; },

    doGroupEnd : function(buf, g, cs, ds, colCount){
    var data = this.calculate(g.rs, cs);
    buf.push('', this.renderSummary({data: data}, cs), '');
    },

    doWidth : function(col, w, tw){
    var gs = this.view.getGroups(), s;
    for(var i = 0, len = gs.length; i < len; i++){
    s = gs[i].childNodes[2];
    s.style.width = tw;
    s.firstChild.style.width = tw;
    s.firstChild.rows[0].childNodes[col].style.width = w;
    }
    },

    doAllWidths : function(ws, tw){
    var gs = this.view.getGroups(), s, cells, wlen = ws.length;
    for(var i = 0, len = gs.length; i < len; i++){
    s = gs[i].childNodes[2];
    s.style.width = tw;
    s.firstChild.style.width = tw;
    cells = s.firstChild.rows[0].childNodes;
    for(var j = 0; j < wlen; j++){
    cells[j].style.width = ws[j];
    }
    }
    },

    doHidden : function(col, hidden, tw){
    var gs = this.view.getGroups(), s, display = hidden ? 'none' : '';
    for(var i = 0, len = gs.length; i < len; i++){
    s = gs[i].childNodes[2];
    s.style.width = tw;
    s.firstChild.style.width = tw;
    s.firstChild.rows[0].childNodes[col].style.display = display;
    }
    },

    // Note: requires that all (or the first) record in the
    // group share the same group value. Returns false if the group
    // could not be found.
    refreshSummary : function(groupValue){
    return this.refreshSummaryById(this.view.getGroupId(groupValue));
    },

    getSummaryNode : function(gid){
    var g = Ext.fly(gid, '_gsummary');
    if(g){
    return g.down('.x-grid3-summary-row', true);
    }
    return null;
    },

    refreshSummaryById : function(gid){
    var g = document.getElementById(gid);
    if(!g){
    return false;
    }
    var rs = [];
    this.grid.store.each(function(r){
    if(r._groupId == gid){
    rs[rs.length] = r;
    }
    });
    var cs = this.view.getColumnData();
    var data = this.calculate(rs, cs);
    var markup = this.renderSummary({data: data}, cs);

    var existing = this.getSummaryNode(gid);
    if(existing){
        g.removeChild(existing);
    }
    Ext.DomHelper.append(g, markup);
    return true;
    

    },

    doUpdate : function(ds, record){
    this.refreshSummaryById(record._groupId);
    },

    doRemove : function(ds, record, index, isUpdate){
    if(!isUpdate){
    this.refreshSummaryById(record._groupId);
    }
    },

    /**

    • Show a message in the summary row.
    • 
      grid.on('afteredit', function(){
      var groupValue = 'Ext Forms: Field Anchoring';
      summary.showSummaryMsg(groupValue, 'Updating Summary...');
      });
    • @param {String} groupValue
    • @param {String} msg Text to use as innerHTML for the summary row. */ showSummaryMsg : function(groupValue, msg){ var gid = this.view.getGroupId(groupValue); var node = this.getSummaryNode(gid); if(node){ node.innerHTML = '
      ' + msg + '
      '; } } });

//backwards compat
Ext.grid.GroupSummary = Ext.ux.grid.GroupSummary;

/**

  • Calculation types for summary row:
    • sum :
    • count :
    • max :
    • min :
    • average :
  • Custom calculations may be implemented. An example of

  • custom summaryType=totalCost:
    
    // define a custom summary function
    Ext.ux.grid.GroupSummary.Calculations['totalCost'] = function(v, record, field){
    return v + (record.data.estimate * record.data.rate);
    };
  • @property Calculations */

Ext.ux.grid.GroupSummary.Calculations = {
'sum' : function(v, record, field){
return v + (record.data[field]||0);
},

'count' : function(v, record, field, data){
    return data[field+'count'] ? ++data[field+'count'] : (data[field+'count'] = 1);
},

'max' : function(v, record, field, data){
    var v = record.data[field];
    var max = data[field+'max'] === undefined ? (data[field+'max'] = v) : data[field+'max'];
    return v > max ? (data[field+'max'] = v) : max;
},

'min' : function(v, record, field, data){
    var v = record.data[field];
    var min = data[field+'min'] === undefined ? (data[field+'min'] = v) : data[field+'min'];
    return v < min ? (data[field+'min'] = v) : min;
},

'average' : function(v, record, field, data){
    var c = data[field+'count'] ? ++data[field+'count'] : (data[field+'count'] = 1);
    var t = (data[field+'total'] = ((data[field+'total']||0) + (record.data[field]||0)));
    return t === 0 ? 0 : t / c;
}

};
Ext.grid.GroupSummary.Calculations = Ext.ux.grid.GroupSummary.Calculations;

/**

  • @class Ext.ux.grid.HybridSummary
  • @extends Ext.ux.grid.GroupSummary
  • Adds capability to specify the summary data for the group via json as illustrated here:

  • {
    data: [
    {
    projectId: 100, project: 'House',
    taskId: 112, description: 'Paint',
    estimate: 6, rate: 150,
    due:'06/24/2007'
    },
    ...
    ],

    summaryData: {
    'House': {
    description: 14, estimate: 9,
    rate: 99, due: new Date(2009, 6, 29),
    cost: 999
    }
    }
    }


  • *
    /
    Ext.ux.grid.HybridSummary = Ext.extend(Ext.ux.grid.GroupSummary, {
    /
    *

    • @private
    • @param {Object} rs
    • @param {Object} cs */ calculate : function(rs, cs){ var gcol = this.view.getGroupField(); var gvalue = rs[0].data[gcol]; var gdata = this.getSummaryData(gvalue); return gdata || Ext.ux.grid.HybridSummary.superclass.calculate.call(this, rs, cs); },

    /**

    • 
      grid.on('afteredit', function(){
      var groupValue = 'Ext Forms: Field Anchoring';
      summary.showSummaryMsg(groupValue, 'Updating Summary...');
      setTimeout(function(){ // simulate server call
      // HybridSummary class implements updateSummaryData
      summary.updateSummaryData(groupValue,
          // create data object based on configured dataIndex
          {description: 22, estimate: 888, rate: 888, due: new Date(), cost: 8});
      }, 2000);
      });
    • @param {String} groupValue
    • @param {Object} data data object
    • @param {Boolean} skipRefresh (Optional) Defaults to false */ updateSummaryData : function(groupValue, data, skipRefresh){ var json = this.grid.store.reader.jsonData; if(!json.summaryData){ json.summaryData = {}; } json.summaryData[groupValue] = data; if(!skipRefresh){ this.refreshSummary(groupValue); } },

    /**

    • Returns the summaryData for the specified groupValue or null.
    • @param {String} groupValue
    • @return {Object} summaryData */ getSummaryData : function(groupValue){ var json = this.grid.store.reader.jsonData; if(json && json.summaryData){ return json.summaryData[groupValue]; } return null; } });

//backwards compat
Ext.grid.HybridSummary = Ext.ux.grid.HybridSummary;
[/code]

RowExpander.js
[code="js"]/*!

/**

  • @class Ext.ux.grid.RowExpander
  • @extends Ext.util.Observable
  • Plugin (ptype = 'rowexpander') that adds the ability to have a Column in a grid which enables
  • a second row body which expands/contracts. The expand/contract behavior is configurable to react
  • on clicking of the column, double click of the row, and/or hitting enter while a row is selected. *
  • @ptype rowexpander
    /
    Ext.ux.grid.RowExpander = Ext.extend(Ext.util.Observable, {
    /
    *

    • @cfg {Boolean} expandOnEnter
    • true to toggle selected row(s) between expanded/collapsed when the enter
    • key is pressed (defaults to true). / expandOnEnter : true, /*
    • @cfg {Boolean} expandOnDblClick
    • true to toggle a row between expanded/collapsed when double clicked
    • (defaults to true). */ expandOnDblClick : true,

    header : '',
    width : 20,
    sortable : false,
    fixed : true,
    menuDisabled : true,
    dataIndex : '',
    id : 'expander',
    lazyRender : true,
    enableCaching : true,

    constructor: function(config){
    Ext.apply(this, config);

    this.addEvents({
        /**
         * @event beforeexpand
         * Fires before the row expands. Have the listener return false to prevent the row from expanding.
         * @param {Object} this RowExpander object.
         * @param {Object} Ext.data.Record Record for the selected row.
         * @param {Object} body body element for the secondary row.
         * @param {Number} rowIndex The current row index.
         */
        beforeexpand: true,
        /**
         * @event expand
         * Fires after the row expands.
         * @param {Object} this RowExpander object.
         * @param {Object} Ext.data.Record Record for the selected row.
         * @param {Object} body body element for the secondary row.
         * @param {Number} rowIndex The current row index.
         */
        expand: true,
        /**
         * @event beforecollapse
         * Fires before the row collapses. Have the listener return false to prevent the row from collapsing.
         * @param {Object} this RowExpander object.
         * @param {Object} Ext.data.Record Record for the selected row.
         * @param {Object} body body element for the secondary row.
         * @param {Number} rowIndex The current row index.
         */
        beforecollapse: true,
        /**
         * @event collapse
         * Fires after the row collapses.
         * @param {Object} this RowExpander object.
         * @param {Object} Ext.data.Record Record for the selected row.
         * @param {Object} body body element for the secondary row.
         * @param {Number} rowIndex The current row index.
         */
        collapse: true
    });
    
    Ext.ux.grid.RowExpander.superclass.constructor.call(this);
    
    if(this.tpl){
        if(typeof this.tpl == 'string'){
            this.tpl = new Ext.Template(this.tpl);
        }
        this.tpl.compile();
    }
    
    this.state = {};
    this.bodyContent = {};
    

    },

    getRowClass : function(record, rowIndex, p, ds){
    p.cols = p.cols-1;
    var content = this.bodyContent[record.id];
    if(!content && !this.lazyRender){
    content = this.getBodyContent(record, rowIndex);
    }
    if(content){
    p.body = content;
    }
    return this.state[record.id] ? 'x-grid3-row-expanded' : 'x-grid3-row-collapsed';
    },

    init : function(grid){
    this.grid = grid;

    var view = grid.getView();
    view.getRowClass = this.getRowClass.createDelegate(this);
    
    view.enableRowBody = true;
    
    grid.on('render', this.onRender, this);
    grid.on('destroy', this.onDestroy, this);
    

    },

    // @private
    onRender: function() {
    var grid = this.grid;
    var mainBody = grid.getView().mainBody;
    mainBody.on('mousedown', this.onMouseDown, this, {delegate: '.x-grid3-row-expander'});
    if (this.expandOnEnter) {
    this.keyNav = new Ext.KeyNav(this.grid.getGridEl(), {
    'enter' : this.onEnter,
    scope: this
    });
    }
    if (this.expandOnDblClick) {
    grid.on('rowdblclick', this.onRowDblClick, this);
    }
    },

    // @private

    onDestroy: function() {
    this.keyNav.disable();
    delete this.keyNav;
    var mainBody = this.grid.getView().mainBody;
    mainBody.un('mousedown', this.onMouseDown, this);
    },
    // @private
    onRowDblClick: function(grid, rowIdx, e) {
    this.toggleRow(rowIdx);
    },

    onEnter: function(e) {
    var g = this.grid;
    var sm = g.getSelectionModel();
    var sels = sm.getSelections();
    for (var i = 0, len = sels.length; i < len; i++) {
    var rowIdx = g.getStore().indexOf(sels[i]);
    this.toggleRow(rowIdx);
    }
    },

    getBodyContent : function(record, index){
    if(!this.enableCaching){
    return this.tpl.apply(record.data);
    }
    var content = this.bodyContent[record.id];
    if(!content){
    content = this.tpl.apply(record.data);
    this.bodyContent[record.id] = content;
    }
    return content;
    },

    onMouseDown : function(e, t){
    e.stopEvent();
    var row = e.getTarget('.x-grid3-row');
    this.toggleRow(row);
    },

    renderer : function(v, p, record){
    p.cellAttr = 'rowspan="2"';
    return '

     
    ';
    },

    beforeExpand : function(record, body, rowIndex){
    if(this.fireEvent('beforeexpand', this, record, body, rowIndex) !== false){
    if(this.tpl && this.lazyRender){
    body.innerHTML = this.getBodyContent(record, rowIndex);
    }
    return true;
    }else{
    return false;
    }
    },

    toggleRow : function(row){
    if(typeof row == 'number'){
    row = this.grid.view.getRow(row);
    }
    thisExt.fly(row).hasClass('x-grid3-row-collapsed') ? 'expandRow' : 'collapseRow';
    },

    expandRow : function(row){
    if(typeof row == 'number'){
    row = this.grid.view.getRow(row);
    }
    var record = this.grid.store.getAt(row.rowIndex);
    var body = Ext.DomQuery.selectNode('tr:nth(2) div.x-grid3-row-body', row);
    if(this.beforeExpand(record, body, row.rowIndex)){
    this.state[record.id] = true;
    Ext.fly(row).replaceClass('x-grid3-row-collapsed', 'x-grid3-row-expanded');
    this.fireEvent('expand', this, record, body, row.rowIndex);
    }
    },

    collapseRow : function(row){
    if(typeof row == 'number'){
    row = this.grid.view.getRow(row);
    }
    var record = this.grid.store.getAt(row.rowIndex);
    var body = Ext.fly(row).child('tr:nth(1) div.x-grid3-row-body', true);
    if(this.fireEvent('beforecollapse', this, record, body, row.rowIndex) !== false){
    this.state[record.id] = false;
    Ext.fly(row).replaceClass('x-grid3-row-expanded', 'x-grid3-row-collapsed');
    this.fireEvent('collapse', this, record, body, row.rowIndex);
    }
    }
    });

Ext.preg('rowexpander', Ext.ux.grid.RowExpander);

//backwards compat
Ext.grid.RowExpander = Ext.ux.grid.RowExpander;[/code]