Многофункциональность фильтрации и нумерация страниц - PullRequest
0 голосов
/ 13 февраля 2020

Я обновляю раздел вакансий на существующем веб-сайте. В настоящее время у меня есть страница открытых вакансий, где вы можете фильтровать вакансии по поиску и / или есть выпадающий список фильтров. Я использую изотоп для фильтрации. Недавно я добавил пагинацию на страницу и наконец-то заставил ее работать с выпадающими фильтрами, но теперь окно поиска не работает.

Ниже приведен мой сценарий. Я чувствую, что это нечто простое, что я не могу понять.

//show hide filters options
  $('.filterLabel').on('click',function(){
event.preventDefault();
$(this).next().slideToggle();
$(this).toggleClass('open');
  });

// store filter for each group
  var buttonFilters = {};
  var buttonFilter;

// store search result
  var qsRegex;

//home search link
  var $a = $('a[name="keywordSearch"]');

  $a.data('href', $a.attr('href'))
$('#keyword').change(function () {
$a.attr('href', $a.data('href') + '?search=' + this.value)
});
  $('#keyword').keyup(function(event) {
    if (event.keyCode === 13) {
      $('a[name="keywordSearch"]').click();
    }
  });

// input from homepage
  var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = window.location.search.substring(1),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');

if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
}
    }
  };

//fill var w/home input
  var homeSearch = getUrlParameter('search');

  //replace search w/home input
  if (homeSearch) {
    qsRegex = new RegExp( homeSearch, 'gi' );;
  }

  $('#quicksearch').val(homeSearch);
// end input from homepage

// init Isotope
  var $grid = $('.grid').isotope({
transitionDuration: 0,
//stagger: 10,
itemSelector: '.position',
layoutMode : 'vertical',
filter: function() {
//console.log( filteredItems.length );
var $this = $(this);
var searchResult = qsRegex ? $this.text().match( qsRegex ) : true;
var buttonResult = buttonFilter ? $this.is( buttonFilter ) : true;
return searchResult && buttonResult;
},
  });

// for Internship page only
  if (homeSearch == 'Internship') {
    $grid.isotope({ filter: '.internship' });
  }
// filter by select
  $('.filters').on( 'click', '.button', function() {
var $this = $(this);

// get group key
var $buttonGroup = $this.parents('.button-group');
var filterGroup = $buttonGroup.attr('data-filter-group');

// set filter for group
buttonFilters[ filterGroup ] = $this.attr('data-filter');

// combine filters
buttonFilter = concatValues( buttonFilters );

setPagination();
goToPage(1);
// Isotope arrange
//$grid.isotope();

// close group
$(this).parent().prev('.filterLabel').toggleClass('open');
$(this).parent().slideToggle();
  });

// use value of search field to filter
  var $quicksearch = $('#quicksearch').keyup( debounce( function() {
qsRegex = new RegExp( $quicksearch.val(), 'gi' );
$grid.isotope();
/*TODO: UPDATE THIS SCRIPT TO ACCOMODATE FOR PAGINATION
setPagination();
goToPage(1);*/
  })
  );


// change is-checked class on buttons
  $('.button-group').each( function( i, buttonGroup ) {
var $buttonGroup = $( buttonGroup );
$buttonGroup.on( 'click', 'div', function() {
$buttonGroup.find('.is-checked').removeClass('is-checked');
$( this ).addClass('is-checked');
});
  });

// flatten object by concatting values
  function concatValues( obj ) {
var value = '';
for ( var prop in obj ) {
value += obj[ prop ];
}
return value;
  }

// debounce so filtering doesn't happen every millisecond
  function debounce( fn, threshold ) {
    var timeout;
    threshold = threshold || 100;
    return function debounced() {
      clearTimeout( timeout );
      var args = arguments;
      var _this = this;
      function delayed() {
        fn.apply( _this, args );
      }
      timeout = setTimeout( delayed, threshold );
    };
  }

// get Isotope instance
  var iso = $grid.data('isotope');

// alternate gray bg
  iso.filteredItems.forEach( function( item, i ) {
if ( i % 2 === 1 ) {
$( item.element ).toggleClass('gray');
}
  });

