Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / source / Grouping.html
index 2368eb6..1d1740b 100644 (file)
@@ -1,4 +1,21 @@
-<!DOCTYPE html><html><head><title>Sencha Documentation Project</title><link rel="stylesheet" href="../reset.css" type="text/css"><link rel="stylesheet" href="../prettify.css" type="text/css"><link rel="stylesheet" href="../prettify_sa.css" type="text/css"><script type="text/javascript" src="../prettify.js"></script></head><body onload="prettyPrint()"><pre class="prettyprint"><pre><span id='Ext-grid.feature.Grouping'>/**
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>The source code</title>
+  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
+  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
+  <style type="text/css">
+    .highlight { display: block; background-color: #ddd; }
+  </style>
+  <script type="text/javascript">
+    function highlight() {
+      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
+    }
+  </script>
+</head>
+<body onload="prettyPrint(); highlight();">
+  <pre class="prettyprint lang-js"><span id='Ext-grid-feature-Grouping'>/**
 </span> * @class Ext.grid.feature.Grouping
  * @extends Ext.grid.feature.Feature
  * 
@@ -42,63 +59,60 @@ Ext.define('Ext.grid.feature.Grouping', {
     eventSelector: '.' + Ext.baseCSSPrefix + 'grid-group-hd',
 
     constructor: function() {
-        this.collapsedState = {};
-        this.callParent(arguments);
+        var me = this;
+        
+        me.collapsedState = {};
+        me.callParent(arguments);
     },
     
-<span id='Ext-grid.feature.Grouping-event-groupclick'>    /**
+<span id='Ext-grid-feature-Grouping-event-groupclick'>    /**
 </span>     * @event groupclick
      * @param {Ext.view.Table} view
      * @param {HTMLElement} node
-     * @param {Number} unused
-     * @param {Number} unused
+     * @param {String} group The name of the group
      * @param {Ext.EventObject} e
      */
 
-<span id='Ext-grid.feature.Grouping-event-groupdblclick'>    /**
+<span id='Ext-grid-feature-Grouping-event-groupdblclick'>    /**
 </span>     * @event groupdblclick
      * @param {Ext.view.Table} view
      * @param {HTMLElement} node
-     * @param {Number} unused
-     * @param {Number} unused
+     * @param {String} group The name of the group
      * @param {Ext.EventObject} e
      */
 
-<span id='Ext-grid.feature.Grouping-event-groupcontextmenu'>    /**
+<span id='Ext-grid-feature-Grouping-event-groupcontextmenu'>    /**
 </span>     * @event groupcontextmenu
      * @param {Ext.view.Table} view
      * @param {HTMLElement} node
-     * @param {Number} unused
-     * @param {Number} unused
+     * @param {String} group The name of the group
      * @param {Ext.EventObject} e
      */
 
-<span id='Ext-grid.feature.Grouping-event-groupcollapse'>    /**
+<span id='Ext-grid-feature-Grouping-event-groupcollapse'>    /**
 </span>     * @event groupcollapse
      * @param {Ext.view.Table} view
      * @param {HTMLElement} node
-     * @param {Number} unused
-     * @param {Number} unused
+     * @param {String} group The name of the group
      * @param {Ext.EventObject} e
      */
 
-<span id='Ext-grid.feature.Grouping-event-groupexpand'>    /**
+<span id='Ext-grid-feature-Grouping-event-groupexpand'>    /**
 </span>     * @event groupexpand
      * @param {Ext.view.Table} view
      * @param {HTMLElement} node
-     * @param {Number} unused
-     * @param {Number} unused
+     * @param {String} group The name of the group
      * @param {Ext.EventObject} e
      */
 
-<span id='Ext-grid.feature.Grouping-cfg-groupHeaderTpl'>    /**
+<span id='Ext-grid-feature-Grouping-cfg-groupHeaderTpl'>    /**
 </span>     * @cfg {String} groupHeaderTpl
      * Template snippet, this cannot be an actual template. {name} will be replaced with the current group.
      * Defaults to 'Group: {name}'
      */
     groupHeaderTpl: 'Group: {name}',
 
-<span id='Ext-grid.feature.Grouping-cfg-depthToIndent'>    /**
+<span id='Ext-grid-feature-Grouping-cfg-depthToIndent'>    /**
 </span>     * @cfg {Number} depthToIndent
      * Number of pixels to indent per grouping level
      */
