JavaScript DHTML/Ext JS/Grid Renderer

Материал из Web эксперт
Перейти к: навигация, поиск

Add Ext.grid.RowNumberer to GridPanel

   
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
<script type="text/javascript" src="ext-3.0.0/examples/ux/BufferView.js"></script>
  <style type="text/css">
  .x-grid3-td-topic b {
      font-family:tahoma, verdana;
      display:block;
    overflow:hidden;
    width:98%;
    text-overflow:ellipsis;
  }
  .x-grid3-td-topic b i {
      font-weight:normal;
      font-style: normal;
      color:#000;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  .x-grid3-td-topic .x-grid3-cell-inner {
      white-space: nowrap;
  }
  </style>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    var store = new Ext.data.Store({
        remoteSort: true,
        baseParams: {lightWeight:true,ext: "js"},
        sortInfo: {field:"lastpost", direction:"DESC"},
        autoLoad: {params:{start:0, limit:500}},
        proxy: new Ext.data.ScriptTagProxy({
            url: "http://extjs.ru/forum/topics-browse-remote.php"
        }),
        reader: new Ext.data.JsonReader({
            root: "topics",
            totalProperty: "totalCount",
            idProperty: "threadid",
            fields: [
                "title", "forumtitle", "forumid", "author",
                {name: "replycount", type: "int"},
                {name: "lastpost", mapping: "lastpost", type: "date", dateFormat: "timestamp"},
                "lastposter", "excerpt"
            ]
        })
    });
    var grid = new Ext.grid.GridPanel({
        renderTo: "topic-grid",
        width:700,
        height:500,
        frame:true,
        title:"ExtJS.ru - Browse Forums",
        trackMouseOver:false,
    autoExpandColumn: "topic",
        store: store,
        columns: [new Ext.grid.RowNumberer({width: 30}),{
            id: "topic",
            header: "Topic",
            dataIndex: "title",
            width: 420,
            renderer: renderTopic,
            sortable:true
        },{
            header: "Replies",
            dataIndex: "replycount",
            width: 70,
            align: "right",
            sortable:true
        },{
            id: "last",
            header: "Last Post",
            dataIndex: "lastpost",
            width: 150,
            renderer: renderLast,
            sortable:true
        }],
      bbar: new Ext.PagingToolbar({
        store: store,
        pageSize:500,
        displayInfo:true
      }),
      view: new Ext.ux.grid.BufferView({
        // custom row height
        rowHeight: 34,
        // render rows as they come into viewable area.
        scrollDelay: false
      })
    });

    // render functions
    function renderTopic(value, p, record){
        return String.format(
                "<b><a href="http://extjs.ru/forum/showthread.php?t={2}" target="_blank">{0}</a></b><a href="http://extjs.ru/forum/forumdisplay.php?f={3}" target="_blank">{1} Forum</a>",
                value, record.data.forumtitle, record.id, record.data.forumid);
    }
    function renderLast(value, p, r){
        return String.format("{0}<br/>by {1}", value.dateFormat("M j, Y, g:i a"), r.data["lastposter"]);
    }
});

</script> 
<div id="topic-grid"></div>
</body>
</html>



