/** * This class implements the configurator panel. */Ext.define('Ext.pivot.plugin.configurator.Panel', { extend: 'Ext.Container', requires: [ 'Ext.pivot.plugin.configurator.Container', 'Ext.pivot.plugin.configurator.DragZone', 'Ext.pivot.plugin.configurator.DropZone', 'Ext.pivot.plugin.configurator.PanelController', 'Ext.pivot.plugin.configurator.Form', 'Ext.layout.HBox', 'Ext.layout.VBox', 'Ext.layout.Card', 'Ext.TitleBar', 'Ext.Promise' ], alias: 'widget.pivotconfigpanel', controller: 'pivotconfigpanel', cls: Ext.baseCSSPrefix + 'pivot-grid-config-panel', translatable: { translationMethod: 'csstransform' }, panelTitle: 'Configuration', /** * @cfg {String} panelAllFieldsText Text displayed in the container reserved for all available fields * when docked to top or bottom. */ panelAllFieldsText: 'Drop Unused Fields Here', /** * @cfg {String} panelAllFieldsTitle Text displayed in the container reserved for all available fields * when docked to left or right. */ panelAllFieldsTitle: 'All fields', /** * @cfg {String} panelTopFieldsText Text displayed in the container reserved for all top axis fields * when docked to top or bottom. */ panelTopFieldsText: 'Drop Column Fields Here', /** * @cfg {String} panelTopFieldsTitle Text displayed in the container reserved for all top axis fields * when docked to left or right. */ panelTopFieldsTitle: 'Column labels', /** * @cfg {String} panelLeftFieldsText Text displayed in the container reserved for all left axis fields * when docked to top or bottom. */ panelLeftFieldsText: 'Drop Row Fields Here', /** * @cfg {String} panelLeftFieldsTitle Text displayed in the container reserved for all left axis fields * when docked to left or right. */ panelLeftFieldsTitle: 'Row labels', /** * @cfg {String} panelAggFieldsText Text displayed in the container reserved for all aggregate fields * when docked to top or bottom. */ panelAggFieldsText: 'Drop Agg Fields Here', /** * @cfg {String} panelAggFieldsTitle Text displayed in the container reserved for all aggregate fields * when docked to left or right. */ panelAggFieldsTitle: 'Values', cancelText: 'Cancel', okText: 'Done', eventedConfig: { pivot: null, fields: null }, listeners: { pivotchange: 'onPivotChanged', fieldschange: 'onFieldsChanged' }, layout: 'card', initialize: function(){ this.setup(); return this.callParent(); }, /** * This function either moves or copies the dragged field from one container to another. * * @param {Ext.pivot.plugin.configurator.Container} fromContainer * @param {Ext.pivot.plugin.configurator.Container} toContainer * @param {Ext.data.Model} record * @param {String} newPos New index position * * @private */ dragDropField: function(fromContainer, toContainer, record, newPos){ var me = this, pivot = me.getPivot(), field = record.get('field'), fromFieldType = fromContainer.getFieldType(), toFieldType = toContainer.getFieldType(), controller = me.getController(), topAxisCt = controller.getTopAxisContainer(), leftAxisCt = controller.getLeftAxisContainer(), item; if(pivot.fireEvent('beforemoveconfigfield', this, { fromContainer: fromContainer, toContainer: toContainer, field: field }) !== false){ if(fromContainer != toContainer){ if (toFieldType === 'all') { // source is "Row labels"/"Column labels"/"Values" // destination is "All fields" // we just remove the field from the source fromContainer.removeField(record); } else if (toFieldType === 'aggregate') { // source is "Row labels"/"Column labels"/"All fields" // destination is "Values" // we copy the field to destination toContainer.addField(field, newPos); if (fromFieldType !== 'all'){ // remove the field from the left/top axis fromContainer.removeField(record); } } else { // source is "Row labels"/"Column labels"/"Values"/"All fields" // destination is "Row labels"/"Column labels" // first let's check if the field is already in the destination container item = me.findFieldInContainer(field, toContainer); if (item) { // the destination has the field already return; } // See if it was on another axis. if (toFieldType === 'leftAxis') { item = me.findFieldInContainer(field, topAxisCt); fromContainer = item ? topAxisCt : fromContainer; } else { item = me.findFieldInContainer(field, leftAxisCt); fromContainer = item ? leftAxisCt : fromContainer; } // If so, move it here. if (item) { fromContainer.removeField(item); toContainer.addField(field); } else { if(fromFieldType === 'aggregate'){ // we need to remove the dragged field because it was found on one of the axis fromContainer.removeField(record); } toContainer.addField(field, newPos); } } }else{ toContainer.moveField(record, newPos); } } }, isAllowed: function (fromContainer, toContainer, record) { var allowed = true, field = record.get('field'), fromFieldType = fromContainer && fromContainer.getFieldType(), toFieldType = toContainer && toContainer.getFieldType(); if (fromFieldType === 'aggregate' && (toFieldType === 'leftAxis' || toFieldType === 'topAxis')) { allowed = !this.findFieldInContainer(field, toContainer); } return allowed; }, /** * * @param {Ext.pivot.plugin.configurator.Field} field * @param {Ext.pivot.plugin.configurator.Container} container * @return {Ext.data.Model} * * @private */ findFieldInContainer: function(field, container){ var store = container.getStore(), length = store.getCount(), i, item; for(i = 0; i < length; i++){ item = store.getAt(i); if(item.get('field').getDataIndex() == field.getDataIndex()){ return item; } } }, setup: function(){ var me = this, listeners = { configchange: 'onConfigChanged', toolsbtnpressed: 'showCard', removefield: 'onRemoveField' }; me.add([{ itemId: 'main', xtype: 'container', layout: { type: 'hbox', align: 'stretch' }, defaults: { flex: 1 }, items: [{ xtype: 'titlebar', docked: 'top', title: me.panelTitle, titleAlign: 'left', items: [{ text: me.cancelText, align: 'right', ui: 'decline', handler:'cancelConfiguration' },{ text: me.okText, align: 'right', ui: 'confirm', handler:'applyConfiguration', margin: '0 0 0 5' }] },{ reference: 'fieldsCt', xtype: 'pivotconfigcontainer', title: me.panelAllFieldsTitle, emptyText: me.panelAllFieldsText, fieldType: 'all', listeners: listeners },{ xtype: 'container', layout: { type: 'vbox', align: 'stretch' }, defaults: { xtype: 'pivotconfigcontainer', flex: 1 }, items: [{ reference: 'fieldsAggCt', title: me.panelAggFieldsTitle, emptyText: me.panelAggFieldsText, fieldType: 'aggregate', listeners: listeners },{ reference: 'fieldsLeftCt', title: me.panelLeftFieldsTitle, emptyText: me.panelLeftFieldsText, fieldType: 'leftAxis', listeners: listeners },{ reference: 'fieldsTopCt', title: me.panelTopFieldsTitle, emptyText: me.panelTopFieldsText, fieldType: 'topAxis', listeners: listeners }] }] },{ itemId: 'field', xtype: 'pivotconfigform', listeners: { close: 'backToMainView', beforeapplyconfigfieldsettings: 'onBeforeApplyConfigFieldSettings', applyconfigfieldsettings: 'onApplyConfigFieldSettings' } }]); }, /** * Returns the container that stores all unused fields. * * @returns {Ext.pivot.plugin.configurator.Container} */ getAllFieldsContainer: function(){ return this.lookup('fieldsCt'); }, /** * Returns the container that stores all fields configured on the left axis. * * @returns {Ext.pivot.plugin.configurator.Container} */ getLeftAxisContainer: function(){ return this.lookup('fieldsLeftCt'); }, /** * Returns the container that stores all fields configured on the top axis. * * @returns {Ext.pivot.plugin.configurator.Container} */ getTopAxisContainer: function(){ return this.lookup('fieldsTopCt'); }, /** * Returns the container that stores all fields configured on the aggregate. * * @returns {Ext.pivot.plugin.configurator.Container} */ getAggregateContainer: function(){ return this.lookup('fieldsAggCt'); } });