|
1 | 1 | /* |
2 | 2 | * File: jquery.dataTables.columnFilter.js |
3 | | -* Version: 1.5.4. |
| 3 | +* Version: 1.5.5. |
4 | 4 | * Author: Jovan Popovic |
5 | 5 | * |
6 | 6 | * Copyright 2011-2014 Jovan Popovic, all rights reserved. |
|
330 | 330 |
|
331 | 331 | } |
332 | 332 |
|
333 | | - function fnCreateColumnSelect(oTable, aData, iColumn, nTh, sLabel, bRegex, oSelected) { |
| 333 | + function fnCreateColumnSelect(oTable, aData, iColumn, nTh, sLabel, bRegex, oSelected, bMultiselect) { |
334 | 334 | if (aData == null) |
335 | 335 | aData = _fnGetColumnValues(oTable.fnSettings(), iColumn, true, false, true); |
336 | 336 | var index = iColumn; |
|
339 | 339 | currentFilter = oSelected; |
340 | 340 |
|
341 | 341 | var r = '<select class="search_init select_filter" rel="' + i + '"><option value="" class="search_init">' + sLabel + '</option>'; |
| 342 | + if(bMultiselect) { |
| 343 | + r = '<select class="search_init select_filter" rel="' + i + ' multiple>'; |
| 344 | + } |
342 | 345 | var j = 0; |
343 | 346 | var iLen = aData.length; |
344 | 347 | for (j = 0; j < iLen; j++) { |
|
366 | 369 | var select = $(r + '</select>'); |
367 | 370 | nTh.html(select); |
368 | 371 | nTh.wrapInner('<span class="filter_column filter_select" />'); |
369 | | - select.change(function () { |
370 | | - //var val = $(this).val(); |
371 | | - if ($(this).val() != "") { |
372 | | - $(this).removeClass("search_init"); |
373 | | - } else { |
374 | | - $(this).addClass("search_init"); |
375 | | - } |
376 | | - if (bRegex) |
377 | | - oTable.fnFilter($(this).val(), iColumn, bRegex); //Issue 41 |
378 | | - else |
379 | | - oTable.fnFilter(unescape($(this).val()), iColumn); //Issue 25 |
380 | | - fnOnFiltered(); |
381 | | - }); |
382 | | - if (currentFilter != null && currentFilter != "")//Issue 81 |
383 | | - oTable.fnFilter(unescape(currentFilter), iColumn); |
| 372 | + |
| 373 | + if(bMultiselect) { |
| 374 | + select.change(function () { |
| 375 | + if ($(this).val() != "") { |
| 376 | + $(this).removeClass("search_init"); |
| 377 | + } else { |
| 378 | + $(this).addClass("search_init"); |
| 379 | + } |
| 380 | + var selectedOptions = $(this).val(); |
| 381 | + var asEscapedFilters = []; |
| 382 | + if(selectedOptions==null || selectedOptions==[]){ |
| 383 | + var re = '^(.*)$'; |
| 384 | + }else{ |
| 385 | + $.each( selectedOptions, function( i, sFilter ) { |
| 386 | + asEscapedFilters.push( fnRegExpEscape( sFilter ) ); |
| 387 | + } ); |
| 388 | + var re = '^(' + asEscapedFilters.join('|') + ')$'; |
| 389 | + } |
| 390 | + |
| 391 | + oTable.fnFilter( re, index, true, false ); |
| 392 | + }); |
| 393 | + } else { |
| 394 | + select.change(function () { |
| 395 | + //var val = $(this).val(); |
| 396 | + if ($(this).val() != "") { |
| 397 | + $(this).removeClass("search_init"); |
| 398 | + } else { |
| 399 | + $(this).addClass("search_init"); |
| 400 | + } |
| 401 | + if (bRegex) |
| 402 | + oTable.fnFilter($(this).val(), iColumn, bRegex); //Issue 41 |
| 403 | + else |
| 404 | + oTable.fnFilter(unescape($(this).val()), iColumn); //Issue 25 |
| 405 | + fnOnFiltered(); |
| 406 | + }); |
| 407 | + if (currentFilter != null && currentFilter != "")//Issue 81 |
| 408 | + oTable.fnFilter(unescape(currentFilter), iColumn); |
| 409 | + } |
384 | 410 | } |
385 | 411 |
|
386 | | - function fnCreateSelect(oTable, aData, bRegex, oSelected) { |
| 412 | + function fnCreateSelect(oTable, aData, bRegex, oSelected, bMultiselect) { |
387 | 413 | var oSettings = oTable.fnSettings(); |
388 | 414 | if ( (aData == null || typeof(aData) == 'function' ) && oSettings.sAjaxSource != "" && !oSettings.oFeatures.bServerSide) { |
389 | 415 | // Add a function to the draw callback, which will check for the Ajax data having |
|
395 | 421 | // Only rebuild the select on the second draw - i.e. when the Ajax |
396 | 422 | // data has been loaded. |
397 | 423 | if (oSettings.iDraw == 2 && oSettings.sAjaxSource != null && oSettings.sAjaxSource != "" && !oSettings.oFeatures.bServerSide) { |
398 | | - return fnCreateColumnSelect(oTable, aData && aData(oSettings.aoData, oSettings), _fnColumnIndex(iColumn), nTh, sLabel, bRegex, oSelected); //Issue 37 |
| 424 | + return fnCreateColumnSelect(oTable, aData && aData(oSettings.aoData, oSettings), _fnColumnIndex(iColumn), nTh, sLabel, bRegex, oSelected, bMultiselect); //Issue 37 |
399 | 425 | } |
400 | 426 | }; |
401 | 427 | })(i, th, label), |
402 | 428 | "sName": "column_filter_" + i |
403 | 429 | }); |
404 | 430 | } |
405 | 431 | // Regardless of the Ajax state, build the select on first pass |
406 | | - fnCreateColumnSelect(oTable, typeof(aData) == 'function' ? null: aData, _fnColumnIndex(i), th, label, bRegex, oSelected); //Issue 37 |
| 432 | + fnCreateColumnSelect(oTable, typeof(aData) == 'function' ? null: aData, _fnColumnIndex(i), th, label, bRegex, oSelected, bMultiselect); //Issue 37 |
407 | 433 |
|
408 | 434 | } |
| 435 | + |
| 436 | + function fnRegExpEscape( sText ) { |
| 437 | + return sText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); |
| 438 | + }; |
409 | 439 |
|
410 | 440 | function fnCreateDropdown(aData) { |
411 | 441 | var index = i; |
|
722 | 752 | case "select": |
723 | 753 | if (aoColumn.bRegex != true) |
724 | 754 | aoColumn.bRegex = false; |
725 | | - fnCreateSelect(oTable, aoColumn.values, aoColumn.bRegex, aoColumn.selected); |
| 755 | + fnCreateSelect(oTable, aoColumn.values, aoColumn.bRegex, aoColumn.selected, aoColumn.multiple); |
726 | 756 | break; |
727 | 757 | case "number-range": |
728 | 758 | fnCreateRangeInput(oTable); |
|
0 commit comments