Andrew
Andrew

Reputation: 622

How to make multiple conditions inside filter datatable jQuery

I Work with datatable library, and i have issues. In my page i have filtering menu, which generate filtering values depends of table header values.

When page start, i filter data, show only active values, if user want to see inactive he can press:

enter image description here

And user will see all values, but in case if i goo to main filters:

enter image description here

And choose some values, and try to make all values active or inactive filtering is not working. How i can solve this issues?

My code for filtering:

function drawTable(table, className, lenth) {
    $.fn.dataTable.ext.search.push(
        function (settings, data, dataIndex) {
            return $(table.row(dataIndex).node()).find(className).length == lenth;
        }
    );
    table.draw();
}

$(document).ready(function () {
    var table = $('#' + tableId + '').DataTable();
    if ($(".fa").hasClass("fa-eye")) {
        drawTable(table, '.fa-inactive, .fa-invisible-data', 0);
    }

    $(".fa-eye-slash").click(function () {
        $(".fa-visibles").removeClass('hide');
        $(".fa-invisibles").addClass('hide');
        $.fn.dataTable.ext.search.pop();
        table.draw();
    });

    $(".fa-eye").click(function () {
        $(".fa-visibles").addClass('hide');
        $(".fa-invisibles").removeClass('hide');
        drawTable(table, '.fa-inactive, .fa-invisible-data', 0);
    });
});

JSFIDDLE

Whe u tap on filtering icon, chosee for example "Office -> Regional Director", on table 3 values, but showing only two, i want to cancel this filter and tap on eye, but this not work.

Upvotes: 1

Views: 2438

Answers (2)

NayDwe
NayDwe

Reputation: 659

According your code JSFiddle, all your code are working fine. Multiple Conditions does not work because your logic are wrong.

Let me explain.

  • Active and inactive condition is working with current table's data.

  • First, table's data have all data (active and inactive). You can filter like "Office -> Regional Director", you can found 3 record. And then you can click Active and inactive condition event. It will work correctly.

  • Second, you hide some inactive data from table, it have only active data in your table.And then, you filter like "Office -> Regional Director". You can only found 2 record, cannot show inactive record because current table's data doesn't have inactive data.

Solution:

  • you should adjust your code when call filter function, your must reload all table data first and then your can call filter process with all data.
  • when finish filter data, you must check active or inactive conditions.

Example Code, Based on your provided code. I hope you will understand.

let tableId = "example";
$('.filtering-system').hide();
$('.button-container').hide();

 addSpliting('');

function showAllVaues() {
    $('#' + tableId + '').dataTable().api().pagae.len(-1).draw();
}

function addSpliting(val, length) {
    if (val != '') {
        //start Reload- Before Filter event, need to reload all data
        var table = $('#' + tableId + '').DataTable();
        $.fn.dataTable.ext.search.pop();
        table.draw();
        //end Reload
        $('#' + tableId + '').DataTable({
            destroy: true,
            searchPanes: {
                layout: 'columns-' + length + ''
            },
            columnDefs: [{
                searchPanes: {
                    show: true
                },
                targets: '_all'
            }],

            dom: 'Pfrtip'
        });
        
        $('.dtsp-searchPanes').children().each(function (i, obj) {
            if (!val.includes(i)) $(this).hide();
            else $(this).show();
        });
        //start check - When get filter data, need to check active or not 
        if ($(".fa").hasClass("fa-eye")) {
        drawTable(table, '.fa-inactive, .fa-invisible-data', 0);
        }
        //end check
    } else {
        $('#' + tableId + '').DataTable({
            destroy: true
        });
    }
}

function setFilters() {
    $("table thead tr th").each(function (index) {
        var boxes = `<label>
                <input type="checkbox" class="custom-checkbox" id="${index}"/>
                ${$(this).text()}
                </label>`;
        if ($(this).text() != "" && $(this).hasClass('checkbox-mark') === false) $(".checkBoxes").append(boxes);
    });
}

setFilters();

$("#createFilter").on("click", function () {
    var columFilters = [];

    $('.custom-checkbox:checked').each(function () {
        columFilters.push(parseInt($(this).attr('id')));
    });

    addSpliting(columFilters, columFilters.length);
});

$("#fil-sys").on("click", function () {
    $('.filtering-system').slideToggle('slow');
});

function drawTable(table, className, lenth) {
    $.fn.dataTable.ext.search.push(
        function (settings, data, dataIndex) {
            return $(table.row(dataIndex).node()).find(className).length == lenth;
        }
    );
    table.draw();
}

