/**
 * @class Ext.grid.Grid
 * @extend Ext.dataview.List
 * @xtype grid
 *
 * Grids are an excellent way of showing large amounts of tabular data on the client side.
 * Essentially a supercharged `<table>`, Grid makes it easy to fetch, sort and filter large
 * amounts of data.
 *
 * Grids are composed of two main pieces - a {@link Ext.data.Store Store} full of data and
 * a set of columns to render.
 *
 * ## A Basic Grid
 *
 *     @example packages=[ext-react]
 *     import React, { Component } from 'react';
 *     import { ExtReact, Grid, Column } from '@sencha/ext-react';
 *
 *     export default class MyExample extends Component {
 *
 *         store = new Ext.data.Store({
 *             data: [
 *                 { "name": "Lisa", "email": "[email protected]", "phone": "555-111-1224" },
 *                 { "name": "Bart", "email": "[email protected]", "phone": "555-222-1234" },
 *                 { "name": "Homer", "email": "[email protected]", "phone": "555-222-1244" },
 *                 { "name": "Marge", "email": "[email protected]", "phone": "555-222-1254" }
 *             ]
 *         });
 *
 *         render() {
 *             return (
 *                 <ExtReact>
 *                     <Grid store={this.store}>
 *                         <Column text="Name" dataIndex="name" flex="1"/>
 *                         <Column text="Email" dataIndex="email" flex="1"/>
 *                         <Column text="Phone" dataIndex="phone" flex="1"/>
 *                     </Grid>
 *                 </ExtReact>
 *             )
 *         }
 *     }
 *
 * The code above produces a simple grid with three columns. We specified a Store which will
 * load JSON data inline.
 *
 * ## Columns
 *
 * By default, each {@link Ext.grid.column.Column column} is sortable and toggles between
 * ascending and descending sorting when you click on its header. There are several basic
 * configs that can be applied to columns to change these behaviors. For example,
 * we can make the Email column hidden by default (it can be shown again by using the
 * {@link Ext.grid.plugin.ViewOptions ViewOptions} plugin). See the
 * {@link Ext.grid.column.Column column class} for more details.
 *
 * A top-level column definition may contain a `columns` configuration. This means that the
 * resulting header will be a group header, and will contain the child columns.
 *
 *     @example packages=[ext-react]
 *     import React, { Component } from 'react'
 *     import { ExtReact, Grid, Column } from '@sencha/ext-react';
 *
 *     export default class MyExample extends Component {
 *
 *         store = new Ext.data.Store({
 *             data: [
 *                 { "name": "Lisa", "email": "[email protected]", "phone": "555-111-1224" },
 *                 { "name": "Bart", "email": "[email protected]", "phone": "555-222-1234" },
 *                 { "name": "Homer", "email": "[email protected]", "phone": "555-222-1244" },
 *                 { "name": "Marge", "email": "[email protected]", "phone": "555-222-1254" }
 *             ]
 *         });
 *
 *         render() {
 *             return (
 *                 <ExtReact>
 *                     <Grid store={this.store}>
 *                         <Column text="Name" dataIndex="name" flex="1"/>
 *                         <Column text="Email" dataIndex="email" flex="1" hidden="true"/>
 *                         <Column text="Phone" dataIndex="phone" flex="1"/>
 *                     </Grid>
 *                 </ExtReact>
 *             )
 *         }
 *     }
 *
 * ## Rows and Cells
 *
 * Grid extends the `{@link Ext.dataview.List List}` component and connects records in the
 * store to `{@link Ext.grid.Row row components}` for the list's items. The Row component
 * utilizes the configs of the grid's {@link Ext.grid.column.Column columns} to create the
 * appropriate type of {@link Ext.grid.cell.Base cells}. Essentially, a Row is a container
 * for {@link Ext.Widget Cell widgets}.
 *
 * For the most part, configuring a grid is about configuring the columns and their cells.
 * There are several built-in column types to display specific types of data:
 *
 *  - {@link Ext.grid.column.Boolean} for true/false values.
 *  - {@link Ext.grid.column.Date} for date/time values.
 *  - {@link Ext.grid.column.Number} for numeric values.
 *
 * These columns specify (via their {@link Ext.grid.column.Column#cell cell config}) one
 * of these basic cell widget types:
 *
 *  - {@link Ext.grid.cell.Boolean}
 *  - {@link Ext.grid.cell.Date}
 *  - {@link Ext.grid.cell.Number}
 *
 * In addition to the above basic cell types, there are two other useful cell types to
 * know about:
 *
 *  - {@link Ext.grid.cell.Text} is the base class for the boolean, date and number cell
 *    classes. It is useful when a cell contains only text.
 *  - {@link Ext.grid.cell.Widget} is a cell class that manages a single child item (either
 *    a {@link Ext.Component component} or a {@link Ext.Widget widget}). The child item is
 *    configured using the `{@link Ext.grid.cell.Widget#widget widget config}`. The most
 *    important part of this config is the `xtype` of the child item to create.
 *
 * ## Renderers and Templates
 *
 * Columns provide two other mechanisms to format their cell content:
 *
 *  - {@link Ext.grid.column.Column#renderer}
 *  - {@link Ext.grid.column.Column#tpl}
 *
 * These column configs are processed by the {@link Ext.grid.column.Cell default cell type}
 * for a column. These configs have some downsides compared to data binding but are provided
 * for compatibility with previous releases.
 *
 *  - Renderers and templates must update the cell content when _any_ field changes. They
 *    cannot assume that only changes to the dataIndex will affect the rendering. Using
 *    data binding, only the configs affected by the changed data will be updated.
 *  - Constructing HTML blocks in code (even in a template) is a common cause of security
 *    problems such as XSS attacks.
 *
 * ## Sorting & Filtering
 *
 * Every grid is attached to a {@link Ext.data.Store Store}, which provides multi-sort and
 * filtering capabilities. It's easy to set up a grid to be sorted from the start:
 *
 *     store: {
 *         fields: ['name', 'email', 'phone'],
 *         sorters: ['name', 'phone']
 *     },
 *
 * Sorting at run time is easily accomplished by simply clicking each column header. If you
 * need to perform sorting on more than one field at run time it's easy to do so by adding
 * new sorters to the store:
 *
 *     myGrid.store.sort([
 *         { property: 'name',  direction: 'ASC' },
 *         { property: 'email', direction: 'DESC' }
 *     ]);
 *
 * See {@link Ext.data.Store} for examples of filtering.
 *
 * ## Plugins
 *
 * Grid supports addition of extra functionality through plugins:
 *
 * - {@link Ext.grid.plugin.ViewOptions ViewOptions} - adds the ability to show/hide
 *  columns and reorder them.
 *
 * - {@link Ext.grid.plugin.ColumnResizing ColumnResizing} - allows for the ability to
 *  resize columns.
 *
 * - {@link Ext.grid.plugin.Editable Editable} - editing grid contents one row at a time.
 *
 * - {@link Ext.grid.plugin.MultiSelection MultiSelection} - selecting and deleting several
 *   rows at a time.
 *
 * - {@link Ext.grid.plugin.PagingToolbar PagingToolbar} - adds a toolbar at the bottom of
 *   the grid that allows you to quickly navigate to another page of data.
 *
 * - {@link Ext.grid.plugin.SummaryRow SummaryRow} - adds and pins an additional row to the
 *   top of the grid that enables you to display summary data.
 */
 
