2016-05-21 43 views
2

jQuery Datatableにさまざまなタイプの複数のカスタムフィルタを作成します。jQuery DateRangePickerとDatatableを使用する複数の日付範囲フィルタ

this jsFiddleに見られるように、1つの列に入力ボックスを作成することに成功しました。いくつかはテキスト検索で、その他は日付範囲です。私はjQuery daterangepickerをclass'date-filter 'を持つ入力ボックスで動作させるようにしました。列の表示/非表示をクリックし、「作成日」または「更新日」を選択すると、日付選択ツールが表示されます。

私は、選択した日付基準をプッシュするカスタムフィルタを作成しました。 ($ .fn.dataTableExt.afnFiltering.push(DateFilterFunction))。ただし、フィルターが期待どおりに機能しません。フィルターを累積したい。 1つの列(たとえば、更新日)の日付範囲を選択し、別の列(DateCreatedなど)を選択すると、フィルタが機能しているように見えます。ただし、2番目のフィルタを変更すると、もう1つのフィルタが変更されます。また、日付範囲列で特定のフィルタをクリアすると、既存のすべての日付範囲列フィルタが削除されます。この動作は不安定です。

誰かlook at the codeとして問題を解決できますか?

$(function() { 


    $('#mytable thead tr.filters th').each(function() { 
     var title = $(this).text(); 


     if ($(this).hasClass("input-filter")) { 


      $(this).html('<input name ="' + $.trim(title).replace(/ /g, '') + '" type="text" class = "form-control" placeholder="Search ' + $.trim(title) + '" />'); 
     } 
     else if ($(this).hasClass("date-filter")) { 

      $(this).html('<div class="input-prepend input-group"><span class="add-on input-group-addon"><i class="glyphicon glyphicon-calendar fa fa-calendar"></i></span><input type="text" style="width: 200px" name="' + $.trim(title).replace(/ /g, '') + '" placeholder="Search ' + $.trim(title) + '" class="form-control daterange"/></div>'); 

     } 

    }); 


    // DataTable 
    var table = $("#mytable").DataTable({ 

     dom: "rBftlip", 

     buttons: [ 
     { 
      extend: 'collection', 
      text: 'Export', 
      buttons: 
       [ 

        { 
         extend: "copy", 
         exportOptions: { columns: ':visible:not(:last-child)' }, //last column has the action types detail/edit/delete 
         footer:true 
        }, 
        { 
         extend: "csv", 
         exportOptions: { columns: ':visible:not(:last-child)' }, 
         footer: true 
        }, 
        { 
         extend: "excel", 
         exportOptions: { columns: ':visible:not(:last-child)' }, 
         footer:true 
        }, 
        { 
         extend: "pdf", 
         exportOptions: { columns: ':visible:not(:last-child)' }, 
         footer:true 
        }, 
        { 
         extend: "print", 
         exportOptions: { columns: ':visible:not(:last-child)' }, 
         footer: true 
        } 

       ] 
     } 
     ], 

     responsive: true, 
     "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]], 
     orderCellsTop: true, 
     scrollX: true, 
     colReorder: true, 


     language: { 
      search: '<div class="input-group"><span class="input-group-addon"><span class="glyphicon glyphicon-search"></span></span>', 
      searchPlaceholder: 'Search all columns', 
      lengthMenu: '<div class="input-group"><span class="input-group-addon"><span class="glyphicon glyphicon-menu-hamburger"></span></span>_MENU_</div>', 
      processing: "<img src='../Content/images/ajax-loader.gif'>" 
     }, 

     processing: true, 


     "initComplete": function (settings, json) { 
      // $("#mytable_processing").css("visibility", "hidden"); 
      $('#mytable').fadeIn(); 
     }, 



     "footerCallback": function(tfoot, data, start, end, display) { 
      var info = $('#mytable').DataTable().page.info(); 
      $(tfoot).find('td').eq(0).html("Total Count: " + info.recordsDisplay); 


     }, 

    }); 

    new $.fn.dataTable.Buttons(table, { 
     buttons: [ 
      { 
       extend: 'colvis', 
       text: 'Show/Hide Columns' 

      }, 

     ] 
    }); 

    //add button to top 
    table.buttons(0, null).container().prependTo(
      table.table().container() 
    ); 


    //remove class from search filter 
    ($("#mytable_filter input").removeClass("input-sm")); 





    //instantiate datepicker and choose your format of the dates 
    $('.daterange').daterangepicker({ 
     ranges: { 
      "Today": [moment(), moment()], 
      'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], 
      '7 last days': [moment().subtract(6, 'days'), moment()], 
      '30 last days': [moment().subtract(29, 'days'), moment()], 
      'This month': [moment().startOf('month'), moment().endOf('month')], 
      'Last month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] 
     }, 
     autoUpdateInput: false, 
     opens:"left", 
     locale: { 
      cancelLabel: 'Clear', 
      format: 'DD-MMM-YYYY' 
     } 
    }); 


    // $.fn.dataTableExt.afnFiltering = new Array(); 

    //get column index for date range 
    var visiblecolumnIndex; 
    var dataColumnIndex; //current data column to work with 

    $("#mytable_wrapper thead").on("mousedown", "th", function (event) { 
     visiblecolumnIndex = $(this).parent().children().index($(this)); 
     dataColumnIndex = $("tr:first-child").children(':eq(' + visiblecolumnIndex + ')').attr('data-column-index'); 

    }); 


    var startDate; 
    var endDate; 



    var DateFilterFunction = (function (settings, data, iDataIndex) { 

     var filterstart = startDate; 
     var filterend = endDate; 
     var iStartDateCol = dataColumnIndex; 
     var iEndDateCol = dataColumnIndex; 

     var tabledatestart = data[iStartDateCol] !== "" ? moment(data[iStartDateCol], "DD-MMM-YYYY") : data[iStartDateCol]; 
     var tabledateend = data[iEndDateCol] !== "" ? moment(data[iEndDateCol], "DD-MMM-YYYY") : data[iEndDateCol]; 



     if (filterstart === "" && filterend === "") { 
      return true; 
     } 

     else if ((moment(filterstart, "DD-MMM-YYYY").isSame(tabledatestart) || moment(filterstart, "DD-MMM-YYYY").isBefore(tabledatestart)) && filterend === "") { 
      return true; 
     } 
     else if ((moment(filterstart, "DD-MMM-YYYY").isSame(tabledatestart) || moment(filterstart, "DD-MMM-YYYY").isAfter(tabledatestart)) && filterstart === "") { 
      return true; 
     } 
     else if ((moment(filterstart, "DD-MMM-YYYY").isSame(tabledatestart) || moment(filterstart, "DD-MMM-YYYY").isBefore(tabledatestart)) && (moment(filterend, "DD-MMM-YYYY").isSame(tabledateend) || moment(filterend, "DD-MMM-YYYY").isAfter(tabledateend))) { 
      return true; 
     } 

     return false; 


    }); 




    $(".daterange", this).on('apply.daterangepicker', function (ev, picker) { 
     ev.preventDefault(); 
     $(this).val(picker.startDate.format('DD-MMM-YYYY') + ' to ' + picker.endDate.format('DD-MMM-YYYY')); 
     startDate = picker.startDate.format('DD-MMM-YYYY'); 
     endDate = picker.endDate.format('DD-MMM-YYYY'); 
     $.fn.dataTableExt.afnFiltering.push(DateFilterFunction); 

     table.draw(); 

    }); 

    $(".daterange", this).on('cancel.daterangepicker', function (ev, picker) { 
     ev.preventDefault(); 
     $(this).val(''); 
     startDate = ''; 
     endDate = ''; 
     $.fn.dataTableExt.afnFiltering.push(DateFilterFunction); 

     table.draw(); 


    }); 



    //hide unnecessary columns 
    var column = table.columns($('.HideColumn')); 
    // Toggle the visibility 
    column.visible(!column.visible()); 

    // Apply the search 
    $.each($('.input-filter', table.table().header()), function() { 
     var column = table.column($(this).index()); 
     //onsole.log(column); 
     $('input', this).on('keyup change', function() { 
      if (column.search() !== this.value) { 
       column 
        .search(this.value) 
        .draw(); 
      } 
     }); 
    }); 





}); /////////////////////// end of Datatable function 

