From 1671fd17762edcad91c73beaa213d986f8728bbf Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 13 Feb 2013 00:32:17 -0600 Subject: [PATCH] Datatables wired up on series grid --- NzbDrone.Api/Bootstrapper.cs | 2 +- NzbDrone.Api/NzbDrone.Api.csproj | 2 +- NzbDrone.Api/Series/SeriesModule.cs | 6 +- .../{SeriesModel.cs => SeriesResource.cs} | 2 +- NzbDrone.Core/Repository/Series.cs | 1 + NzbDrone.Web/NzbDrone.Web.csproj | 4 + .../_backboneApp/CassetteConfiguration.cs | 3 +- .../Content/Bootstrap/mixins.less | 1 + .../_backboneApp/Content/Images/sort_asc.png | Bin 0 -> 440 bytes .../Content/Images/sort_asc_disabled.png | Bin 0 -> 418 bytes .../_backboneApp/Content/Images/sort_both.png | Bin 0 -> 554 bytes .../_backboneApp/Content/Images/sort_desc.png | Bin 0 -> 447 bytes .../Content/Images/sort_desc_disabled.png | Bin 0 -> 411 bytes .../Content/jquery.dataTables.bootstrap.css | 110 + .../jquery.dataTables-1.10.0-dev.js | 11979 ++++++++++++++++ .../jquery.dataTables.bootstrap.pagination.js | 97 + .../jquery.dataTables.extensions.js | 51 + .../_backboneApp/Series/Index/IndexLayout.js | 2 + .../Series/Index/IndexLayoutTemplate.html | 2 +- .../Series/Index/SeriesItemTemplate.html | 10 +- .../Series/Index/SeriesItemView.js | 37 + .../_backboneApp/Series/SeriesModel.js | 37 +- NzbDrone.Web/_backboneApp/app.js | 30 +- NzbDrone/NzbDrone.Console.csproj | 4 - 24 files changed, 12335 insertions(+), 45 deletions(-) rename NzbDrone.Api/Series/{SeriesModel.cs => SeriesResource.cs} (98%) create mode 100644 NzbDrone.Web/_backboneApp/Content/Images/sort_asc.png create mode 100644 NzbDrone.Web/_backboneApp/Content/Images/sort_asc_disabled.png create mode 100644 NzbDrone.Web/_backboneApp/Content/Images/sort_both.png create mode 100644 NzbDrone.Web/_backboneApp/Content/Images/sort_desc.png create mode 100644 NzbDrone.Web/_backboneApp/Content/Images/sort_desc_disabled.png create mode 100644 NzbDrone.Web/_backboneApp/Content/jquery.dataTables.bootstrap.css create mode 100644 NzbDrone.Web/_backboneApp/JsLibraries/jquery.dataTables-1.10.0-dev.js create mode 100644 NzbDrone.Web/_backboneApp/JsLibraries/jquery.dataTables.bootstrap.pagination.js create mode 100644 NzbDrone.Web/_backboneApp/JsLibraries/jquery.dataTables.extensions.js diff --git a/NzbDrone.Api/Bootstrapper.cs b/NzbDrone.Api/Bootstrapper.cs index 50c614198..5e1170b8f 100644 --- a/NzbDrone.Api/Bootstrapper.cs +++ b/NzbDrone.Api/Bootstrapper.cs @@ -56,7 +56,7 @@ namespace NzbDrone.Api .ForMember(dest => dest.QualityTypeId, opt => opt.MapFrom(src => src.Id)); //Series - Mapper.CreateMap() + Mapper.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.SeriesId)) .ForMember(dest => dest.CustomStartDate, opt => opt.ResolveUsing().FromMember(src => src.CustomStartDate)) .ForMember(dest => dest.BacklogSetting, opt => opt.MapFrom(src => (Int32)src.BacklogSetting)); diff --git a/NzbDrone.Api/NzbDrone.Api.csproj b/NzbDrone.Api/NzbDrone.Api.csproj index 8c0150e64..9ca354aa4 100644 --- a/NzbDrone.Api/NzbDrone.Api.csproj +++ b/NzbDrone.Api/NzbDrone.Api.csproj @@ -97,7 +97,7 @@ - + diff --git a/NzbDrone.Api/Series/SeriesModule.cs b/NzbDrone.Api/Series/SeriesModule.cs index 7ba929cda..9e436eec1 100644 --- a/NzbDrone.Api/Series/SeriesModule.cs +++ b/NzbDrone.Api/Series/SeriesModule.cs @@ -37,7 +37,7 @@ namespace NzbDrone.Api.Series private Response AllSeries() { var series = _seriesProvider.GetAllSeriesWithEpisodeCount().ToList(); - var seriesModels = Mapper.Map, List>(series); + var seriesModels = Mapper.Map, List>(series); return seriesModels.AsResponse(); } @@ -45,7 +45,7 @@ namespace NzbDrone.Api.Series private Response GetSeries(int id) { var series = _seriesProvider.GetSeries(id); - var seriesModels = Mapper.Map(series); + var seriesModels = Mapper.Map(series); return seriesModels.AsResponse(); } @@ -67,7 +67,7 @@ namespace NzbDrone.Api.Series private Response UpdateSeries() { - var request = Request.Body.FromJson(); + var request = Request.Body.FromJson(); var series = _seriesProvider.GetSeries(request.Id); diff --git a/NzbDrone.Api/Series/SeriesModel.cs b/NzbDrone.Api/Series/SeriesResource.cs similarity index 98% rename from NzbDrone.Api/Series/SeriesModel.cs rename to NzbDrone.Api/Series/SeriesResource.cs index 5c42d0305..f4f28103f 100644 --- a/NzbDrone.Api/Series/SeriesModel.cs +++ b/NzbDrone.Api/Series/SeriesResource.cs @@ -7,7 +7,7 @@ using NzbDrone.Core.Model; namespace NzbDrone.Api.Series { - public class SeriesModel + public class SeriesResource { public Int32 Id { get; set; } diff --git a/NzbDrone.Core/Repository/Series.cs b/NzbDrone.Core/Repository/Series.cs index 71f738969..a210a6ab4 100644 --- a/NzbDrone.Core/Repository/Series.cs +++ b/NzbDrone.Core/Repository/Series.cs @@ -61,6 +61,7 @@ namespace NzbDrone.Core.Repository public string TvRageTitle { get; set; } + //Todo: This should be a double since there are timezones that aren't on a full hour offset public int UtcOffset { get; set; } public DateTime? FirstAired { get; set; } diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index f3bf22022..3700bdc59 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -209,6 +209,7 @@ + @@ -216,6 +217,9 @@ + + + diff --git a/NzbDrone.Web/_backboneApp/CassetteConfiguration.cs b/NzbDrone.Web/_backboneApp/CassetteConfiguration.cs index 31e1342b8..65e339ef0 100644 --- a/NzbDrone.Web/_backboneApp/CassetteConfiguration.cs +++ b/NzbDrone.Web/_backboneApp/CassetteConfiguration.cs @@ -23,7 +23,8 @@ namespace NzbDrone.Web.Backbone.NzbDrone APP_PATH + "\\Content\\Bootstrap\\bootstrap.less", APP_PATH + "\\Content\\base.css", APP_PATH + "\\Content\\menu.css", - APP_PATH + "\\AddSeries\\addSeries.css" + APP_PATH + "\\AddSeries\\addSeries.css", + APP_PATH + "\\Content\\jquery.dataTables.bootstrap.css" }, bundle => bundle.AddReference("/" + FONTS)); diff --git a/NzbDrone.Web/_backboneApp/Content/Bootstrap/mixins.less b/NzbDrone.Web/_backboneApp/Content/Bootstrap/mixins.less index a9f313b54..a35492a28 100644 --- a/NzbDrone.Web/_backboneApp/Content/Bootstrap/mixins.less +++ b/NzbDrone.Web/_backboneApp/Content/Bootstrap/mixins.less @@ -579,6 +579,7 @@ .row { margin-left: @gridGutterWidth * -1; + margin-right: @gridGutterWidth * -1; .clearfix(); } diff --git a/NzbDrone.Web/_backboneApp/Content/Images/sort_asc.png b/NzbDrone.Web/_backboneApp/Content/Images/sort_asc.png new file mode 100644 index 0000000000000000000000000000000000000000..6689409ed43b68629901c10a434cb7c740294e3f GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3opai!tBg3pY56Z))r3MTPuM!v-tY$DUi04m= zKkCN7z^Lcx;uunKE9uAo|Mtv0$;?hpPJbM1D05C}`9%b*ktaRx>j*w!px^+8R9;4h6Lw zw#FC+BaRdXj)J11eGHNuMiMH0ryYQX97+>7!K%=!prEb2`|*#Dj~f+cO`Is0r{E#G zE0KY*CF#cP?fLs(y?$-awv%H?U{qAq@n>geb2q*bR)}(QW6M$Si1YV0-EO%dKf6Rs*RCFAe5JxLt&K^n}9=zDUZSdhL`Ir V7C0aOKL;4f44$rjF6*2UngCsak4FFi literal 0 HcmV?d00001 diff --git a/NzbDrone.Web/_backboneApp/Content/Images/sort_asc_disabled.png b/NzbDrone.Web/_backboneApp/Content/Images/sort_asc_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..965040f75478428f4d12c1d199b24d153a3592e7 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3opai!tBg3pY56Z))r3MTPuM!v-tY$DUi04m= zKkCN7z$oGA;uunKE9uYw|Mtv0YvT6KVwBymY11d>m7ESSAAWy--+!WL;lhO)S&U2_ zos9epl1EOQsF={&s>xZi#A3U zfv&`B*RI7^R#eC-OD|cyI=bS)fkt5kshbWHtV#|uFmW6;Sg_3g*RNko6?{F|?lzpd z+aSqt2&z|kTgkHr4;C;QGsH4)lBu#{=1>qhticMj?}&pdgMdSbDUU+KiYy5ShQO-^ y4GfD`B{DF&gaS?NSOu~=lozOBl@yym0)ttY>qPEMj=#Y0WbkzLb6Mw<&;$Tp3X9VK literal 0 HcmV?d00001 diff --git a/NzbDrone.Web/_backboneApp/Content/Images/sort_both.png b/NzbDrone.Web/_backboneApp/Content/Images/sort_both.png new file mode 100644 index 0000000000000000000000000000000000000000..3eea3fdc254af83bbc04f1c3a54b0f9fe3895249 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3opai!tBg3pY56Z))r3MTPuM!v-tY$DUi04m= zKkCN7z_`HE#WAGfR??sU|LvK1*2L|d#VEUB)22_%D>)rvKK%avzW+qg!i5VpvKW~< zIvM#HB#)dpQ8A&lRh7}jnfDkc15k8=qeImEnKLDiTxaKcY$~A8FoQ#qWy!%Lg;~A5 zzVh?AfjT+eB^F8?IdbF+Q<_4E%<4u4#v?6f6;^N`NP6?;jdf2?50j(GrbdO*7j29z z0$qvMu3d|-tf-JvmR_=Yb#%pp1C7E8Qa2qYSd|=RVB$Dxuwa?}uV25GD)@S^-EBB^ zw?UHQ5LB=7wvuNL9xPxqW{73pBvWO@%%LE1IBtL4SqClwQBl{2%q#-J%%Y4A42h<1 zUR+%K*>OgQWdlRfp=APH5OwIHFlqFF|gaJ zST@xB{B-o$x3{-9|Nr-QHIoqYC7$|!e<~SFJQ!0rI2c}9uUfTgWmi`h`vhK~z{RLAd7J+q38qc;?@G>z1rKX>I kz}B>hU$NPNLE!*H^U?VmN?nwcf$_@V>FVdQ&MBb@0D<|&GXMYp literal 0 HcmV?d00001 diff --git a/NzbDrone.Web/_backboneApp/Content/Images/sort_desc.png b/NzbDrone.Web/_backboneApp/Content/Images/sort_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..794f1fc1458323c4aa580c959d1d1bf311304834 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3opai!tBg3pY56Z))r3MTPuM!v-tY$DUi04m= zKkCN7z-a2};uunKE9uYw|MtvV85|f44Fd!jSOh|OnK=|zNwEnygqZRuG_1&ya9{|$ zYS6&2XjLKuqf6*v2BwZxZH!QbVkvye%E~jugoI}CFS@_CdV0q?#z;O}Z6+20ZnL8f za~K{gOLI(aj^tv|mAI$U(ZpZojkC1=c>dGM1$^D@7=vsSHNU(d4QDgP#*yIHnzwoN?Zz-D#h#*I5> z1_nR)ul$gAiH?rGZ&&|s53`3{tUd=bi$K`n1hyuVLp(0#9J7JCS}q%;FxS@9Y+Eed eauyf_%nYv!w$`!rS#AIZHiM_DpUXO@geCxH)s>zA literal 0 HcmV?d00001 diff --git a/NzbDrone.Web/_backboneApp/Content/Images/sort_desc_disabled.png b/NzbDrone.Web/_backboneApp/Content/Images/sort_desc_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..639bdb22820b44edf75aabee715b38872e0226f1 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3opai!tBg3pY56Z))r3MTPuM!v-tY$DUi04m= zKkCN7z$obH;uunKE9uYw|MtvV85|f44Fd!jSOh|OnK=|zNwEnygqZRuG_1&ya9{|$ zYS6&2XjLKuqf6*v2BwZxZH!QbVkzfdU0r?9L|glHjlkdE-`~5G@SZ4IxNxCH5d-6q zCSOBtZf~ZZ{v3r}G6D-CfQIU1uzlRTd2_S^r|JQo7Re)L&hT)`tEq99v;*x{E?W8V z*VpW6`tkd2+}T%K{q6q#`cQ`?hglEL&$s7qVADLn!*r=UBs4TwR8*8-K^kbDhG4;i z1C91JHa6}KT#ix;q$F?LxM9Gg;(t#oIh?*I*q@<)FNZ>lRfJ4M&Ha_u3rW`B` qOdRP}&SnA */function( window, document, undefined ) { + +(function( factory ) { + "use strict"; + + // Define as an AMD module if possible + if ( typeof define === 'function' && define.amd ) + { + define( ['jquery'], factory ); + } + /* Define using browser globals otherwise + * Prevent multiple instantiations if the script is loaded twice + */ + else if ( jQuery && !jQuery.fn.dataTable ) + { + factory( jQuery ); + } +} +(/** @lends */function( $ ) { + "use strict"; + + /** + * DataTables is a plug-in for the jQuery Javascript library. It is a highly + * flexible tool, based upon the foundations of progressive enhancement, + * which will add advanced interaction controls to any HTML table. For a + * full list of features please refer to + * [DataTables.net](href="http://datatables.net). + * + * Note that the `DataTable` object is not a global variable but is aliased + * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may + * be accessed. + * + * @class + * @param {object} [init={}] Configuration object for DataTables. Options + * are defined by {@link DataTable.defaults} + * @requires jQuery 1.3+ + * + * @example + * // Basic initialisation + * $(document).ready( function { + * $('#example').dataTable(); + * } ); + * + * @example + * // Initialisation with configuration options - in this case, disable + * // pagination and sorting. + * $(document).ready( function { + * $('#example').dataTable( { + * "paginate": false, + * "sort": false + * } ); + * } ); + */ + var DataTable; + + + + /** + * Create a mapping object that allows camel case parameters to be looked up + * for their Hungarian counterparts. The mapping is stored in a private + * parameter called `_hungaianMap` which can be accessed on the source object. + * @param {object} o + * @memberof DataTable#oApi + */ + function _fnHungarianMap ( o ) + { + var + hungarian = 'a aa ao as b fn i m o s ', + match, + newKey, + map = {}; + + $.each( o, function (key, val) { + match = key.match(/^([^A-Z]+?)([A-Z])/); + + if ( match && hungarian.indexOf(match[1]+' ') !== -1 ) + { + newKey = key.replace( match[0], match[2].toLowerCase() ); + map[ newKey ] = key; + + if ( match[1] === 'o' ) + { + _fnHungarianMap( o[key] ); + } + } + } ); + + o._hungaianMap = map; + } + + + /** + * Convert from camel case parameters to Hungarian, based on a Hungarian map + * created by _fnHungarianMap. + * @param {object} src The model object which holds all parameters that can be + * mapped. + * @param {object} user The object to convert from camel case to Hungarian. + * @param {boolean} force When set to `true`, properties which already have a + * Hungarian value in the `user` object will be overwritten. Otherwise they + * won't be. + * @memberof DataTable#oApi + */ + function _fnCamelToHungarian ( src, user, force ) + { + if ( ! src._hungaianMap ) + { + _fnHungarianMap( src ); + } + + var hungarianKey; + + $.each( user, function (key, val) { + hungarianKey = src._hungaianMap[ key ]; + + if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) ) + { + user[hungarianKey] = user[ key ]; + + if ( hungarianKey.charAt(0) === 'o' ) + { + _fnCamelToHungarian( src[hungarianKey], user[key] ); + } + } + } ); + } + + + /** + * Language compatibility - when certain options are given, and others aren't, we + * need to duplicate the values over, in order to provide backwards compatibility + * with older language files. + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnLanguageCompat( oLanguage ) + { + var oDefaults = DataTable.defaults.oLanguage; + + /* Backwards compatibility - if there is no sEmptyTable given, then use the same as + * sZeroRecords - assuming that is given. + */ + if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords && + oDefaults.sEmptyTable === "No data available in table" ) + { + _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' ); + } + + /* Likewise with loading records */ + if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords && + oDefaults.sLoadingRecords === "Loading..." ) + { + _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' ); + } + } + + + /** + * Browser feature detection for capabilities, quirks + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnBrowserDetect( oSettings ) + { + // Scrolling feature / quirks detection + var n = $( + '
'+ + '
'+ + '
'+ + '
'+ + '
')[0]; + + document.body.appendChild( n ); + // IE6/7 will oversize a width 100% element inside a scrolling element, to + // include the width of the scrollbar, while other browsers ensure the inner + // element is contained without forcing scrolling + oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false; + + // In rtl text layout, some browsers (most, but not all) will place the + // scrollbar on the left, rather than the right. + oSettings.oBrowser.bScrollbarLeft = $('#DT_BrowserTest', n).offset().left !== 1 ? true : false; + document.body.removeChild( n ); + } + + + /** + * Add a column to the list used for the table with default values + * @param {object} oSettings dataTables settings object + * @param {node} nTh The th element for this column + * @memberof DataTable#oApi + */ + function _fnAddColumn( oSettings, nTh ) + { + var oDefaults = DataTable.defaults.column; + var iCol = oSettings.aoColumns.length; + var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { + "sSortingClass": oSettings.oClasses.sSortable, + "sSortingClassJUI": oSettings.oClasses.sSortJUI, + "nTh": nTh ? nTh : document.createElement('th'), + "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', + "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], + "mData": oDefaults.mData ? oDefaults.oDefaults : iCol + } ); + oSettings.aoColumns.push( oCol ); + + /* Add a column specific filter */ + if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null ) + { + oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch ); + } + else + { + var oPre = oSettings.aoPreSearchCols[ iCol ]; + + /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */ + if ( oPre.bRegex === undefined ) + { + oPre.bRegex = true; + } + + if ( oPre.bSmart === undefined ) + { + oPre.bSmart = true; + } + + if ( oPre.bCaseInsensitive === undefined ) + { + oPre.bCaseInsensitive = true; + } + } + + /* Use the column options function to initialise classes etc */ + _fnColumnOptions( oSettings, iCol, null ); + } + + + /** + * Apply options for a column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column index to consider + * @param {object} oOptions object with sType, bVisible and bSearchable etc + * @memberof DataTable#oApi + */ + function _fnColumnOptions( oSettings, iCol, oOptions ) + { + var oCol = oSettings.aoColumns[ iCol ]; + + /* User specified column options */ + if ( oOptions !== undefined && oOptions !== null ) + { + // Map camel case parameters to their Hungarian counterparts + _fnCamelToHungarian( DataTable.defaults.column, oOptions ); + + /* Backwards compatibility for mDataProp */ + if ( oOptions.mDataProp !== undefined && !oOptions.mData ) + { + oOptions.mData = oOptions.mDataProp; + } + + if ( oOptions.sType !== undefined ) + { + oCol.sType = oOptions.sType; + oCol._bAutoType = false; + } + + $.extend( oCol, oOptions ); + _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); + + /* iDataSort to be applied (backwards compatibility), but aDataSort will take + * priority if defined + */ + if ( oOptions.iDataSort !== undefined ) + { + oCol.aDataSort = [ oOptions.iDataSort ]; + } + _fnMap( oCol, oOptions, "aDataSort" ); + } + + /* Cache the data get and set functions for speed */ + var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null; + var mData = _fnGetObjectDataFn( oCol.mData ); + + oCol.fnGetData = function (oData, sSpecific) { + var innerData = mData( oData, sSpecific ); + + if ( oCol.mRender && (sSpecific && sSpecific !== '') ) + { + return mRender( innerData, sSpecific, oData ); + } + return innerData; + }; + oCol.fnSetData = _fnSetObjectDataFn( oCol.mData ); + + /* Feature sorting overrides column specific when off */ + if ( !oSettings.oFeatures.bSort ) + { + oCol.bSortable = false; + } + + /* Check that the class assignment is correct for sorting */ + if ( !oCol.bSortable || + ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableNone; + oCol.sSortingClassJUI = ""; + } + else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortable; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI; + } + else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableAsc; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed; + } + else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 ) + { + oCol.sSortingClass = oSettings.oClasses.sSortableDesc; + oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed; + } + } + + + /** + * Adjust the table column widths for new data. Note: you would probably want to + * do a redraw after calling this function! + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAdjustColumnSizing ( oSettings ) + { + /* Not interested in doing column width calculation if auto-width is disabled */ + if ( oSettings.oFeatures.bAutoWidth === false ) + { + return false; + } + + _fnCalculateColumnWidths( oSettings ); + for ( var i=0 , iLen=oSettings.aoColumns.length ; i