/**
 * @cfg {Object} [selectable]
 * A configuration object which allows passing of configuration options to create or
 * reconfigure a {@link Ext.dataview.selection.Model selection model}.
 *
 * May contain the following options:
 *
 *     - mode `'single'`, `'multi'` Allow selection of only a single or multiple *records*.
 *     This is only valid when selecting {@link #cfg!rows}.
 *     - deselectable Configure as false to disallow deselecting down to zero selected *records*.
 *     This is only valid when selecting {@link #cfg!rows}.
 *     - drag `true` or `false` to allow drag gestures to swipt a rage of cells or rows.
 *     - columns `true` to enable column selection by clicking on headers. Defaults to `false`
 *     - cells `true` to enable cell selection by clicking or dragging on cells. Defaults to `false`
 *     - rows Set to `false` to disable selecting rows. Defaults to `true`
 *     - checkbox `true` to add a checkbox column to display selected state. `'only'` to indicate
 *     that only clicks on the checkbox affect row selected state.
 *     - extensible `true` to enable the selection to be extended either in the `X` or `Y` axis
 *     or `'x'` or `'y'` to configure
 */
 
/**
 * @cfg {Boolean} [reserveScrollbar=false]
 * *only meaningful on platforms which has space-consuming scroll bars*
 *
 * Configure as `true` to leave space for a scrollbar to appear even if the content does not
 * overflow.
 *
 * This is useful for trees which may expand and collapse causing visual flickering
 * when scrollbars appear of disappear.
 */
 
