Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / guides / grid / README.md
diff --git a/docs/guides/grid/README.md b/docs/guides/grid/README.md
new file mode 100644 (file)
index 0000000..35893b9
--- /dev/null
@@ -0,0 +1,286 @@
+# Grids
+
+The {@link Ext.grid.Panel Grid Panel} is one of the centerpieces of Ext JS. It's an incredibly versatile component that provides an easy way to display, sort, group, and edit data.
+
+## Basic Grid Panel
+
+{@img simple_grid.png Simple Grid}
+
+Let's get started by creating a basic {@link Ext.grid.Panel Grid Panel} .  Here's all you need to know to get a simple grid up and running:
+
+### Model and Store
+
+A {@link Ext.grid.Panel Grid Panel} is simply a component that displays data contained in a {@link Ext.data.Store Store}. A {@link Ext.data.Store Store} can be thought of as a collection of records, or {@link Ext.data.Model Model} instances. For more information on {@link Ext.data.Store Store}s and {@link Ext.data.Model Model}s see the [Data guide](#/guide/data).  The benefit of this setup is clear separation of concerns.  The {@link Ext.grid.Panel Grid Panel} is only concerned with displaying the data, while the {@link Ext.data.Store Store} takes care of fetching and saving the data using its {@link Ext.data.proxy.Proxy Proxy}.
+
+First we need to define a {@link Ext.data.Model Model}. A {@link Ext.data.Model Model} is just a collection of fields that represents a type of data.  Let's define a model that represents a "User":
+
+    Ext.define('User', {
+        extend: 'Ext.data.Model',
+        fields: [ 'name', 'email', 'phone' ]
+    });
+
+Next let's create a {@link Ext.data.Store Store} that contains several `User` instances.
+
+    var userStore = Ext.create('Ext.data.Store', {
+        model: 'User',
+        data: [
+            { name: 'Lisa', email: 'lisa@simpsons.com', phone: '555-111-1224' },
+            { name: 'Bart', email: 'bart@simpsons.com', phone: '555-222-1234' },
+            { name: 'Homer', email: 'home@simpsons.com', phone: '555-222-1244' },
+            { name: 'Marge', email: 'marge@simpsons.com', phone: '555-222-1254' }
+        ]
+    });
+
+For sake of ease we configured the {@link Ext.data.Store Store} to load its data inline.  In a real world application you'll usually configure the {@link Ext.data.Store Store} to use a {@link Ext.data.Proxy Proxy} to load data from the server.  See the [Data guide](#/guide/data) for more on using {@link Ext.data.Proxy Proxies}.
+
+### Grid Panel
+
+Now that we have a {@link Ext.data.Model Model} which defines our data structure, and we've loaded several {@link Ext.data.Model Model} instances into a {@link Ext.data.Store Store}, we're ready to display the data using a {@link Ext.grid.Panel Grid Panel}:
+
+    Ext.create('Ext.grid.Panel', {
+        renderTo: Ext.getBody(),
+        store: userStore,
+        width: 400,
+        height: 200,
+        title: 'Application Users',
+        columns: [
+            {
+                text: 'Name',
+                width: 100,
+                sortable: false,
+                hideable: false,
+                dataIndex: 'name'
+            },
+            {
+                text: 'Email Address',
+                width: 150,
+                dataIndex: 'email',
+                hidden: true
+            },
+            {
+                text: 'Phone Number',
+                flex: 1,
+                dataIndex: 'phone'
+            }
+        ]
+    });
+
+And that's all there is to it.  We just created a {@link Ext.grid.Panel Grid Panel} that renders itself to the body element, and we told it to get its data from the `userStore` {@link Ext.data.Store Store} that we created earlier.  Finally we defined what columns the {@link Ext.grid.Panel Grid Panel} will have, and we used the `dataIndex` property to configure which field in the `User` {@link Ext.data.Model Model} each column will get its data from.  The `Name` column has a fixed width of 100px and has sorting and hiding disabled, the `Email Address` column is hidden by default (it can be shown again by using the menu on any other column), and the `Phone Number` column flexes to fit the remainder of the {@link Ext.grid.Panel Grid Panel}'s total width.  To view this example live, see the [Simple Grid Example](guides/grid/examples/simple_grid/index.html).
+
+## Renderers
+
+You can use the `renderer` property of the column config to change the way data is displayed. A renderer is a function that modifies the underlying value and returns a new value to be displayed. Some of the most common renderers are included in {@link Ext.util.Format}, but you can write your own as well:
+
+    columns: [
+        {
+            text: 'Birth Date',
+            dataIndex: 'birthDate',
+            // format the date using a renderer from the Ext.util.Format class
+            renderer: Ext.util.Format.dateRenderer('m/d/Y')
+        },
+        {
+            text: 'Email Address',
+            dataIndex: 'email',
+            // format the email address using a custom renderer
+            renderer: function(value) {
+                return Ext.String.format('<a href="mailto:{0}">{1}</a>', value, value);
+            }
+        }
+    ]
+
+See the [Renderers Example](guides/grid/examples/renderers/index.html) for a live demo that uses custom renderers.
+
+
+## Grouping
+
+{@img grouping.png Grouping Grid}
+
+Organizing the rows in a {@link Ext.grid.Panel Grid Panel} into groups is easy, first we specify a {@link Ext.data.Store#groupField groupField} property on our store:
+
+
+    Ext.create('Ext.data.Store', {
+        model: 'Employee',
+        data: ...,
+        groupField: 'department'
+    });
+
+For more on gouping in {@link Ext.data.Store Store}s please refer to the [Data guide](#/guide/data).  Next we configure a grid with a grouping {@link Ext.grid.feature.Feature Feature} that will handle displaying the rows in groups:
+
+
+    Ext.create('Ext.grid.Panel', {
+        ...
+        features: [{ ftype: 'grouping' }]
+    });
+
+See [Grouping Grid Panel](guides/grid/examples/grouping/index.html) for a live example.
+
+
+## Selection Models
+
+Sometimes {@link Ext.grid.Panel Grid Panel}s are use only to display data on the screen, but usually it is necessary to interact with or update that data.  All {@link Ext.grid.Panel Grid Panel}s have a {@link Ext.selection.Model Selection Model} which determines how data is selected. The two main types of Selection Model are {@link Ext.selection.RowModel Row Selection Model}, where entire rows are selected, and {@link Ext.selection.CellModel Cell Selection Model}, where individual cells are selected.
+
+{@link Ext.grid.Panel Grid Panel}s use a {@link Ext.selection.RowModel Row Selection Model} by default, but it's easy to switch to a {@link Ext.selection.CellModel Cell Selection Model}:
+
+    Ext.create('Ext.grid.Panel', {
+        selType: 'cellmodel',
+        store: ...
+    });
+
+Using a {@link Ext.selection.CellModel Cell Selection Model} changes a couple of things. Firstly, clicking on a cell now selects just that cell (using a {@link Ext.selection.RowModel Row Selection Model} will select the entire row), and secondly the keyboard navigation will walk from cell to cell instead of row to row. Cell-based selection models are usually used in conjunction with editing.
+
+## Editing
+
+{@link Ext.grid.Panel Grid Panel} has build in support for editing.  We're going to look at the two main editing modes - row editing and cell editing
+
+### Cell Editing
+
+Cell editing allows you to edit the data in a {@link Ext.grid.Panel Grid Panel} one cell at a time.  The first step in implementing cell editing is to configure an editor for each {@link Ext.grid.column.Column Column} in your {@link Ext.grid.Panel Grid Panel} that should be editable.  This is done using the {@link Ext.grid.column.Column#editor editor} config.  The simplest way is to specify just the xtype of the field you want to use as an editor:
+
+    Ext.create('Ext.grid.Panel', {
+        ...
+        columns: [
+            {
+                text: 'Email Address',
+                dataIndex: 'email',
+                editor: 'textfield'
+           }
+        ]
+    });
+
+If you need more control over how the editor field behaves, the {@link Ext.grid.column.Column#editor editor} config can also take a config object for a Field.  For example if we are using a {@link Ext.form.field.Text Text Field} and we want to require a value:
+
+    columns: [
+        text: 'Name',
+        dataIndex: 'name',
+        editor: {
+            xtype: 'textfield',
+            allowBlank: false
+        }
+    [
+
+You can use any class in the `Ext.form.field` package as an editor field.  Lets suppose we want to edit a column that contains dates.  We can use a {@link Ext.form.field.Date Date Field} editor:
+
+    columns: [
+        {
+            text: 'Birth Date',
+            dataIndex: 'birthDate',
+            editor: 'datefield'
+        }
+    ]
+
+Any {@link Ext.grid.column.Column}s in a {@link Ext.grid.Panel Grid Panel} that do not have a {@link Ext.grid.column.Column#editor editor} configured will not be editable.
+
+Now that we've configured which columns we want to be editable, and the editor fields that will be used to edit the data, the next step is to specify a selection model. Let's use a {@link Ext.selection.CellModel Cell Selection Model} in our {@link Ext.grid.Panel Grid Panel} config:
+
+
+    Ext.create('Ext.grid.Panel', {
+        ...
+        selType: 'cellmodel'
+    });
+
+Finally, to enable editing we need to configure the {@link Ext.grid.Panel Grid Panel} with a {@link Ext.grid.plugin.CellEditing Cell Editing Plugin}:
+
+    Ext.create('Ext.grid.Panel', {
+        ...
+        selType: 'cellmodel',
+        plugins: [
+            Ext.create('Ext.grid.plugin.CellEditing', {
+                clicksToEdit: 1
+            })
+        ]
+    });
+
+And that's all it takes to create an editable grid using cell editing. See [Cell Editing](guides/grid/examples/cell_editing) for a working example.
+
+{@img cell_editing.png Cell Editing Grid}
+
+### Row Editing
+
+Row editing enables you to edit an entire row at a time, rather than editing cell by cell. Row editing works in exactly the same way as cell editing - all we need to do is change the plugin type to {@link Ext.grid.plugin.RowEditing} and set the selType to `rowmodel`.
+
+    Ext.create('Ext.grid.Panel', {
+        ...
+        selType: 'rowmodel',
+        plugins: [
+            Ext.create('Ext.grid.plugin.RowEditing', {
+                clicksToEdit: 1
+            })
+        ]
+    });
+
+[Row Editing - Live Example](guides/grid/examples/row_editing)
+
+{@img row_editing.png Row Editing Grid}
+
+## Paging
+
+Sometimes your data set is too large to display all on one page.  {@link Ext.grid.Panel Grid Panel} supports two different methods of paging - {@link Ext.toolbar.Paging Paging Toolbar} which loads pages using previous/next buttons, and {@link Ext.grid.PagingScroller Paging Scroller} which loads new pages inline as you scroll.
+
+### Store Setup
+
+Before we can set up either type of paging on a {@link Ext.grid.Panel Grid Panel}, we have to configure the {@link Ext.data.Store Store} to support paging.  In the below example we add a {@link Ext.data.Store#pageSize pageSize} to the {@link Ext.data.Store Store}, and we configure our {@link Ext.data.reader.Reader Reader} with a {@link Ext.data.reader.Reader#totalProperty totalProperty}:
+
+    Ext.create('Ext.data.Store', {
+        model: 'User',
+        autoLoad: true,
+        pageSize: 4,
+        proxy: {
+            type: 'ajax',
+            url : 'data/users.json',
+            reader: {
+                type: 'json',
+                root: 'users',
+                totalProperty: 'total'
+            }
+        }
+    });
+
+The {@link Ext.data.reader.Reader#totalProperty totalProperty} config tells the {@link Ext.data.reader.Reader Reader} where to get the total number of results in the JSON response.  This {@link Ext.data.Store Store} is configured to consume a JSON response that looks something like this:
+
+    {
+        "success": true,
+        "total": 12,
+        "users": [
+            { "name": "Lisa", "email": "lisa@simpsons.com", "phone": "555-111-1224" },
+            { "name": "Bart", "email": "bart@simpsons.com", "phone": "555-222-1234" },
+            { "name": "Homer", "email": "home@simpsons.com", "phone": "555-222-1244" },
+            { "name": "Marge", "email": "marge@simpsons.com", "phone": "555-222-1254" }
+        ]
+    }
+
+For more on {@link Ext.data.Store Stores}, {@link Ext.data.proxy.Proxy Proxies}, and {@link Ext.data.reader.Reader Readers} refer to the [Data Guide](#/guide/data).
+
+### Paging Toolbar
+
+Now that we've setup our {@link Ext.data.Store Store} to support paging, all that's left is to configure a {@link Ext.toolbar.Paging Paging Toolbar}.  You could put the {@link Ext.toolbar.Paging Paging Toolbar} anywhere in your application layout, but typically it is docked to the {@link Ext.grid.Panel Grid Panel}:
+
+    Ext.create('Ext.grid.Panel', {
+        store: userStore,
+        columns: ...,
+        dockedItems: [{
+            xtype: 'pagingtoolbar',
+            store: userStore,   // same store GridPanel is using
+            dock: 'bottom',
+            displayInfo: true
+        }]
+    });
+
+{@img paging_toolbar.png Paging Toolbar}
+
+[Paging Toolbar Example](guides/grid/examples/paging_toolbar/index.html)
+
+### Paging Scroller
+
+Grid supports infinite scrolling as an alternative to using a paging toolbar. Your users can scroll through thousands of records without the performance penalties of renderering all the records on screen at once. The grid should be bound to a store with a pageSize specified.
+
+    Ext.create('Ext.grid.Panel', {
+        // Use a PagingGridScroller (this is interchangeable with a PagingToolbar)
+        verticalScrollerType: 'paginggridscroller',
+        // do not reset the scrollbar when the view refreshs
+        invalidateScrollerOnRefresh: false,
+        // infinite scrolling does not support selection
+        disableSelection: true,
+        // ...
+    });
+
+[Infinite Scrolling Example](extjs/examples/grid/infinite-scroll.html)
\ No newline at end of file