Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / src / grid / feature / GroupingSummary.js
index 0efe6d5..5ca4bb3 100644 (file)
@@ -1,12 +1,26 @@
+/*
+
+This file is part of Ext JS 4
+
+Copyright (c) 2011 Sencha Inc
+
+Contact:  http://www.sencha.com/contact
+
+GNU General Public License Usage
+This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.  Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
+
+If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
+
+*/
 /**
  * @class Ext.grid.feature.GroupingSummary
  * @extends Ext.grid.feature.Grouping
- * 
+ *
  * This feature adds an aggregate summary row at the bottom of each group that is provided
- * by the {@link Ext.grid.feature.Grouping} feature. There are 2 aspects to the summary:
- * 
+ * by the {@link Ext.grid.feature.Grouping} feature. There are two aspects to the summary:
+ *
  * ## Calculation
- * 
+ *
  * The summary value needs to be calculated for each column in the grid. This is controlled
  * by the summaryType option specified on the column. There are several built in summary types,
  * which can be specified as a string on the column configuration. These call underlying methods
  *
  * Alternatively, the summaryType can be a function definition. If this is the case,
  * the function is called with an array of records to calculate the summary value.
- * 
+ *
  * ## Rendering
- * 
+ *
  * Similar to a column, the summary also supports a summaryRenderer function. This
  * summaryRenderer is called before displaying a value. The function is optional, if
  * not specified the default calculated value is shown. The summaryRenderer is called with:
  *
  *  - value {Object} - The calculated value.
- *  - data {Object} - Contains all raw summary values for the row.
+ *  - summaryData {Object} - Contains all raw summary values for the row.
  *  - field {String} - The name of the field we are calculating
- * 
+ *
  * ## Example Usage
  *
+ *     @example
  *     Ext.define('TestResult', {
  *         extend: 'Ext.data.Model',
  *         fields: ['student', 'subject', {
@@ -40,7 +55,7 @@
  *             type: 'int'
  *         }]
  *     });
- *     
+ *
  *     Ext.create('Ext.grid.Panel', {
  *         width: 200,
  *         height: 240,
@@ -75,7 +90,7 @@
  *             text: 'Name',
  *             summaryType: 'count',
  *             summaryRenderer: function(value){
- *                 return Ext.String.format('{0} student{1}', value, value !== 1 ? 's' : ''); 
+ *                 return Ext.String.format('{0} student{1}', value, value !== 1 ? 's' : '');
  *             }
  *         }, {
  *             dataIndex: 'mark',
  *     });
  */
 Ext.define('Ext.grid.feature.GroupingSummary', {
-    
+
     /* Begin Definitions */
-    
+
     extend: 'Ext.grid.feature.Grouping',
-    
+
     alias: 'feature.groupingsummary',
-    
+
     mixins: {
         summary: 'Ext.grid.feature.AbstractSummary'
     },
-    
+
     /* End Definitions */
 
-     
+
    /**
     * Modifies the row template to include the summary row.
     * @private
@@ -106,7 +121,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
     */
    getFeatureTpl: function() {
         var tpl = this.callParent(arguments);
-            
+
         if (this.showSummaryRow) {
             // lop off the end </tpl> so we can attach it
             tpl = tpl.replace('</tpl>', '');
@@ -114,7 +129,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
         }
         return tpl;
     },
-    
+
     /**
      * Gets any fragments needed for the template.
      * @private
@@ -123,7 +138,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
     getFragmentTpl: function() {
         var me = this,
             fragments = me.callParent();
-            
+
         Ext.apply(fragments, me.getSummaryFragments());
         if (me.showSummaryRow) {
             // this gets called before render, so we'll setup the data here.
@@ -132,7 +147,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
         }
         return fragments;
     },
-    
+
     /**
      * Gets the data for printing a template row
      * @private
@@ -148,7 +163,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
             name = me.summaryGroups[index - 1].name,
             active = me.summaryData[name],
             column;
-            
+
         for (; i < length; ++i) {
             column = columns[i];
             column.gridSummaryValue = this.getColumnValue(column, active);
@@ -156,7 +171,7 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
         }
         return data;
     },
-    
+
     /**
      * Generates all of the summary data to be used when processing the template
      * @private
@@ -171,44 +186,50 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
             reader = store.proxy.reader,
             groups = me.summaryGroups,
             columns = me.view.headerCt.getColumnsForTpl(),
+            remote,
             i,
             length,
             fieldData,
             root,
             key,
             comp;
-            
+
         for (i = 0, length = groups.length; i < length; ++i) {
             data[groups[i].name] = {};
         }
-        
-    /**
-     * @cfg {String} remoteRoot.  The name of the property
-     * which contains the Array of summary objects.  Defaults to <tt>undefined</tt>.
-     * It allows to use server-side calculated summaries.
-     */
+
+        /**
+         * @cfg {String} [remoteRoot=undefined]  The name of the property which contains the Array of
+         * summary objects. It allows to use server-side calculated summaries.
+         */
         if (me.remoteRoot && reader.rawData) {
             // reset reader root and rebuild extractors to extract summaries data
             root = reader.root;
             reader.root = me.remoteRoot;
             reader.buildExtractors(true);
             Ext.Array.each(reader.getRoot(reader.rawData), function(value) {
-                 data[value[groupField]] = value;
-                 data[value[groupField]]._remote = true;
+                 remoteData[value[groupField]] = value;
             });
             // restore initial reader configuration
             reader.root = root;
             reader.buildExtractors(true);
         }
-        
+
         for (i = 0, length = columns.length; i < length; ++i) {
             comp = Ext.getCmp(columns[i].id);
             fieldData = me.getSummary(store, comp.summaryType, comp.dataIndex, true);
-            
+
             for (key in fieldData) {
                 if (fieldData.hasOwnProperty(key)) {
-                    if (!data[key]._remote) {
-                        data[key][comp.dataIndex] = fieldData[key];
+                    data[key][comp.id] = fieldData[key];
+                }
+            }
+
+            for (key in remoteData) {
+                if (remoteData.hasOwnProperty(key)) {
+                    remote = remoteData[key][comp.dataIndex];
+                    if (remote !== undefined && data[key] !== undefined) {
+                        data[key][comp.id] = remote;
                     }
                 }
             }
@@ -216,3 +237,4 @@ Ext.define('Ext.grid.feature.GroupingSummary', {
         return data;
     }
 });
+