答えて

0

私は最終的に動作するようになった。ここで興味のある人のための私の解決策だった:

https://jsfiddle.net/a9pLk0ud/2/

//instantiate datepicker and choose your format of the dates 
 
    $('.daterange').daterangepicker({ 
 
     ranges: { 
 
      "Today": [moment(), moment()], 
 
      'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], 
 
      '7 last days': [moment().subtract(6, 'days'), moment()], 
 
      '30 last days': [moment().subtract(29, 'days'), moment()], 
 
      'This month': [moment().startOf('month'), moment().endOf('month')], 
 
      'Last month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')], 
 
      'Blank date': [moment("0001-01-01"), moment("0001-01-01")] 
 
     } 
 
     , 
 
     autoUpdateInput: false, 
 
     opens: "left", 
 
     locale: { 
 
      cancelLabel: 'Clear', 
 
      format: 'DD-MMM-YYYY' 
 
     } 
 
    }); 
 

 
    var startDate; 
 
    var endDate; 
 
    var dataIdx; //current data column to work with 
 

 

 
    $("#mytable_wrapper thead").on("mousedown", "th", function (event) { 
 
     var visIdx = $(this).parent().children().index($(this)); 
 
     dataIdx = table.column.index('fromVisible', visIdx); 
 
    }); 
 

 

 

 

 
    // Function for converting a dd/mmm/yyyy date value into a numeric string for comparison (example 01-Dec-2010 becomes 20101201 
 
    function parseDateValue(rawDate) { 
 

 
     var d = moment(rawDate, "DD-MMM-YYYY").format('DD-MM-YYYY'); 
 
     var dateArray = d.split("-"); 
 
     var parsedDate = dateArray[2] + dateArray[1] + dateArray[0]; 
 
     return parsedDate; 
 
    } 
 

 

 

 

 

 
    //filter on daterange 
 
    $(".daterange").on('apply.daterangepicker', function (ev, picker) { 
 

 
     ev.preventDefault(); 
 

 

 

 
     //if blank date option was selected 
 
     if ((picker.startDate.format('DD-MMM-YYYY') == "01-Jan-0001") && (picker.endDate.format('DD-MMM-YYYY')) == "01-Jan-0001") { 
 
      $(this).val('Blank'); 
 

 

 
      val = "^$"; 
 

 
      table.column(dataIdx) 
 
       .search(val, true, false, true) 
 
       .draw(); 
 

 
     } 
 
     else { 
 
      //set field value 
 
      $(this).val(picker.startDate.format('DD-MMM-YYYY') + ' to ' + picker.endDate.format('DD-MMM-YYYY')); 
 

 

 

 
      //run date filter 
 
      startDate = picker.startDate.format('DD-MMM-YYYY'); 
 
      endDate = picker.endDate.format('DD-MMM-YYYY'); 
 

 
      var dateStart = parseDateValue(startDate); 
 
      var dateEnd = parseDateValue(endDate); 
 

 
      var filteredData = table 
 
        .column(dataIdx) 
 
        .data() 
 
        .filter(function (value, index) { 
 

 
         var evalDate = value === "" ? 0 : parseDateValue(value); 
 
         if ((isNaN(dateStart) && isNaN(dateEnd)) || (evalDate >= dateStart && evalDate <= dateEnd)) { 
 

 
          return true; 
 
         } 
 
         return false; 
 
        }); 
 

 

 
      var val = ""; 
 
      for (var count = 0; count < filteredData.length; count++) { 
 

 
       val += filteredData[count] + "|"; 
 
      } 
 

 
      val = val.slice(0, -1); 
 

 

 
      table.column(dataIdx) 
 
        .search(val ? "^" + val + "$" : "^" + "-" + "$", true, false, true) 
 
        .draw(); 
 
     } 
 

 

 
     
 

 
    }); 
 

 

 
    $(".daterange").on('cancel.daterangepicker', function (ev, picker) { 
 
     ev.preventDefault(); 
 
     $(this).val(''); 
 
     table.column(dataIdx) 
 
       .search("") 
 
       .draw(); 
 

 
     
 

 

 

 
    });