Custom Group Summary Plugin

   
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
    <link rel="stylesheet" type="text/css" href="ext-3.0.0/examples/ux/css/GroupSummary.css" />
    <script type="text/javascript" src="ext-3.0.0/examples/ux/GroupSummary.js"></script>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    Ext.QuickTips.init();
    var xg = Ext.grid;
    var reader = new Ext.data.JsonReader({
        idProperty: "taskId",
        fields: [
            {name: "projectId", type: "int"},
            {name: "project", type: "string"},
            {name: "taskId", type: "int"},
            {name: "description", type: "string"},
            {name: "estimate", type: "float"},
            {name: "rate", type: "float"},
            {name: "cost", type: "float"},
            {name: "due", type: "date", dateFormat:"m/d/Y"}
        ]
    });
    // define a custom summary function
    Ext.ux.grid.GroupSummary.Calculations["totalCost"] = function(v, record, field){
        return v + (record.data.estimate * record.data.rate);
    };
  // utilize custom extension for Group Summary
    var summary = new Ext.ux.grid.GroupSummary();
    var grid = new xg.EditorGridPanel({
        ds: new Ext.data.GroupingStore({
            reader: reader,
      // use local data
            data: app.grid.dummyData,
            sortInfo: {field: "due", direction: "ASC"},
            groupField: "project"
        }),
        columns: [
            {
                id: "description",
                header: "Task",
                width: 80,
                sortable: true,
                dataIndex: "description",
                summaryType: "count",
                hideable: false,
                summaryRenderer: function(v, params, data){
                    return ((v === 0 || v &gt; 1) ? "(" + v +" Tasks)" : "(1 Task)");
                },
                editor: new Ext.form.TextField({
                   allowBlank: false
                })
            },{
                header: "Project",
                width: 20,
                sortable: true,
                dataIndex: "project"
            },{
                header: "Due Date",
                width: 25,
                sortable: true,
                dataIndex: "due",
                summaryType: "max",
                renderer: Ext.util.Format.dateRenderer("m/d/Y"),
                editor: new Ext.form.DateField({
                    format: "m/d/Y"
                })
            },{
                header: "Estimate",
                width: 20,
                sortable: true,
                dataIndex: "estimate",
                summaryType: "sum",
                renderer : function(v){
                    return v +" hours";
                },
                editor: new Ext.form.NumberField({
                   allowBlank: false,
                   allowNegative: false,
                   style: "text-align:left"
                })
            },{
                header: "Rate",
                width: 20,
                sortable: true,
                renderer: Ext.util.Format.usMoney,
                dataIndex: "rate",
                summaryType: "average",
                editor: new Ext.form.NumberField({
                    allowBlank: false,
                    allowNegative: false,
                    style: "text-align:left"
                })
            },{
                id: "cost",
                header: "Cost",
                width: 20,
                sortable: false,
                groupable: false,
                renderer: function(v, params, record){
                    return Ext.util.Format.usMoney(record.data.estimate * record.data.rate);
                },
                dataIndex: "cost",
                summaryType: "totalCost",
                summaryRenderer: Ext.util.Format.usMoney
            }
        ],
        view: new Ext.grid.GroupingView({
            forceFit: true,
            showGroupName: false,
            enableNoGroups: false,
      enableGroupingMenu: false,
            hideGroupedColumn: true
        }),
        plugins: summary,
        tbar : [{
            text: "Toggle",
            tooltip: "Toggle the visibility of summary row",
            handler: function(){summary.toggleSummaries();}
        }],
        frame: true,
        width: 800,
        height: 450,
        clicksToEdit: 1,
        collapsible: true,
        animCollapse: false,
        trackMouseOver: false,
        //enableColumnMove: false,
        title: "Sponsored Projects",
        iconCls: "icon-grid",
        renderTo: document.body
    });
});
// set up namespace for application
Ext.ns("app.grid");
// store dummy data in the app namespace
app.grid.dummyData = [
    {projectId: 100, project: "Ext Forms: Field Anchoring", taskId: 112, description: "Integrate 2.0 Forms with 2.0 Layouts", estimate: 6, rate: 150, due:"06/24/2007"},
    {projectId: 100, project: "Ext Forms: Field Anchoring", taskId: 113, description: "Implement AnchorLayout", estimate: 4, rate: 150, due:"06/25/2007"},
    {projectId: 100, project: "Ext Forms: Field Anchoring", taskId: 114, description: "Add support for multiple types of anchors", estimate: 4, rate: 150, due:"06/27/2007"},
    {projectId: 100, project: "Ext Forms: Field Anchoring", taskId: 115, description: "Testing and debugging", estimate: 8, rate: 0, due:"06/29/2007"},
    {projectId: 101, project: "Ext Grid: Single-level Grouping", taskId: 101, description: "Add required rendering "hooks" to GridView", estimate: 6, rate: 100, due:"07/01/2007"},
    {projectId: 101, project: "Ext Grid: Single-level Grouping", taskId: 102, description: "Extend GridView and override rendering functions", estimate: 6, rate: 100, due:"07/03/2007"},
    {projectId: 101, project: "Ext Grid: Single-level Grouping", taskId: 103, description: "Extend Store with grouping functionality", estimate: 4, rate: 100, due:"07/04/2007"},
    {projectId: 101, project: "Ext Grid: Single-level Grouping", taskId: 121, description: "Default CSS Styling", estimate: 2, rate: 100, due:"07/05/2007"},
    {projectId: 101, project: "Ext Grid: Single-level Grouping", taskId: 104, description: "Testing and debugging", estimate: 6, rate: 100, due:"07/06/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 105, description: "Ext Grid plugin integration", estimate: 4, rate: 125, due:"07/01/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 106, description: "Summary creation during rendering phase", estimate: 4, rate: 125, due:"07/02/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 107, description: "Dynamic summary updates in editor grids", estimate: 6, rate: 125, due:"07/05/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 108, description: "Remote summary integration", estimate: 4, rate: 125, due:"07/05/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 109, description: "Summary renderers and calculators", estimate: 4, rate: 125, due:"07/06/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 110, description: "Integrate summaries with GroupingView", estimate: 10, rate: 125, due:"07/11/2007"},
    {projectId: 102, project: "Ext Grid: Summary Rows", taskId: 111, description: "Testing and debugging", estimate: 8, rate: 125, due:"07/15/2007"}
];
</script>
<div id="grid-example"></div>
</body>
</html>