/**
 * @cfg {Boolean} [infinite=true]
 * This List configuration should always be set to true on a Grid.
 * @hide
 */
 
/**
 * @cfg {Ext.grid.column.Column} [columns=null]
 * One or more {@link Ext.grid.column.Column Columns} providing the header text for the
 * column, a column menu, optional column header tools, and a definition of where the
 * data for that column comes from.
 *
 * Example snippet:
 *
 *     <Grid title="Stock Prices" store={this.store} shadow grouped>
 *         <Column text="Company" dataIndex="name" width="150"/>
 *         <Column text="Price" width="85" dataIndex="price" formatter='usMoney'/>
 *         <Column text="Change" width="100" dataIndex="priceChange" tpl={this.signTpl.bind(this, 'priceChange', '0.00')} cell={{ encodeHtml: false }}/>
 *         <Column text="% Change" dataIndex="priceChangePct" tpl={this.signTpl.bind(this, 'priceChangePct', '0.00%')} cell={{ encodeHtml: false }}/>
 *         <Column text="Last Updated" width="125" dataIndex="lastChange" formatter='date("m/d/Y")'/>
 *     </Grid>
 *
 * NOTE: The Column component or any column sub-component may be used.  i.e.:
 * {@link Ext.grid.column.Column GridColumn}  
 * 
 * {@link Ext.grid.column.Boolean BooleanColumn}  
 * 
 * {@link Ext.grid.column.Check CheckColumn}  
 * 
 * {@link Ext.grid.column.Date DateColumn}  
 * 
 * {@link Ext.grid.column.Number NumberColumn}  
 * 
 * {@link Ext.grid.column.RowNumberer RowNumberer}  
 * 
 * {@link Ext.grid.column.Text}  
 * 
 * {@link Ext.grid.column.Tree TreeColumn}
 *
 * @accessor
 * @react-child
 */
 
/**
 * @cfg {Object} [columnMenu]
 * This is a config object which is used by columns in this grid to create their
 * header menus.
 *
 * The default column menu contains the following items.
 *
 * - A "Sort Ascending" menu item
 * - A "Sort Descending" menu item
 * - A Columns menu item with each of the columns in a sub-menu of check items
 *   that is used to hide or show each column.
 * - A "Group by this field" menu item to enable grouping.
 * - A "Show in groups" check menu item to enable/disable grouping.
 *
 * These items have {@link #cfg!weight} of `-100`, `-90` and `-80` respectively to
 * place them at the start of the menu.
 *
 * This can be configured as `null` to prevent columns from showing a column menu.
 * @accessor
 */
 
/**
 * @cfg {Boolean} [hideHeaders=false]
 * `true` to hide the grid column headers.
 *
 * @accessor
 * @since 6.0.1
 */
 
/**
 * @cfg {Boolean} [striped=true]
 * @inheritdoc
 * @accessor
 */
 
/**
 * @cfg {String} [title='']
 * The title that will be displayed in the TitleBar at the top of this Grid.
 * @accessor
 */
 
/**
 * @cfg {Boolean} [sortable=true]
 * Configure as `false` to disable column sorting via clicking the header and via
 * the Sorting menu items.
 * @accessor
 */
 
/**
 * @cfg {Boolean} [multiColumnSort=false]
 * Configure as `true` to have columns remember their sorted state after other
 * columns have been clicked upon to sort.
 *
 * As subsequent columns are clicked upon, they become the new primary sort key.
 *
 * The maximum number of sorters allowed in a Store is configurable via its
 * underlying data collection. See {@link Ext.util.Collection#multiSortLimit}
 * @accessor
 */
 
/**
 * @cfg {Boolean} [columnLines=null]
 * Configure as `true` to display lines between grid cells.
 * @accessor
 */
 
/**
 * @cfg {Boolean} [enableColumnMove=true]
 * Set to `false` to disable column reorder.
 * 
 * **Note**: if `gridviewoptions` plugin is enabled on grids gets 
 * precedence over `enableColumnMove` for touch supported device.
 */
 
