Skip to content

Instantly share code, notes, and snippets.

@oresh
Last active November 21, 2016 15:34
Show Gist options
  • Save oresh/f6d8af103e8cd7b1f9769df6c0b2cacd to your computer and use it in GitHub Desktop.
Save oresh/f6d8af103e8cd7b1f9769df6c0b2cacd to your computer and use it in GitHub Desktop.
Filter functionality with cards and category titles
// filter wrapper class, that has checkboxes.
var $filters = $('.filters', context);
if($filters.length) {
var itemFilter = {
itemClass: '.item-container',
categoryClass: '.category-name',
dataArr: 'data-filters',
sectionClass: 'section.category',
sections: $(this.sectionClass),
items: $(this.itemClass),
categories: $(this.categoryClass),
filtersWrapper: $filters,
filterCheckboxes: $filters.find('input[type="checkbox"]'),
applied: [],
getFilters: function() {
var self = this;
var applied = [];
for (var i = 0, len = self.filterCheckboxes.length; i < len; i++) {
var t = self.filterCheckboxes.eq(i);
if (t.is(':checked')) {
applied[applied.length] = t.val();
}
}
return applied;
},
checkByFilter: function($item) {
var self = this;
var applied = self.applied;
var attrs = $item.attr(self.dataArr);
if (!attrs || attrs == ' ') return false;
for (var i = 0, len = applied.length; i < len; i++) {
if (attrs.indexOf(applied[i]) != -1) return true;
}
return false;
},
hideCategories: function() {
var self = this;
var $sections = self.sections;
for (var i = 0, len = $sections.length; i < len; i++) {
var $section = $sections.eq(i);
var $category = $section.find(self.categoryClass);
if (!$section.find(self.itemClass).length || !$section.find(self.itemClass).filter(':visible').length) {
$category.hide();
} else {
$category.show();
}
}
self.checkAllEmpty();
},
checkAllEmpty: function() {
var self = this;
var emptyBlock = ['<div class="empty-filter-results">', 'По выбранным фильтрам результата не найдено' ,'</div>'].join('');
$('.empty-filter-results').remove();
if (!self.categories.filter(':visible').length) {
$(emptyBlock).insertAfter(self.sections.filter(':last'));
}
},
showAll: function () {
var self = this;
self.items.show();
self.categories.show();
$('.empty-filter-results').remove();
},
showMatches: function() {
var self = this;
self.applied = self.getFilters();
if (!self.applied.length) {
self.showAll();
return;
}
for (var i = 0, len = self.items.length; i < len; i++) {
var $item = self.items.eq(i);
if (!self.checkByFilter($item)) {
$item.hide();
} else {
$item.show();
}
}
self.hideCategories();
return;
},
configure: function(settings) {
var self = this;
if (typeof settings == 'object') {
self = $.extend(self, settings);
}
self.sections = $(self.sectionClass);
self.items = $(self.itemClass);
self.categories = $(self.categoryClass);
},
init: function(settings) {
var self = this;
self.configure(settings);
self.filterCheckboxes.change(function(e) {
self.showMatches();
});
}
}
itemFilter.init();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment