0
|
1
|
|
2
|
|
3 /**
|
|
4 * Add a column to the list used for the table with default values
|
|
5 * @param {object} oSettings dataTables settings object
|
|
6 * @param {node} nTh The th element for this column
|
|
7 * @memberof DataTable#oApi
|
|
8 */
|
|
9 function _fnAddColumn( oSettings, nTh )
|
|
10 {
|
|
11 var oDefaults = DataTable.defaults.columns;
|
|
12 var iCol = oSettings.aoColumns.length;
|
|
13 var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
|
|
14 "sSortingClass": oSettings.oClasses.sSortable,
|
|
15 "sSortingClassJUI": oSettings.oClasses.sSortJUI,
|
|
16 "nTh": nTh ? nTh : document.createElement('th'),
|
|
17 "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
|
|
18 "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
|
|
19 "mData": oDefaults.mData ? oDefaults.oDefaults : iCol
|
|
20 } );
|
|
21 oSettings.aoColumns.push( oCol );
|
|
22
|
|
23 /* Add a column specific filter */
|
|
24 if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
|
|
25 {
|
|
26 oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
|
|
27 }
|
|
28 else
|
|
29 {
|
|
30 var oPre = oSettings.aoPreSearchCols[ iCol ];
|
|
31
|
|
32 /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
|
|
33 if ( oPre.bRegex === undefined )
|
|
34 {
|
|
35 oPre.bRegex = true;
|
|
36 }
|
|
37
|
|
38 if ( oPre.bSmart === undefined )
|
|
39 {
|
|
40 oPre.bSmart = true;
|
|
41 }
|
|
42
|
|
43 if ( oPre.bCaseInsensitive === undefined )
|
|
44 {
|
|
45 oPre.bCaseInsensitive = true;
|
|
46 }
|
|
47 }
|
|
48
|
|
49 /* Use the column options function to initialise classes etc */
|
|
50 _fnColumnOptions( oSettings, iCol, null );
|
|
51 }
|
|
52
|
|
53
|
|
54 /**
|
|
55 * Apply options for a column
|
|
56 * @param {object} oSettings dataTables settings object
|
|
57 * @param {int} iCol column index to consider
|
|
58 * @param {object} oOptions object with sType, bVisible and bSearchable etc
|
|
59 * @memberof DataTable#oApi
|
|
60 */
|
|
61 function _fnColumnOptions( oSettings, iCol, oOptions )
|
|
62 {
|
|
63 var oCol = oSettings.aoColumns[ iCol ];
|
|
64
|
|
65 /* User specified column options */
|
|
66 if ( oOptions !== undefined && oOptions !== null )
|
|
67 {
|
|
68 /* Backwards compatibility for mDataProp */
|
|
69 if ( oOptions.mDataProp && !oOptions.mData )
|
|
70 {
|
|
71 oOptions.mData = oOptions.mDataProp;
|
|
72 }
|
|
73
|
|
74 if ( oOptions.sType !== undefined )
|
|
75 {
|
|
76 oCol.sType = oOptions.sType;
|
|
77 oCol._bAutoType = false;
|
|
78 }
|
|
79
|
|
80 $.extend( oCol, oOptions );
|
|
81 _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
|
|
82
|
|
83 /* iDataSort to be applied (backwards compatibility), but aDataSort will take
|
|
84 * priority if defined
|
|
85 */
|
|
86 if ( oOptions.iDataSort !== undefined )
|
|
87 {
|
|
88 oCol.aDataSort = [ oOptions.iDataSort ];
|
|
89 }
|
|
90 _fnMap( oCol, oOptions, "aDataSort" );
|
|
91 }
|
|
92
|
|
93 /* Cache the data get and set functions for speed */
|
|
94 var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
|
|
95 var mData = _fnGetObjectDataFn( oCol.mData );
|
|
96
|
|
97 oCol.fnGetData = function (oData, sSpecific) {
|
|
98 var innerData = mData( oData, sSpecific );
|
|
99
|
|
100 if ( oCol.mRender && (sSpecific && sSpecific !== '') )
|
|
101 {
|
|
102 return mRender( innerData, sSpecific, oData );
|
|
103 }
|
|
104 return innerData;
|
|
105 };
|
|
106 oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
|
|
107
|
|
108 /* Feature sorting overrides column specific when off */
|
|
109 if ( !oSettings.oFeatures.bSort )
|
|
110 {
|
|
111 oCol.bSortable = false;
|
|
112 }
|
|
113
|
|
114 /* Check that the class assignment is correct for sorting */
|
|
115 if ( !oCol.bSortable ||
|
|
116 ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
|
|
117 {
|
|
118 oCol.sSortingClass = oSettings.oClasses.sSortableNone;
|
|
119 oCol.sSortingClassJUI = "";
|
|
120 }
|
|
121 else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
|
|
122 {
|
|
123 oCol.sSortingClass = oSettings.oClasses.sSortable;
|
|
124 oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
|
|
125 }
|
|
126 else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
|
|
127 {
|
|
128 oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
|
|
129 oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
|
|
130 }
|
|
131 else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
|
|
132 {
|
|
133 oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
|
|
134 oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
|
|
135 }
|
|
136 }
|
|
137
|
|
138
|
|
139 /**
|
|
140 * Adjust the table column widths for new data. Note: you would probably want to
|
|
141 * do a redraw after calling this function!
|
|
142 * @param {object} oSettings dataTables settings object
|
|
143 * @memberof DataTable#oApi
|
|
144 */
|
|
145 function _fnAdjustColumnSizing ( oSettings )
|
|
146 {
|
|
147 /* Not interested in doing column width calculation if auto-width is disabled */
|
|
148 if ( oSettings.oFeatures.bAutoWidth === false )
|
|
149 {
|
|
150 return false;
|
|
151 }
|
|
152
|
|
153 _fnCalculateColumnWidths( oSettings );
|
|
154 for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
|
|
155 {
|
|
156 oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
|
|
157 }
|
|
158 }
|
|
159
|
|
160
|
|
161 /**
|
|
162 * Covert the index of a visible column to the index in the data array (take account
|
|
163 * of hidden columns)
|
|
164 * @param {object} oSettings dataTables settings object
|
|
165 * @param {int} iMatch Visible column index to lookup
|
|
166 * @returns {int} i the data index
|
|
167 * @memberof DataTable#oApi
|
|
168 */
|
|
169 function _fnVisibleToColumnIndex( oSettings, iMatch )
|
|
170 {
|
|
171 var aiVis = _fnGetColumns( oSettings, 'bVisible' );
|
|
172
|
|
173 return typeof aiVis[iMatch] === 'number' ?
|
|
174 aiVis[iMatch] :
|
|
175 null;
|
|
176 }
|
|
177
|
|
178
|
|
179 /**
|
|
180 * Covert the index of an index in the data array and convert it to the visible
|
|
181 * column index (take account of hidden columns)
|
|
182 * @param {int} iMatch Column index to lookup
|
|
183 * @param {object} oSettings dataTables settings object
|
|
184 * @returns {int} i the data index
|
|
185 * @memberof DataTable#oApi
|
|
186 */
|
|
187 function _fnColumnIndexToVisible( oSettings, iMatch )
|
|
188 {
|
|
189 var aiVis = _fnGetColumns( oSettings, 'bVisible' );
|
|
190 var iPos = $.inArray( iMatch, aiVis );
|
|
191
|
|
192 return iPos !== -1 ? iPos : null;
|
|
193 }
|
|
194
|
|
195
|
|
196 /**
|
|
197 * Get the number of visible columns
|
|
198 * @param {object} oSettings dataTables settings object
|
|
199 * @returns {int} i the number of visible columns
|
|
200 * @memberof DataTable#oApi
|
|
201 */
|
|
202 function _fnVisbleColumns( oSettings )
|
|
203 {
|
|
204 return _fnGetColumns( oSettings, 'bVisible' ).length;
|
|
205 }
|
|
206
|
|
207
|
|
208 /**
|
|
209 * Get an array of column indexes that match a given property
|
|
210 * @param {object} oSettings dataTables settings object
|
|
211 * @param {string} sParam Parameter in aoColumns to look for - typically
|
|
212 * bVisible or bSearchable
|
|
213 * @returns {array} Array of indexes with matched properties
|
|
214 * @memberof DataTable#oApi
|
|
215 */
|
|
216 function _fnGetColumns( oSettings, sParam )
|
|
217 {
|
|
218 var a = [];
|
|
219
|
|
220 $.map( oSettings.aoColumns, function(val, i) {
|
|
221 if ( val[sParam] ) {
|
|
222 a.push( i );
|
|
223 }
|
|
224 } );
|
|
225
|
|
226 return a;
|
|
227 }
|
|
228
|
|
229
|
|
230 /**
|
|
231 * Get the sort type based on an input string
|
|
232 * @param {string} sData data we wish to know the type of
|
|
233 * @returns {string} type (defaults to 'string' if no type can be detected)
|
|
234 * @memberof DataTable#oApi
|
|
235 */
|
|
236 function _fnDetectType( sData )
|
|
237 {
|
|
238 var aTypes = DataTable.ext.aTypes;
|
|
239 var iLen = aTypes.length;
|
|
240
|
|
241 for ( var i=0 ; i<iLen ; i++ )
|
|
242 {
|
|
243 var sType = aTypes[i]( sData );
|
|
244 if ( sType !== null )
|
|
245 {
|
|
246 return sType;
|
|
247 }
|
|
248 }
|
|
249
|
|
250 return 'string';
|
|
251 }
|
|
252
|
|
253
|
|
254 /**
|
|
255 * Figure out how to reorder a display list
|
|
256 * @param {object} oSettings dataTables settings object
|
|
257 * @returns array {int} aiReturn index list for reordering
|
|
258 * @memberof DataTable#oApi
|
|
259 */
|
|
260 function _fnReOrderIndex ( oSettings, sColumns )
|
|
261 {
|
|
262 var aColumns = sColumns.split(',');
|
|
263 var aiReturn = [];
|
|
264
|
|
265 for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
|
|
266 {
|
|
267 for ( var j=0 ; j<iLen ; j++ )
|
|
268 {
|
|
269 if ( oSettings.aoColumns[i].sName == aColumns[j] )
|
|
270 {
|
|
271 aiReturn.push( j );
|
|
272 break;
|
|
273 }
|
|
274 }
|
|
275 }
|
|
276
|
|
277 return aiReturn;
|
|
278 }
|
|
279
|
|
280
|
|
281 /**
|
|
282 * Get the column ordering that DataTables expects
|
|
283 * @param {object} oSettings dataTables settings object
|
|
284 * @returns {string} comma separated list of names
|
|
285 * @memberof DataTable#oApi
|
|
286 */
|
|
287 function _fnColumnOrdering ( oSettings )
|
|
288 {
|
|
289 var sNames = '';
|
|
290 for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
|
|
291 {
|
|
292 sNames += oSettings.aoColumns[i].sName+',';
|
|
293 }
|
|
294 if ( sNames.length == iLen )
|
|
295 {
|
|
296 return "";
|
|
297 }
|
|
298 return sNames.slice(0, -1);
|
|
299 }
|
|
300
|
|
301
|
|
302 /**
|
|
303 * Take the column definitions and static columns arrays and calculate how
|
|
304 * they relate to column indexes. The callback function will then apply the
|
|
305 * definition found for a column to a suitable configuration object.
|
|
306 * @param {object} oSettings dataTables settings object
|
|
307 * @param {array} aoColDefs The aoColumnDefs array that is to be applied
|
|
308 * @param {array} aoCols The aoColumns array that defines columns individually
|
|
309 * @param {function} fn Callback function - takes two parameters, the calculated
|
|
310 * column index and the definition for that column.
|
|
311 * @memberof DataTable#oApi
|
|
312 */
|
|
313 function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
|
|
314 {
|
|
315 var i, iLen, j, jLen, k, kLen;
|
|
316
|
|
317 // Column definitions with aTargets
|
|
318 if ( aoColDefs )
|
|
319 {
|
|
320 /* Loop over the definitions array - loop in reverse so first instance has priority */
|
|
321 for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
|
|
322 {
|
|
323 /* Each definition can target multiple columns, as it is an array */
|
|
324 var aTargets = aoColDefs[i].aTargets;
|
|
325 if ( !$.isArray( aTargets ) )
|
|
326 {
|
|
327 _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
|
|
328 }
|
|
329
|
|
330 for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
|
|
331 {
|
|
332 if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
|
|
333 {
|
|
334 /* Add columns that we don't yet know about */
|
|
335 while( oSettings.aoColumns.length <= aTargets[j] )
|
|
336 {
|
|
337 _fnAddColumn( oSettings );
|
|
338 }
|
|
339
|
|
340 /* Integer, basic index */
|
|
341 fn( aTargets[j], aoColDefs[i] );
|
|
342 }
|
|
343 else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
|
|
344 {
|
|
345 /* Negative integer, right to left column counting */
|
|
346 fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
|
|
347 }
|
|
348 else if ( typeof aTargets[j] === 'string' )
|
|
349 {
|
|
350 /* Class name matching on TH element */
|
|
351 for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
|
|
352 {
|
|
353 if ( aTargets[j] == "_all" ||
|
|
354 $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
|
|
355 {
|
|
356 fn( k, aoColDefs[i] );
|
|
357 }
|
|
358 }
|
|
359 }
|
|
360 }
|
|
361 }
|
|
362 }
|
|
363
|
|
364 // Statically defined columns array
|
|
365 if ( aoCols )
|
|
366 {
|
|
367 for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
|
|
368 {
|
|
369 fn( i, aoCols[i] );
|
|
370 }
|
|
371 }
|
|
372 }
|
|
373
|