Custom Hybrid Summary Plugin

   
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
    <!-- extensions -->
    <script type="text/javascript" src="ext-3.0.0/examples/ux/GroupSummary.js"></script>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    Ext.QuickTips.init();
    var xg = Ext.grid;
    var reader = new Ext.data.JsonReader({
        idProperty:"taskId",
        fields: [
            {name: "projectId", type: "int"},
            {name: "project", type: "string"},
            {name: "taskId", type: "int"},
            {name: "description", type: "string"},
            {name: "estimate", type: "float"},
            {name: "rate", type: "float"},
            {name: "cost", type: "float"},
            {name: "due", type: "date", dateFormat:"m/d/Y"}
        ],
    // additional configuration for remote
        root:"data",
        remoteGroup:true,
        remoteSort: true
    });
    // define a custom summary function
    Ext.ux.grid.GroupSummary.Calculations["totalCost"] = function(v, record, field){
        return v + (record.data.estimate * record.data.rate);
    };
  // utilize custom extension for Hybrid Summary
    var summary = new Ext.ux.grid.HybridSummary();
    var grid = new xg.EditorGridPanel({
        ds: new Ext.data.GroupingStore({
            reader: reader,
      // use remote data
            proxy : new Ext.data.HttpProxy({
                url: "ext-3.0.0/examples/grid/totals-hybrid.json",
                method: "GET"
            }),
            sortInfo: {field: "due", direction: "ASC"},
            groupField: "project"
        }),
        columns: [
            {
                id: "description",
                header: "Task",
                width: 80,
                sortable: true,
                dataIndex: "description",
                summaryType: "count",
                hideable: false,
                summaryRenderer: function(v, params, data){
                    return ((v === 0 || v &gt; 1) ? "(" + v +" Tasks)" : "(1 Task)");
                },
                editor: new Ext.form.TextField({
                   allowBlank: false
                })
            },{
                header: "Project",
                width: 20,
                sortable: true,
                dataIndex: "project"
            },{
                header: "Due Date",
                width: 25,
                sortable: true,
                dataIndex: "due",
                summaryType:"max",
                renderer: Ext.util.Format.dateRenderer("m/d/Y"),
                editor: new Ext.form.DateField({
                    format: "m/d/Y"
                })
            },{
                header: "Estimate",
                width: 20,
                sortable: true,
                dataIndex: "estimate",
                summaryType:"sum",
                renderer : function(v){
                    return v +" hours";
                },
                editor: new Ext.form.NumberField({
                   allowBlank: false,
                   allowNegative: false,
                    style: "text-align:left"
                })
            },{
                header: "Rate",
                width: 20,
                sortable: true,
                renderer: Ext.util.Format.usMoney,
                dataIndex: "rate",
                summaryType:"average",
                editor: new Ext.form.NumberField({
                    allowBlank: false,
                    allowNegative: false,
                    style: "text-align:left"
                })
            },{
                id: "cost",
                header: "Cost",
                width: 20,
                sortable: false,
                groupable: false,
                renderer: function(v, params, record){
                    return Ext.util.Format.usMoney(record.data.estimate * record.data.rate);
                },
                dataIndex: "cost",
                summaryType: "totalCost",
                summaryRenderer: Ext.util.Format.usMoney
            }
        ],
        view: new Ext.grid.GroupingView({
            forceFit:true,
            showGroupName: false,
            enableNoGroups:false,
      enableGroupingMenu:false,
            hideGroupedColumn: true
        }),
        plugins: summary,
        tbar : [{
            text: "Toggle",
            tooltip: "Toggle the visibility of summary row",
            handler: function(){summary.toggleSummaries();}
        }],
        frame: true,
        width: 800,
        height: 450,
        clicksToEdit: 1,
        collapsible: true,
        animCollapse: false,
        trackMouseOver: false,
        //enableColumnMove: false,
        title: "Sponsored Projects",
        iconCls: "icon-grid",
        renderTo: document.body
    });
    grid.on("afteredit", function(){
        var groupValue = "Ext Forms: Field Anchoring";
        summary.showSummaryMsg(groupValue, "Updating Summary...");
        setTimeout(function(){ // simulate server call
            // HybridSummary class implements updateSummaryData
            summary.updateSummaryData(groupValue,
                // create data object based on configured dataIndex
                {description: 22, estimate: 888, rate: 888, due: new Date(), cost: 8});
        }, 2000);
    });
  // load the remote data
    grid.store.load();
});
</script>
<div id="example-grid"></div></body>
</html>



Custom renderer function

  

<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    // NOTE: This is an example showing simple state management. During development,
    // it is generally best to disable state management as dynamically-generated ids
    // can change across page loads, leading to unpredictable results.  The developer
    // should ensure that stable state ids are set for stateful components in real apps.    
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    var myData = [
        ["3m Co",71.72,0.02,0.03,"9/1 12:00am"],
        ["Alcoa Inc",29.01,0.42,1.47,"9/1 12:00am"],
        ["Altria Group Inc",83.81,0.28,0.34,"9/1 12:00am"],
        ["American Express Company",52.55,0.01,0.02,"9/1 12:00am"],
        ["American International Group, Inc.",64.13,0.31,0.49,"9/1 12:00am"],
        ["AT&T Inc.",31.61,-0.48,-1.54,"9/1 12:00am"],
        ["Boeing Co.",75.43,0.53,0.71,"9/1 12:00am"],
        ["Caterpillar Inc.",67.27,0.92,1.39,"9/1 12:00am"],
        ["Citigroup, Inc.",49.37,0.02,0.04,"9/1 12:00am"],
        ["E.I. du Pont de Nemours and Company",40.48,0.51,1.28,"9/1 12:00am"],
        ["Exxon Mobil Corp",68.1,-0.43,-0.64,"9/1 12:00am"],
        ["General Electric Company",34.14,-0.08,-0.23,"9/1 12:00am"],
        ["General Motors Corporation",30.27,1.09,3.74,"9/1 12:00am"],
        ["Hewlett-Packard Co.",36.53,-0.03,-0.08,"9/1 12:00am"],
        ["Honeywell Intl Inc",38.77,0.05,0.13,"9/1 12:00am"],
        ["Intel Corporation",19.88,0.31,1.58,"9/1 12:00am"],
        ["International Business Machines",81.41,0.44,0.54,"9/1 12:00am"],
        ["Johnson & Johnson",64.72,0.06,0.09,"9/1 12:00am"],
        ["JP Morgan & Chase & Co",45.73,0.07,0.15,"9/1 12:00am"],
        ["McDonald\"s Corporation",36.76,0.86,2.40,"9/1 12:00am"],
        ["Merck & Co., Inc.",40.96,0.41,1.01,"9/1 12:00am"],
        ["Microsoft Corporation",25.84,0.14,0.54,"9/1 12:00am"],
        ["Pfizer Inc",27.96,0.4,1.45,"9/1 12:00am"],
        ["The Coca-Cola Company",45.07,0.26,0.58,"9/1 12:00am"],
        ["The Home Depot, Inc.",34.64,0.35,1.02,"9/1 12:00am"],
        ["The Procter & Gamble Company",61.91,0.01,0.02,"9/1 12:00am"],
        ["United Technologies Corporation",63.26,0.55,0.88,"9/1 12:00am"],
        ["Verizon Communications",35.57,0.39,1.11,"9/1 12:00am"],            
        ["Wal-Mart Stores, Inc.",45.45,0.73,1.63,"9/1 12:00am"]
    ];
    // example of custom renderer function
    function change(val){
        if(val > 0){
            return "<span style="color:green;">" + val + "</span>";
        }else if(val < 0){
            return "<span style="color:red;">" + val + "</span>";
        }
        return val;
    }
    // example of custom renderer function
    function pctChange(val){
        if(val > 0){
            return "<span style="color:green;">" + val + "%</span>";
        }else if(val < 0){
            return "<span style="color:red;">" + val + "%</span>";
        }
        return val;
    }
    // create the data store
    var store = new Ext.data.ArrayStore({
        fields: [
           {name: "company"},
           {name: "price", type: "float"},
           {name: "change", type: "float"},
           {name: "pctChange", type: "float"},
           {name: "lastChange", type: "date", dateFormat: "n/j h:ia"}
        ]
    });
    store.loadData(myData);
    // create the Grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {id:"company",header: "Company", width: 160, sortable: true, dataIndex: "company"},
            {header: "Price", width: 75, sortable: true, renderer: "usMoney", dataIndex: "price"},
            {header: "Change", width: 75, sortable: true, renderer: change, dataIndex: "change"},
            {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: "pctChange"},
            {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer("m/d/Y"), dataIndex: "lastChange"}
        ],
        stripeRows: true,
        autoExpandColumn: "company",
        height:350,
        width:600,
        title:"Array Grid"
    });
    grid.render("grid-example");
});
</script> 
<div id="grid-example"></div>
</body>
</html>



