enmi12/glossaire/_posts/tests/2012-08-11-combo-sort-history.html
changeset 0 d970ebf37754
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/enmi12/glossaire/_posts/tests/2012-08-11-combo-sort-history.html	Wed Nov 06 03:21:17 2013 +0000
@@ -0,0 +1,177 @@
+---
+title: Combo filters, sorting, AND hash history
+layout: default
+category: tests
+schema:
+  - name: color
+    filters: [ red, blue, yellow ]
+  - name: size
+    filters: [ small, wide, tall, big ]
+  - name: shape
+    filters : [ round, square ]
+---
+
+<section id="copy">
+  <p>Filters can be combined. In addition to filtering for just <code>.red</code> or <code>.tall</code>, you can pass in a filter selector of both: <code>.red.tall</code>.</p>
+</section>
+
+<section id="options" class="clearfix combo-filters">
+  <div class="clearfix">
+    <h3>Filters</h3>
+
+    {% for group in page.schema %}
+      <div class="option-combo {{ group.name }}">
+        <h4>{{ group.name }}</h4>
+        <ul class="filter option-set clearfix " data-filter-group="{{ group.name }}"> 
+          <li><a href="#filter-{{ group.name }}-any" data-filter-value="" class="selected">any</a>
+          {% for filter in group.filters %}
+            <li><a href="#filter-{{ group.name }}-{{ filter }}" data-filter-value=".{{ filter }}">{{ filter }}</a>
+          {% endfor %}
+        </ul>
+      </div>
+    {% endfor %}
+  </div>
+
+  <h3>Sort</h3>
+  
+    <ul id="sort-by" class="option-set clearfix" data-option-key="sortBy">
+      <li><a href="#sortBy=original-order" data-option-value="original-order" class="selected" data>original-order</a></li>
+      <li><a href="#sortBy=color" data-option-value="color">color</a></li>
+      <li><a href="#sortBy=size" data-option-value="size">size</a></li>
+      <li><a href="#sortBy=shape" data-option-value="shape">shape</a></li>
+    </ul>
+
+
+</section> <!-- #options -->
+
+<div id="container" class="clearfix">
+  {% for size in page.schema[1].filters %}
+    {% for shape in page.schema[2].filters %}
+      {% for color in page.schema[0].filters %}
+        <div class="color-shape {{ size }} {{ shape }} {{ color }}" data-size="{{ size }}" data-color="{{ color }}" data-shape="{{ shape }}"></div>
+      {% endfor %}
+    {% endfor %}
+  {% endfor %}
+  
+  
+  {% for color in page.schema[0].filters %}
+    {% for shape in page.schema[2].filters %}
+      {% for size in page.schema[1].filters %}
+        <div class="color-shape {{ size }} {{ shape }} {{ color }}" data-size="{{ size }}" data-color="{{ color }}" data-shape="{{ shape }}"></div>
+      {% endfor %}
+    {% endfor %}
+  {% endfor %}
+  
+</div> <!-- #container -->
+
+<script src="../js/jquery-1.7.1.min.js"></script>
+<script src="../js/jquery.ba-bbq.min.js"></script>
+<script src="../jquery.isotope.min.js"></script>
+<script>
+$(function(){
+    
+  var $container = $('#container');
+  var initialOptions = {
+    itemSelector : '.color-shape',
+    masonry: {
+      columnWidth: 80
+    },
+    getSortData: {
+      color: function( $elem ) {
+        return $elem.attr('data-color');
+      },
+      shape: function( $elem ) {
+        return $elem.attr('data-shape');
+      },
+      size: function( $elem ) {
+        return $elem.attr('data-size');
+      }
+    }
+  };
+  // build a hash for all our options
+  var options = {
+    // special hash for combination filters
+    comboFilters: {}
+  };
+
+
+  // filter buttons
+  $('.filter').on( 'click', 'a', function( event ) {
+    event.preventDefault();
+    var $this = $(this);
+    // don't proceed if already selected
+    if ( $this.hasClass('selected') ) {
+      return false;
+    }
+
+    // console.log('hello world');
+    var $optionSet = $this.parents('.option-set');
+    var group = $optionSet.attr('data-filter-group');
+    options.comboFilters[ group ] = $this.attr('data-filter-value');
+    $.bbq.pushState( options );
+  });
+
+  var $sortBy = $('#sort-by').on( 'click', 'a', function( event ) {
+    event.preventDefault();
+    var $this = $(this);
+    // don't proceed if already selected
+    if ( $this.hasClass('selected') ) {
+      return false;
+    }
+    options.sortBy = $this.attr('data-option-value');
+    // console.log( options );
+    $.bbq.pushState( options );
+  });
+
+  function selectLink( $link ) {
+    $link.parents('.option-set').find('.selected').removeClass('selected');
+    $link.addClass('selected')
+  }
+
+  var location = window.location;
+  var $comboFilterOptionSets = $('.combo-filters .option-set');
+
+
+  function getComboFilterSelector( comboFilters ) {
+    // build filter
+    var isoFilters = [];
+    var filterValue, $link, $optionSet;
+    for ( var prop in comboFilters ) {
+      filterValue = comboFilters[ prop ];
+      isoFilters.push( filterValue );
+      // change selected combo filter link
+      $optionSet = $comboFilterOptionSets.filter('[data-filter-group="' + prop + '"]');
+      $link = $optionSet.find('a[data-filter-value="' + filterValue + '"]');
+      selectLink( $link );
+    }
+    var selector = isoFilters.join('');
+    return selector;
+  }
+
+  $( window ).on( 'hashchange', function() {
+    // get options from hash
+    if ( location.hash ) {
+      $.extend( options, $.deparam.fragment( location.hash, true ) );
+    }
+    // build options from hash and initial options
+    var isoOptions = $.extend( {}, initialOptions, options );
+
+    if ( options.comboFilters ) {
+      isoOptions.filter = getComboFilterSelector( options.comboFilters );
+    }
+
+    // change selected link for sortBy
+    if ( options.sortBy ) {
+      var $link = $sortBy.find('a[data-option-value="' + options.sortBy + '"]');
+      selectLink( $link );
+    }
+
+    $container.isotope( isoOptions );
+  })
+    // trigger hashchange to capture initial hash options
+    .trigger( 'hashchange' );
+
+});
+  
+</script>
+