src/cm/media/js/lib/yui/yui3-3.15.0/build/datatable-body/datatable-body.js
author ymh <ymh.work@gmail.com>
Fri, 14 Mar 2014 13:16:10 +0100
changeset 611 fa66f4bb1563
parent 602 e16a97fb364a
permissions -rw-r--r--
add some more custom config and put every thing in comment in the custom.yaml template
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('datatable-body', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
View class responsible for rendering the `<tbody>` section of a table. Used as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
the default `bodyView` for `Y.DataTable.Base` and `Y.DataTable` classes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
@module datatable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
@submodule datatable-body
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
var Lang             = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
    isArray          = Lang.isArray,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    isNumber         = Lang.isNumber,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
    isString         = Lang.isString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    fromTemplate     = Lang.sub,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    htmlEscape       = Y.Escape.html,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    toArray          = Y.Array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
    bind             = Y.bind,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
    YObject          = Y.Object,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
    valueRegExp      = /\{value\}/g,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    EV_CONTENT_UPDATE = 'contentUpdate';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
View class responsible for rendering the `<tbody>` section of a table. Used as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
the default `bodyView` for `Y.DataTable.Base` and `Y.DataTable` classes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
Translates the provided `modelList` into a rendered `<tbody>` based on the data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
in the constituent Models, altered or amended by any special column
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
configurations.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
The `columns` configuration, passed to the constructor, determines which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
columns will be rendered.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
The rendering process involves constructing an HTML template for a complete row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
of data, built by concatenating a customized copy of the instance's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
`CELL_TEMPLATE` into the `ROW_TEMPLATE` once for each column.  This template is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
then populated with values from each Model in the `modelList`, aggregating a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
complete HTML string of all row and column data.  A `<tbody>` Node is then created from the markup and any column `nodeFormatter`s are applied.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
Supported properties of the column objects include:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
  * `key` - Used to link a column to an attribute in a Model.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
  * `name` - Used for columns that don't relate to an attribute in the Model
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    (`formatter` or `nodeFormatter` only) if the implementer wants a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    predictable name to refer to in their CSS.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
  * `cellTemplate` - Overrides the instance's `CELL_TEMPLATE` for cells in this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    column only.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
  * `formatter` - Used to customize or override the content value from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    Model.  These do not have access to the cell or row Nodes and should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
    return string (HTML) content.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
  * `nodeFormatter` - Used to provide content for a cell as well as perform any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
    custom modifications on the cell or row Node that could not be performed by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    `formatter`s.  Should be used sparingly for better performance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
  * `emptyCellValue` - String (HTML) value to use if the Model data for a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    column, or the content generated by a `formatter`, is the empty string,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    `null`, or `undefined`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
  * `allowHTML` - Set to `true` if a column value, `formatter`, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    `emptyCellValue` can contain HTML.  This defaults to `false` to protect
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    against XSS.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
  * `className` - Space delimited CSS classes to add to all `<td>`s in a column.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
A column `formatter` can be:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
  * a function, as described below.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
  * a string which can be:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
      * the name of a pre-defined formatter function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
        which can be located in the `Y.DataTable.BodyView.Formatters` hash using the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
        value of the `formatter` property as the index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
      * A template that can use the `{value}` placeholder to include the value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
        for the current cell or the name of any field in the underlaying model
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        also enclosed in curly braces.  Any number and type of these placeholders
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
        can be used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
Column `formatter`s are passed an object (`o`) with the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
  * `value` - The current value of the column's associated attribute, if any.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
  * `data` - An object map of Model keys to their current values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
  * `record` - The Model instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
  * `column` - The column configuration object for the current column.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
  * `className` - Initially empty string to allow `formatter`s to add CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
    classes to the cell's `<td>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
  * `rowIndex` - The zero-based row number.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
  * `rowClass` - Initially empty string to allow `formatter`s to add CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
    classes to the cell's containing row `<tr>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
They may return a value or update `o.value` to assign specific HTML content.  A
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
returned value has higher precedence.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
Column `nodeFormatter`s are passed an object (`o`) with the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
  * `value` - The current value of the column's associated attribute, if any.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
  * `td` - The `<td>` Node instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
  * `cell` - The `<div>` liner Node instance if present, otherwise, the `<td>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
    When adding content to the cell, prefer appending into this property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
  * `data` - An object map of Model keys to their current values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
  * `record` - The Model instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
  * `column` - The column configuration object for the current column.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
  * `rowIndex` - The zero-based row number.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
They are expected to inject content into the cell's Node directly, including
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
any "empty" cell content.  Each `nodeFormatter` will have access through the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
Node API to all cells and rows in the `<tbody>`, but not to the `<table>`, as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
it will not be attached yet.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
If a `nodeFormatter` returns `false`, the `o.td` and `o.cell` Nodes will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
`destroy()`ed to remove them from the Node cache and free up memory.  The DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
elements will remain as will any content added to them.  _It is highly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
advisable to always return `false` from your `nodeFormatter`s_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
@class BodyView
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
@namespace DataTable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
@extends View
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
@since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
Y.namespace('DataTable').BodyView = Y.Base.create('tableBody', Y.View, [], {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    // -- Instance properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
    HTML template used to create table cells.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    @property CELL_TEMPLATE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
    @type {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
    @default '<td {headers} class="{className}">{content}</td>'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
    CELL_TEMPLATE: '<td {headers} class="{className}">{content}</td>',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    CSS class applied to even rows.  This is assigned at instantiation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    For DataTable, this will be `yui3-datatable-even`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    @property CLASS_EVEN
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    @type {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    @default 'yui3-table-even'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    //CLASS_EVEN: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    CSS class applied to odd rows.  This is assigned at instantiation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    When used by DataTable instances, this will be `yui3-datatable-odd`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    @property CLASS_ODD
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
    @type {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    @default 'yui3-table-odd'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
    //CLASS_ODD: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    HTML template used to create table rows.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    @property ROW_TEMPLATE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
    @type {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
    @default '<tr id="{rowId}" data-yui3-record="{clientId}" class="{rowClass}">{content}</tr>'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    ROW_TEMPLATE : '<tr id="{rowId}" data-yui3-record="{clientId}" class="{rowClass}">{content}</tr>',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
    The object that serves as the source of truth for column and row data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
    This property is assigned at instantiation from the `host` property of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    the configuration object passed to the constructor.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
    @property host
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
    @type {Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
    @default (initially unset)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
    //TODO: should this be protected?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
    //host: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    HTML templates used to create the `<tbody>` containing the table rows.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
    @property TBODY_TEMPLATE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
    @type {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    @default '<tbody class="{className}">{content}</tbody>'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    @since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    TBODY_TEMPLATE: '<tbody class="{className}"></tbody>',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
    // -- Public methods ------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
    Returns the `<td>` Node from the given row and column index.  Alternately,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
    the `seed` can be a Node.  If so, the nearest ancestor cell is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    If the `seed` is a cell, it is returned.  If there is no cell at the given
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    coordinates, `null` is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    Optionally, include an offset array or string to return a cell near the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    cell identified by the `seed`.  The offset can be an array containing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    number of rows to shift followed by the number of columns to shift, or one
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    of "above", "below", "next", or "previous".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    <pre><code>// Previous cell in the previous row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    var cell = table.getCell(e.target, [-1, -1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
    // Next cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    var cell = table.getCell(e.target, 'next');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
    var cell = table.getCell(e.target, [0, 1];</pre></code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
    @method getCell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    @param {Number[]|Node} seed Array of row and column indexes, or a Node that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
        is either the cell itself or a descendant of one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
    @param {Number[]|String} [shift] Offset by which to identify the returned
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        cell Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
    @return {Node}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
    getCell: function (seed, shift) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
        var tbody = this.tbodyNode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
            row, cell, index, rowIndexOffset;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
        if (seed && tbody) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
            if (isArray(seed)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
                row = tbody.get('children').item(seed[0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
                cell = row && row.get('children').item(seed[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
            } else if (Y.instanceOf(seed, Y.Node)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
                cell = seed.ancestor('.' + this.getClassName('cell'), true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
            if (cell && shift) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
                rowIndexOffset = tbody.get('firstChild.rowIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
                if (isString(shift)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
                    // TODO this should be a static object map
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
                    switch (shift) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
                        case 'above'   : shift = [-1, 0]; break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
                        case 'below'   : shift = [1, 0]; break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
                        case 'next'    : shift = [0, 1]; break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
                        case 'previous': shift = [0, -1]; break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
                if (isArray(shift)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
                    index = cell.get('parentNode.rowIndex') +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
                                shift[0] - rowIndexOffset;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
                    row   = tbody.get('children').item(index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
                    index = cell.get('cellIndex') + shift[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
                    cell  = row && row.get('children').item(index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
        return cell || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
    Returns the generated CSS classname based on the input.  If the `host`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
    attribute is configured, it will attempt to relay to its `getClassName`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
    or use its static `NAME` property as a string base.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
    If `host` is absent or has neither method nor `NAME`, a CSS classname
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
    will be generated using this class's `NAME`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
    @method getClassName
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
    @param {String} token* Any number of token strings to assemble the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
        classname from.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
    @return {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
    getClassName: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        var host = this.host,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
            args;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
        if (host && host.getClassName) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
            return host.getClassName.apply(host, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
            args = toArray(arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
            args.unshift(this.constructor.NAME);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
            return Y.ClassNameManager.getClassName
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
                .apply(Y.ClassNameManager, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    Returns the Model associated to the row Node or id provided. Passing the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
    Node or id for a descendant of the row also works.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
    If no Model can be found, `null` is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
    @method getRecord
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
    @param {String|Node} seed Row Node or `id`, or one for a descendant of a row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
    @return {Model}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    getRecord: function (seed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
        var modelList = this.get('modelList'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
            tbody     = this.tbodyNode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
            row       = null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
            record;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
        if (tbody) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
            if (isString(seed)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
                seed = tbody.one('#' + seed);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
            if (Y.instanceOf(seed, Y.Node)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
                row = seed.ancestor(function (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
                    return node.get('parentNode').compareTo(tbody);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
                }, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
                record = row &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
                    modelList.getByClientId(row.getData('yui3-record'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
        return record || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    Returns the `<tr>` Node from the given row index, Model, or Model's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    `clientId`.  If the rows haven't been rendered yet, or if the row can't be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    found by the input, `null` is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    @method getRow
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
    @param {Number|String|Model} id Row index, Model instance, or clientId
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
    @return {Node}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
    getRow: function (id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
        var tbody = this.tbodyNode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
            row = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
        if (tbody) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
            if (id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
                id = this._idMap[id.get ? id.get('clientId') : id] || id;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
            row = isNumber(id) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
                tbody.get('children').item(id) :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
                tbody.one('#' + id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
        return row;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
    Creates the table's `<tbody>` content by assembling markup generated by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
    populating the `ROW\_TEMPLATE`, and `CELL\_TEMPLATE` templates with content
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    from the `columns` and `modelList` attributes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
    The rendering process happens in three stages:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
    1. A row template is assembled from the `columns` attribute (see
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
       `_createRowTemplate`)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    2. An HTML string is built up by concatenating the application of the data in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
       each Model in the `modelList` to the row template. For cells with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
       `formatter`s, the function is called to generate cell content. Cells
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
       with `nodeFormatter`s are ignored. For all other cells, the data value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
       from the Model attribute for the given column key is used.  The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
       accumulated row markup is then inserted into the container.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
    3. If any column is configured with a `nodeFormatter`, the `modelList` is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
       iterated again to apply the `nodeFormatter`s.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
    Supported properties of the column objects include:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
      * `key` - Used to link a column to an attribute in a Model.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
      * `name` - Used for columns that don't relate to an attribute in the Model
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
        (`formatter` or `nodeFormatter` only) if the implementer wants a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
        predictable name to refer to in their CSS.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
      * `cellTemplate` - Overrides the instance's `CELL_TEMPLATE` for cells in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
        this column only.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
      * `formatter` - Used to customize or override the content value from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
        Model.  These do not have access to the cell or row Nodes and should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
        return string (HTML) content.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
      * `nodeFormatter` - Used to provide content for a cell as well as perform
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
        any custom modifications on the cell or row Node that could not be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
        performed by `formatter`s.  Should be used sparingly for better
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
        performance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
      * `emptyCellValue` - String (HTML) value to use if the Model data for a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
        column, or the content generated by a `formatter`, is the empty string,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
        `null`, or `undefined`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
      * `allowHTML` - Set to `true` if a column value, `formatter`, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
        `emptyCellValue` can contain HTML.  This defaults to `false` to protect
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
        against XSS.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
      * `className` - Space delimited CSS classes to add to all `<td>`s in a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
        column.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    Column `formatter`s are passed an object (`o`) with the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
      * `value` - The current value of the column's associated attribute, if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
        any.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
      * `data` - An object map of Model keys to their current values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
      * `record` - The Model instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
      * `column` - The column configuration object for the current column.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
      * `className` - Initially empty string to allow `formatter`s to add CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
        classes to the cell's `<td>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
      * `rowIndex` - The zero-based row number.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
      * `rowClass` - Initially empty string to allow `formatter`s to add CSS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
        classes to the cell's containing row `<tr>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
    They may return a value or update `o.value` to assign specific HTML
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
    content.  A returned value has higher precedence.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
    Column `nodeFormatter`s are passed an object (`o`) with the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
      * `value` - The current value of the column's associated attribute, if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
        any.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
      * `td` - The `<td>` Node instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
      * `cell` - The `<div>` liner Node instance if present, otherwise, the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
        `<td>`.  When adding content to the cell, prefer appending into this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
        property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
      * `data` - An object map of Model keys to their current values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
      * `record` - The Model instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
      * `column` - The column configuration object for the current column.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
      * `rowIndex` - The zero-based row number.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
    They are expected to inject content into the cell's Node directly, including
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
    any "empty" cell content.  Each `nodeFormatter` will have access through the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
    Node API to all cells and rows in the `<tbody>`, but not to the `<table>`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
    as it will not be attached yet.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
    If a `nodeFormatter` returns `false`, the `o.td` and `o.cell` Nodes will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    `destroy()`ed to remove them from the Node cache and free up memory.  The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
    DOM elements will remain as will any content added to them.  _It is highly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
    advisable to always return `false` from your `nodeFormatter`s_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
    @method render
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
    render: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
        var table   = this.get('container'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
            data    = this.get('modelList'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
            displayCols = this.get('columns'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
            tbody   = this.tbodyNode ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
                      (this.tbodyNode = this._createTBodyNode());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
        // Needed for mutation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
        this._createRowTemplate(displayCols);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
        if (data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
            tbody.setHTML(this._createDataHTML(displayCols));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
            this._applyNodeFormatters(tbody, displayCols);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
        if (tbody.get('parentNode') !== table) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
            table.appendChild(tbody);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
        this.bindUI();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
     Refreshes the provided row against the provided model and the Array of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
     columns to be updated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
     @method refreshRow
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
     @param {Node} row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
     @param {Model} model Y.Model representation of the row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
     @param {String[]} colKeys Array of column keys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
     @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
    refreshRow: function (row, model, colKeys) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
        var col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
            cell,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
            len = colKeys.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
            i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
        for (i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
            col = this.getColumn(colKeys[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
            if (col !== null) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
                cell = row.one('.' + this.getClassName('col', col._id || col.key));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
                this.refreshCell(cell, model);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
     Refreshes the given cell with the provided model data and the provided
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
     column configuration.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
     Uses the provided column formatter if aviable.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
     @method refreshCell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
     @param {Node} cell Y.Node pointer to the cell element to be updated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
     @param {Model} [model] Y.Model representation of the row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
     @param {Object} [col] Column configuration object for the cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
     @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
    refreshCell: function (cell, model, col) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
        var content,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
            formatterFn,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
            formatterData,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
            data = model.toJSON();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
        cell = this.getCell(cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
        /* jshint -W030 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
        model || (model = this.getRecord(cell));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
        col || (col = this.getColumn(cell));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
        /* jshint +W030 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
        if (col.nodeFormatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
            formatterData = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
                cell: cell.one('.' + this.getClassName('liner')) || cell,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
                column: col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
                data: data,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
                record: model,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
                rowIndex: this._getRowIndex(cell.ancestor('tr')),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
                td: cell,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
                value: data[col.key]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
            keep = col.nodeFormatter.call(host,formatterData);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
            if (keep === false) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
                // Remove from the Node cache to reduce
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
                // memory footprint.  This also purges events,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
                // which you shouldn't be scoping to a cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
                // anyway.  You've been warned.  Incidentally,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
                // you should always return false. Just sayin.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
                cell.destroy(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
        } else if (col.formatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
            if (!col._formatterFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
                col = this._setColumnsFormatterFn([col])[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
            formatterFn = col._formatterFn || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
            if (formatterFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
                formatterData = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
                    value    : data[col.key],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
                    data     : data,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
                    column   : col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
                    record   : model,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
                    className: '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
                    rowClass : '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
                    rowIndex : this._getRowIndex(cell.ancestor('tr'))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
                // Formatters can either return a value ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
                content = formatterFn.call(this.get('host'), formatterData);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
                // ... or update the value property of the data obj passed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
                if (content === undefined) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
                    content = formatterData.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
            if (content === undefined || content === null || content === '') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
                content = col.emptyCellValue || '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
            content = data[col.key] || col.emptyCellValue || '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
        cell.setHTML(col.allowHTML ? content : Y.Escape.html(content));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
     Returns column data from this.get('columns'). If a Y.Node is provided as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
     the key, will try to determine the key from the classname
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
     @method getColumn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
     @param {String|Node} name
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
     @return {Object} Returns column configuration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
    getColumn: function (name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
        if (Y.instanceOf(name, Y.Node)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
            // get column name from node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
            name = name.get('className').match(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
                new RegExp( this.getClassName('col') +'-([^ ]*)' )
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
            )[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
        if (this.host) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
            return this.host._columnMap[name] || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
        var displayCols = this.get('columns'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
            col = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
        Y.Array.some(displayCols, function (_col) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
            if ((_col._id || _col.key) === name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
                col = _col;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
                return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
        return col;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
    // -- Protected and private methods ---------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
    Handles changes in the source's columns attribute.  Redraws the table data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
    @method _afterColumnsChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
    @param {EventFacade} e The `columnsChange` event object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
    // TODO: Preserve existing DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
    // This will involve parsing and comparing the old and new column configs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
    // and reacting to four types of changes:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
    // 1. formatter, nodeFormatter, emptyCellValue changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
    // 2. column deletions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
    // 3. column additions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
    // 4. column moves (preserve cells)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
    _afterColumnsChange: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
        this.render();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
    Handles modelList changes, including additions, deletions, and updates.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
    Modifies the existing table DOM accordingly.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
    @method _afterDataChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
    @param {EventFacade} e The `change` event from the ModelList
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
    _afterDataChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
        var type = (e.type.match(/:(add|change|remove)$/) || [])[1],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
            index = e.index,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
            displayCols = this.get('columns'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
            col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
            changed = e.changed && Y.Object.keys(e.changed),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
            key,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
            row,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
            i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
            len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
        for (i = 0, len = displayCols.length; i < len; i++ ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
            col = displayCols[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
            // since nodeFormatters typcially make changes outside of it's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
            // cell, we need to see if there are any columns that have a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
            // nodeFormatter and if so, we need to do a full render() of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
            // tbody
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
            if (col.hasOwnProperty('nodeFormatter')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
                this.render();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
                this.fire(EV_CONTENT_UPDATE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
        // TODO: if multiple rows are being added/remove/swapped, can we avoid the restriping?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
        switch (type) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
            case 'change':
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
                for (i = 0, len = displayCols.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
                    col = displayCols[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
                    key = col.key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
                    if (col.formatter && !e.changed[key]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
                        changed.push(key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
                this.refreshRow(this.getRow(e.target), e.target, changed);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
            case 'add':
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
                // we need to make sure we don't have an index larger than the data we have
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
                index =  Math.min(index, this.get('modelList').size() - 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
                // updates the columns with formatter functions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
                this._setColumnsFormatterFn(displayCols);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
                row = Y.Node.create(this._createRowHTML(e.model, index, displayCols));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
                this.tbodyNode.insert(row, index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
                this._restripe(index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
            case 'remove':
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
                this.getRow(index).remove(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
                // we removed a row, so we need to back up our index to stripe
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
                this._restripe(index - 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
            default:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
                this.render();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
        // Event fired to tell users when we are done updating after the data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
        // was changed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
        this.fire(EV_CONTENT_UPDATE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
     Toggles the odd/even classname of the row after the given index. This method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
     is used to update rows after a row is inserted into or removed from the table.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
     Note this event is delayed so the table is only restriped once when multiple
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
     rows are updated at one time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
     @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
     @method _restripe
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
     @param {Number} [index] Index of row to start restriping after
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
     @since 3.11.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
    _restripe: function (index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
        var task = this._restripeTask,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
            self;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
        // index|0 to force int, avoid NaN. Math.max() to avoid neg indexes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
        index = Math.max((index|0), 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
        if (!task) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
            self = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
            this._restripeTask = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
                timer: setTimeout(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
                    // Check for self existence before continuing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
                    if (!self || self.get('destroy') || !self.tbodyNode || !self.tbodyNode.inDoc()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
                        self._restripeTask = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
                        return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
                    var odd  = [self.CLASS_ODD, self.CLASS_EVEN],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
                        even = [self.CLASS_EVEN, self.CLASS_ODD],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
                        index = self._restripeTask.index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
                    self.tbodyNode.get('childNodes')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
                        .slice(index)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
                        .each(function (row, i) { // TODO: each vs batch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
                            row.replaceClass.apply(row, (index + i) % 2 ? even : odd);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
                        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
                    self._restripeTask = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
                }, 0),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
                index: index
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
            task.index = Math.min(task.index, index);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
    Handles replacement of the modelList.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
    Rerenders the `<tbody>` contents.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
    @method _afterModelListChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
    @param {EventFacade} e The `modelListChange` event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
    @since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
    _afterModelListChange: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
        var handles = this._eventHandles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
        if (handles.dataChange) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
            handles.dataChange.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
            delete handles.dataChange;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
            this.bindUI();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
        if (this.tbodyNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
            this.render();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
    Iterates the `modelList`, and calls any `nodeFormatter`s found in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
    `columns` param on the appropriate cell Nodes in the `tbody`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
    @method _applyNodeFormatters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
    @param {Node} tbody The `<tbody>` Node whose columns to update
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
    @param {Object[]} displayCols The column configurations
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
    _applyNodeFormatters: function (tbody, displayCols) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
        var host = this.host || this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
            data = this.get('modelList'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
            formatters = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
            linerQuery = '.' + this.getClassName('liner'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
            rows, i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
        // Only iterate the ModelList again if there are nodeFormatters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
        for (i = 0, len = displayCols.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
            if (displayCols[i].nodeFormatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
                formatters.push(i);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
        if (data && formatters.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
            rows = tbody.get('childNodes');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
            data.each(function (record, index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
                var formatterData = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
                        data      : record.toJSON(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
                        record    : record,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
                        rowIndex  : index
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
                    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
                    row = rows.item(index),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
                    i, len, col, key, cells, cell, keep;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
                if (row) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
                    cells = row.get('childNodes');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
                    for (i = 0, len = formatters.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
                        cell = cells.item(formatters[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
                        if (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
                            col = formatterData.column = displayCols[formatters[i]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
                            key = col.key || col.id;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
                            formatterData.value = record.get(key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
                            formatterData.td    = cell;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
                            formatterData.cell  = cell.one(linerQuery) || cell;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
                            keep = col.nodeFormatter.call(host,formatterData);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
                            if (keep === false) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
                                // Remove from the Node cache to reduce
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
                                // memory footprint.  This also purges events,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
                                // which you shouldn't be scoping to a cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
                                // anyway.  You've been warned.  Incidentally,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
                                // you should always return false. Just sayin.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
                                cell.destroy(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
    Binds event subscriptions from the UI and the host (if assigned).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
    @method bindUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
    bindUI: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
        var handles     = this._eventHandles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
            modelList   = this.get('modelList'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
            changeEvent = modelList.model.NAME + ':change';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
        if (!handles.columnsChange) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
            handles.columnsChange = this.after('columnsChange',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
                bind('_afterColumnsChange', this));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
        if (modelList && !handles.dataChange) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
            handles.dataChange = modelList.after(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
                ['add', 'remove', 'reset', changeEvent],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
                bind('_afterDataChange', this));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
    Iterates the `modelList` and applies each Model to the `_rowTemplate`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
    allowing any column `formatter` or `emptyCellValue` to override cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
    content for the appropriate column.  The aggregated HTML string is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
    returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
    @method _createDataHTML
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
    @param {Object[]} displayCols The column configurations to customize the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
                generated cell content or class names
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
    @return {String} The markup for all Models in the `modelList`, each applied
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
                to the `_rowTemplate`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
    _createDataHTML: function (displayCols) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
        var data = this.get('modelList'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
            html = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
        if (data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
            data.each(function (model, index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
                html += this._createRowHTML(model, index, displayCols);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
            }, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
        return html;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
    Applies the data of a given Model, modified by any column formatters and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
    supplemented by other template values to the instance's `_rowTemplate` (see
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
    `_createRowTemplate`).  The generated string is then returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
    The data from Model's attributes is fetched by `toJSON` and this data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
    object is appended with other properties to supply values to {placeholders}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
    in the template.  For a template generated from a Model with 'foo' and 'bar'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
    attributes, the data object would end up with the following properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
    before being used to populate the `_rowTemplate`:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
      * `clientID` - From Model, used the assign the `<tr>`'s 'id' attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
      * `foo` - The value to populate the 'foo' column cell content.  This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
        value will be the value stored in the Model's `foo` attribute, or the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
        result of the column's `formatter` if assigned.  If the value is '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
        `null`, or `undefined`, and the column's `emptyCellValue` is assigned,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
        that value will be used.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
      * `bar` - Same for the 'bar' column cell content.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
      * `foo-className` - String of CSS classes to apply to the `<td>`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
      * `bar-className` - Same.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
      * `rowClass`      - String of CSS classes to apply to the `<tr>`. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
        will be the odd/even class per the specified index plus any additional
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
        classes assigned by column formatters (via `o.rowClass`).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
    Because this object is available to formatters, any additional properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
    can be added to fill in custom {placeholders} in the `_rowTemplate`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
    @method _createRowHTML
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
    @param {Model} model The Model instance to apply to the row template
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
    @param {Number} index The index the row will be appearing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
    @param {Object[]} displayCols The column configurations
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
    @return {String} The markup for the provided Model, less any `nodeFormatter`s
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
    _createRowHTML: function (model, index, displayCols) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
        var data     = model.toJSON(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
            clientId = model.get('clientId'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
            values   = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
                rowId   : this._getRowId(clientId),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
                clientId: clientId,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
                rowClass: (index % 2) ? this.CLASS_ODD : this.CLASS_EVEN
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
            host = this.host || this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
            i, len, col, token, value, formatterData;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
        for (i = 0, len = displayCols.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
            col   = displayCols[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
            value = data[col.key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
            token = col._id || col.key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
            values[token + '-className'] = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
            if (col._formatterFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
                formatterData = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
                    value    : value,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
                    data     : data,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
                    column   : col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
                    record   : model,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
                    className: '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
                    rowClass : '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
                    rowIndex : index
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
                // Formatters can either return a value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
                value = col._formatterFn.call(host, formatterData);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
                // or update the value property of the data obj passed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
                if (value === undefined) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
                    value = formatterData.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   958
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   959
                values[token + '-className'] = formatterData.className;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   960
                values.rowClass += ' ' + formatterData.rowClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   961
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   962
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   963
            // if the token missing OR is the value a legit value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   964
            if (!values.hasOwnProperty(token) || data.hasOwnProperty(col.key)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   965
                if (value === undefined || value === null || value === '') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   966
                    value = col.emptyCellValue || '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   967
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   968
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   969
                values[token] = col.allowHTML ? value : htmlEscape(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   970
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   971
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   972
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   973
        // replace consecutive whitespace with a single space
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   974
        values.rowClass = values.rowClass.replace(/\s+/g, ' ');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   975
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   976
        return fromTemplate(this._rowTemplate, values);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   977
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   978
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   979
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   980
     Locates the row within the tbodyNode and returns the found index, or Null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   981
     if it is not found in the tbodyNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   982
     @param {Node} row
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   983
     @return {Number} Index of row in tbodyNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   984
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   985
    _getRowIndex: function (row) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   986
        var tbody = this.tbodyNode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   987
            index = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   988
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   989
        if (tbody && row) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   990
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   991
            //if row is not in the tbody, return
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   992
            if (row.ancestor('tbody') !== tbody) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   993
                return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   994
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   995
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   996
            // increment until we no longer have a previous node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   997
            /*jshint boss: true*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   998
            while (row = row.previous()) { // NOTE: assignment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   999
            /*jshint boss: false*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1000
                index++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1001
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1002
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1003
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1004
        return index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1005
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1006
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1007
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1008
    Creates a custom HTML template string for use in generating the markup for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1009
    individual table rows with {placeholder}s to capture data from the Models
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1010
    in the `modelList` attribute or from column `formatter`s.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1011
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1012
    Assigns the `_rowTemplate` property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1013
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1014
    @method _createRowTemplate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1015
    @param {Object[]} displayCols Array of column configuration objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1016
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1017
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1018
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1019
    _createRowTemplate: function (displayCols) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1020
        var html         = '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1021
            cellTemplate = this.CELL_TEMPLATE,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1022
            i, len, col, key, token, headers, tokenValues, formatter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1023
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1024
        this._setColumnsFormatterFn(displayCols);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1025
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1026
        for (i = 0, len = displayCols.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1027
            col     = displayCols[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1028
            key     = col.key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1029
            token   = col._id || key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1030
            formatter = col._formatterFn;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1031
            // Only include headers if there are more than one
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1032
            headers = (col._headers || []).length > 1 ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1033
                        'headers="' + col._headers.join(' ') + '"' : '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1034
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1035
            tokenValues = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1036
                content  : '{' + token + '}',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1037
                headers  : headers,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1038
                className: this.getClassName('col', token) + ' ' +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1039
                           (col.className || '') + ' ' +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1040
                           this.getClassName('cell') +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1041
                           ' {' + token + '-className}'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1042
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1043
            if (!formatter && col.formatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1044
                tokenValues.content = col.formatter.replace(valueRegExp, tokenValues.content);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1045
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1046
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1047
            if (col.nodeFormatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1048
                // Defer all node decoration to the formatter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1049
                tokenValues.content = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1050
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1051
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1052
            html += fromTemplate(col.cellTemplate || cellTemplate, tokenValues);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1053
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1054
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1055
        this._rowTemplate = fromTemplate(this.ROW_TEMPLATE, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1056
            content: html
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1057
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1058
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1059
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1060
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1061
     Parses the columns array and defines the column's _formatterFn if there
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1062
     is a formatter available on the column
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1063
     @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1064
     @method _setColumnsFormatterFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1065
     @param {Object[]} displayCols Array of column configuration objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1066
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1067
     @return {Object[]} Returns modified displayCols configuration Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1068
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1069
    _setColumnsFormatterFn: function (displayCols) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1070
        var Formatters = Y.DataTable.BodyView.Formatters,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1071
            formatter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1072
            col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1073
            i,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1074
            len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1075
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1076
        for (i = 0, len = displayCols.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1077
            col = displayCols[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1078
            formatter = col.formatter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1079
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1080
            if (!col._formatterFn && formatter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1081
                if (Lang.isFunction(formatter)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1082
                    col._formatterFn = formatter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1083
                } else if (formatter in Formatters) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1084
                    col._formatterFn = Formatters[formatter].call(this.host || this, col);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1085
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1086
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1087
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1088
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1089
        return displayCols;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1090
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1091
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1092
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1093
    Creates the `<tbody>` node that will store the data rows.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1094
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1095
    @method _createTBodyNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1096
    @return {Node}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1097
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1098
    @since 3.6.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1099
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1100
    _createTBodyNode: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1101
        return Y.Node.create(fromTemplate(this.TBODY_TEMPLATE, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1102
            className: this.getClassName('data')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1103
        }));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1104
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1105
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1106
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1107
    Destroys the instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1108
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1109
    @method destructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1110
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1111
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1112
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1113
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1114
        (new Y.EventHandle(YObject.values(this._eventHandles))).detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1115
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1116
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1117
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1118
    Holds the event subscriptions needing to be detached when the instance is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1119
    `destroy()`ed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1121
    @property _eventHandles
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1122
    @type {Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1123
    @default undefined (initially unset)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1124
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1125
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1126
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1127
    //_eventHandles: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1128
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1129
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1130
    Returns the row ID associated with a Model's clientId.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1132
    @method _getRowId
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1133
    @param {String} clientId The Model clientId
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1134
    @return {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1135
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1136
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1137
    _getRowId: function (clientId) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1138
        return this._idMap[clientId] || (this._idMap[clientId] = Y.guid());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1139
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1141
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1142
    Map of Model clientIds to row ids.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1143
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1144
    @property _idMap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1145
    @type {Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1146
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1147
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1148
    //_idMap,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1149
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1150
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1151
    Initializes the instance. Reads the following configuration properties in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1152
    addition to the instance attributes:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1153
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1154
      * `columns` - (REQUIRED) The initial column information
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1155
      * `host`    - The object to serve as source of truth for column info and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1156
                    for generating class names
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1158
    @method initializer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1159
    @param {Object} config Configuration data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1160
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1161
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1162
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1163
    initializer: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1164
        this.host = config.host;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1165
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1166
        this._eventHandles = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1167
            modelListChange: this.after('modelListChange',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1168
                bind('_afterModelListChange', this))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1169
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1170
        this._idMap = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1171
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1172
        this.CLASS_ODD  = this.getClassName('odd');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1173
        this.CLASS_EVEN = this.getClassName('even');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1174
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1175
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1177
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1178
    The HTML template used to create a full row of markup for a single Model in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1179
    the `modelList` plus any customizations defined in the column
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1180
    configurations.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1181
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1182
    @property _rowTemplate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1183
    @type {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1184
    @default (initially unset)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1185
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1186
    @since 3.5.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1187
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1188
    //_rowTemplate: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1189
},{
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1190
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1191
    Hash of formatting functions for cell contents.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1192
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1193
    This property can be populated with a hash of formatting functions by the developer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1194
    or a set of pre-defined functions can be loaded via the `datatable-formatters` module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1195
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1196
    See: [DataTable.BodyView.Formatters](./DataTable.BodyView.Formatters.html)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1197
    @property Formatters
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1198
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1199
    @since 3.8.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1200
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1201
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1202
    Formatters: {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1203
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1204
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1205
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1206
}, '@VERSION@', {"requires": ["datatable-core", "view", "classnamemanager"]});