src/cm/media/js/lib/yui/yui_3.10.3/build/datatable-body/datatable-body-debug.js
author gibus
Tue, 11 Feb 2014 12:33:25 +0100
changeset 572 93383e54e042
parent 525 89ef5ed3c48b
permissions -rw-r--r--
Font size for piwik optout iframe.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
/*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
YUI 3.10.3 (build 2fb5187)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
Copyright 2013 Yahoo! Inc. All rights reserved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
Licensed under the BSD License.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
http://yuilibrary.com/license/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
YUI.add('datatable-body', function (Y, NAME) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
View class responsible for rendering the `<tbody>` section of a table. Used as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
the default `bodyView` for `Y.DataTable.Base` and `Y.DataTable` classes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
@module datatable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
@submodule datatable-body
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
@since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
var Lang         = Y.Lang,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
    isArray      = Lang.isArray,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
    isNumber     = Lang.isNumber,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
    isString     = Lang.isString,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
    fromTemplate = Lang.sub,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
    htmlEscape   = Y.Escape.html,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
    toArray      = Y.Array,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
    bind         = Y.bind,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
    YObject      = Y.Object,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
    valueRegExp  = /\{value\}/g;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
View class responsible for rendering the `<tbody>` section of a table. Used as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
the default `bodyView` for `Y.DataTable.Base` and `Y.DataTable` classes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
Translates the provided `modelList` into a rendered `<tbody>` based on the data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
in the constituent Models, altered or ammended by any special column
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
configurations.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
The `columns` configuration, passed to the constructor, determines which
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
columns will be rendered.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
The rendering process involves constructing an HTML template for a complete row
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
of data, built by concatenating a customized copy of the instance's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
`CELL_TEMPLATE` into the `ROW_TEMPLATE` once for each column.  This template is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
then populated with values from each Model in the `modelList`, aggregating a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
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.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
Supported properties of the column objects include:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
  * `key` - Used to link a column to an attribute in a Model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
  * `name` - Used for columns that don't relate to an attribute in the Model
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
    (`formatter` or `nodeFormatter` only) if the implementer wants a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
    predictable name to refer to in their CSS.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
  * `cellTemplate` - Overrides the instance's `CELL_TEMPLATE` for cells in this
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
    column only.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
  * `formatter` - Used to customize or override the content value from the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
    Model.  These do not have access to the cell or row Nodes and should
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
    return string (HTML) content.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
  * `nodeFormatter` - Used to provide content for a cell as well as perform any
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
    custom modifications on the cell or row Node that could not be performed by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
    `formatter`s.  Should be used sparingly for better performance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
  * `emptyCellValue` - String (HTML) value to use if the Model data for a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
    column, or the content generated by a `formatter`, is the empty string,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
    `null`, or `undefined`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
  * `allowHTML` - Set to `true` if a column value, `formatter`, or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
    `emptyCellValue` can contain HTML.  This defaults to `false` to protect
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
    against XSS.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
  * `className` - Space delimited CSS classes to add to all `<td>`s in a column.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
A column `formatter` can be:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
  * a function, as described below.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
  * a string which can be:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
      * the name of a pre-defined formatter function
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
        which can be located in the `Y.DataTable.BodyView.Formatters` hash using the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
        value of the `formatter` property as the index.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
      * A template that can use the `{value}` placeholder to include the value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
        for the current cell or the name of any field in the underlaying model
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
        also enclosed in curly braces.  Any number and type of these placeholders
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
        can be used.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
Column `formatter`s are passed an object (`o`) with the following properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
  * `value` - The current value of the column's associated attribute, if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
  * `data` - An object map of Model keys to their current values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
  * `record` - The Model instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
  * `column` - The column configuration object for the current column.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
  * `className` - Initially empty string to allow `formatter`s to add CSS
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
    classes to the cell's `<td>`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
  * `rowIndex` - The zero-based row number.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
  * `rowClass` - Initially empty string to allow `formatter`s to add CSS
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
    classes to the cell's containing row `<tr>`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
They may return a value or update `o.value` to assign specific HTML content.  A
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
returned value has higher precedence.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
Column `nodeFormatter`s are passed an object (`o`) with the following
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
  * `value` - The current value of the column's associated attribute, if any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
  * `td` - The `<td>` Node instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
  * `cell` - The `<div>` liner Node instance if present, otherwise, the `<td>`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
    When adding content to the cell, prefer appending into this property.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
  * `data` - An object map of Model keys to their current values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
  * `record` - The Model instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
  * `column` - The column configuration object for the current column.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
  * `rowIndex` - The zero-based row number.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
They are expected to inject content into the cell's Node directly, including
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
any "empty" cell content.  Each `nodeFormatter` will have access through the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
Node API to all cells and rows in the `<tbody>`, but not to the `<table>`, as
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
it will not be attached yet.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
If a `nodeFormatter` returns `false`, the `o.td` and `o.cell` Nodes will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
`destroy()`ed to remove them from the Node cache and free up memory.  The DOM
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
elements will remain as will any content added to them.  _It is highly
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
advisable to always return `false` from your `nodeFormatter`s_.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
@class BodyView
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
@namespace DataTable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
@extends View
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
@since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
**/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
Y.namespace('DataTable').BodyView = Y.Base.create('tableBody', Y.View, [], {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
    // -- Instance properties -------------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
    HTML template used to create table cells.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
    @property CELL_TEMPLATE
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
    @type {HTML}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
    @default '<td {headers} class="{className}">{content}</td>'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
    CELL_TEMPLATE: '<td {headers} class="{className}">{content}</td>',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
    CSS class applied to even rows.  This is assigned at instantiation.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
    For DataTable, this will be `yui3-datatable-even`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
    @property CLASS_EVEN
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
    @type {String}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
    @default 'yui3-table-even'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
    //CLASS_EVEN: null
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
    CSS class applied to odd rows.  This is assigned at instantiation.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
    When used by DataTable instances, this will be `yui3-datatable-odd`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
    @property CLASS_ODD
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
    @type {String}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
    @default 'yui3-table-odd'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
    //CLASS_ODD: null
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
    HTML template used to create table rows.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
    @property ROW_TEMPLATE
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
    @type {HTML}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
    @default '<tr id="{rowId}" data-yui3-record="{clientId}" class="{rowClass}">{content}</tr>'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
    ROW_TEMPLATE : '<tr id="{rowId}" data-yui3-record="{clientId}" class="{rowClass}">{content}</tr>',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
    The object that serves as the source of truth for column and row data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
    This property is assigned at instantiation from the `host` property of
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
    the configuration object passed to the constructor.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
    @property host
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
    @type {Object}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
    @default (initially unset)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
    //TODO: should this be protected?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
    //host: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
    HTML templates used to create the `<tbody>` containing the table rows.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
    @property TBODY_TEMPLATE
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
    @type {HTML}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
    @default '<tbody class="{className}">{content}</tbody>'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
    @since 3.6.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
    TBODY_TEMPLATE: '<tbody class="{className}"></tbody>',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
    // -- Public methods ------------------------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
    Returns the `<td>` Node from the given row and column index.  Alternately,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
    the `seed` can be a Node.  If so, the nearest ancestor cell is returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
    If the `seed` is a cell, it is returned.  If there is no cell at the given
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
    coordinates, `null` is returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
    Optionally, include an offset array or string to return a cell near the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
    cell identified by the `seed`.  The offset can be an array containing the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
    number of rows to shift followed by the number of columns to shift, or one
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
    of "above", "below", "next", or "previous".
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
    <pre><code>// Previous cell in the previous row
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
    var cell = table.getCell(e.target, [-1, -1]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
    // Next cell
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
    var cell = table.getCell(e.target, 'next');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
    var cell = table.getCell(e.taregt, [0, 1];</pre></code>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
    @method getCell
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
    @param {Number[]|Node} seed Array of row and column indexes, or a Node that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
        is either the cell itself or a descendant of one.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
    @param {Number[]|String} [shift] Offset by which to identify the returned
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
        cell Node
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
    @return {Node}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
    getCell: function (seed, shift) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
        var tbody = this.tbodyNode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
            row, cell, index, rowIndexOffset;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
        if (seed && tbody) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
            if (isArray(seed)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
                row = tbody.get('children').item(seed[0]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
                cell = row && row.get('children').item(seed[1]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
            } else if (Y.instanceOf(seed, Y.Node)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
                cell = seed.ancestor('.' + this.getClassName('cell'), true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
            if (cell && shift) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
                rowIndexOffset = tbody.get('firstChild.rowIndex');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
                if (isString(shift)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
                    // TODO this should be a static object map
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
                    switch (shift) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
                        case 'above'   : shift = [-1, 0]; break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
                        case 'below'   : shift = [1, 0]; break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
                        case 'next'    : shift = [0, 1]; break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
                        case 'previous': shift = [0, -1]; break;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
                if (isArray(shift)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
                    index = cell.get('parentNode.rowIndex') +
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
                                shift[0] - rowIndexOffset;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
                    row   = tbody.get('children').item(index);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
                    index = cell.get('cellIndex') + shift[1];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
                    cell  = row && row.get('children').item(index);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
        return cell || null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
    Returns the generated CSS classname based on the input.  If the `host`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
    attribute is configured, it will attempt to relay to its `getClassName`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
    or use its static `NAME` property as a string base.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
    If `host` is absent or has neither method nor `NAME`, a CSS classname
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
    will be generated using this class's `NAME`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
    @method getClassName
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
    @param {String} token* Any number of token strings to assemble the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
        classname from.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
    @return {String}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
    getClassName: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
        var host = this.host,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
            args;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
        if (host && host.getClassName) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
            return host.getClassName.apply(host, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
        } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
            args = toArray(arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
            args.unshift(this.constructor.NAME);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
            return Y.ClassNameManager.getClassName
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
                .apply(Y.ClassNameManager, args);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
    Returns the Model associated to the row Node or id provided. Passing the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
    Node or id for a descendant of the row also works.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
    If no Model can be found, `null` is returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
    @method getRecord
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
    @param {String|Node} seed Row Node or `id`, or one for a descendant of a row
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
    @return {Model}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
    getRecord: function (seed) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
        var modelList = this.get('modelList'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
            tbody     = this.tbodyNode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
            row       = null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
            record;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
        if (tbody) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
            if (isString(seed)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
                seed = tbody.one('#' + seed);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
            if (Y.instanceOf(seed, Y.Node)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
                row = seed.ancestor(function (node) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
                    return node.get('parentNode').compareTo(tbody);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
                }, true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
                record = row &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
                    modelList.getByClientId(row.getData('yui3-record'));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
        return record || null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
    Returns the `<tr>` Node from the given row index, Model, or Model's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
    `clientId`.  If the rows haven't been rendered yet, or if the row can't be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
    found by the input, `null` is returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
    @method getRow
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
    @param {Number|String|Model} id Row index, Model instance, or clientId
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
    @return {Node}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
    getRow: function (id) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
        var tbody = this.tbodyNode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
            row = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
        if (tbody) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
            if (id) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
                id = this._idMap[id.get ? id.get('clientId') : id] || id;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
            row = isNumber(id) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
                tbody.get('children').item(id) :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
                tbody.one('#' + id);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
        return row;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
    Creates the table's `<tbody>` content by assembling markup generated by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
    populating the `ROW\_TEMPLATE`, and `CELL\_TEMPLATE` templates with content
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
    from the `columns` and `modelList` attributes.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
    The rendering process happens in three stages:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
    1. A row template is assembled from the `columns` attribute (see
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
       `_createRowTemplate`)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
    2. An HTML string is built up by concatening the application of the data in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
       each Model in the `modelList` to the row template. For cells with
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
       `formatter`s, the function is called to generate cell content. Cells
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
       with `nodeFormatter`s are ignored. For all other cells, the data value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
       from the Model attribute for the given column key is used.  The
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
       accumulated row markup is then inserted into the container.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
    3. If any column is configured with a `nodeFormatter`, the `modelList` is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
       iterated again to apply the `nodeFormatter`s.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
    Supported properties of the column objects include:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
      * `key` - Used to link a column to an attribute in a Model.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
      * `name` - Used for columns that don't relate to an attribute in the Model
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
        (`formatter` or `nodeFormatter` only) if the implementer wants a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
        predictable name to refer to in their CSS.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
      * `cellTemplate` - Overrides the instance's `CELL_TEMPLATE` for cells in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
        this column only.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
      * `formatter` - Used to customize or override the content value from the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
        Model.  These do not have access to the cell or row Nodes and should
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
        return string (HTML) content.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
      * `nodeFormatter` - Used to provide content for a cell as well as perform
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
        any custom modifications on the cell or row Node that could not be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
        performed by `formatter`s.  Should be used sparingly for better
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
        performance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
      * `emptyCellValue` - String (HTML) value to use if the Model data for a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
        column, or the content generated by a `formatter`, is the empty string,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
        `null`, or `undefined`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
      * `allowHTML` - Set to `true` if a column value, `formatter`, or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
        `emptyCellValue` can contain HTML.  This defaults to `false` to protect
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
        against XSS.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
      * `className` - Space delimited CSS classes to add to all `<td>`s in a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
        column.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
    Column `formatter`s are passed an object (`o`) with the following
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
    properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
      * `value` - The current value of the column's associated attribute, if
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
        any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
      * `data` - An object map of Model keys to their current values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
      * `record` - The Model instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
      * `column` - The column configuration object for the current column.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
      * `className` - Initially empty string to allow `formatter`s to add CSS
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
        classes to the cell's `<td>`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
      * `rowIndex` - The zero-based row number.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
      * `rowClass` - Initially empty string to allow `formatter`s to add CSS
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
        classes to the cell's containing row `<tr>`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
    They may return a value or update `o.value` to assign specific HTML
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
    content.  A returned value has higher precedence.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
    Column `nodeFormatter`s are passed an object (`o`) with the following
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
    properties:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
      * `value` - The current value of the column's associated attribute, if
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
        any.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
      * `td` - The `<td>` Node instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
      * `cell` - The `<div>` liner Node instance if present, otherwise, the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
        `<td>`.  When adding content to the cell, prefer appending into this
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
        property.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
      * `data` - An object map of Model keys to their current values.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
      * `record` - The Model instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
      * `column` - The column configuration object for the current column.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
      * `rowIndex` - The zero-based row number.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
    They are expected to inject content into the cell's Node directly, including
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
    any "empty" cell content.  Each `nodeFormatter` will have access through the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
    Node API to all cells and rows in the `<tbody>`, but not to the `<table>`,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
    as it will not be attached yet.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
    If a `nodeFormatter` returns `false`, the `o.td` and `o.cell` Nodes will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
    `destroy()`ed to remove them from the Node cache and free up memory.  The
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
    DOM elements will remain as will any content added to them.  _It is highly
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
    advisable to always return `false` from your `nodeFormatter`s_.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
    @method render
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
    @return {BodyView} The instance
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
    @chainable
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
    render: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
        var table   = this.get('container'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
            data    = this.get('modelList'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
            columns = this.get('columns'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
            tbody   = this.tbodyNode ||
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
                      (this.tbodyNode = this._createTBodyNode());
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
        // Needed for mutation
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
        this._createRowTemplate(columns);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
        if (data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
            tbody.setHTML(this._createDataHTML(columns));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
            this._applyNodeFormatters(tbody, columns);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
        if (tbody.get('parentNode') !== table) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
            table.appendChild(tbody);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
        this._afterRenderCleanup();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
        this.bindUI();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
        return this;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
    // -- Protected and private methods ---------------------------------------
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
    Handles changes in the source's columns attribute.  Redraws the table data.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
    @method _afterColumnsChange
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
    @param {EventFacade} e The `columnsChange` event object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
    // TODO: Preserve existing DOM
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
    // This will involve parsing and comparing the old and new column configs
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
    // and reacting to four types of changes:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
    // 1. formatter, nodeFormatter, emptyCellValue changes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
    // 2. column deletions
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
    // 3. column additions
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
    // 4. column moves (preserve cells)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
    _afterColumnsChange: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
        this.render();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
    Handles modelList changes, including additions, deletions, and updates.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
    Modifies the existing table DOM accordingly.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
    @method _afterDataChange
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
    @param {EventFacade} e The `change` event from the ModelList
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
    _afterDataChange: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
        //var type = e.type.slice(e.type.lastIndexOf(':') + 1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
        // TODO: Isolate changes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
        this.render();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
    Handles replacement of the modelList.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
    Rerenders the `<tbody>` contents.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
    @method _afterModelListChange
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
    @param {EventFacade} e The `modelListChange` event
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
    @since 3.6.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
    _afterModelListChange: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
        var handles = this._eventHandles;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
        if (handles.dataChange) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
            handles.dataChange.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
            delete handles.dataChange;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
            this.bindUI();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
        if (this.tbodyNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
            this.render();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
    Iterates the `modelList`, and calls any `nodeFormatter`s found in the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
    `columns` param on the appropriate cell Nodes in the `tbody`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
    @method _applyNodeFormatters
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
    @param {Node} tbody The `<tbody>` Node whose columns to update
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
    @param {Object[]} columns The column configurations
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   537
    _applyNodeFormatters: function (tbody, columns) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   538
        var host = this.host,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   539
            data = this.get('modelList'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
            formatters = [],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
            linerQuery = '.' + this.getClassName('liner'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
            rows, i, len;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
        // Only iterate the ModelList again if there are nodeFormatters
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
        for (i = 0, len = columns.length; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
            if (columns[i].nodeFormatter) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
                formatters.push(i);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
        if (data && formatters.length) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
            rows = tbody.get('childNodes');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
            data.each(function (record, index) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
                var formatterData = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
                        data      : record.toJSON(),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
                        record    : record,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
                        rowIndex  : index
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
                    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
                    row = rows.item(index),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
                    i, len, col, key, cells, cell, keep;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   563
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   564
                if (row) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   565
                    cells = row.get('childNodes');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
                    for (i = 0, len = formatters.length; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
                        cell = cells.item(formatters[i]);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
                        if (cell) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
                            col = formatterData.column = columns[formatters[i]];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
                            key = col.key || col.id;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
                            formatterData.value = record.get(key);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
                            formatterData.td    = cell;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
                            formatterData.cell  = cell.one(linerQuery) || cell;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
                            keep = col.nodeFormatter.call(host,formatterData);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
                            if (keep === false) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
                                // Remove from the Node cache to reduce
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
                                // memory footprint.  This also purges events,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
                                // which you shouldn't be scoping to a cell
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
                                // anyway.  You've been warned.  Incidentally,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
                                // you should always return false. Just sayin.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
                                cell.destroy(true);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
                            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
                        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
                    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
            });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
    Binds event subscriptions from the UI and the host (if assigned).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
    @method bindUI
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
    bindUI: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
        var handles     = this._eventHandles,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
            modelList   = this.get('modelList'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
            changeEvent = modelList.model.NAME + ':change';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
        if (!handles.columnsChange) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
            handles.columnsChange = this.after('columnsChange',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
                bind('_afterColumnsChange', this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   609
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   610
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   611
        if (modelList && !handles.dataChange) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
            handles.dataChange = modelList.after(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
                ['add', 'remove', 'reset', changeEvent],
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
                bind('_afterDataChange', this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
    Iterates the `modelList` and applies each Model to the `_rowTemplate`,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
    allowing any column `formatter` or `emptyCellValue` to override cell
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
    content for the appropriate column.  The aggregated HTML string is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
    returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
    @method _createDataHTML
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
    @param {Object[]} columns The column configurations to customize the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
                generated cell content or class names
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
    @return {HTML} The markup for all Models in the `modelList`, each applied
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
                to the `_rowTemplate`
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
    _createDataHTML: function (columns) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   633
        var data = this.get('modelList'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   634
            html = '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
        if (data) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
            data.each(function (model, index) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
                html += this._createRowHTML(model, index, columns);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
            }, this);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
        return html;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   646
    Applies the data of a given Model, modified by any column formatters and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   647
    supplemented by other template values to the instance's `_rowTemplate` (see
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   648
    `_createRowTemplate`).  The generated string is then returned.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   649
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   650
    The data from Model's attributes is fetched by `toJSON` and this data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   651
    object is appended with other properties to supply values to {placeholders}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   652
    in the template.  For a template generated from a Model with 'foo' and 'bar'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   653
    attributes, the data object would end up with the following properties
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   654
    before being used to populate the `_rowTemplate`:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   655
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   656
      * `clientID` - From Model, used the assign the `<tr>`'s 'id' attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   657
      * `foo` - The value to populate the 'foo' column cell content.  This
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   658
        value will be the value stored in the Model's `foo` attribute, or the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   659
        result of the column's `formatter` if assigned.  If the value is '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   660
        `null`, or `undefined`, and the column's `emptyCellValue` is assigned,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   661
        that value will be used.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   662
      * `bar` - Same for the 'bar' column cell content.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   663
      * `foo-className` - String of CSS classes to apply to the `<td>`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   664
      * `bar-className` - Same.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   665
      * `rowClass`      - String of CSS classes to apply to the `<tr>`. This
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   666
        will be the odd/even class per the specified index plus any additional
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   667
        classes assigned by column formatters (via `o.rowClass`).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   668
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   669
    Because this object is available to formatters, any additional properties
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   670
    can be added to fill in custom {placeholders} in the `_rowTemplate`.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   671
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   672
    @method _createRowHTML
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   673
    @param {Model} model The Model instance to apply to the row template
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   674
    @param {Number} index The index the row will be appearing
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   675
    @param {Object[]} columns The column configurations
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   676
    @return {HTML} The markup for the provided Model, less any `nodeFormatter`s
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   677
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   678
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   679
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   680
    _createRowHTML: function (model, index, columns) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   681
        var data     = model.toJSON(),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   682
            clientId = model.get('clientId'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   683
            values   = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   684
                rowId   : this._getRowId(clientId),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   685
                clientId: clientId,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   686
                rowClass: (index % 2) ? this.CLASS_ODD : this.CLASS_EVEN
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   687
            },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   688
            host = this.host || this,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   689
            i, len, col, token, value, formatterData;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   690
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   691
        for (i = 0, len = columns.length; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   692
            col   = columns[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   693
            value = data[col.key];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   694
            token = col._id || col.key;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   695
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   696
            values[token + '-className'] = '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   697
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   698
            if (col._formatterFn) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   699
                formatterData = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   700
                    value    : value,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   701
                    data     : data,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   702
                    column   : col,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   703
                    record   : model,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   704
                    className: '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   705
                    rowClass : '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   706
                    rowIndex : index
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   707
                };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   708
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   709
                // Formatters can either return a value
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   710
                value = col._formatterFn.call(host, formatterData);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   711
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   712
                // or update the value property of the data obj passed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   713
                if (value === undefined) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   714
                    value = formatterData.value;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   715
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   716
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   717
                values[token + '-className'] = formatterData.className;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   718
                values.rowClass += ' ' + formatterData.rowClass;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   719
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   720
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   721
            if (value === undefined || value === null || value === '') {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   722
                value = col.emptyCellValue || '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   723
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   724
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   725
            values[token] = col.allowHTML ? value : htmlEscape(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   726
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   727
            values.rowClass = values.rowClass.replace(/\s+/g, ' ');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   728
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   729
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   730
        return fromTemplate(this._rowTemplate, values);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   731
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   732
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   733
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   734
    Creates a custom HTML template string for use in generating the markup for
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   735
    individual table rows with {placeholder}s to capture data from the Models
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   736
    in the `modelList` attribute or from column `formatter`s.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   737
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   738
    Assigns the `_rowTemplate` property.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   739
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   740
    @method _createRowTemplate
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   741
    @param {Object[]} columns Array of column configuration objects
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   742
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   743
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   744
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   745
    _createRowTemplate: function (columns) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   746
        var html         = '',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   747
            cellTemplate = this.CELL_TEMPLATE,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   748
            F = Y.DataTable.BodyView.Formatters,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   749
            i, len, col, key, token, headers, tokenValues, formatter;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   750
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   751
        for (i = 0, len = columns.length; i < len; ++i) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   752
            col     = columns[i];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   753
            key     = col.key;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   754
            token   = col._id || key;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   755
            formatter = col.formatter;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   756
            // Only include headers if there are more than one
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   757
            headers = (col._headers || []).length > 1 ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   758
                        'headers="' + col._headers.join(' ') + '"' : '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   759
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   760
            tokenValues = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   761
                content  : '{' + token + '}',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   762
                headers  : headers,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   763
                className: this.getClassName('col', token) + ' ' +
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   764
                           (col.className || '') + ' ' +
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   765
                           this.getClassName('cell') +
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   766
                           ' {' + token + '-className}'
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   767
            };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   768
            if (formatter) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   769
                if (Lang.isFunction(formatter)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   770
                    col._formatterFn = formatter;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   771
                } else if (formatter in F) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   772
                    col._formatterFn = F[formatter].call(this.host || this, col);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   773
                } else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   774
                    tokenValues.content = formatter.replace(valueRegExp, tokenValues.content);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   775
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   776
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   777
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   778
            if (col.nodeFormatter) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   779
                // Defer all node decoration to the formatter
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   780
                tokenValues.content = '';
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   781
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   782
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   783
            html += fromTemplate(col.cellTemplate || cellTemplate, tokenValues);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   784
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   785
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   786
        this._rowTemplate = fromTemplate(this.ROW_TEMPLATE, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   787
            content: html
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   788
        });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   789
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   790
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   791
    Cleans up temporary values created during rendering.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   792
    @method _afterRenderCleanup
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   793
    @private
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   794
    */
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   795
    _afterRenderCleanup: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   796
        var columns = this.get('columns'),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   797
            i, len = columns.length;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   798
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   799
        for (i = 0;i < len; i+=1) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   800
            delete columns[i]._formatterFn;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   801
        }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   802
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   803
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   804
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   805
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   806
    Creates the `<tbody>` node that will store the data rows.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   807
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   808
    @method _createTBodyNode
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   809
    @return {Node}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   810
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   811
    @since 3.6.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   812
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   813
    _createTBodyNode: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   814
        return Y.Node.create(fromTemplate(this.TBODY_TEMPLATE, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   815
            className: this.getClassName('data')
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   816
        }));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   817
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   818
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   819
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   820
    Destroys the instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   821
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   822
    @method destructor
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   823
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   824
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   825
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   826
    destructor: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   827
        (new Y.EventHandle(YObject.values(this._eventHandles))).detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   828
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   829
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   830
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   831
    Holds the event subscriptions needing to be detached when the instance is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   832
    `destroy()`ed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   833
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   834
    @property _eventHandles
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   835
    @type {Object}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   836
    @default undefined (initially unset)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   837
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   838
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   839
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   840
    //_eventHandles: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   841
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   842
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   843
    Returns the row ID associated with a Model's clientId.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   844
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   845
    @method _getRowId
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   846
    @param {String} clientId The Model clientId
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   847
    @return {String}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   848
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   849
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   850
    _getRowId: function (clientId) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   851
        return this._idMap[clientId] || (this._idMap[clientId] = Y.guid());
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   852
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   853
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   854
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   855
    Map of Model clientIds to row ids.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   856
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   857
    @property _idMap
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   858
    @type {Object}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   859
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   860
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   861
    //_idMap,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   862
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   863
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   864
    Initializes the instance. Reads the following configuration properties in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   865
    addition to the instance attributes:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   866
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   867
      * `columns` - (REQUIRED) The initial column information
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   868
      * `host`    - The object to serve as source of truth for column info and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   869
                    for generating class names
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   870
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   871
    @method initializer
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   872
    @param {Object} config Configuration data
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   873
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   874
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   875
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   876
    initializer: function (config) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   877
        this.host = config.host;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   878
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   879
        this._eventHandles = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   880
            modelListChange: this.after('modelListChange',
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   881
                bind('_afterModelListChange', this))
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   882
        };
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   883
        this._idMap = {};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   884
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   885
        this.CLASS_ODD  = this.getClassName('odd');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   886
        this.CLASS_EVEN = this.getClassName('even');
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   887
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   888
    }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   889
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   890
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   891
    The HTML template used to create a full row of markup for a single Model in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   892
    the `modelList` plus any customizations defined in the column
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   893
    configurations.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   894
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   895
    @property _rowTemplate
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   896
    @type {HTML}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   897
    @default (initially unset)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   898
    @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   899
    @since 3.5.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   900
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   901
    //_rowTemplate: null
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   902
},{
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   903
    /**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   904
    Hash of formatting functions for cell contents.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   905
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   906
    This property can be populated with a hash of formatting functions by the developer
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   907
    or a set of pre-defined functions can be loaded via the `datatable-formatters` module.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   908
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   909
    See: [DataTable.BodyView.Formatters](./DataTable.BodyView.Formatters.html)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   910
    @property Formatters
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   911
    @type Object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   912
    @since 3.8.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   913
    @static
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   914
    **/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   915
    Formatters: {}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   916
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   917
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   918
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   919
}, '3.10.3', {"requires": ["datatable-core", "view", "classnamemanager"]});