Define custom renderer for table row

   
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
</head>
<script type="text/javascript">
Ext.onReady(function() {
      var store = new Ext.data.Store({
      data: [
        [1,"A","D","2009-02-19",1,"asdf",19.95,true],
        [3,"B","E","2002-02-15",1,"asdf",14.95,1],
        [4,"C","F","2009-10-01",2,"asdf",19.95,true]
        ],
      reader: new Ext.data.ArrayReader({id:"id"}, [
        "id",
        "title",
        "director",
        {name: "released", type: "date", dateFormat: "Y-m-d"},
        "genre",
        "tagline",
        {name: "price", type: "float"},
        {name: "available", type: "bool"}
      ])
      });
    function title_tagline(val, x, store){
      return "<b>"+val+"</b><br>"+store.data.tagline;
    }
      var grid = new Ext.grid.GridPanel({
      renderTo: document.body,
      frame:true,
      title: "Movie Database",
          height:200,
          width:520,
      enableColumnMove: false,
          store: store,
          columns: [
        {header: "Title", dataIndex: "title",renderer: title_tagline},
        {header: "Director", dataIndex: "director"},
        {header: "Released", dataIndex: "released", renderer: Ext.util.Format.dateRenderer("m/d/Y")},
        {header: "Genre", dataIndex: "genre"},
        {header: "Tagline", dataIndex: "tagline"}
          ]
      });
});

</script>
<body>

</body>
</html>



Define your own render function for columns in a GridPanel

   

<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    // create the Data Store
    var store = new Ext.data.JsonStore({
        root: "topics",
        totalProperty: "totalCount",
        idProperty: "threadid",
        remoteSort: true,
        fields: [
            "title", "forumtitle", "forumid", "author",
            {name: "replycount", type: "int"},
            {name: "lastpost", mapping: "lastpost", type: "date", dateFormat: "timestamp"},
            "lastposter", "excerpt"
        ],
        // load using script tags for cross domain, if the data in on the same domain as
        // this page, an HttpProxy would be better
        proxy: new Ext.data.ScriptTagProxy({
            url: "http://extjs.ru/forum/topics-browse-remote.php"
        })
    });
    store.setDefaultSort("lastpost", "desc");

    // pluggable renders
    function renderTopic(value, p, record){
        return String.format(
                "<b><a href="http://extjs.ru/forum/showthread.php?t={2}" target="_blank">{0}</a></b><a href="http://extjs.ru/forum/forumdisplay.php?f={3}" target="_blank">{1} Forum</a>",
                value, record.data.forumtitle, record.id, record.data.forumid);
    }
    function renderLast(value, p, r){
        return String.format("{0}<br/>by {1}", value.dateFormat("M j, Y, g:i a"), r.data["lastposter"]);
    }
    var grid = new Ext.grid.GridPanel({
        width:700,
        height:500,
        title:"ExtJS.ru - Browse Forums",
        store: store,
        trackMouseOver:false,
        disableSelection:true,
        loadMask: true,
        // grid columns
        columns:[{
            id: "topic", // id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
            header: "Topic",
            dataIndex: "title",
            width: 420,
            renderer: renderTopic,
            sortable: true
        },{
            header: "Author",
            dataIndex: "author",
            width: 100,
            hidden: true,
            sortable: true
        },{
            header: "Replies",
            dataIndex: "replycount",
            width: 70,
            align: "right",
            sortable: true
        },{
            id: "last",
            header: "Last Post",
            dataIndex: "lastpost",
            width: 150,
            renderer: renderLast,
            sortable: true
        }],
        // customize view config
        viewConfig: {
            forceFit:true,
            enableRowBody:true,
            showPreview:true,
            getRowClass : function(record, rowIndex, p, store){
                if(this.showPreview){
                    p.body = "<p>"+record.data.excerpt+"</p>";
                    return "x-grid3-row-expanded";
                }
                return "x-grid3-row-collapsed";
            }
        },
        // paging bar on the bottom
        bbar: new Ext.PagingToolbar({
            pageSize: 25,
            store: store,
            displayInfo: true,
            displayMsg: "Displaying topics {0} - {1} of {2}",
            emptyMsg: "No topics to display",
            items:[
                "-", {
                pressed: true,
                enableToggle:true,
                text: "Show Preview",
                cls: "x-btn-text-icon details",
                toggleHandler: function(btn, pressed){
                    var view = grid.getView();
                    view.showPreview = pressed;
                    view.refresh();
                }
            }]
        })
    });
    // render it
    grid.render("topic-grid");
    // trigger the data store load
    store.load({params:{start:0, limit:25}});
});
</script>
<div id="topic-grid"></div>
</body>
</html>