@@ -107,34 +121,32 @@ Ext.define('Ext.grid.feature.Grouping', {
     collapsedCls: Ext.baseCSSPrefix + 'grid-group-collapsed',
     hdCollapsedCls: Ext.baseCSSPrefix + 'grid-group-hd-collapsed',
 
-<span id='Ext-grid.feature.Grouping-cfg-groupByText'>    /**
-</span>     * @cfg {String} groupByText Text displayed in the grid header menu for grouping by header
-     * (defaults to 'Group By This Field').
+<span id='Ext-grid-feature-Grouping-cfg-groupByText'>    /**
+</span>     * @cfg {String} groupByText Text displayed in the grid header menu for grouping by header.
      */
     groupByText : 'Group By This Field',
-<span id='Ext-grid.feature.Grouping-cfg-showGroupsText'>    /**
-</span>     * @cfg {String} showGroupsText Text displayed in the grid header for enabling/disabling grouping
-     * (defaults to 'Show in Groups').
+<span id='Ext-grid-feature-Grouping-cfg-showGroupsText'>    /**
+</span>     * @cfg {String} showGroupsText Text displayed in the grid header for enabling/disabling grouping.
      */
     showGroupsText : 'Show in Groups',
 
-<span id='Ext-grid.feature.Grouping-cfg-hideGroupedHeader'>    /**
-</span>     * @cfg {Boolean} hideGroupedHeader&lt;tt&gt;true&lt;/tt&gt; to hide the header that is currently grouped (defaults to &lt;tt&gt;false&lt;/tt&gt;)
+<span id='Ext-grid-feature-Grouping-cfg-hideGroupedHeader'>    /**
+</span>     * @cfg {Boolean} hideGroupedHeader&lt;tt&gt;true&lt;/tt&gt; to hide the header that is currently grouped.
      */
     hideGroupedHeader : false,
 
-<span id='Ext-grid.feature.Grouping-cfg-startCollapsed'>    /**
-</span>     * @cfg {Boolean} startCollapsed &lt;tt&gt;true&lt;/tt&gt; to start all groups collapsed (defaults to &lt;tt&gt;false&lt;/tt&gt;)
+<span id='Ext-grid-feature-Grouping-cfg-startCollapsed'>    /**
+</span>     * @cfg {Boolean} startCollapsed &lt;tt&gt;true&lt;/tt&gt; to start all groups collapsed
      */
     startCollapsed : false,
 
-<span id='Ext-grid.feature.Grouping-cfg-enableGroupingMenu'>    /**
-</span>     * @cfg {Boolean} enableGroupingMenu &lt;tt&gt;true&lt;/tt&gt; to enable the grouping control in the header menu (defaults to &lt;tt&gt;true&lt;/tt&gt;)
+<span id='Ext-grid-feature-Grouping-cfg-enableGroupingMenu'>    /**
+</span>     * @cfg {Boolean} enableGroupingMenu &lt;tt&gt;true&lt;/tt&gt; to enable the grouping control in the header menu
      */
     enableGroupingMenu : true,
 
-<span id='Ext-grid.feature.Grouping-cfg-enableNoGroups'>    /**
-</span>     * @cfg {Boolean} enableNoGroups &lt;tt&gt;true&lt;/tt&gt; to allow the user to turn off grouping (defaults to &lt;tt&gt;true&lt;/tt&gt;)
+<span id='Ext-grid-feature-Grouping-cfg-enableNoGroups'>    /**
+</span>     * @cfg {Boolean} enableNoGroups &lt;tt&gt;true&lt;/tt&gt; to allow the user to turn off grouping
      */
     enableNoGroups : true,
     
@@ -144,33 +156,46 @@ Ext.define('Ext.grid.feature.Grouping', {
             store = view.store,
             groupToggleMenuItem;
             
+        me.lastGroupField = me.getGroupField();
+
         if (me.lastGroupIndex) {
             store.group(me.lastGroupIndex);
         }
         me.callParent();
         groupToggleMenuItem = me.view.headerCt.getMenu().down('#groupToggleMenuItem');
         groupToggleMenuItem.setChecked(true, true);
-        view.refresh();
+        me.refreshIf();
     },
 
     disable: function() {
         var me    = this,
             view  = me.view,
             store = view.store,
+            remote = store.remoteGroup,
             groupToggleMenuItem,
             lastGroup;
             
         lastGroup = store.groupers.first();
         if (lastGroup) {
             me.lastGroupIndex = lastGroup.property;
-            store.groupers.clear();
+            me.block();
+            store.clearGrouping();
+            me.unblock();
         }
         
         me.callParent();
         groupToggleMenuItem = me.view.headerCt.getMenu().down('#groupToggleMenuItem');
         groupToggleMenuItem.setChecked(true, true);
         groupToggleMenuItem.setChecked(false, true);
-        view.refresh();
+        if (!remote) {
+            view.refresh();
+        }
+    },
+    
+    refreshIf: function() {
+        if (this.blockRefresh !== true) {
+            this.view.refresh();
+        }    
     },
 
     getFeatureTpl: function(values, parent, x, xcount) {
@@ -210,8 +235,7 @@ Ext.define('Ext.grid.feature.Grouping', {
     // perhaps rename to afterViewRender
     attachEvents: function() {
         var me = this,
-            view = me.view,
-            header, headerId, menu, menuItem;
+            view = me.view;
 
         view.on({
             scope: me,
@@ -225,16 +249,10 @@ Ext.define('Ext.grid.feature.Grouping', {
         if (me.enableGroupingMenu) {
             me.injectGroupingMenu();
         }
-
-        if (me.hideGroupedHeader) {
-            header = view.headerCt.down('gridcolumn[dataIndex=' + me.getGroupField() + ']');
-            headerId = header.id;
-            menu = view.headerCt.getMenu();
-            menuItem = menu.down('menuitem[headerId='+ headerId +']');
-            if (menuItem) {
-                menuItem.setChecked(false);
-            }
-        }
+        me.lastGroupField = me.getGroupField();
+        me.block();
+        me.onGroupChange();
+        me.unblock();
     },
     
     injectGroupingMenu: function() {
@@ -261,12 +279,13 @@ Ext.define('Ext.grid.feature.Grouping', {
             showGroupsText     = me.showGroupsText,
             enableNoGroups     = me.enableNoGroups,
             groupMenuItemClick = Ext.Function.bind(me.onGroupMenuItemClick, me),
-            groupToggleMenuItemClick = Ext.Function.bind(me.onGroupToggleMenuItemClick, me)
+            groupToggleMenuItemClick = Ext.Function.bind(me.onGroupToggleMenuItemClick, me);
         
         // runs in the scope of headerCt
         return function() {
             var o = Ext.grid.header.Container.prototype.getMenuItems.call(this);
             o.push('-', {
+                iconCls: Ext.baseCSSPrefix + 'group-by-icon',
                 itemId: 'groupMenuItem',
                 text: groupByText,
                 handler: groupMenuItemClick
@@ -284,23 +303,38 @@ Ext.define('Ext.grid.feature.Grouping', {
     },
 
 
-<span id='Ext-grid.feature.Grouping-method-onGroupMenuItemClick'>    /**
+<span id='Ext-grid-feature-Grouping-method-onGroupMenuItemClick'>    /**
 </span>     * Group by the header the user has clicked on.
      * @private
      */
     onGroupMenuItemClick: function(menuItem, e) {
-        var menu = menuItem.parentMenu,
+        var me = this,
+            menu = menuItem.parentMenu,
             hdr  = menu.activeHeader,
-            view = this.view;
+            view = me.view,
+            store = view.store,
+            remote = store.remoteGroup;
 
-        delete this.lastGroupIndex;
-        this.enable();
-        view.store.group(hdr.dataIndex);
-        this.pruneGroupedHeader();
-        
+        delete me.lastGroupIndex;
+        me.block();
+        me.enable();
+        store.group(hdr.dataIndex);
+        me.pruneGroupedHeader();
+        me.unblock();
+        if (!remote) {
+            view.refresh();
+        }  
+    },
+    
+    block: function(){
+        this.blockRefresh = this.view.blockRefresh = true;
+    },
+    
+    unblock: function(){
+        this.blockRefresh = this.view.blockRefresh = false;
     },
 
-<span id='Ext-grid.feature.Grouping-method-onGroupToggleMenuItemClick'>    /**
+<span id='Ext-grid-feature-Grouping-method-onGroupToggleMenuItemClick'>    /**
 </span>     * Turn on and off grouping via the menu
      * @private
      */
@@ -308,7 +342,7 @@ Ext.define('Ext.grid.feature.Grouping', {
         this[checked ? 'enable' : 'disable']();
     },
 
-<span id='Ext-grid.feature.Grouping-method-pruneGroupedHeader'>    /**
+<span id='Ext-grid-feature-Grouping-method-pruneGroupedHeader'>    /**
 </span>     * Prunes the grouped header from the header container
      * @private
      */
@@ -337,7 +371,7 @@ Ext.define('Ext.grid.feature.Grouping', {
         return ''; 
     },
 
-<span id='Ext-grid.feature.Grouping-method-onRowFocus'>    /**
+<span id='Ext-grid-feature-Grouping-method-onRowFocus'>    /**
 </span>     * When a row gains focus, expand the groups above it
      * @private
      */
@@ -352,9 +386,9 @@ Ext.define('Ext.grid.feature.Grouping', {
         }
     },
 
-<span id='Ext-grid.feature.Grouping-method-expand'>    /**
+<span id='Ext-grid-feature-Grouping-method-expand'>    /**
 </span>     * Expand a group by the groupBody
-     * @param {Ext.core.Element} groupBd
+     * @param {Ext.Element} groupBd
      * @private
      */
     expand: function(groupBd) {
@@ -373,9 +407,9 @@ Ext.define('Ext.grid.feature.Grouping', {
         view.fireEvent('groupexpand');
     },
 
-<span id='Ext-grid.feature.Grouping-method-collapse'>    /**
+<span id='Ext-grid-feature-Grouping-method-collapse'>    /**
 </span>     * Collapse a group by the groupBody
-     * @param {Ext.core.Element} groupBd
+     * @param {Ext.Element} groupBd
      * @private
      */
     collapse: function(groupBd) {
@@ -395,10 +429,44 @@ Ext.define('Ext.grid.feature.Grouping', {
     },
     
     onGroupChange: function(){
-        this.view.refresh();
+        var me = this,
+            field = me.getGroupField(),
+            menuItem;
+            
+        if (me.hideGroupedHeader) {
+            if (me.lastGroupField) {
+                menuItem = me.getMenuItem(me.lastGroupField);
+                if (menuItem) {
+                    menuItem.setChecked(true);
+                }
+            }
+            if (field) {
+                menuItem = me.getMenuItem(field);
+                if (menuItem) {
+                    menuItem.setChecked(false);
+                }
+            }
+        }
+        if (me.blockRefresh !== true) {
+            me.view.refresh();
+        }
+        me.lastGroupField = field;
+    },
+    
+<span id='Ext-grid-feature-Grouping-method-getMenuItem'>    /**
+</span>     * Gets the related menu item for a dataIndex
+     * @private
+     * @return {Ext.grid.header.Container} The header
+     */
+    getMenuItem: function(dataIndex){
+        var view = this.view,
+            header = view.headerCt.down('gridcolumn[dataIndex=' + dataIndex + ']'),
+            menu = view.headerCt.getMenu();
+            
+        return menu.down('menuitem[headerId='+ header.id +']');
     },
 
-<span id='Ext-grid.feature.Grouping-method-onGroupClick'>    /**
+<span id='Ext-grid-feature-Grouping-method-onGroupClick'>    /**
 </span>     * Toggle between expanded/collapsed state when clicking on
      * the group.
      * @private
@@ -504,16 +572,18 @@ Ext.define('Ext.grid.feature.Grouping', {
     // events that are fired on the view. Chose not to return the actual
     // group itself because of its expense and because developers can simply
     // grab the group via store.getGroups(groupName)
-    getFireEventArgs: function(type, view, featureTarget) {
+    getFireEventArgs: function(type, view, featureTarget, e) {
         var returnArray = [type, view, featureTarget],
             groupBd     = Ext.fly(featureTarget.nextSibling, '_grouping'),
             groupBdId   = Ext.getDom(groupBd).id,
             prefix      = view.id + '-gp-',
             groupName   = groupBdId.substr(prefix.length);
         
-        returnArray.push(groupName);
+        returnArray.push(groupName, e);
         
         return returnArray;
     }
 });
-</pre></pre></body></html>
\ No newline at end of file
+</pre>
+</body>
+</html>