/**
* A small abstract class that contains the shared behaviour for any summary
* calculations to be used in the grid.
* @class Ext.grid.feature.AbstractSummary
* @extends Ext.grid.feature.Feature
* @ignore
*/
Ext.define('Ext.grid.feature.AbstractSummary', {
/* Begin Definitions */
extend: 'Ext.grid.feature.Feature',
alias: 'feature.abstractsummary',
/* End Definitions */
/**
* @cfg {Boolean} showSummaryRow True to show the summary row. Defaults to <tt>true</tt>.
*/
showSummaryRow: true,
// @private
nestedIdRe: /\{\{id\}([\w\-]*)\}/g,
/**
* Toggle whether or not to show the summary row.
* @param {Boolan} visible True to show the summary row
*/
toggleSummaryRow: function(visible){
this.showSummaryRow = !!visible;
},
/**
* Gets any fragments to be used in the tpl
* @private
* @return {Object} The fragments
*/
getSummaryFragments: function(){
var fragments = {};
if (this.showSummaryRow) {
Ext.apply(fragments, {
printSummaryRow: Ext.bind(this.printSummaryRow, this)
});
}
return fragments;
},
/**
* Prints a summary row
* @private
* @param {Object} index The index in the template
* @return {String} The value of the summary row
*/
printSummaryRow: function(index){
var inner = this.view.getTableChunker().metaRowTpl.join('');
inner = inner.replace('x-grid-row', 'x-grid-row-summary');
inner = inner.replace('{{id}}', '{gridSummaryValue}');
inner = inner.replace(this.nestedIdRe, '{id$1}');
inner = inner.replace('{[this.embedRowCls()]}', '{rowCls}');
inner = inner.replace('{[this.embedRowAttr()]}', '{rowAttr}');
inner = Ext.create('Ext.XTemplate', inner, {
firstOrLastCls: Ext.view.TableChunker.firstOrLastCls
});
return inner.applyTemplate({
columns: this.getPrintData(index)
});
},
/**
* Gets the value for the column from the attached data.
* @param {Ext.grid.column.Column} column The header
* @param {Object} data The current data
* @return {String} The value to be rendered
*/
getColumnValue: function(column, data){
var comp = Ext.getCmp(column.id),
value = data[column.dataIndex],
renderer = comp.summaryRenderer || comp.renderer;
if (renderer) {
value = renderer.call(comp.scope || this, value, data, column.dataIndex);
}
return value;
},
/**
* Get the summary data for a field.
* @private
* @param {Ext.data.Store} store The store to get the data from
* @param {String/Function} type The type of aggregation. If a function is specified it will
* be passed to the stores aggregate function.
* @param {String} field The field to aggregate on
* @param {Boolean} group True to aggregate in grouped mode
* @return {Mixed} See the return type for the store functions.
*/
getSummary: function(store, type, field, group){
if (type) {
if (Ext.isFunction(type)) {
return store.aggregate(type, null, group);
}
switch (type) {
case 'count':
return store.count(group);
case 'min':
return store.min(field, group);
case 'max':
return store.max(field, group);
case 'sum':
return store.sum(field, group);
case 'average':
return store.average(field, group);
default:
return group ? {} : '';
}
}
}
});