Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / examples / charts / FormDashboard.js
diff --git a/examples/charts/FormDashboard.js b/examples/charts/FormDashboard.js
new file mode 100644 (file)
index 0000000..20b5bab
--- /dev/null
@@ -0,0 +1,414 @@
+Ext.require([
+    'Ext.form.*',
+    'Ext.data.*',
+    'Ext.chart.*',
+    'Ext.grid.Panel',
+    'Ext.layout.container.Column'
+]);
+
+
+Ext.onReady(function(){
+    
+    //use a renderer for values in the data view.
+    function perc(v) {
+        return v + '%';
+    }
+
+    var bd = Ext.getBody(),
+        form = false,
+        rec = false,
+        selectedStoreItem = false,
+        //performs the highlight of an item in the bar series
+        selectItem = function(storeItem) {
+            var name = storeItem.get('company'),
+                series = barChart.series.get(0),
+                i, items, l;
+            
+            series.highlight = true;
+            series.unHighlightItem();
+            series.cleanHighlights();
+            for (i = 0, items = series.items, l = items.length; i < l; i++) {
+                if (name == items[i].storeItem.get('company')) {
+                    selectedStoreItem = items[i].storeItem;
+                    series.highlightItem(items[i]);
+                    break;
+                }
+            }
+            series.highlight = false;
+        },
+        //updates a record modified via the form
+        updateRecord = function(rec) {
+            var name, series, i, l, items, json = [{
+                'Name': 'Price %',
+                'Data': rec.get('price %')
+            }, {
+                'Name': 'Revenue %',
+                'Data': rec.get('revenue %')
+            }, {
+                'Name': 'Growth %',
+                'Data': rec.get('growth %')
+            }, {
+                'Name': 'Product %',
+                'Data': rec.get('product %')
+            }, {
+                'Name': 'Market %',
+                'Data': rec.get('market %')
+            }];
+            chs.loadData(json);
+            selectItem(rec);
+        },
+        createListeners = function() {
+            return {
+                // buffer so we don't refire while the user is still typing
+                buffer: 200,
+                change: function(field, newValue, oldValue, listener) {
+                    form.updateRecord(rec);
+                    updateRecord(rec);
+                }
+            };
+        };
+        
+    // sample static data for the store
+    var myData = [
+        ['3m Co'],
+        ['Alcoa Inc'],
+        ['Altria Group Inc'],
+        ['American Express Company'],
+        ['American International Group, Inc.'],
+        ['AT&T Inc'],
+        ['Boeing Co.'],
+        ['Caterpillar Inc.'],
+        ['Citigroup, Inc.'],
+        ['E.I. du Pont de Nemours and Company'],
+        ['Exxon Mobil Corp'],
+        ['General Electric Company'],
+        ['General Motors Corporation'],
+        ['Hewlett-Packard Co'],
+        ['Honeywell Intl Inc'],
+        ['Intel Corporation'],
+        ['International Business Machines'],
+        ['Johnson & Johnson'],
+        ['JP Morgan & Chase & Co'],
+        ['McDonald\'s Corporation'],
+        ['Merck & Co., Inc.'],
+        ['Microsoft Corporation'],
+        ['Pfizer Inc'],
+        ['The Coca-Cola Company'],
+        ['The Home Depot, Inc.'],
+        ['The Procter & Gamble Company'],
+        ['United Technologies Corporation'],
+        ['Verizon Communications'],
+        ['Wal-Mart Stores, Inc.']
+    ];
+    
+    for (var i = 0, l = myData.length, rand = Math.random; i < l; i++) {
+        var data = myData[i];
+        data[1] = ((rand() * 10000) >> 0) / 100;
+        data[2] = ((rand() * 10000) >> 0) / 100;
+        data[3] = ((rand() * 10000) >> 0) / 100;
+        data[4] = ((rand() * 10000) >> 0) / 100;
+        data[5] = ((rand() * 10000) >> 0) / 100;
+    }
+
+    //create data store to be shared among the grid and bar series.
+    var ds = Ext.create('Ext.data.ArrayStore', {
+        fields: [
+            {name: 'company'},
+            {name: 'price %',   type: 'float'},
+            {name: 'revenue %', type: 'float'},
+            {name: 'growth %',  type: 'float'},
+            {name: 'product %', type: 'float'},
+            {name: 'market %',  type: 'float'}
+        ],
+        data: myData
+    });
+    
+    //create radar dataset model.
+    var chs = Ext.create('Ext.data.JsonStore', {
+        fields: ['Name', 'Data'],
+        data: [
+        {
+            'Name': 'Price %',
+            'Data': 100
+        }, {
+            'Name': 'Revenue %',
+            'Data': 100
+        }, {
+            'Name': 'Growth %',
+            'Data': 100
+        }, {
+            'Name': 'Product %',
+            'Data': 100
+        }, {
+            'Name': 'Market %',
+            'Data': 100
+        }]
+    });
+    
+    //Radar chart will render information for a selected company in the
+    //list. Selection can also be done via clicking on the bars in the series.
+    var radarChart = Ext.create('Ext.chart.Chart', {
+        margin: '0 0 0 0',
+        insetPadding: 20,
+        flex: 1.2,
+        animate: true,
+        store: chs,
+        axes: [{
+            type: 'Radial',
+            position: 'radial',
+            maximum: 100,
+            label: {
+                display: 'none'    
+            }
+        }],
+        series: [{
+            type: 'radar',
+            xField: 'Name',
+            yField: 'Data',
+            showInLegend: false,
+            showMarkers: true,
+            markerConfig: {
+                radius: 2,
+                size: 2
+            },
+            style: {
+                fill: '#273f68',
+                opacity: 0.5,
+                'stroke-width': 0.5
+            },
+            label: {
+                display: true,
+                field: 'Name'
+            }
+        }]
+    });
+    
+    //create a grid that will list the dataset items.
+    var gridPanel = Ext.create('Ext.grid.Panel', {
+        id: 'company-form',
+        flex: 0.60,
+        store: ds,
+        title:'Company Data',
+
+        columns: [
+            {
+                id       :'company',
+                text   : 'Company',
+                flex: 1,
+                sortable : true,
+                dataIndex: 'company'
+            },
+            {
+                text   : 'Price',
+                width    : 75,
+                sortable : true,
+                dataIndex: 'price %',
+                renderer: perc
+            },
+            {
+                text   : 'Revenue',
+                width    : 75,
+                sortable : true,
+                dataIndex: 'revenue %',
+                renderer: perc
+            },
+            {
+                text   : 'Growth',
+                width    : 75,
+                sortable : true,
+                dataIndex: 'growth %',
+                renderer: perc
+            },
+            {
+                text   : 'Product',
+                width    : 75,
+                sortable : true,
+                dataIndex: 'product %',
+                renderer: perc
+            },
+            {
+                text   : 'Market',
+                width    : 75,
+                sortable : true,
+                dataIndex: 'market %',
+                renderer: perc
+            }
+        ],
+
+        listeners: {
+            selectionchange: function(model, records) {
+                var json, name, i, l, items, series, fields;
+                if (records[0]) {
+                    rec = records[0];
+                    form = form || this.up('form').getForm();
+                    fields = form.getFields();
+                    // prevent change events from firing
+                    fields.each(function(field){
+                        field.suspendEvents();
+                    });
+                    form.loadRecord(rec);
+                    updateRecord(rec);
+                    fields.each(function(field){
+                        field.resumeEvents();
+                    });
+                }
+            }
+        }
+    });
+
+    //create a bar series to be at the top of the panel.
+    var barChart = Ext.create('Ext.chart.Chart', {
+        flex: 1,
+        shadow: true,
+        animate: true,
+        store: ds,
+        axes: [{
+            type: 'Numeric',
+            position: 'left',
+            fields: ['price %'],
+            minimum: 0,
+            label: {
+                font: '9px Arial'
+            },
+            hidden: true
+        }, {
+            type: 'Category',
+            position: 'bottom',
+            fields: ['company'],
+            label: {
+                font: '9px Arial'
+            }
+        }],
+        series: [{
+            type: 'column',
+            axis: 'left',
+            highlight: true,
+            style: {
+                fill: '#456d9f'
+            },
+            highlightCfg: {
+                fill: '#a2b5ca'
+            },
+            label: {
+                display: 'insideEnd',
+                field: 'price %',
+                color: '#000',
+                orientation: 'vertical',
+                'text-anchor': 'middle'
+            },
+            listeners: {
+                'itemmouseup': function(item) {
+                     var series = barChart.series.get(0),
+                         index = Ext.Array.indexOf(series.items, item),
+                         selectionModel = gridPanel.getSelectionModel();
+                     
+                     selectedStoreItem = item.storeItem;
+                     selectionModel.select(index);
+                }
+            },
+            xField: 'name',
+            yField: ['price %']
+        }]        
+    });
+    
+    //disable highlighting by default.
+    barChart.series.get(0).highlight = false;
+    
+    //add listener to (re)select bar item after sorting or refreshing the dataset.
+    barChart.addListener('beforerefresh', (function() {
+        var timer = false;
+        return function() {
+            clearTimeout(timer);
+            if (selectedStoreItem) {
+                timer = setTimeout(function() {
+                    selectItem(selectedStoreItem);
+                }, 900);
+            }
+        };
+    })());
+    
+    /*
+     * Here is where we create the Form
+     */
+    var gridForm = Ext.create('Ext.form.Panel', {
+        title: 'Company data',
+        frame: true,
+        bodyPadding: 5,
+        width: 870,
+        height: 700,
+
+        fieldDefaults: {
+            labelAlign: 'left',
+            msgTarget: 'side'
+        },
+    
+        layout: {
+            type: 'vbox',
+            align: 'stretch'
+        },
+        
+        items: [
+            {
+                height: 200,
+                layout: 'fit',
+                margin: '0 0 3 0',
+                items: [barChart]
+            },
+            {
+            
+            layout: {type: 'hbox', align: 'stretch'},
+            flex: 3,
+            border: false,
+            bodyStyle: 'background-color: transparent',
+            
+            items: [gridPanel, {
+                flex: 0.4,
+                layout: {
+                    type: 'vbox',
+                    align:'stretch'
+                },
+                margin: '0 0 0 5',
+                title: 'Company Details',
+                items: [{
+                    margin: '5',
+                    xtype: 'fieldset',
+                    flex: 1,
+                    title:'Company details',
+                    defaults: {
+                        width: 240,
+                        labelWidth: 90
+                    },
+                    defaultType: 'textfield',
+                    items: [{
+                        fieldLabel: 'Name',
+                        name: 'company',
+                        disabled: true
+                    },{
+                        fieldLabel: 'Price %',
+                        name: 'price %',
+                        listeners: createListeners('price %')
+                    },{
+                        fieldLabel: 'Revenue %',
+                        name: 'revenue %',
+                        listeners: createListeners('revenue %')
+                    },{
+                        fieldLabel: 'Growth %',
+                        name: 'growth %',
+                        listeners: createListeners('growth %')
+                    },{
+                        fieldLabel: 'Product %',
+                        name: 'product %',
+                        listeners: createListeners('product %')
+                    },{
+                        fieldLabel: 'Market %',
+                        name: 'market %',
+                        listeners: createListeners('market %')
+                    }]
+                }, radarChart]
+            }]
+        }],
+        renderTo: bd
+    });
+
+    var gp = Ext.getCmp('company-form');
+});
\ No newline at end of file