Ext.util.Format.usMoney

  
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
<script type="text/javascript" src="ext-3.0.0/examples/ux/RowExpander.js"></script>
<style type="text/css">
        body .x-panel {
            margin-bottom:20px;
        }
        .icon-grid {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/grid.png) !important;
        }
        #button-grid .x-panel-body {
            border:1px solid #99bbe8;
            border-top:0 none;
        }
        .add {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/add.gif) !important;
        }
        .option {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/plugin.gif) !important;
        }
        .remove {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/delete.gif) !important;
        }
        .save {
            background-image:url(ext-3.0.0/examples/shared/icons/save.gif) !important;
        }
</style>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    Ext.QuickTips.init();
    var xg = Ext.grid;
    // shared reader
    var reader = new Ext.data.ArrayReader({}, [
       {name: "company"},
       {name: "price", type: "float"},
       {name: "change", type: "float"},
       {name: "pctChange", type: "float"},
       {name: "lastChange", type: "date", dateFormat: "n/j h:ia"},
       {name: "industry"},
       {name: "desc"}
    ]);
    ////////////////////////////////////////////////////////////////////////////////////////
    // Grid 3
    ////////////////////////////////////////////////////////////////////////////////////////
    var grid3 = new xg.GridPanel({
        store: new Ext.data.Store({
            reader: reader,
            data: xg.dummyData
        }),
        cm: new xg.ColumnModel([
            new xg.RowNumberer(),
            {id:"company",header: "Company", width: 40, sortable: true, dataIndex: "company"},
            {header: "Price", width: 20, sortable: true, renderer: Ext.util.Format.usMoney, dataIndex: "price"},
            {header: "Change", width: 20, sortable: true, dataIndex: "change"},
            {header: "% Change", width: 20, sortable: true, dataIndex: "pctChange"},
            {header: "Last Updated", width: 20, sortable: true, renderer: Ext.util.Format.dateRenderer("m/d/Y"), dataIndex: "lastChange"}
        ]),
        viewConfig: {
            forceFit:true
        },
        columnLines: true,
        width:600,
        height:300,
        title:"Grid with Numbered Rows and Force Fit",
        iconCls:"icon-grid",
        renderTo: document.body
    });
});

// Array data for the grids
Ext.grid.dummyData = [
    ["3m Co",71.72,0.02,0.03,"9/1 12:00am", "Manufacturing"],
    ["Alcoa Inc",29.01,0.42,1.47,"9/1 12:00am", "Manufacturing"],
    ["Altria Group Inc",83.81,0.28,0.34,"9/1 12:00am", "Manufacturing"],
    ["American Express Company",52.55,0.01,0.02,"9/1 12:00am", "Finance"],
    ["American International Group, Inc.",64.13,0.31,0.49,"9/1 12:00am", "Services"],
    ["AT&T Inc.",31.61,-0.48,-1.54,"9/1 12:00am", "Services"],
    ["Boeing Co.",75.43,0.53,0.71,"9/1 12:00am", "Manufacturing"],
    ["Caterpillar Inc.",67.27,0.92,1.39,"9/1 12:00am", "Services"],
    ["Citigroup, Inc.",49.37,0.02,0.04,"9/1 12:00am", "Finance"],
    ["E.I. du Pont de Nemours and Company",40.48,0.51,1.28,"9/1 12:00am", "Manufacturing"],
    ["Exxon Mobil Corp",68.1,-0.43,-0.64,"9/1 12:00am", "Manufacturing"],
    ["General Electric Company",34.14,-0.08,-0.23,"9/1 12:00am", "Manufacturing"],
    ["General Motors Corporation",30.27,1.09,3.74,"9/1 12:00am", "Automotive"],
    ["Hewlett-Packard Co.",36.53,-0.03,-0.08,"9/1 12:00am", "Computer"],
    ["Honeywell Intl Inc",38.77,0.05,0.13,"9/1 12:00am", "Manufacturing"],
    ["Intel Corporation",19.88,0.31,1.58,"9/1 12:00am", "Computer"],
    ["International Business Machines",81.41,0.44,0.54,"9/1 12:00am", "Computer"],
    ["Johnson & Johnson",64.72,0.06,0.09,"9/1 12:00am", "Medical"],
    ["JP Morgan & Chase & Co",45.73,0.07,0.15,"9/1 12:00am", "Finance"],
    ["McDonald\"s Corporation",36.76,0.86,2.40,"9/1 12:00am", "Food"],
    ["Merck & Co., Inc.",40.96,0.41,1.01,"9/1 12:00am", "Medical"],
    ["Microsoft Corporation",25.84,0.14,0.54,"9/1 12:00am", "Computer"],
    ["Pfizer Inc",27.96,0.4,1.45,"9/1 12:00am", "Services", "Medical"],
    ["The Coca-Cola Company",45.07,0.26,0.58,"9/1 12:00am", "Food"],
    ["The Home Depot, Inc.",34.64,0.35,1.02,"9/1 12:00am", "Retail"],
    ["The Procter & Gamble Company",61.91,0.01,0.02,"9/1 12:00am", "Manufacturing"],
    ["United Technologies Corporation",63.26,0.55,0.88,"9/1 12:00am", "Computer"],
    ["Verizon Communications",35.57,0.39,1.11,"9/1 12:00am", "Services"],
    ["Wal-Mart Stores, Inc.",45.45,0.73,1.63,"9/1 12:00am", "Retail"],
    ["Walt Disney Company (The) (Holding Company)",29.89,0.24,0.81,"9/1 12:00am", "Services"]
];
// add in some dummy descriptions
for(var i = 0; i < Ext.grid.dummyData.length; i++){
    Ext.grid.dummyData[i].push("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna.<br/><br/>Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit.");
}
</script>
</body>
</html>



