datatable-sort.js revision eb6c1c09177446c3a7fa974e4658cbd555c5be18
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Plugs DataTable with sorting functionality.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @module datatable
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @submodule datatable-sort
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Adds column sorting to DataTable.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @class DataTableSort
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @extends Plugin.Base
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smithvar YgetClassName = Y.ClassNameManager.getClassName,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith DATATABLE = "datatable",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith COLUMN = "column",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith ASC = "asc",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith DESC = "desc",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //TODO: Don't use hrefs - use tab/arrow/enter
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith TEMPLATE = '<a class="{link_class}" title="{link_title}" href="{link_href}">{value}</a>';
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smithfunction DataTableSort() {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith DataTableSort.superclass.constructor.apply(this, arguments);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith}
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith//
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith// STATIC PROPERTIES
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith//
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke SmithY.mix(DataTableSort, {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * The namespace for the plugin. This will be the property on the host which
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * references the plugin instance.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @property NS
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @type String
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @static
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @final
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @value "sort"
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith NS: "sort",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Class name.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @property NAME
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @type String
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @static
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @final
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @value "dataTableSort"
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith NAME: "dataTableSort",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith//
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith// ATTRIBUTES
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith//
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith ATTRS: {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @attribute trigger
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @description Defines the trigger that causes a column to be sorted:
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * {event, selector}, where "event" is an event type and "selector" is
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * is a node query selector.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @type Object
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @default {event:"click", selector:"th"}
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @writeOnce "initOnly"
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith trigger: {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith value: {event:"click", selector:"th"},
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith writeOnce: "initOnly"
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @attribute lastSortedBy
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @description Describes last known sort state: {key,dir}, where
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * "key" is column key and "dir" is either "asc" or "desc".
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @type Object
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith lastSortedBy: {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith setter: "_setLastSortedBy",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith lazyAdd: false
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @attribute template
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @description Tokenized markup template for TH sort element.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @type String
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @default '<a class="{link_class}" title="{link_title}" href="{link_href}">{value}</a>'
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith template: {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith value: TEMPLATE
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Strings used in the UI elements.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * The strings used are defaulted from the datatable-sort language pack
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * for the language identified in the YUI "lang" configuration (which
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * defaults to "en").
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Configurable strings are "sortBy" and "reverseSortBy", which are
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * assigned to the sort link's title attribute.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @attribute strings
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @type {Object}
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith strings: {
eb6c1c09177446c3a7fa974e4658cbd555c5be18Luke Smith valueFn: function () { return Y.Intl.get('datatable-sort-deprecated'); }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith});
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith//
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith// PROTOTYPE
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith//
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith/////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke SmithY.extend(DataTableSort, Y.Plugin.Base, {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // METHODS
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /////////////////////////////////////////////////////////////////////////////
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Initializer.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method initializer
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param config {Object} Config object.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @private
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith initializer: function(config) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith var dt = this.get("host"),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith trigger = this.get("trigger");
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dt.get("recordset").plug(Y.Plugin.RecordsetSort, {dt: dt});
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dt.get("recordset").sort.addTarget(dt);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Wrap link around TH value
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this.doBefore("_createTheadThNode", this._beforeCreateTheadThNode);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Add class
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this.doBefore("_attachTheadThNode", this._beforeAttachTheadThNode);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this.doBefore("_attachTbodyTdNode", this._beforeAttachTbodyTdNode);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Attach trigger handlers
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dt.delegate(trigger.event, Y.bind(this._onEventSortColumn,this), trigger.selector);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Attach UI hooks
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dt.after("recordsetSort:sort", function() {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this._uiSetRecordset(this.get("recordset"));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith });
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this.on("lastSortedByChange", function(e) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this._uiSetLastSortedBy(e.prevVal, e.newVal, dt);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith });
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //TODO
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //dt.after("recordset:mutation", function() {//reset lastSortedBy});
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //TODO
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //add Column sortFn ATTR
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Update UI after the fact (render-then-plug case)
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if(dt.get("rendered")) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dt._uiSetColumnset(dt.get("columnset"));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this._uiSetLastSortedBy(null, this.get("lastSortedBy"), dt);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method _setLastSortedBy
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @description Normalizes lastSortedBy
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param val {String | Object} {key, dir} or "key"
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @return {key, dir, notdir}
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @private
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith _setLastSortedBy: function(val) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (Y.Lang.isString(val)) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith val = { key: val, dir: "desc" };
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (val) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith return (val.dir === "desc") ?
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith { key: val.key, dir: "desc", notdir: "asc" } :
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith { key: val.key, dir: "asc", notdir:"desc" };
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith } else {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith return null;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Updates sort UI.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method _uiSetLastSortedBy
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param val {Object} New lastSortedBy object {key,dir}.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param dt {Y.DataTable.Base} Host.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @protected
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith _uiSetLastSortedBy: function(prevVal, newVal, dt) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith var strings = this.get('strings'),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith columnset = dt.get("columnset"),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith prevKey = prevVal && prevVal.key,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith newKey = newVal && newVal.key,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith prevClass = prevVal && dt.getClassName(prevVal.dir),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith newClass = newVal && dt.getClassName(newVal.dir),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith prevColumn = columnset.keyHash[prevKey],
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith newColumn = columnset.keyHash[newKey],
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith tbodyNode = dt._tbodyNode,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith fromTemplate = Y.Lang.sub,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith th, sortArrow, sortLabel;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Clear previous UI
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (prevColumn && prevClass) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith th = prevColumn.thNode;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortArrow = th.one('a');
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (sortArrow) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortArrow.set('title', fromTemplate(strings.sortBy, {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith column: prevColumn.get('label')
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith th.removeClass(prevClass);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith tbodyNode.all("." + YgetClassName(COLUMN, prevColumn.get("id")))
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith .removeClass(prevClass);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // Add new sort UI
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (newColumn && newClass) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith th = newColumn.thNode;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortArrow = th.one('a');
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (sortArrow) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortLabel = (newVal.dir === ASC) ? "reverseSortBy" : "sortBy";
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortArrow.set('title', fromTemplate(strings[sortLabel], {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith column: newColumn.get('label')
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith th.addClass(newClass);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith tbodyNode.all("." + YgetClassName(COLUMN, newColumn.get("id")))
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith .addClass(newClass);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Before header cell element is created, inserts link markup around {value}.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method _beforeCreateTheadThNode
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param o {Object} {value, column, tr}.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @protected
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith _beforeCreateTheadThNode: function(o) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith var sortedBy, sortLabel;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (o.column.get("sortable")) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortedBy = this.get('lastSortedBy');
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortLabel = (sortedBy && sortedBy.dir === ASC &&
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sortedBy.key === o.column.get('key')) ?
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith "reverseSortBy" : "sortBy";
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith o.value = Y.Lang.sub(this.get("template"), {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith link_class: o.link_class || "",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith link_title: Y.Lang.sub(this.get('strings.' + sortLabel), {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith column: o.column.get('label')
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith link_href: "#",
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith value: o.value
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith });
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Before header cell element is attached, sets applicable class names.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method _beforeAttachTheadThNode
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param o {Object} {value, column, tr}.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @protected
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith _beforeAttachTheadThNode: function(o) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith var lastSortedBy = this.get("lastSortedBy"),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith key = lastSortedBy && lastSortedBy.key,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dir = lastSortedBy && lastSortedBy.dir,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith notdir = lastSortedBy && lastSortedBy.notdir;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // This Column is sortable
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if(o.column.get("sortable")) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith o.th.addClass(YgetClassName(DATATABLE, "sortable"));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // This Column is currently sorted
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if(key && (key === o.column.get("key"))) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith o.th.replaceClass(YgetClassName(DATATABLE, notdir), YgetClassName(DATATABLE, dir));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * Before header cell element is attached, sets applicable class names.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method _beforeAttachTbodyTdNode
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param o {Object} {record, column, tr, headers, classnames, value}.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @protected
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith _beforeAttachTbodyTdNode: function(o) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith var lastSortedBy = this.get("lastSortedBy"),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith key = lastSortedBy && lastSortedBy.key,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dir = lastSortedBy && lastSortedBy.dir,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith notdir = lastSortedBy && lastSortedBy.notdir;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // This Column is sortable
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if(o.column.get("sortable")) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith o.td.addClass(YgetClassName(DATATABLE, "sortable"));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith // This Column is currently sorted
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if(key && (key === o.column.get("key"))) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith o.td.replaceClass(YgetClassName(DATATABLE, notdir), YgetClassName(DATATABLE, dir));
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith },
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith /**
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * In response to the "trigger" event, sorts the underlying Recordset and
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * updates the lastSortedBy attribute.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith *
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @method _onEventSortColumn
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @param o {Object} {value, column, tr}.
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith * @protected
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith */
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith _onEventSortColumn: function(e) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith e.halt();
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith //TODO: normalize e.currentTarget to TH
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith var table = this.get("host"),
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith column = table.get("columnset").idHash[e.currentTarget.get("id")],
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith key, field, lastSort, desc, sorter;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith if (column.get("sortable")) {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith key = column.get("key");
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith field = column.get("field");
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith lastSort = this.get("lastSortedBy") || {};
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith desc = (lastSort.key === key && lastSort.dir === ASC);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith sorter = column.get("sortFn");
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith table.get("recordset").sort.sort(field, desc, sorter);
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith this.set("lastSortedBy", {
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith key: key,
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith dir: (desc) ? DESC : ASC
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith });
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith }
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith});
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke SmithY.namespace("Plugin").DataTableSort = DataTableSort;
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith
a3b15d60042c81a524cebb94370e5a234a19d04bLuke Smith