Upgrade to ExtJS 3.3.0 - Released 10/06/2010
[extjs.git] / examples / pivotgrid / ConfigPanel.js
diff --git a/examples/pivotgrid/ConfigPanel.js b/examples/pivotgrid/ConfigPanel.js
new file mode 100644 (file)
index 0000000..925293a
--- /dev/null
@@ -0,0 +1,178 @@
+/*!
+ * Ext JS Library 3.3.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+/**\r
+ * @class pivot.ConfigPanel\r
+ * @extends Ext.Panel\r
+ * A configuration panel used for modifying the properties of a PivotGrid.\r
+ */\r
+pivot.ConfigPanel = Ext.extend(Ext.Panel, {\r
+    title: 'Configure',\r
+    layout: {\r
+        type: 'vbox',\r
+        align: 'stretch'\r
+    },\r
+    /**\r
+     * @cfg {Ext.data.Record} record The Ext.data.Record to extract the field list from. Required\r
+     */\r
+\r
+    initComponent: function() {\r
+        var fields = this.getRecordFields();\r
+\r
+        /**\r
+         * @property form\r
+         * @type Ext.form.FormPanel\r
+         * Used to set the measure and aggregation function\r
+         */\r
+        this.form = new Ext.Container({\r
+            layout: 'form',\r
+            style: 'padding: 7px',\r
+            items: [{\r
+                xtype:          'combo',\r
+                mode:           'local',\r
+                triggerAction:  'all',\r
+                forceSelection: true,\r
+                editable:       false,\r
+                anchor:         "0",\r
+                fieldLabel:     'Measure',\r
+                ref:            '/measure',\r
+                name:           'measure',\r
+                displayField:   'name',\r
+                valueField:     'name',\r
+                value:           this.measure || this.measures[0],\r
+                store:           this.getMeasureStore()\r
+            }, {\r                xtype:          'combo',\r
+                mode:           'local',\r
+                triggerAction:  'all',\r                forceSelection: true,\r                editable:       false,\r                anchor:         "0",\r                fieldLabel:     'Aggregator',\r                ref:            '/aggregator',\r
+                name:           'aggregator',\r
+                displayField:   'name',\r                valueField:     'value',\r                value:          this.aggregator,\r
+                store:          new Ext.data.JsonStore({\r
+                    fields : ['name', 'value'],\r
+                    data   : [\r
+                        {name : 'Sum',     value: 'sum'},\r
+                        {name : 'Count',   value: 'count'},\r
+                        {name : 'Min',     value: 'min'},\r
+                        {name : 'Max',     value: 'max'},\r
+                        {name : 'Average', value: 'avg'}\r
+                    ]\r
+                })\r
+            }]\r
+        });\r
+\r
+        /**\r
+         * @property leftAxisGrid\r
+         * @type pivot.AxisGrid\r
+         */\r
+        this.leftAxisGrid = new pivot.AxisGrid({\r
+            title : 'Left Axis',\r
+            fields: fields,\r
+            dimensionData: this.leftAxisDimensions || [],\r
+            hasWidthField: true\r
+        });\r
+\r
+        /**\r
+         * @property topAxisGrid\r
+         * @type pivot.AxisGrid\r
+         */\r
+        this.topAxisGrid = new pivot.AxisGrid({\r
+            title : 'Top Axis',\r
+            fields: fields,\r
+            dimensionData: this.topAxisDimensions || []\r
+        });\r
+\r
+        Ext.applyIf(this, {\r
+            items: [\r
+                this.form,\r
+                this.topAxisGrid,\r
+                this.leftAxisGrid\r
+            ],\r
+            fbar: {\r
+                buttonAlign: 'left',\r
+                items: [{\r
+                    icon   : '../shared/icons/fam/accept.png',\r
+                    text   : 'Update',\r
+                    scope  : this,\r
+                    handler: this.updateGrid\r
+                }]\r
+            }\r
+        });\r
+        \r
+        pivot.ConfigPanel.superclass.initComponent.apply(this, arguments);\r
+    },\r
+\r
+    /**\r
+     * @private\r
+     * Retrieves the configured axis dimensions for the top and left grids and updates the PivotGrid accordingly\r
+     */\r
+    updateGrid: function() {\r
+        var leftDimensions = [],\r
+            topDimensions  = [],\r
+            leftGridItems  = this.leftAxisGrid.store.data.items,\r
+            topGridItems   = this.topAxisGrid.store.data.items,\r
+            i;\r
+\r
+        for (i = 0; i < leftGridItems.length; i++) {\r
+            leftDimensions.push({\r
+                dataIndex: leftGridItems[i].get('field'),\r
+                direction: leftGridItems[i].get('direction'),\r
+                width    : leftGridItems[i].get('width')\r
+            });\r
+        }\r
+\r
+        for (i = 0; i < topGridItems.length; i++) {\r
+            topDimensions.push({\r
+                dataIndex: topGridItems[i].get('field'),\r
+                direction: topGridItems[i].get('direction')\r
+            });\r
+        }\r
+\r
+        this.fireEvent('update', {\r
+            leftDimensions: leftDimensions,\r
+            topDimensions : topDimensions,\r
+            aggregator    : this.aggregator.getValue(),\r
+            measure       : this.measure.getValue()\r
+        });\r
+    },\r
+\r
+    /**\r
+     * Extracts the field names from the configured record\r
+     * @return {Array} The set of Record fields\r
+     */\r
+    getRecordFields: function() {\r
+        return Ext.pluck(this.record.prototype.fields.items, 'name');\r
+    },\r
+\r
+    /**\r
+     * @private\r
+     * @return {Ext.data.Store} The store\r
+     */\r
+    getMeasureStore: function() {\r
+        /**\r
+         * @property measureStore\r
+         * @type Ext.data.JsonStore\r
+         * The store bound to the combo for selecting the field\r
+         */\r
+        if (this.measureStore == undefined) {\r
+            var fields = [],\r
+                measures = this.measures,\r
+                length   = measures.length,\r
+                i;\r
+\r
+            for (i = 0; i < length; i++) {\r
+                fields[i] = [measures[i]];\r
+            }\r
+\r
+            this.measureStore = new Ext.data.ArrayStore({\r
+                fields: ['name'],\r
+                data  : fields\r
+            });\r
+        }\r
+\r
+        return this.measureStore; \r
+    }\r
+});\r
+\r
+Ext.reg('pivotconfig', pivot.ConfigPanel);
\ No newline at end of file