Ext.ux.grid.RowExpander

   
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
<script type="text/javascript" src="ext-3.0.0/examples/ux/RowExpander.js"></script>
<style type="text/css">
        body .x-panel {
            margin-bottom:20px;
        }
        .icon-grid {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/grid.png) !important;
        }
        #button-grid .x-panel-body {
            border:1px solid #99bbe8;
            border-top:0 none;
        }
        .add {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/add.gif) !important;
        }
        .option {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/plugin.gif) !important;
        }
        .remove {
            background-image:url(ext-3.0.0/examples/shared/icons/fam/delete.gif) !important;
        }
        .save {
            background-image:url(ext-3.0.0/examples/shared/icons/save.gif) !important;
        }
</style>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    Ext.QuickTips.init();
    var xg = Ext.grid;
    // shared reader
    var reader = new Ext.data.ArrayReader({}, [
       {name: "company"},
       {name: "price", type: "float"},
       {name: "change", type: "float"},
       {name: "pctChange", type: "float"},
       {name: "lastChange", type: "date", dateFormat: "n/j h:ia"},
       {name: "industry"},
       {name: "desc"}
    ]);
    ////////////////////////////////////////////////////////////////////////////////////////
    // Grid 1
    ////////////////////////////////////////////////////////////////////////////////////////
    // row expander
    var expander = new Ext.ux.grid.RowExpander({
        tpl : new Ext.Template(
            "<p><b>Company:</b> {company}</p><br>",
            "<p><b>Summary:</b> {desc}</p>"
        )
    });
    var grid1 = new xg.GridPanel({
        store: new Ext.data.Store({
            reader: reader,
            data: xg.dummyData
        }),
        cm: new xg.ColumnModel({
            defaults: {
                width: 20,
                sortable: true
            },
            columns: [
                expander,
                {id:"company",header: "Company", width: 40, dataIndex: "company"},
                {header: "Price", renderer: Ext.util.Format.usMoney, dataIndex: "price"},
                {header: "Change", dataIndex: "change"},
                {header: "% Change", dataIndex: "pctChange"},
                {header: "Last Updated", renderer: Ext.util.Format.dateRenderer("m/d/Y"), dataIndex: "lastChange"}
            ]
        }),
        viewConfig: {
            forceFit:true
        },
        columnLines: true,
        width: 600,
        height: 300,
        plugins: expander,
        collapsible: true,
        animCollapse: false,
        title: "Expander Rows, Collapse and Force Fit",
        iconCls: "icon-grid",
        renderTo: document.body
    });

});

// Array data for the grids
Ext.grid.dummyData = [
    ["3m Co",71.72,0.02,0.03,"9/1 12:00am", "Manufacturing"],
    ["Alcoa Inc",29.01,0.42,1.47,"9/1 12:00am", "Manufacturing"],
    ["Altria Group Inc",83.81,0.28,0.34,"9/1 12:00am", "Manufacturing"],
    ["American Express Company",52.55,0.01,0.02,"9/1 12:00am", "Finance"],
    ["American International Group, Inc.",64.13,0.31,0.49,"9/1 12:00am", "Services"],
    ["AT&T Inc.",31.61,-0.48,-1.54,"9/1 12:00am", "Services"],
    ["Boeing Co.",75.43,0.53,0.71,"9/1 12:00am", "Manufacturing"],
    ["Caterpillar Inc.",67.27,0.92,1.39,"9/1 12:00am", "Services"],
    ["Citigroup, Inc.",49.37,0.02,0.04,"9/1 12:00am", "Finance"],
    ["E.I. du Pont de Nemours and Company",40.48,0.51,1.28,"9/1 12:00am", "Manufacturing"],
    ["Exxon Mobil Corp",68.1,-0.43,-0.64,"9/1 12:00am", "Manufacturing"],
    ["General Electric Company",34.14,-0.08,-0.23,"9/1 12:00am", "Manufacturing"],
    ["General Motors Corporation",30.27,1.09,3.74,"9/1 12:00am", "Automotive"],
    ["Hewlett-Packard Co.",36.53,-0.03,-0.08,"9/1 12:00am", "Computer"],
    ["Honeywell Intl Inc",38.77,0.05,0.13,"9/1 12:00am", "Manufacturing"],
    ["Intel Corporation",19.88,0.31,1.58,"9/1 12:00am", "Computer"],
    ["International Business Machines",81.41,0.44,0.54,"9/1 12:00am", "Computer"],
    ["Johnson & Johnson",64.72,0.06,0.09,"9/1 12:00am", "Medical"],
    ["JP Morgan & Chase & Co",45.73,0.07,0.15,"9/1 12:00am", "Finance"],
    ["McDonald\"s Corporation",36.76,0.86,2.40,"9/1 12:00am", "Food"],
    ["Merck & Co., Inc.",40.96,0.41,1.01,"9/1 12:00am", "Medical"],
    ["Microsoft Corporation",25.84,0.14,0.54,"9/1 12:00am", "Computer"],
    ["Pfizer Inc",27.96,0.4,1.45,"9/1 12:00am", "Services", "Medical"],
    ["The Coca-Cola Company",45.07,0.26,0.58,"9/1 12:00am", "Food"],
    ["The Home Depot, Inc.",34.64,0.35,1.02,"9/1 12:00am", "Retail"],
    ["The Procter & Gamble Company",61.91,0.01,0.02,"9/1 12:00am", "Manufacturing"],
    ["United Technologies Corporation",63.26,0.55,0.88,"9/1 12:00am", "Computer"],
    ["Verizon Communications",35.57,0.39,1.11,"9/1 12:00am", "Services"],
    ["Wal-Mart Stores, Inc.",45.45,0.73,1.63,"9/1 12:00am", "Retail"],
    ["Walt Disney Company (The) (Holding Company)",29.89,0.24,0.81,"9/1 12:00am", "Services"]
];
// add in some dummy descriptions
for(var i = 0; i < Ext.grid.dummyData.length; i++){
    Ext.grid.dummyData[i].push("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna.<br/><br/>Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit.");
}
</script>
</body>
</html>



