patrickkunka / mixitup

A high-performance, dependency-free library for animated filtering, sorting, insertion, removal and more
https://www.kunkalabs.com/mixitup/
4.52k stars 735 forks source link

Having trouble converting to 'AND' logic #526

Closed dohara21 closed 4 years ago

dohara21 commented 4 years ago

Hi!

I have cobbled together some different tutorials to the best of my ability, and everything is working as needed except I can't manage to change the logic to and instead of or. I have tried my best to add ',' in different places to join the filters, however I always end up with errors. Any help would be hugely appreciated!


var mixer = mixitup('#podcast-list', {
              load: {
                    sort: 'featured:desc',
              },
              controls: {
  enable: false // we won't be needing these
},
              pagination: {
                limit: 5,
                maintainActivePage: false
              },
              animation: {
                        enable: false
                        },
          });

var multiFilter = {

  $filterGroups: null,
  $filterUi: null,
  $reset: null,
  groups: [],
  outputArray: [],
  outputString: '',

  init: function(){
    var self = this; 

    self.$filterUi = $('#Filters');
    self.$filterGroups = $('.filter-group');
    self.$reset = $('#reset');
    self.$container = $('#podcast-list');

    self.$filterGroups.each(function(){
      self.groups.push({
        $inputs: $(this).find('input'),
        active: [],
            tracker: false
      });
    });

    self.bindHandlers();
  },

  bindHandlers: function(){
    var self = this,
        typingDelay = 300,
        typingTimeout = -1,
        resetTimer = function() {
          clearTimeout(typingTimeout);

          typingTimeout = setTimeout(function() {
            self.parseFilters();
          }, typingDelay);
        };

    self.$filterGroups
      .filter('.checkboxes')
        .on('change', function() {
        self.parseFilters();
        });

    self.$filterGroups
      .filter('.search')
      .on('keyup change', resetTimer);

    self.$reset.on('click', function(e){
      e.preventDefault();
      self.$filterUi[0].reset();
      self.$filterUi.find('input[type="text"]').val('');
      self.parseFilters();
    });
  },

  parseFilters: function(){
    var self = this;
    for(var i = 0, group; group = self.groups[i]; i++){
      group.active = []; 
      var searchTerms = [];
      group.$inputs.each(function(){
        var searchTerm = '',
                $input = $(this),
            minimumLength = 3;
        if ($input.is(':checked')) {
          group.active.push(this.value);
        }
        if ($input.is('[type="text"]') && this.value.length >= minimumLength) {
          searchTerm = this.value
                      .toLowerCase()
          searchTerms = searchTerm.split(' ');
          group.active[0] = '[class*="' + searchTerms[0] + '"]'; 
          for (var i = 1; i < searchTerms.length; i++) {
            if (searchTerms[i] != '') {
            group.active[0] += '[class*="' + searchTerms[i] + '"]'; } 
        }
        }
      });
        group.active.length && (group.tracker = 0);
    }
    self.concatenate();
  },

  concatenate: function(){
    var self = this,
          cache = '',
          crawled = false,
          checkTrackers = function(){
        var done = 0;

        for(var i = 0, group; group = self.groups[i]; i++){
          (group.tracker === false) && done++;
        }

        return (done < self.groups.length);
      },
      crawl = function(){
        for(var i = 0, group; group = self.groups[i]; i++){
          group.active[group.tracker] && (cache += group.active[group.tracker]);

          if(i === self.groups.length - 1){
            self.outputArray.push(cache);
            cache = '';
            updateTrackers();
          }
        }
      },
      updateTrackers = function(){
        for(var i = self.groups.length - 1; i > -1; i--){
          var group = self.groups[i];

          if(group.active[group.tracker + 1]){
            group.tracker++; 
            break;
          } else if(i > 0){
            group.tracker && (group.tracker = 0);
          } else {
            crawled = true;
          }
        }
      };

    self.outputArray = []; 

      do{
          crawl();
      }
      while(!crawled && checkTrackers());

    self.outputString = self.outputArray.join();

    !self.outputString.length && (self.outputString = 'all'); 

    console.log(self.outputString); 

    mixer.filter(self.outputString);

  }
};

// Disable enter on search function
$('#input-search').on(' keypress', function(e) {
  const keyCode = e.keyCode || e.which;
  if (keyCode === 13) {
    e.preventDefault();
    return false;
  }
});

// Allow for sorting via iTunes rating/featured tag
$(function(){

    var selectSort = document.querySelector('.select-sort');

  multiFilter.init();
  selectSort.addEventListener('change', function() {
    var order = selectSort.value;
    mixer.sort(order);
  });
});```