data-sort.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. (function ($) {
  2. $("#switch").click(function () {
  3. if ($(this).hasClass('btn-default')) {
  4. $(".fixed").scrollTop(0);
  5. $("#caret").css('transform', 'rotate(180deg)')
  6. $(this).removeClass('btn-default');
  7. $(this).addClass('btn-primary');
  8. $("#filter-content").fadeIn();
  9. } else {
  10. $("#caret").css('transform', 'rotate(0deg)')
  11. $(this).addClass('btn-default');
  12. $(this).removeClass('btn-primary');
  13. $("#filter-content").fadeOut();
  14. }
  15. });
  16. function Filter() {
  17. var $this = $(this);
  18. var searchResult = qsRegex ? $this.text().match(qsRegex) : true;
  19. var buttonResult = buttonFilter ? $this.is(buttonFilter) : true;
  20. var comboResult = comboFilter ? $this.is(comboFilter) : true;
  21. return searchResult && buttonResult && comboResult;
  22. }
  23. var buttonFilters = {};
  24. var buttonFilter;
  25. // quick search regex
  26. var qsRegex;
  27. var comboFilter;
  28. var $quicksearch = $('#quicksearch').keyup(debounce(function () {
  29. qsRegex = new RegExp($quicksearch.val(), 'gi');
  30. $grid.isotope({
  31. filter: Filter
  32. });
  33. }));
  34. // debounce so filtering doesn't happen every millisecond
  35. function debounce(fn, threshold) {
  36. var timeout;
  37. threshold = threshold || 100;
  38. return function debounced() {
  39. clearTimeout(timeout);
  40. var args = arguments;
  41. var _this = this;
  42. function delayed() {
  43. fn.apply(_this, args);
  44. }
  45. timeout = setTimeout(delayed, threshold);
  46. };
  47. }
  48. function concatValues(obj) {
  49. var value = '';
  50. for (var prop in obj) {
  51. value += obj[prop];
  52. }
  53. return value;
  54. }
  55. $('.button-group').each(function (i, buttonGroup) {
  56. var $buttonGroup = $(buttonGroup);
  57. $buttonGroup.on('click', 'a', function () {
  58. $buttonGroup.find('.active').removeClass('active');
  59. $(this).parents('li').addClass('active');
  60. });
  61. });
  62. $('.filters').on('click', '.button', function () {
  63. var $this = $(this);
  64. // get group key
  65. var $buttonGroup = $this.parents('.button-group');
  66. var filterGroup = $buttonGroup.attr('data-filter-group');
  67. // set filter for group
  68. buttonFilters[filterGroup] = $this.attr('data-filter');
  69. // combine filters
  70. buttonFilter = concatValues(buttonFilters);
  71. // Isotope arrange
  72. $grid.isotope({
  73. filter: Filter
  74. });
  75. });
  76. // store filter per group
  77. var filters = {};
  78. // do stuff when checkbox change
  79. $('#options').on('change', function (event) {
  80. var checkbox = event.target;
  81. var $checkbox = $(checkbox);
  82. var group = $checkbox.parents('.option-set').attr('data-group');
  83. // create array for filter group, if not there yet
  84. var filterGroup = filters[group];
  85. if (!filterGroup) {
  86. filterGroup = filters[group] = [];
  87. }
  88. // add/remove filter
  89. if (checkbox.checked) {
  90. // add filter
  91. filterGroup.push(checkbox.value);
  92. } else {
  93. // remove filter
  94. var index = filterGroup.indexOf(checkbox.value);
  95. filterGroup.splice(index, 1);
  96. }
  97. comboFilter = getComboFilter();
  98. $grid.isotope({
  99. filter: Filter
  100. });
  101. });
  102. function getComboFilter() {
  103. var combo = [];
  104. for (var prop in filters) {
  105. var group = filters[prop];
  106. if (!group.length) {
  107. // no filters in group, carry on
  108. continue;
  109. }
  110. // add first group
  111. if (!combo.length) {
  112. combo = group.slice(0);
  113. continue;
  114. }
  115. // add additional groups
  116. var nextCombo = [];
  117. // split group into combo: [ A, B ] & [ 1, 2 ] => [ A1, A2, B1, B2 ]
  118. for (var i = 0; i < combo.length; i++) {
  119. for (var j = 0; j < group.length; j++) {
  120. var item = combo[i] + group[j];
  121. nextCombo.push(item);
  122. }
  123. }
  124. combo = nextCombo;
  125. }
  126. var comboFilter = combo.join(', ');
  127. return comboFilter;
  128. }
  129. }(jQuery));