// actions once filtered
  $grid.on( 'arrangeComplete', function( event, filteredItems ) {


// remove gray bg
iso.filteredItems.forEach( function( item, i ) {
$( item.element ).removeClass('gray');
});

// alternate gray bg after filtered
iso.filteredItems.forEach( function( item, i ) {
if ( i % 2 === 1 ) {
$( item.element ).toggleClass('gray');
}
});

//clear error message if showing
$('.no-results').hide();

//error message
if(filteredItems.length == 0){
$('.no-results').show();
    }else{
$('.no-results').hide();
    }
});

  var results = $grid.isotope('getFilteredItemElements');
  //console.log (results);
  if(results.length == 0){
    $('.no-results').show();
  }else{
    $('.no-results').hide();
    }

//New Pagination Script
var itemSelector = ".position";
        var $filterdropdowns = $('.filter');
        //Defined by $grid
//var $container = $('#products').isotope({ itemSelector: itemSelector });

        //Ascending order
        var responsiveIsotope = [ [480, 4] , [720, 6] ];
        var itemsPerPageDefault = 10;
        var itemsPerPage = 10;
        var currentNumberPages = 1;
        var currentPage = 1;
        var currentFilter = '*';
        var filterAttribute = 'data-filter';
        var filterValue = "";
        var pageAttribute = 'data-page';
        var pagerClass = 'isotope-pager';

setPagination();
goToPage(1);
        // update items based on current filters
        function changeFilter(selector) { $grid.isotope({

filter: selector

}); }

        //grab all checked filters and goto page on fresh isotope output
        function goToPage(n) {
            currentPage = n;
            var selector = itemSelector;
            var exclusives = [buttonFilter];
                // smash all values back together for 'and' filtering
                filterValue = exclusives.length ? exclusives.join('') : '*';

                // add page number to the string of filters
                var wordPage = currentPage.toString();
                filterValue += ('.'+wordPage);
            changeFilter(filterValue);
        }


        function setPagination() {
            var SettingsPagesOnItems = function(){
                var itemsLength = $grid.children(itemSelector).length;
                var pages = Math.ceil(itemsLength / 10);
                var item = 1;
                var page = 1;
                var selector = itemSelector;
                var exclusives = [buttonFilter];
                filterValue = exclusives.length ? exclusives.join('') : '*';
                    // find each child element with current filter values
                    $grid.children(filterValue).each(function(){
                        // increment page if a new one is needed
                        if( item > itemsPerPage ) {
                            page++;
                            item = 1;
                        }
                        // add page number to element as a class
                        wordPage = page.toString();

                        var classes = $(this).attr('class').split(' ');
                        var lastClass = classes[classes.length-1];
                        // last class shorter than 4 will be a page number, if so, grab and replace
                        if(lastClass.length < 4){
                            $(this).removeClass();
                            classes.pop();
                            classes.push(wordPage);
                            classes = classes.join(' ');
                            $(this).addClass(classes);
                        } else {
                            // if there was no page number, add it
                           $(this).addClass(wordPage);
                        }
                        item++;
                    });
                currentNumberPages = page;
            }();

            // create page number navigation
            var CreatePagers = function() {

                var $isotopePager = ( $('.'+pagerClass).length == 0 ) ? $('<div class="'+pagerClass+'"></div>') : $('.'+pagerClass);

                $isotopePager.html('');
                if(currentNumberPages > 1){
                  for( var i = 0; i < currentNumberPages; i++ ) {
                      var $pager = $('<a href="javascript:void(0);" class="pager" '+pageAttribute+'="'+(i+1)+'"></a>');
                          $pager.html(i+1);

                          $pager.click(function(){
                              var page = $(this).eq(0).attr(pageAttribute);
                              goToPage(page);
                          });
                      $pager.appendTo($isotopePager);
                  }
                }
                $grid.after($isotopePager);
            }();
        }

И у меня также есть кодовая ручка для обзора.

https://codepen.io/angexlynne/pen/BaNoqam?editors=1010

Я думаю, мне просто нужно обновить эту функцию

// use value of search field to filter
  var $quicksearch = $('#quicksearch').keyup( debounce( function() {
qsRegex = new RegExp( $quicksearch.val(), 'gi' );
$grid.isotope();
/*TODO: UPDATE THIS SCRIPT TO ACCOMODATE FOR PAGINATION
setPagination();
goToPage(1);*/
  })
  );
...