diff options
author | Halil İbrahim Kalkan <hikalkan@gmail.com> | 2013-02-03 19:48:57 +0200 |
---|---|---|
committer | Halil İbrahim Kalkan <hikalkan@gmail.com> | 2013-02-03 19:48:57 +0200 |
commit | 82df9fff9f0a1ea9b4bc8a91d4481b74f391a36f (patch) | |
tree | c50b74c768bb53f608abbe6f53c33d2ae5756c5d /dev/jquery.jtable.sorting.js | |
parent | c95b1d81d0cf3b9840c76b2b297ee4f3494851d6 (diff) | |
download | jtable-82df9fff9f0a1ea9b4bc8a91d4481b74f391a36f.zip jtable-82df9fff9f0a1ea9b4bc8a91d4481b74f391a36f.tar.gz jtable-82df9fff9f0a1ea9b4bc8a91d4481b74f391a36f.tar.bz2 |
added multiSorting option
Diffstat (limited to 'dev/jquery.jtable.sorting.js')
-rw-r--r-- | dev/jquery.jtable.sorting.js | 359 |
1 files changed, 183 insertions, 176 deletions
diff --git a/dev/jquery.jtable.sorting.js b/dev/jquery.jtable.sorting.js index 165795c..0cd4479 100644 --- a/dev/jquery.jtable.sorting.js +++ b/dev/jquery.jtable.sorting.js @@ -1,177 +1,184 @@ -/************************************************************************ -* 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(",") ); - } - - }); - +/************************************************************************
+* 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,
+ multiSorting: 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 (fieldName, fieldProps) {
+ if (fieldProps.sorting) {
+ var colOffset = orderValue.indexOf(fieldName);
+ if (colOffset > -1) {
+ if (orderValue.toUpperCase().indexOf('DESC', colOffset) > -1) {
+ self._lastSorting.push({
+ fieldName: fieldName,
+ sortOrder: 'DESC'
+ });
+ } else {
+ self._lastSorting.push({
+ fieldName: fieldName,
+ 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 (!self.options.multiSorting || !e.ctrlKey) {
+ self._lastSorting = []; //clear previous sorting
+ }
+
+ self._sortTableByColumn($columnHeader);
+ });
+
+ //Set 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) {
+ //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');
+ }
+
+ //If current sorting list includes this column, remove it from the list
+ for (var i = 0; i < this._lastSorting.length; i++) {
+ if (this._lastSorting[i].fieldName == $columnHeader.data('fieldName')) {
+ this._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 |