diff options
author | gbisheimer <guillermobisheimer@yahoo.com.ar> | 2013-02-02 16:31:05 -0300 |
---|---|---|
committer | gbisheimer <guillermobisheimer@yahoo.com.ar> | 2013-02-02 16:31:05 -0300 |
commit | 73b793b81e2b5ae70eecf4c72882ea4f8be7128d (patch) | |
tree | 7194e196c3ef295cd16c9a59091ff3157037b872 /dev/jquery.jtable.sorting.js | |
parent | 54b12cf75defb08329fcc097643178036b145f98 (diff) | |
download | jtable-73b793b81e2b5ae70eecf4c72882ea4f8be7128d.zip jtable-73b793b81e2b5ae70eecf4c72882ea4f8be7128d.tar.gz jtable-73b793b81e2b5ae70eecf4c72882ea4f8be7128d.tar.bz2 |
FEATURE - Multiple column sorting
Diffstat (limited to 'dev/jquery.jtable.sorting.js')
-rw-r--r-- | dev/jquery.jtable.sorting.js | 299 |
1 files changed, 177 insertions, 122 deletions
diff --git a/dev/jquery.jtable.sorting.js b/dev/jquery.jtable.sorting.js index 6320783..165795c 100644 --- a/dev/jquery.jtable.sorting.js +++ b/dev/jquery.jtable.sorting.js @@ -1,122 +1,177 @@ -/************************************************************************
-* SORTING extension for jTable *
-*************************************************************************/
-(function ($) {
-
- //Reference to base object members
- var base = {
- _normalizeFieldOptions: $.hik.jtable.prototype._normalizeFieldOptions,
- _createHeaderCellForField: $.hik.jtable.prototype._createHeaderCellForField,
- _createRecordLoadUrl: $.hik.jtable.prototype._createRecordLoadUrl
- };
-
- //extension members
- $.extend(true, $.hik.jtable.prototype, {
-
- /************************************************************************
- * DEFAULT OPTIONS / EVENTS *
- *************************************************************************/
- options: {
- sorting: false,
- defaultSorting: ''
- },
-
- /************************************************************************
- * PRIVATE FIELDS *
- *************************************************************************/
-
- _lastSorting: '', //Last sorting of the table
-
- /************************************************************************
- * OVERRIDED METHODS *
- *************************************************************************/
-
- /* Overrides _normalizeFieldOptions method to normalize sorting option for fields.
- *************************************************************************/
- _normalizeFieldOptions: function (fieldName, props) {
- base._normalizeFieldOptions.apply(this, arguments);
- props.sorting = (props.sorting != false);
- },
-
- /* Overrides _createHeaderCellForField to make columns sortable.
- *************************************************************************/
- _createHeaderCellForField: function (fieldName, field) {
- var $headerCell = base._createHeaderCellForField.apply(this, arguments);
- if (this.options.sorting && field.sorting) {
- this._makeColumnSortable($headerCell, fieldName);
- }
-
- return $headerCell;
- },
-
- /* Overrides _createRecordLoadUrl to add sorting specific info to URL.
- *************************************************************************/
- _createRecordLoadUrl: function () {
- var loadUrl = base._createRecordLoadUrl.apply(this, arguments);
- loadUrl = this._addSortingInfoToUrl(loadUrl);
- return loadUrl;
- },
-
- /************************************************************************
- * PRIVATE METHODS *
- *************************************************************************/
-
- /* Makes a column sortable.
- *************************************************************************/
- _makeColumnSortable: function ($columnHeader, fieldName) {
- var self = this;
- $columnHeader
- .addClass('jtable-column-header-sortable')
- .click(function(e) {
- e.preventDefault();
- self._sortTableByColumn($columnHeader);
- });
-
- //Default sorting?
- if (self.options.defaultSorting.indexOf(fieldName) > -1) {
- if (self.options.defaultSorting.indexOf(' DESC') > -1) {
- $columnHeader.addClass('jtable-column-header-sorted-desc');
- self._lastSorting = fieldName + " DESC";
- } else {
- $columnHeader.addClass('jtable-column-header-sorted-asc');
- self._lastSorting = fieldName + " ASC";
- }
- }
- },
-
- /* Sorts table according to a column header.
- *************************************************************************/
- _sortTableByColumn: function ($columnHeader) {
- //Remove sorting styles from all columns except this one
- $columnHeader.siblings().removeClass('jtable-column-header-sorted-asc jtable-column-header-sorted-desc');
-
- //Sort ASC or DESC according to current sorting state
- if ($columnHeader.hasClass('jtable-column-header-sorted-asc')) {
- $columnHeader
- .removeClass('jtable-column-header-sorted-asc')
- .addClass('jtable-column-header-sorted-desc');
- this._lastSorting = $columnHeader.data('fieldName') + " DESC";
- } else {
- $columnHeader
- .removeClass('jtable-column-header-sorted-desc')
- .addClass('jtable-column-header-sorted-asc');
- this._lastSorting = $columnHeader.data('fieldName') + " ASC";
- }
-
- //Load current page again
- this._reloadTable();
- },
-
- /* Adds jtSorting parameter to a URL as query string.
- *************************************************************************/
- _addSortingInfoToUrl: function (url) {
- if (!this.options.sorting || this._lastSorting == '') {
- return url;
- }
-
- return (url + (url.indexOf('?') < 0 ? '?' : '&') + 'jtSorting=' + this._lastSorting);
- }
-
- });
-
-})(jQuery);
+/************************************************************************ +* SORTING extension for jTable * +*************************************************************************/ +(function ($) { + + //Reference to base object members + var base = { + _initializeFields: $.hik.jtable.prototype._initializeFields, + _normalizeFieldOptions: $.hik.jtable.prototype._normalizeFieldOptions, + _createHeaderCellForField: $.hik.jtable.prototype._createHeaderCellForField, + _createRecordLoadUrl: $.hik.jtable.prototype._createRecordLoadUrl + }; + + //extension members + $.extend(true, $.hik.jtable.prototype, { + + /************************************************************************ + * DEFAULT OPTIONS / EVENTS * + *************************************************************************/ + options: { + sorting: false, + defaultSorting: '' + }, + + /************************************************************************ + * PRIVATE FIELDS * + *************************************************************************/ + + _lastSorting: null, //Last sorting of the table + + /************************************************************************ + * OVERRIDED METHODS * + *************************************************************************/ + + /* Overrides base method to create sorting array. + *************************************************************************/ + _initializeFields: function() { + base._initializeFields.apply(this, arguments); + + this._lastSorting = []; + if( this.options.sorting ){ + this._buildDefaultSortingArray(); + } + }, + + /* Overrides _normalizeFieldOptions method to normalize sorting option for fields. + *************************************************************************/ + _normalizeFieldOptions: function (fieldName, props) { + base._normalizeFieldOptions.apply(this, arguments); + props.sorting = (props.sorting != false); + }, + + /* Overrides _createHeaderCellForField to make columns sortable. + *************************************************************************/ + _createHeaderCellForField: function (fieldName, field) { + var $headerCell = base._createHeaderCellForField.apply(this, arguments); + if (this.options.sorting && field.sorting) { + this._makeColumnSortable($headerCell, fieldName); + } + + return $headerCell; + }, + + /* Overrides _createRecordLoadUrl to add sorting specific info to URL. + *************************************************************************/ + _createRecordLoadUrl: function () { + var loadUrl = base._createRecordLoadUrl.apply(this, arguments); + loadUrl = this._addSortingInfoToUrl(loadUrl); + return loadUrl; + }, + + /************************************************************************ + * PRIVATE METHODS * + *************************************************************************/ + + /* Builds the sorting array according to defaultSorting string + *************************************************************************/ + _buildDefaultSortingArray: function( ) { + var self = this; + + $.each(self.options.defaultSorting.split(","), function( orderIndex, orderValue ){ + $.each(self.options.fields, function( field, props ){ + var colOffset; + if( props.sorting ){ + colOffset = orderValue.indexOf(field); + if (colOffset > -1) { + if (orderValue.indexOf('DESC', colOffset) > -1) { + self._lastSorting.push({ + 'fieldName': field, + sortOrder: 'DESC' + }); + } else { + self._lastSorting.push({ + 'fieldName': field, + sortOrder: 'ASC' + }); + } + } + } + }); + }); + }, + + /* Makes a column sortable. + *************************************************************************/ + _makeColumnSortable: function ($columnHeader, fieldName) { + var self = this; + $columnHeader + .addClass('jtable-column-header-sortable') + .click(function(e) { + e.preventDefault(); + if( !e.ctrlKey ) self._lastSorting = []; + self._sortTableByColumn($columnHeader); + }); + + //Default sorting? + $.each(this._lastSorting, function( sortIndex, sortField ){ + if( sortField.fieldName == fieldName ){ + if (sortField.sortOrder == 'DESC') $columnHeader.addClass('jtable-column-header-sorted-desc'); + else $columnHeader.addClass('jtable-column-header-sorted-asc'); + } + }); + }, + + /* Sorts table according to a column header. + *************************************************************************/ + _sortTableByColumn: function ($columnHeader) { + var self = this; + + //Remove sorting styles from all columns except this one + if( this._lastSorting.length == 0 ){ + $columnHeader.siblings().removeClass('jtable-column-header-sorted-asc jtable-column-header-sorted-desc'); + } + + for( var i=0; i<self._lastSorting.length; i++ ){ + if( self._lastSorting[i].fieldName == $columnHeader.data('fieldName') ){ + self._lastSorting.splice( i--, 1 ); + } + } + + //Sort ASC or DESC according to current sorting state + if ($columnHeader.hasClass('jtable-column-header-sorted-asc')) { + $columnHeader.removeClass('jtable-column-header-sorted-asc').addClass('jtable-column-header-sorted-desc'); + this._lastSorting.push({ + 'fieldName': $columnHeader.data('fieldName'), + sortOrder: 'DESC' + }); + } else { + $columnHeader.removeClass('jtable-column-header-sorted-desc').addClass('jtable-column-header-sorted-asc'); + this._lastSorting.push({ + 'fieldName': $columnHeader.data('fieldName'), + sortOrder: 'ASC' + }); + } + + //Load current page again + this._reloadTable(); + }, + + /* Adds jtSorting parameter to a URL as query string. + *************************************************************************/ + _addSortingInfoToUrl: function (url) { + if (!this.options.sorting || this._lastSorting.length == 0) { + return url; + } + + var sorting = []; + $.each( this._lastSorting, function( idx, value ){ + sorting.push(value.fieldName + ' ' + value.sortOrder); + }); + + return (url + (url.indexOf('?') < 0 ? '?' : '&') + 'jtSorting=' + sorting.join(",") ); + } + + }); + +})(jQuery);
\ No newline at end of file |