diff --git a/assets/scripts/lib/ext/ember/computed.js b/assets/scripts/lib/ext/ember/computed.js new file mode 100644 index 00000000..089f8fe1 --- /dev/null +++ b/assets/scripts/lib/ext/ember/computed.js @@ -0,0 +1,26 @@ +Ember.computed.limit = function(dependentKey, limitKey) { + var options = { + addedItem: function(array, item, changeMeta, instanceMeta) { + var limit = Ember.get(this, limitKey); + if (changeMeta.index < limit) { + array.insertAt(changeMeta.index, item); + if (Ember.get(array, "length") > limit) { + array.popObject(); + } + } + return array; + }, + removedItem: function(array, item, changeMeta, instanceMeta) { + var limit = Ember.get(this, limitKey); + if (changeMeta.index < limit && changeMeta.index < Ember.get(array, 'length')) { + array.removeAt(changeMeta.index, 1); + var toPush = changeMeta.arrayChanged.objectAt(limit); + if (toPush) { + array.pushObject(toPush); + } + } + return array; + } + }; + return Ember.arrayComputed(dependentKey, limitKey, options); +}; diff --git a/assets/scripts/lib/travis/limited_array.coffee b/assets/scripts/lib/travis/limited_array.coffee index c6baaddc..f5f9941f 100644 --- a/assets/scripts/lib/travis/limited_array.coffee +++ b/assets/scripts/lib/travis/limited_array.coffee @@ -1,17 +1,7 @@ Travis.LimitedArray = Em.ArrayProxy.extend limit: 10 isLoadedBinding: 'content.isLoaded' - - init: -> - @_super.apply this, arguments - - arrangedContent: (-> - content = @get('content') - if @get('disabled') - content - else if content - content.slice(0, @get('limit')) - ).property('content', 'limit', 'disabled') + arrangedContent: Ember.computed.limit('content', 'limit') totalLength: (-> @get('content.length') @@ -21,54 +11,13 @@ Travis.LimitedArray = Em.ArrayProxy.extend totalLength = @get('totalLength') limit = @get('limit') - if @get('disabled') || totalLength <= limit - 0 - else - totalLength - limit - ).property('totalLength', 'limit', 'disabled') + left = totalLength - limit + if left < 0 then 0 else left + ).property('totalLength', 'limit') isMore: (-> - !@get('disabled') && @get('leftLength') > 0 + @get('leftLength') > 0 ).property('leftLength') showAll: -> - @set 'disabled', true - - contentArrayWillChange: (array, index, removedCount, addedCount) -> - @_super.apply this, arguments - - return if @get('disabled') - - if removedCount - arrangedContent = @get 'arrangedContent' - removedObjects = array.slice(index, index + removedCount); - arrangedContent.removeObjects(removedObjects) - - contentArrayDidChange: (array, index, removedCount, addedCount) -> - @_super.apply this, arguments - - return if @get('disabled') - - limit = @get('limit') - - if addedCount - if index < limit - addedObjects = array.slice(index, index + addedCount) - @get('arrangedContent').replace(index, 0, addedObjects) - - @balanceArray() - - balanceArray: -> - limit = @get 'limit' - arrangedContent = @get 'arrangedContent' - length = arrangedContent.get 'length' - content = @get 'content' - - if length > limit - arrangedContent.replace(limit, length - limit) - else if length < limit && content.get('length') > length - count = limit - length - while count > 0 - if next = content.find( (object) -> !arrangedContent.contains(object) ) - arrangedContent.pushObject(next) - count -= 1 + @set 'limit', Infinity diff --git a/assets/scripts/spec/unit/limited_array_spec.coffee b/assets/scripts/spec/unit/limited_array_spec.coffee index 818bbecc..8c482234 100644 --- a/assets/scripts/spec/unit/limited_array_spec.coffee +++ b/assets/scripts/spec/unit/limited_array_spec.coffee @@ -41,7 +41,8 @@ test 'allows to expand array to show all items', -> content = [1, 2, 3] array = Travis.LimitedArray.create content: content, limit: 2 - array.showAll() + Ember.run -> + array.showAll() equal( array.get('length'), 3) deepEqual( array.toArray(), [1, 2, 3]) diff --git a/assets/scripts/travis.coffee b/assets/scripts/travis.coffee index f01a0e0b..dea8798d 100644 --- a/assets/scripts/travis.coffee +++ b/assets/scripts/travis.coffee @@ -1,5 +1,6 @@ require 'ext/jquery' require 'ext/ember/namespace' +require 'ext/ember/computed' require 'app' window.ENV ||= {}