Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / form-grid.html
1 <html>\r
2 <head>\r
3   <title>The source code</title>\r
4     <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
5     <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
6 </head>\r
7 <body  onload="prettyPrint();">\r
8     <pre class="prettyprint lang-js">Ext.onReady(function(){
9
10     Ext.QuickTips.init();
11
12     // turn on validation errors beside the field globally
13     Ext.form.Field.prototype.msgTarget = 'side';
14
15     var bd = Ext.getBody();
16
17 //   Define the Grid data and create the Grid
18     var myData = [
19         ['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
20         ['Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'],
21         ['Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am'],
22         ['American Express Company',52.55,0.01,0.02,'9/1 12:00am'],
23         ['American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am'],
24         ['AT&T Inc.',31.61,-0.48,-1.54,'9/1 12:00am'],
25         ['Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'],
26         ['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
27         ['Citigroup, Inc.',49.37,0.02,0.04,'9/1 12:00am'],
28         ['E.I. du Pont de Nemours and Company',40.48,0.51,1.28,'9/1 12:00am'],
29         ['Exxon Mobil Corp',68.1,-0.43,-0.64,'9/1 12:00am'],
30         ['General Electric Company',34.14,-0.08,-0.23,'9/1 12:00am'],
31         ['General Motors Corporation',30.27,1.09,3.74,'9/1 12:00am'],
32         ['Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'],
33         ['Honeywell Intl Inc',38.77,0.05,0.13,'9/1 12:00am'],
34         ['Intel Corporation',19.88,0.31,1.58,'9/1 12:00am'],
35         ['International Business Machines',81.41,0.44,0.54,'9/1 12:00am'],
36         ['Johnson & Johnson',64.72,0.06,0.09,'9/1 12:00am'],
37         ['JP Morgan & Chase & Co',45.73,0.07,0.15,'9/1 12:00am'],
38         ['McDonald\'s Corporation',36.76,0.86,2.40,'9/1 12:00am'],
39         ['Merck & Co., Inc.',40.96,0.41,1.01,'9/1 12:00am'],
40         ['Microsoft Corporation',25.84,0.14,0.54,'9/1 12:00am'],
41         ['Pfizer Inc',27.96,0.4,1.45,'9/1 12:00am'],
42         ['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
43         ['The Home Depot, Inc.',34.64,0.35,1.02,'9/1 12:00am'],
44         ['The Procter & Gamble Company',61.91,0.01,0.02,'9/1 12:00am'],
45         ['United Technologies Corporation',63.26,0.55,0.88,'9/1 12:00am'],
46         ['Verizon Communications',35.57,0.39,1.11,'9/1 12:00am'],
47         ['Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am']
48     ];
49
50     var ds = new Ext.data.Store({
51         reader: new Ext.data.ArrayReader({}, [
52             {name: 'company'},
53             {name: 'price', type: 'float'},
54             {name: 'change', type: 'float'},
55             {name: 'pctChange', type: 'float'},
56             {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'},
57
58 //          Rating dependent upon performance 0 = best, 2 = worst
59             {name: 'rating', type: 'int', convert: function(v, rec) {
60                    if (rec[3] < 0) return 2;
61                    if (rec[3] < 1) return 1;
62                    return 0;
63                }
64             }
65         ])
66     });
67     ds.loadData(myData);
68
69     // example of custom renderer function
70     function italic(value){
71         return '<i>' + value + '</i>';
72     }
73
74     // example of custom renderer function
75     function change(val){
76         if(val > 0){
77             return '<span style="color:green;">' + val + '</span>';
78         }else if(val < 0){
79             return '<span style="color:red;">' + val + '</span>';
80         }
81         return val;
82     }
83     // example of custom renderer function
84     function pctChange(val){
85         if(val > 0){
86             return '<span style="color:green;">' + val + '%</span>';
87         }else if(val < 0){
88             return '<span style="color:red;">' + val + '%</span>';
89         }
90         return val;
91     }
92     
93     // render rating as "A", "B" or "C" depending upon numeric value.
94     function rating(v) {
95         if (v == 0) return "A"
96         if (v == 1) return "B"
97         if (v == 2) return "C"
98     }
99
100     // the DefaultColumnModel expects this blob to define columns. It can be extended to provide
101     // custom or reusable ColumnModels
102     var colModel = new Ext.grid.ColumnModel([
103         {id:'company',header: "Company", width: 160, sortable: true, locked:false, dataIndex: 'company'},
104         {header: "Price", width: 55, sortable: true, renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
105         {header: "Change", width: 55, sortable: true, renderer: change, dataIndex: 'change'},
106         {header: "% Change", width: 65, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
107         {header: "Last Updated", width: 80, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'},
108         {header: "Rating", width: 40, sortable: true, renderer: rating, dataIndex: 'rating'}
109     ]);
110
111     bd.createChild({tag: 'h2', html: 'Using a Grid with a Form'});
112
113 /*
114  *    Here is where we create the Form
115  */
116     var gridForm = new Ext.FormPanel({
117         id: 'company-form',
118         frame: true,
119         labelAlign: 'left',
120         title: 'Company data',
121         bodyStyle:'padding:5px',
122         width: 750,
123         layout: 'column',    // Specifies that the items will now be arranged in columns
124         items: [{
125             columnWidth: 0.60,
126             layout: 'fit',
127             items: {
128                 xtype: 'grid',
129                 ds: ds,
130                 cm: colModel,
131                 sm: new Ext.grid.RowSelectionModel({
132                     singleSelect: true,
133                     listeners: {
134                         rowselect: function(sm, row, rec) {
135                             Ext.getCmp("company-form").getForm().loadRecord(rec);
136                         }
137                     }
138                 }),
139                 autoExpandColumn: 'company',
140                 height: 350,
141                 title:'Company Data',
142                 border: true,
143                 listeners: {
144                     render: function(g) {
145                         g.getSelectionModel().selectRow(0);
146                     },
147                     delay: 10 // Allow rows to be rendered.
148                 }
149             }
150         },{
151             columnWidth: 0.4,
152             xtype: 'fieldset',
153             labelWidth: 90,
154             title:'Company details',
155             defaults: {width: 140, border:false},    // Default config options for child items
156             defaultType: 'textfield',
157             autoHeight: true,
158             bodyStyle: Ext.isIE ? 'padding:0 0 5px 15px;' : 'padding:10px 15px;',
159             border: false,
160             style: {
161                 "margin-left": "10px", // when you add custom margin in IE 6...
162                 "margin-right": Ext.isIE6 ? (Ext.isStrict ? "-10px" : "-13px") : "0"  // you have to adjust for it somewhere else
163             },
164             items: [{
165                 fieldLabel: 'Name',
166                 name: 'company'
167             },{
168                 fieldLabel: 'Price',
169                 name: 'price'
170             },{
171                 fieldLabel: '% Change',
172                 name: 'pctChange'
173             },{
174                 xtype: 'datefield',
175                 fieldLabel: 'Last Updated',
176                 name: 'lastChange'
177             }, {
178                 xtype: 'panel',
179                 layout: 'table',
180                 layoutConfig: {
181                     columns: 4
182                 },
183                 anchor: '100%',
184                 defaults: {
185                     border: false,
186                     layout: 'form',
187                     labelWidth: 15,
188                     style: {
189                         paddingRight: '10px'
190                     }
191                 },
192
193 // A radio group: A setValue on any of the following 'radio' inputs using the numeric
194 // 'rating' field checks the radio instance which has the matching inputValue.
195                 items: [{
196                     cellCls: 'x-form-item',
197                     xtype: 'label',
198                     text: 'Rating',
199                        width: 98
200                 }, {
201                     items: {    
202                         xtype: 'radio',
203                         name: 'rating',
204                         inputValue: '0',
205                         fieldLabel: 'A'
206                     }
207                 }, {
208                     items: {
209                         xtype: 'radio',
210                         name: 'rating',
211                         inputValue: '1',
212                         fieldLabel: 'B'
213                     }
214                 }, {
215                     items: {
216                         xtype: 'radio',
217                         name: 'rating',
218                         inputValue: '2',
219                         fieldLabel: 'C'
220                     }
221                 }]
222             }]
223         }],
224         renderTo: bd
225     });
226     
227     //  Create Panel view code. Ignore.
228     createCodePanel('form-grid.js', 'View code to create this Form');
229 });</pre>    \r
230 </body>\r
231 </html>