# Selection

The Selection module adds selection capability to a list or grid. The resulting
instance(s) will include a `selection` property representing the selected items.
This mixin will also fire batched `dgrid-select` and `dgrid-deselect` events,
which will possess a `rows` property containing an array of Row objects (with
`id`, `data`, and `element`). For example:

```js
require([
    'dojo/_base/declare',
    'dgrid/OnDemandGrid',
    'dgrid/Selection'
], function (declare, OnDemandGrid, Selection) {
    var grid = new (declare([ OnDemandGrid, Selection ]))({
        selectionMode: 'single',
        // ...
    }, 'grid');
    grid.on('dgrid-select', function (event) {
        // Get the rows that were just selected
        var rows = event.rows;
        // ...

        // Iterate through all currently-selected items
        for (var id in grid.selection) {
            if (grid.selection[id]) {
                // ...
            }
        }
    });
    grid.on('dgrid-deselect', function (event) {
        // Get the rows that were just deselected
        var rows = event.rows;
        // ...
    });
});
```

## APIs

The Selection mixin supports the following additional instance properties and methods.

### Property Summary

Property | Description
-------- | -----------
`selection` | The object containing the IDs of the selected objects. The property names correspond to object IDs, and values are `true` or `false` depending on whether an item is selected.
`selectionMode` | String indicating how selection should behave in response to direct user interaction. See Selection Modes below for supported values.
`allowTextSelection` | Optional boolean indicating whether normal text selection within grid cells should be prevented.  By default, text selection is prevented unless `selectionMode` is set to `none`; setting this property to `true` or `false` will enable or disable text selection regardless of `selectionMode`.
`deselectOnRefresh`| Determines whether calls to `refresh` (including sorts) also clear the current selection; `true` by default.
`allowSelectAll`| Determines whether the "select-all" action should be permitted via a checkbox selector column or the Ctrl/Cmd+A keyboard shortcut; defaults to `false`.

### Method Summary

Method | Description
------ | -----------
`allowSelect(row)`| Returns a boolean indicating whether the given `row` should be selectable; designed to be overridden.
`select(row[, toRow])`| Programmatically selects a row or range of rows.
`deselect(row[, toRow])`| Programmatically deselects a row or range of rows.
`selectAll()`| Programmatically selects all rows in the component. Note that only rows that have actually been loaded will be represented in the `selection` object.
`clearSelection()`| Programmatically deselects all rows in the component.
`isSelected(row)`| Returns `true` if the given row is selected.

**Note:** The `select`, `deselect`, and `isSelected` methods can be passed any
type of argument acceptable to List's `row` method; see the [List](../core-components/List.md) APIs for
more information.


## Events

As indicated above, the Selection mixin will emit two custom events:

* `dgrid-select`: Emitted when one or more rows are selected
* `dgrid-deselect`: Emitted when one or more rows are deselected

Note that this means that when a user interaction results in the selection being
changed from one row to another, both events will be fired (with the
`dgrid-deselected` event firing first).

Both of these events expose the following properties (note that `rows` is
*always* an array, even if only one row was (de)selected.) :

* `grid`: The Grid (or List) instance in which the event occurred
* `rows`: Array containing any rows affected by the event
* `parentType`: If the event was triggered by user interaction, this property indicates what type of event originally triggered the event


## Selection Modes

The Selection mixin, as well as the [CellSelection](CellSelection.md) mixin which extends from
it, are capable of running in one of several different selection modes, as
specified by the `selectionMode` property:

Mode | Description
---- | -----------
`extended` | The default mode; allows multiple selection via keyboard modifiers (Shift to select ranges, Ctrl/Cmd to select/deselect multiple separate rows).  Clicks or keypresses without holding Shift or Ctrl/Cmd will select only the current target.
`multiple` | Like `extended`, except that clicks or keypresses without holding Shift or Ctrl/Cmd will add to the existing selection.
`single` | Allows only one row to be selected at a time.
`toggle` | Toggles the selected state of the row being acted upon; useful for touch input.
`none` | Does not allow direct selection of rows via keyboard or mouse events, but still allows selection via direct API calls, or via a [Selector](Selector.md) column.

### Implementing a Custom Selection Mode

Adding support for a custom selection mode is as simple as adding a single method.
For example, to add support for a custom mode named `mymode`, implement a method named `_mymodeSelectionHandler`.
This method receives 2 arguments: the event object, and the target that is being selected (a
dgrid row or cell element, depending on whether Selection or [CellSelection](CellSelection.md)
is being used).  The method should call `this.select` as appropriate based on
the details of the event.