X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/3789b528d8dd8aad4558e38e22d775bcab1cbd36..f562e4c6e5fac7bcb445985b99acbea4d706e6f0:/src/grid/feature/Grouping.js diff --git a/src/grid/feature/Grouping.js b/src/grid/feature/Grouping.js index d8ee6e36..c53bb94e 100644 --- a/src/grid/feature/Grouping.js +++ b/src/grid/feature/Grouping.js @@ -1,3 +1,17 @@ +/* + +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.Grouping * @extends Ext.grid.feature.Feature @@ -42,8 +56,10 @@ 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); }, /** @@ -103,33 +119,31 @@ Ext.define('Ext.grid.feature.Grouping', { hdCollapsedCls: Ext.baseCSSPrefix + 'grid-group-hd-collapsed', /** - * @cfg {String} groupByText Text displayed in the grid header menu for grouping by header - * (defaults to 'Group By This Field'). + * @cfg {String} groupByText Text displayed in the grid header menu for grouping by header. */ groupByText : 'Group By This Field', /** - * @cfg {String} showGroupsText Text displayed in the grid header for enabling/disabling grouping - * (defaults to 'Show in Groups'). + * @cfg {String} showGroupsText Text displayed in the grid header for enabling/disabling grouping. */ showGroupsText : 'Show in Groups', /** - * @cfg {Boolean} hideGroupedHeadertrue to hide the header that is currently grouped (defaults to false) + * @cfg {Boolean} hideGroupedHeadertrue to hide the header that is currently grouped. */ hideGroupedHeader : false, /** - * @cfg {Boolean} startCollapsed true to start all groups collapsed (defaults to false) + * @cfg {Boolean} startCollapsed true to start all groups collapsed */ startCollapsed : false, /** - * @cfg {Boolean} enableGroupingMenu true to enable the grouping control in the header menu (defaults to true) + * @cfg {Boolean} enableGroupingMenu true to enable the grouping control in the header menu */ enableGroupingMenu : true, /** - * @cfg {Boolean} enableNoGroups true to allow the user to turn off grouping (defaults to true) + * @cfg {Boolean} enableNoGroups true to allow the user to turn off grouping */ enableNoGroups : true, @@ -139,33 +153,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) { @@ -205,8 +232,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, @@ -220,16 +246,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() { @@ -262,6 +282,7 @@ Ext.define('Ext.grid.feature.Grouping', { 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,15 +305,30 @@ Ext.define('Ext.grid.feature.Grouping', { * @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; }, /** @@ -349,7 +385,7 @@ Ext.define('Ext.grid.feature.Grouping', { /** * Expand a group by the groupBody - * @param {Ext.core.Element} groupBd + * @param {Ext.Element} groupBd * @private */ expand: function(groupBd) { @@ -370,7 +406,7 @@ Ext.define('Ext.grid.feature.Grouping', { /** * Collapse a group by the groupBody - * @param {Ext.core.Element} groupBd + * @param {Ext.Element} groupBd * @private */ collapse: function(groupBd) { @@ -390,7 +426,41 @@ 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; + }, + + /** + * 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 +']'); }, /** @@ -511,3 +581,4 @@ Ext.define('Ext.grid.feature.Grouping', { return returnArray; } }); +