/**
 * @cfg {Object[]} [data=null]
 * An array of records to display. Use in place of {@link #store} when fetching data directly
 * or using static data rather than fetching data with an ExtReact proxy.
 * 
 *      <Grid 
 *          data={[
 *              { name: 'Apple', symbol: 'AAPL' },
 *              { name: 'Microsoft', symbol: 'MSFT' },
 *              { name: 'Oracle', symbol: 'ORCL' }
 *          ]}
 *      >
 *          <Column text="Name" dataIndex="name"/>
 *          <Column text="Symbol" dataIndex="symbol"/>
 *      </Grid>
 */
 
/**
 * @event columnadd
 * Fires whenever a column is added to the Grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The added column.
 * @param {Number} index The index of the added column.
 */
 
/**
 * @event columnmove
 * Fires whenever a column is moved in the grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The moved column.
 * @param {Number} fromIndex The index the column was moved from.
 * @param {Number} toIndex The index the column was moved to.
 */
 
/**
 * @event columnremove
 * Fires whenever a column is removed from the Grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The removed column.
 */
 
/**
 * @event columnshow
 * Fires whenever a column is shown in the Grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The shown column.
 */
 
/**
 * @event columnhide
 * Fires whenever a column is hidden in the Grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The shown column.
 */
 
/**
 * @event columnresize
 * Fires whenever a column is resized in the Grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The resized column.
 * @param {Number} width The new column width.
 */
 
/**
 * @event columnsort
 * Fires whenever a column is sorted in the Grid.
 * @param {Ext.grid.Grid} this The Grid instance.
 * @param {Ext.grid.column.Column} column The sorted column.
 * @param {String} direction The direction of the sort on this Column. Either 'asc' or 'desc'.
 */
 
/**
 * @event beforecomplete
 * Fires after a change has been made to the field, but before the change is reflected in the
 * underlying field.  Saving the change to the field can be canceled by returning false from
 * the handler of this event. Note that if the value has not changed and ignoreNoChange = true,
 * the editing will still end but this event will not fire since no edit actually occurred.
 * @param {Ext.Editor} editor 
 * @param {Object} value The current field value
 * @param {Object} startValue The original field value
 * @param {Ext.grid.Location} The location where actionable mode was successfully started
 * @since 7.0
 */
 
/**
 * @event canceledit
 * Fires after editing has been canceled and the editor's value has been reset.
 * @param {Ext.Editor} editor 
 * @param {Object} value The user-entered field value that was discarded
 * @param {Object} startValue The original field value that was set back into the editor after
 * cancel
 * @since 7.0
 */
 
/**
 * @event complete
 * Fires after editing is complete and any changed value has been written to the underlying
 * field.
 * @param {Ext.Editor} editor 
 * @param {Object} value The current field value
 * @param {Object} startValue The original field value
 * @param {Ext.grid.Location} The location where actionable mode was successfully started
 * @since 7.0
 */
 
/**
 * @event startedit
 * Fires when this editor is displayed
 * @param {Ext.Editor} editor 
 * @param {Ext.dom.Element} boundEl The underlying element bound to this editor
 * @param {Object} value The starting field value
 * @param {Ext.grid.Location} The location where actionable mode was successfully started
 * @since 7.0
 */
 
/**
 * @event specialkey
 * Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed. You can
 * check
 * {@link Ext.event.Event#getKey} to determine which key was pressed.
 * @param {Ext.Editor} editor 
 * @param {Ext.form.field.Field} field The field attached to this editor
 * @param {Ext.event.Event} event The event object
 * @since 7.0
 */
 
/**
 * @event beforestartedit
 * Fires when editing is initiated, but before the value changes.  Editing can be canceled by
 * returning false from the handler of this event.
 * @param {Ext.Editor} editor 
 * @param {Ext.dom.Element} boundEl The underlying element bound to this editor
 * @param {Object} value The field value being set
 * @param {Ext.grid.Location} The location where actionable mode was successfully started
 * @since 7.0
 */
 
/**
 * @method getSelection
 * Returns the grid's selection if {@link Ext.grid.selection.Model#cfg!mode mode} is single 
 * @return {Ext.data.Model} returns selected record if selectable is rows
 * @return {Ext.grid.column.Column} returns selected column if selectable is columns
 * @return {Ext.data.Model} returns selected record if selectable is cells
 * 
 * Returns the last selected column/cell's record/row's record based on selectable
 * if {@link Ext.grid.selection.Model#cfg!mode mode} is multi
 */