From 9f96aeb87f344474843773debcde86f257eb52be Mon Sep 17 00:00:00 2001 From: David DeSandro Date: Thu, 13 Nov 2014 14:49:10 -0500 Subject: [PATCH] fix updateSortData with empty array, or jQ object add updateSortData tests #646 update jQuery link in tests --- js/isotope.js | 21 ++++++--- test/get-sort-data.js | 24 ---------- test/index.html | 11 +++-- test/sort-data.js | 101 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 34 deletions(-) delete mode 100644 test/get-sort-data.js create mode 100644 test/sort-data.js diff --git a/js/isotope.js b/js/isotope.js index 8496179..0db2637 100644 --- a/js/isotope.js +++ b/js/isotope.js @@ -268,13 +268,17 @@ function isotopeDefinition( Outlayer, getSize, matchesSelector, Item, LayoutMode * @public */ Isotope.prototype.updateSortData = function( elems ) { + // get items + var items; + if ( elems ) { + elems = makeArray( elems ); + items = this.getItems( elems ); + } else { + // update all items if no elems provided + items = this.items; + } + this._getSorters(); - // update item sort data - // default to all items if none are passed in - elems = makeArray( elems ); - var items = this.getItems( elems ); - // if no items found, update all items - items = items.length ? items : this.items; this._updateItemsSortData( items ); }; @@ -291,7 +295,10 @@ function isotopeDefinition( Outlayer, getSize, matchesSelector, Item, LayoutMode * @private */ Isotope.prototype._updateItemsSortData = function( items ) { - for ( var i=0, len = items.length; i < len; i++ ) { + // do not update if no items + var len = items && items.length; + + for ( var i=0; len && i < len; i++ ) { var item = items[i]; item.updateSortData(); } diff --git a/test/get-sort-data.js b/test/get-sort-data.js deleted file mode 100644 index ce6091f..0000000 --- a/test/get-sort-data.js +++ /dev/null @@ -1,24 +0,0 @@ -test( 'getSortData', function() { - - 'use strict'; - - var iso = new Isotope( '#get-sort-data', { - layoutMode: 'fitRows', - getSortData: { - ninjaTurtle: '[data-ninja-turtle]', - fruit: 'span.fruit', - b: 'b parseFloat', - i: 'i parseInt', - bbroke: 'b foobar' - } - }); - - var item = iso.items[0]; - - equal( item.sortData.ninjaTurtle, 'leonardo', '[data-attr] shorthand' ); - equal( item.sortData.fruit, 'watermelon', 'query selector shorthand' ); - equal( item.sortData.b, 3.14, 'parseFloat parser' ); - equal( item.sortData.i, 42, 'parseInt parser' ); - equal( item.sortData.bbroke, '3.14', 'default nonparser' ); - -}); diff --git a/test/index.html b/test/index.html index a54bd85..51032e6 100644 --- a/test/index.html +++ b/test/index.html @@ -21,7 +21,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -63,11 +63,16 @@

getSortData

-
+
watermelon 3.14 42
+
+ papaya + 2.13 + 1001 +

Filtering

diff --git a/test/sort-data.js b/test/sort-data.js new file mode 100644 index 0000000..1e28cdc --- /dev/null +++ b/test/sort-data.js @@ -0,0 +1,101 @@ +test( 'sort data', function() { + + 'use strict'; + + var iso = new Isotope( '#get-sort-data', { + layoutMode: 'fitRows', + getSortData: { + ninjaTurtle: '[data-ninja-turtle]', + fruit: 'span.fruit', + b: 'b parseFloat', + i: 'i parseInt', + bbroke: 'b foobar' + } + }); + + var item0 = iso.items[0]; + var item1 = iso.items[1]; + + equal( item0.sortData.ninjaTurtle, 'leonardo', '[data-attr] shorthand' ); + equal( item0.sortData.fruit, 'watermelon', 'query selector shorthand' ); + equal( item0.sortData.b, 3.14, 'parseFloat parser' ); + equal( item0.sortData.i, 42, 'parseInt parser' ); + equal( item0.sortData.bbroke, '3.14', 'default nonparser' ); + + // ----- ----- // + + var docElem = document.documentElement; + var textSetter = docElem.textContent !== undefined ? 'textContent' : 'innerText'; + + function setText( elem, value ) { + elem[ textSetter ] = value; + } + + var elem0 = iso.items[0].element; + var elem1 = iso.items[1].element; + + elem0.setAttribute( 'data-ninja-turtle', 'donatello' ); + setText( elem0.querySelector('span.fruit'), 'mango' ); + setText( elem0.querySelector('b'), '7.24' ); + setText( elem0.querySelector('i'), 'foo' ); + + iso.updateSortData( elem0 ); + + var message = ', after updateSortData on single item' + equal( item0.sortData.ninjaTurtle, 'donatello', '[data-attr] shorthand' + message ); + equal( item0.sortData.fruit, 'mango', 'query selector shorthand' + message ); + equal( item0.sortData.b, 7.24, 'parseFloat parser' + message ); + ok( isNaN( item0.sortData.i ), 'parseInt parser' + message ); + equal( item0.sortData.bbroke, '7.24', 'default nonparser' + message ); + + // ----- update all items ----- // + + elem0.setAttribute( 'data-ninja-turtle', 'leonardo' ); + setText( elem0.querySelector('span.fruit'), 'passion fruit' ); + + elem1.setAttribute( 'data-ninja-turtle', 'michelangelo' ); + setText( elem1.querySelector('span.fruit'), 'starfruit' ); + + // update all + iso.updateSortData(); + + message = ', after updateSortData on all items' + equal( item0.sortData.ninjaTurtle, 'leonardo', '[data-attr] shorthand' + message ); + equal( item0.sortData.fruit, 'passion fruit', 'query selector shorthand' + message ); + equal( item1.sortData.ninjaTurtle, 'michelangelo', '[data-attr] shorthand' + message ); + equal( item1.sortData.fruit, 'starfruit', 'query selector shorthand' + message ); + + // ----- no items ----- // + + iso.options.itemSelector = 'none'; + iso.reloadItems(); + + iso.updateSortData(); + ok( true, 'updateSortData on empty container is ok' ); + + iso.updateSortData( document.createElement('div') ); + ok( true, 'updateSortData with non-item is ok, with no child items' ); + + iso.updateSortData( false ); + ok( true, 'updateSortData with falsy is ok, with no child items' ); + + iso.updateSortData( [] ); + ok( true, 'updateSortData with empty array is ok, with no child items' ); + + iso.updateSortData( jQuery() ); + ok( true, 'updateSortData with empty jQuery object is ok, with no child items' ); + + // ----- bad getSortData ----- // + + delete iso.options.itemSelector; + iso.options.getSortData.badQuery = 'bad-query'; + iso.options.getSortData.badAttr = '[bad-attr]'; + iso._getSorters(); + iso.reloadItems(); + + item0 = iso.items[0]; + + equal( item0.sortData.badQuery, null, 'bad query returns null' ); + equal( item0.sortData.badAttr, null, 'bad attr returns null' ); + +});