Set different renders for columns

  
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    // NOTE: This is an example showing simple state management. During development,
    // it is generally best to disable state management as dynamically-generated ids
    // can change across page loads, leading to unpredictable results.  The developer
    // should ensure that stable state ids are set for stateful components in real apps.    
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    var myData = [
        ["3m Co",71.72,0.02,0.03,"9/1 12:00am"],
        ["Alcoa Inc",29.01,0.42,1.47,"9/1 12:00am"],
        ["Altria Group Inc",83.81,0.28,0.34,"9/1 12:00am"],
        ["American Express Company",52.55,0.01,0.02,"9/1 12:00am"],
        ["American International Group, Inc.",64.13,0.31,0.49,"9/1 12:00am"],
        ["AT&T Inc.",31.61,-0.48,-1.54,"9/1 12:00am"],
        ["Boeing Co.",75.43,0.53,0.71,"9/1 12:00am"],
        ["Caterpillar Inc.",67.27,0.92,1.39,"9/1 12:00am"],
        ["Citigroup, Inc.",49.37,0.02,0.04,"9/1 12:00am"],
        ["E.I. du Pont de Nemours and Company",40.48,0.51,1.28,"9/1 12:00am"],
        ["Exxon Mobil Corp",68.1,-0.43,-0.64,"9/1 12:00am"],
        ["General Electric Company",34.14,-0.08,-0.23,"9/1 12:00am"],
        ["General Motors Corporation",30.27,1.09,3.74,"9/1 12:00am"],
        ["Hewlett-Packard Co.",36.53,-0.03,-0.08,"9/1 12:00am"],
        ["Honeywell Intl Inc",38.77,0.05,0.13,"9/1 12:00am"],
        ["Intel Corporation",19.88,0.31,1.58,"9/1 12:00am"],
        ["International Business Machines",81.41,0.44,0.54,"9/1 12:00am"],
        ["Johnson & Johnson",64.72,0.06,0.09,"9/1 12:00am"],
        ["JP Morgan & Chase & Co",45.73,0.07,0.15,"9/1 12:00am"],
        ["McDonald\"s Corporation",36.76,0.86,2.40,"9/1 12:00am"],
        ["Merck & Co., Inc.",40.96,0.41,1.01,"9/1 12:00am"],
        ["Microsoft Corporation",25.84,0.14,0.54,"9/1 12:00am"],
        ["Pfizer Inc",27.96,0.4,1.45,"9/1 12:00am"],
        ["The Coca-Cola Company",45.07,0.26,0.58,"9/1 12:00am"],
        ["The Home Depot, Inc.",34.64,0.35,1.02,"9/1 12:00am"],
        ["The Procter & Gamble Company",61.91,0.01,0.02,"9/1 12:00am"],
        ["United Technologies Corporation",63.26,0.55,0.88,"9/1 12:00am"],
        ["Verizon Communications",35.57,0.39,1.11,"9/1 12:00am"],            
        ["Wal-Mart Stores, Inc.",45.45,0.73,1.63,"9/1 12:00am"]
    ];
    // example of custom renderer function
    function change(val){
        if(val > 0){
            return "<span style="color:green;">" + val + "</span>";
        }else if(val < 0){
            return "<span style="color:red;">" + val + "</span>";
        }
        return val;
    }
    // example of custom renderer function
    function pctChange(val){
        if(val > 0){
            return "<span style="color:green;">" + val + "%</span>";
        }else if(val < 0){
            return "<span style="color:red;">" + val + "%</span>";
        }
        return val;
    }
    // create the data store
    var store = new Ext.data.ArrayStore({
        fields: [
           {name: "company"},
           {name: "price", type: "float"},
           {name: "change", type: "float"},
           {name: "pctChange", type: "float"},
           {name: "lastChange", type: "date", dateFormat: "n/j h:ia"}
        ]
    });
    store.loadData(myData);
    // create the Grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {id:"company",header: "Company", width: 160, sortable: true, dataIndex: "company"},
            {header: "Price", width: 75, sortable: true, renderer: "usMoney", dataIndex: "price"},
            {header: "Change", width: 75, sortable: true, renderer: change, dataIndex: "change"},
            {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: "pctChange"},
            {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer("m/d/Y"), dataIndex: "lastChange"}
        ],
        stripeRows: true,
        autoExpandColumn: "company",
        height:350,
        width:600,
        title:"Array Grid"
    });
    grid.render("grid-example");
});
</script> 
<div id="grid-example"></div>
</body>
</html>