$(document).ready(function () {
    var table = $('#' + tableId + '').DataTable();
    if ($(".fa").hasClass("fa-eye")) {
        drawTable(table, '.fa-inactive, .fa-invisible-data', 0);
    }

    $(".fa-eye-slash").click(function () {
        $(".fa-visibles").removeClass('hide');
        $(".fa-invisibles").addClass('hide');
        $.fn.dataTable.ext.search.pop();
        table.draw();
    });

    $(".fa-eye").click(function () {
        $(".fa-visibles").addClass('hide');
        $(".fa-invisibles").removeClass('hide');
        drawTable(table, '.fa-inactive, .fa-invisible-data', 0);
    });
});

Upvotes: 2

andrewJames
andrewJames

Reputation: 22021

You asked for an example - and I assumed you meant an example using the panes techniques I mentioned, so I have provided one below. However I do still think you may want to consider using the search builder, instead.


My example does the following:

(1) It uses a pane for the first column. The table column shows the "check" and "cross" symbols, but the filter pane uses the words "active" and "inactive".

(2) It opens the table with only "active" records selected, at the start.

I made the following changes:

(a) Changed the HTML source data to use <td>active</td> and <td>inactive</td>, instead of embedding the fontawesome symbols in the HTML table.

(b) Added a render function to handle how the first column is displayed in the table (using the FA symbols instead of the words).

(c) Added logic to handle how the search pane uses this data in the first column.

(d) Pre-selected only "active" records.

I removed all your other logic.

This means the page shows every search pane (just for my demo) - so you may want to restore your logic to hide and show specific search panes, as needed, using your checkboxes. Otherwise the panes take up too much space in the page (in my demo).

Here is the demo:

$(document).ready(function() {
            
  var table = $('#example').DataTable( {
    dom: 'Plfrtip',
    columnDefs: [
      {
        targets: 0, // the first column needs custom handling:
        render: function ( data, type, row, meta ) {
          if ( type === 'display' ) { // show symbols, instead of table data:
            if (data === 'active') {
              return '<em class="fa fa-check pointer fa-active"></em>';
            } else {
              return '<em class="fa fa-close pointer fa-inactive"></em>';
            }
          } else { // all other types, including "filter" and "sort"
            return data;
          }
        },
        searchPanes: {
          show: true,
          orthogonal: {
            // For the search pane, use the "filter" data from the above 
            // render function. In this case, that is the original raw 
            // data from the table.
            display: 'filter' 
          },
          preSelect: ['active']
        }
      },
      {
        targets: "_all", // all remaining filter panes are also shown:
        searchPanes: {
          show: true,
          initCollapsed: true
        }
      }
    ]
  } );              
            
} );
            
