/**
* This plugin enables a grouping panel above the grid to allow easy grouping.
*
* It adds the following methods to the grid panel instance:
*
* - showGroupingPanel
* - hideGroupingPanel
*/
Ext.define('Ext.grid.plugin.GroupingPanel', {
extend: 'Ext.grid.plugin.BaseGroupingPanel',
alias: 'plugin.groupingpanel',
requires: [
'Ext.grid.plugin.grouping.Panel'
],
/**
* `"both"` (the default) - The plugin is added to both grids
* `"top"` - The plugin is added to the containing Panel
* `"locked"` - The plugin is added to the locked (left) grid
* `"normal"` - The plugin is added to the normal (right) grid
*
* @private
*/
lockableScope: 'top',
gridListeners: {
render: 'onAfterGridRendered'
},
updateGrid: function(grid, oldGrid) {
this.callParent([grid, oldGrid]);
if (grid) {
this.injectGroupingMenu();
}
},
injectGroupingMenu: function() {
var me = this,
grid = me.getGrid(),
headerCt;
// "getMenuItems" is only called once on the grid header container
// so we need to inject our fn before the grid is rendered
if (grid.enableLocking) {
headerCt = grid.normalGrid.headerCt;
// eslint-disable-next-line max-len
headerCt.showMenuBy = Ext.Function.createInterceptor(headerCt.showMenuBy, me.showMenuBy);
headerCt.getMenuItems = me.getMenuItems(headerCt);
headerCt = grid.lockedGrid.headerCt;
// eslint-disable-next-line max-len
headerCt.showMenuBy = Ext.Function.createInterceptor(headerCt.showMenuBy, me.showMenuBy);
headerCt.getMenuItems = me.getMenuItems(headerCt);
}
else {
headerCt = grid.headerCt;
// eslint-disable-next-line max-len
headerCt.showMenuBy = Ext.Function.createInterceptor(headerCt.showMenuBy, me.showMenuBy);
headerCt.getMenuItems = me.getMenuItems(headerCt);
}
},
showMenuBy: function(clickEvent, t, header) {
var me = this,
menuItem = me.getMenu().down('#groupingPanel'),
panel = me.grid.ownerGrid.down('groupingpanel');
if (panel && menuItem) {
menuItem.setText(panel.getHidden()
? panel.showGroupingPanelText
: panel.hideGroupingPanelText);
}
},
getMenuItems: function(headerCt) {
var me = this,
bar = me.getBar(),
getMenuItems = headerCt.getMenuItems;
// runs in the scope of headerCt
return function() {
// We cannot use the method from HeaderContainer's prototype here
// because other plugins or features may already have injected an implementation
var o = getMenuItems.call(this);
o.push('-', {
iconCls: bar
? bar.groupingPanelIconCls
: Ext.baseCSSPrefix + 'grid-group-panel-icon',
itemId: 'groupingPanel',
text: '', // text will be updated when menu is shown
handler: 'toggleGroupingPanel',
scope: me
});
return o;
};
},
addGroupingPanel: function() {
var me = this,
ret;
ret = me.getGrid().addDocked(me.getPanel());
ret = ret && ret.length ? ret[0] : ret;
return ret;
}
});