jackrabb1t
jackrabb1t

Reputation: 31

Filter Data Separately in Two Different DataTables

Here is what I am trying to do:

I have two DataTables on the same page with different data. One is 'sell_orders' and the other is 'buy_orders'. I want to filter the data in each table separately based on checkboxes at the top of each table. So far I have gotten that to work using the following code:

$("#sell_vis_cit").change(function() {
    var checked = this.checked;
    var allowFilter = ['sell-orders'];
    if (!checked) {
        $.fn.dataTable.ext.search.push (
            function(settings, data, dataIndex) {
                // check if current table is part of the allow list
                if ( $.inArray( settings.nTable.getAttribute('id'), allowFilter ) == -1 ) {
                   // if not table should be ignored
                   return true;
                }
                return $(sell_table.row(dataIndex).node()).attr('sell-data-sec') != 'x';
            }
        );
        sell_table.draw();
    } else {
        $.fn.dataTable.ext.search.pop();
        sell_table.draw();
    }
});
$("#buy_vis_cit").change(function() {
    var checked = this.checked;
    var allowFilter = ['buy-orders'];
    if (!checked) {
        $.fn.dataTable.ext.search.push (
            function(settings, data, dataIndex) {
                // check if current table is part of the allow list
                if ( $.inArray( settings.nTable.getAttribute('id'), allowFilter ) == -1 ) {
                   // if not table should be ignored
                   return true;
                }
                return $(buy_table.row(dataIndex).node()).attr('buy-data-sec') != 'x';
            }
        );
        buy_table.draw();
    } else {
        $.fn.dataTable.ext.search.pop();
        buy_table.draw();
    }
});

The problem I am having is when it comes time to remove the filter. If filters have been applied to each table, the removal of the filter using the pop() function becomes unreliable because there is no way to verify that it is removing the filter from the right table.

So my question is: is there a way to verify that pop() is running on the right table like I did with push()? Alternatively, is there a better way to achieve my goal?

Upvotes: 1

Views: 612

Answers (1)

davidkonrad
davidkonrad

Reputation: 85578

Why push() and pop() in the first place? It seems to me you have some static filters which is turned on and off by checkboxes. You could declare a filter once globally and do the "math" inside the filter :

$.fn.dataTable.ext.search.push(function(settings, data, dataIndex) {
  if ((settings.sTableId == 'sell-orders' && $("#sell_vis_cit").is(':checked')) ||
      (settings.sTableId == 'buy-orders' && $("#buy_vis_cit").is(':checked'))) {

     //filter code
  } else {
    return true
  }
})

and then simply activate the filters in the click handlers :

$("#sell_vis_cit, #buy_vis_cit").change(function() {
  buy_table.draw();
  sell_table.draw();
})

Upvotes: 1

Related Questions