Use Ext.util.Format.dateRenderer

  
<!--
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
-->
<html>
<head>
<title>Hello World Window</title>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" />
<script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
</head>
<!-- Revised from demo code in ext3.0.0 -->
<body>
<script type="text/javascript">
/*!
 * Ext JS Library 3.0.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.ru
 * http://www.extjs.ru/license
 */
Ext.onReady(function(){
    // NOTE: This is an example showing simple state management. During development,
    // it is generally best to disable state management as dynamically-generated ids
    // can change across page loads, leading to unpredictable results.  The developer
    // should ensure that stable state ids are set for stateful components in real apps.    
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
    var myData = [
        ["3m Co",71.72,0.02,0.03,"9/1 12:00am"],
        ["Alcoa Inc",29.01,0.42,1.47,"9/1 12:00am"],
        ["Altria Group Inc",83.81,0.28,0.34,"9/1 12:00am"],
        ["American Express Company",52.55,0.01,0.02,"9/1 12:00am"],
        ["American International Group, Inc.",64.13,0.31,0.49,"9/1 12:00am"],
        ["AT&T Inc.",31.61,-0.48,-1.54,"9/1 12:00am"],
        ["Boeing Co.",75.43,0.53,0.71,"9/1 12:00am"],
        ["Caterpillar Inc.",67.27,0.92,1.39,"9/1 12:00am"],
        ["Citigroup, Inc.",49.37,0.02,0.04,"9/1 12:00am"],
        ["E.I. du Pont de Nemours and Company",40.48,0.51,1.28,"9/1 12:00am"],
        ["Exxon Mobil Corp",68.1,-0.43,-0.64,"9/1 12:00am"],
        ["General Electric Company",34.14,-0.08,-0.23,"9/1 12:00am"],
        ["General Motors Corporation",30.27,1.09,3.74,"9/1 12:00am"],
        ["Hewlett-Packard Co.",36.53,-0.03,-0.08,"9/1 12:00am"],
        ["Honeywell Intl Inc",38.77,0.05,0.13,"9/1 12:00am"],
        ["Intel Corporation",19.88,0.31,1.58,"9/1 12:00am"],
        ["International Business Machines",81.41,0.44,0.54,"9/1 12:00am"],
        ["Johnson & Johnson",64.72,0.06,0.09,"9/1 12:00am"],
        ["JP Morgan & Chase & Co",45.73,0.07,0.15,"9/1 12:00am"],
        ["McDonald\"s Corporation",36.76,0.86,2.40,"9/1 12:00am"],
        ["Merck & Co., Inc.",40.96,0.41,1.01,"9/1 12:00am"],
        ["Microsoft Corporation",25.84,0.14,0.54,"9/1 12:00am"],
        ["Pfizer Inc",27.96,0.4,1.45,"9/1 12:00am"],
        ["The Coca-Cola Company",45.07,0.26,0.58,"9/1 12:00am"],
        ["The Home Depot, Inc.",34.64,0.35,1.02,"9/1 12:00am"],
        ["The Procter & Gamble Company",61.91,0.01,0.02,"9/1 12:00am"],
        ["United Technologies Corporation",63.26,0.55,0.88,"9/1 12:00am"],
        ["Verizon Communications",35.57,0.39,1.11,"9/1 12:00am"],            
        ["Wal-Mart Stores, Inc.",45.45,0.73,1.63,"9/1 12:00am"]
    ];
    // example of custom renderer function
    function change(val){
        if(val > 0){
            return "<span style="color:green;">" + val + "</span>";
        }else if(val < 0){
            return "<span style="color:red;">" + val + "</span>";
        }
        return val;
    }
    // example of custom renderer function
    function pctChange(val){
        if(val > 0){
            return "<span style="color:green;">" + val + "%</span>";
        }else if(val < 0){
            return "<span style="color:red;">" + val + "%</span>";
        }
        return val;
    }
    // create the data store
    var store = new Ext.data.ArrayStore({
        fields: [
           {name: "company"},
           {name: "price", type: "float"},
           {name: "change", type: "float"},
           {name: "pctChange", type: "float"},
           {name: "lastChange", type: "date", dateFormat: "n/j h:ia"}
        ]
    });
    store.loadData(myData);
    // create the Grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {id:"company",header: "Company", width: 160, sortable: true, dataIndex: "company"},
            {header: "Price", width: 75, sortable: true, renderer: "usMoney", dataIndex: "price"},
            {header: "Change", width: 75, sortable: true, renderer: change, dataIndex: "change"},
            {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: "pctChange"},
            {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer("m/d/Y"), dataIndex: "lastChange"}
        ],
        stripeRows: true,
        autoExpandColumn: "company",
        height:350,
        width:600,
        title:"Array Grid"
    });
    grid.render("grid-example");
});
</script> 
<div id="grid-example"></div>
</body>
</html>