1

後半に来て、私はそれがコードの下に与えられたと完璧に働いてしまった:

ここからの抜粋です私のコードでは、年齢と日付をフィルタリングしています。自分のデータで変更するだけです。今、あなたはつもりフィルタリングに

を与え、

table.draw();//where table is your initialized DataTable 

を入れて、あなたの入力ボックスにjqueryのか何かでからkeyupトリガーを配置

 $.fn.dataTable.ext.search.push(
     function(settings, data, dataIndex) { 
      var min = parseInt($('#minAge').val()); 
      var max = parseInt($('#maxAge').val()); 
      var age = parseFloat(data[3]) || 0; // use data for the age column 

      var dateMin = Date.parse($('#dateMin').val()); 
      var dateMax = Date.parse($('#dateMax').val()); 
      var date = parseFloat(Date.parse(data[4])) || 0; //use data for date column 

      if (((isNaN(min) && isNaN(max)) || 
       (isNaN(min) && age <= max) || 
       (min <= age && isNaN(max)) || 
       (min <= age && age <= max)) && 
       ((isNaN(dateMin) && isNaN(dateMax)) || 
       (isNaN(dateMin) && date <= dateMax) || 
       (dateMin <= date && isNaN(dateMax)) || 
       (dateMin <= date && date <= dateMax))) 
      { 
       return true; 
      } 
       return false; 
     } 
    ); 

をして:あなたはあなたのDataTableを初期化した後に、このコードを配置あなたは終わった!