<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Demo</title>
        <!-- 
            <script src="https://code.jquery.com/jquery-3.5.0.js"></script>
             <script src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.js"></script>
             <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.css">
             <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">
            -->
        <script src="https://code.jquery.com/jquery-3.5.0.js"></script>
        <script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>
        <script src="https://cdn.datatables.net/select/1.3.0/js/dataTables.select.min.js"></script>
        <script src="https://cdn.datatables.net/searchpanes/1.0.1/js/dataTables.searchPanes.min.js"></script>
        <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/searchpanes/1.0.1/css/searchPanes.dataTables.min.css">
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/select/1.3.0/css/select.dataTables.min.css">
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css">

        <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">

    </head>
    <body>
        <div style="margin: 20px;">
            <table id="example" class="display" style="width:100%">
                <thead>
                    <tr>
                        <th>Status</th>
                        <th>Name</th>
                        <th>Position</th>
                        <th>Office</th>
                        <th>Age</th>
                        <th>Start date</th>
                        <th>Salary</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td> inactive</td>
                        <td>Tiger Nixon</td>
                        <td>System Architect</td>
                        <td>Edinburgh</td>
                        <td>61</td>
                        <td>2011/04/25</td>
                        <td>$320,800</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Garrett Winters</td>
                        <td>Accountant</td>
                        <td>Tokyo</td>
                        <td>63</td>
                        <td>2011/07/25</td>
                        <td>$170,750</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Ashton Cox</td>
                        <td>Junior Technical Author</td>
                        <td>San Francisco</td>
                        <td>66</td>
                        <td>2009/01/12</td>
                        <td>$86,000</td>
                    </tr>
                    <tr>
                        <td> inactive</td>
                        <td>Cedric Kelly</td>
                        <td>Senior Javascript Developer</td>
                        <td>Edinburgh</td>
                        <td>22</td>
                        <td>2012/03/29</td>
                        <td>$433,060</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Airi Satou</td>
                        <td>Accountant</td>
                        <td>Tokyo</td>
                        <td>33</td>
                        <td>2008/11/28</td>
                        <td>$162,700</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Brielle Williamson</td>
                        <td>Integration Specialist</td>
                        <td>New York</td>
                        <td>61</td>
                        <td>2012/12/02</td>
                        <td>$372,000</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Herrod Chandler</td>
                        <td>Sales Assistant</td>
                        <td>San Francisco</td>
                        <td>59</td>
                        <td>2012/08/06</td>
                        <td>$137,500</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Rhona Davidson</td>
                        <td>Integration Specialist</td>
                        <td>Tokyo</td>
                        <td>55</td>
                        <td>2010/10/14</td>
                        <td>$327,900</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Colleen Hurst</td>
                        <td>Javascript Developer</td>
                        <td>San Francisco</td>
                        <td>39</td>
                        <td>2009/09/15</td>
                        <td>$205,500</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Sonya Frost</td>
                        <td>Software Engineer</td>
                        <td>Edinburgh</td>
                        <td>23</td>
                        <td>2008/12/13</td>
                        <td>$103,600</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Jena Gaines</td>
                        <td>Office Manager</td>
                        <td>London</td>
                        <td>30</td>
                        <td>2008/12/19</td>
                        <td>$90,560</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Quinn Flynn</td>
                        <td>Support Lead</td>
                        <td>Edinburgh</td>
                        <td>22</td>
                        <td>2013/03/03</td>
                        <td>$342,000</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Charde Marshall</td>
                        <td>Regional Director</td>
                        <td>San Francisco</td>
                        <td>36</td>
                        <td>2008/10/16</td>
                        <td>$470,600</td>
                    </tr>
                    <tr>
                        <td>inactive</td>
                        <td>Haley Kennedy</td>
                        <td>Senior Marketing Designer</td>
                        <td>London</td>
                        <td>43</td>
                        <td>2012/12/18</td>
                        <td>$313,500</td>
                    </tr>
                    <tr>
                        <td>inactive</td>
                        <td>Tatyana Fitzpatrick</td>
                        <td>Regional Director</td>
                        <td>London</td>
                        <td>19</td>
                        <td>2010/03/17</td>
                        <td>$385,750</td>
                    </tr>
                    <tr>
                        <td>inactive</td>
                        <td>Michael Silva</td>
                        <td>Marketing Designer</td>
                        <td>London</td>
                        <td>66</td>
                        <td>2012/11/27</td>
                        <td>$198,500</td>
                    </tr>
                    <tr>
                        <td> inactive</td>
                        <td>Paul Byrd</td>
                        <td>Chief Financial Officer (CFO)</td>
                        <td>New York</td>
                        <td>64</td>
                        <td>2010/06/09</td>
                        <td>$725,000</td>
                    </tr>
                    <tr>
                        <td> inactive</td>
                        <td>Gloria Little</td>
                        <td>Systems Administrator</td>
                        <td>New York</td>
                        <td>59</td>
                        <td>2009/04/10</td>
                        <td>$237,500</td>
                    </tr>
                    <tr>
                        <td> inactive</td>
                        <td>Bradley Greer</td>
                        <td>Software Engineer</td>
                        <td>London</td>
                        <td>41</td>
                        <td>2012/10/13</td>
                        <td>$132,000</td>
                    </tr>
                    <tr>
                        <td>inactive</td>
                        <td>Dai Rios</td>
                        <td>Personnel Lead</td>
                        <td>Edinburgh</td>
                        <td>35</td>
                        <td>2012/09/26</td>
                        <td>$217,500</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Jenette Caldwell</td>
                        <td>Development Lead</td>
                        <td>New York</td>
                        <td>30</td>
                        <td>2011/09/03</td>
                        <td>$345,000</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Yuri Berry</td>
                        <td>Chief Marketing Officer (CMO)</td>
                        <td>New York</td>
                        <td>40</td>
                        <td>2009/06/25</td>
                        <td>$675,000</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Caesar Vance</td>
                        <td>Pre-Sales Support</td>
                        <td>New York</td>
                        <td>21</td>
                        <td>2011/12/12</td>
                        <td>$106,450</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Doris Wilder</td>
                        <td>Sales Assistant</td>
                        <td>Sydney</td>
                        <td>23</td>
                        <td>2010/09/20</td>
                        <td>$85,600</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Angelica Ramos</td>
                        <td>Chief Executive Officer (CEO)</td>
                        <td>London</td>
                        <td>47</td>
                        <td>2009/10/09</td>
                        <td>$1,200,000</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Gavin Joyce</td>
                        <td>Developer</td>
                        <td>Edinburgh</td>
                        <td>42</td>
                        <td>2010/12/22</td>
                        <td>$92,575</td>
                    </tr>
                    <tr>
                        <td>active</td>
                        <td>Jennifer Chang</td>
                        <td>Regional Director</td>
                        <td>Singapore</td>
                        <td>28</td>
                        <td>2010/11/14</td>
                        <td>$357,650</td>
                    </tr>
                </tbody>
            </table>
        </div>

    </body>
</html>

Upvotes: 2

Related Questions