Skip to content

Instantly share code, notes, and snippets.

@alyraz
Created June 25, 2014 17:42
Show Gist options
  • Save alyraz/33e27df4b90fb5f22148 to your computer and use it in GitHub Desktop.
Save alyraz/33e27df4b90fb5f22148 to your computer and use it in GitHub Desktop.
HC.filters = function filtersCollection() {
var api = {};
var filters = {
amenity: [],
activity: [],
feature: []
};
api.add = function(type, name) {
filters[type].push(name);
var eventName = 'filterSelected';
triggerEvent(eventName, type, name);
};
api.remove = function(type, name) {
filters[type] = _.reject(filters[type], function(filter) {
return filter === name;
});
var eventName = 'filterUnselected';
triggerEvent(eventName, type, name);
};
api.selected = function() {
return filters;
};
api.isSelected = function(type, name) {
return _.some(filters[type], function(filter) {
return filter === name;
});
};
api.updateFilters = function(type, name) {
api.isSelected(type, name) ? api.remove(type, name) : api.add(type, name);
}
function triggerEvent(eventName, type, name) {
$.event.trigger({
type: eventName,
filter: {
type: type,
name: name
},
selectedFilters: api.selected()
});
}
return api;
}();
function filterHandlers() {
var filters = HC.filters;
var hideAllPopovers = function(e) {
$('.filter-handlers > span').not(this).removeClass('active').popover('hide');
$(this).toggleClass('active');
}
var selectFilter = function(e) {
e.preventDefault();
var target = $(e.currentTarget).find('a');
var filter = target.data('filter').split('-');
var type = _.first(filter);
var name = _.last(filter);
filters.updateFilters(type, name);
}
return {
hideAllPopovers: hideAllPopovers,
selectFilter: selectFilter
}
}
function filtersView() {
var api = {};
api.updateCounts = function(e) {
var filters = e.selectedFilters;
_.each(_.keys(filters), function(filterName) {
var filterCount = filters[filterName].length;
var contents = filterCount > 0 ? '('+filterCount+')' : '';
$('.'+filterName+'-count').html(contents);
});
}
return api;
}
function filterItemsView() {
var api = {};
api.onItemSelect = function(e) {
$('.filter-options li').removeClass('active');
var filters = e.selectedFilters;
_.each(_.keys(filters), function(filterType) {
_.each(filters[filterType], function(filter) {
var element = $('a[data-filter="'+filterType+'-'+filter+'"]').parent();
element.addClass('active');
});
});
}
return api;
}
$(document).ready(function() {
var handler = filterHandlers();
var view = filtersView();
var itemsView = filterItemsView();
$('.filter-handlers > span').on('click', handler.hideAllPopovers);
$('.filter-handlers > span').popover({
html : true,
content: function() {
var panelToShow = $(this).data('panel');
var $panelToShow = $('.'+panelToShow+'-panel');
return $panelToShow;
},
placement: 'bottom'
});
$('.filters li').on('click', handler.selectFilter);
$(document).on('filterSelected', view.updateCounts);
$(document).on('filterUnselected', view.updateCounts);
$(document).on('filterSelected', itemsView.onItemSelect);
$(document).on('filterUnselected', itemsView.onItemSelect);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment