From 202f158d55dc93bd4c90cdb8a47fccf38f73af23 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 2 Oct 2012 22:39:11 +0200 Subject: [PATCH] Fix show more button and make it disabled when loading --- .../javascripts/app/models/repository.coffee | 23 ++++++++++++--- .../javascripts/app/templates/builds/list.hbs | 4 +-- assets/javascripts/app/views/build.coffee | 22 ++++++++++++-- .../lib/travis/expandable_record_array.coffee | 29 +++++++++++++++++++ public/javascripts/application.js | 2 +- public/javascripts/application.min.js | 8 +++-- public/version | 2 +- 7 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 assets/javascripts/lib/travis/expandable_record_array.coffee diff --git a/assets/javascripts/app/models/repository.coffee b/assets/javascripts/app/models/repository.coffee index c6f47a3e..77921440 100644 --- a/assets/javascripts/app/models/repository.coffee +++ b/assets/javascripts/app/models/repository.coffee @@ -1,3 +1,4 @@ +require 'travis/expandable_record_array' require 'travis/model' @Travis.Repository = Travis.Model.extend @@ -13,14 +14,28 @@ require 'travis/model' builds: (-> id = @get('id') - Travis.Build.byRepositoryId id, event_type: 'push' - Travis.Build.filter (data) -> parseInt(data.get('repository_id')) == id && !data.get('pull_request') + builds = Travis.Build.byRepositoryId id, event_type: 'push' + array = Travis.ExpandableRecordArray.create + type: Travis.Build + content: Ember.A([]) + store: @get('store') + + array.load(builds) + + array ).property() pullRequests: (-> id = @get('id') - Travis.Build.byRepositoryId id, event_type: 'pull_request' - Travis.Build.filter (data) -> parseInt(data.get('repository_id')) == id && data.get('pull_request') + builds = Travis.Build.byRepositoryId id, event_type: 'pull_request' + array = Travis.ExpandableRecordArray.create + type: Travis.Build + content: Ember.A([]) + store: @get('store') + + array.load(builds) + + array ).property() branches: (-> diff --git a/assets/javascripts/app/templates/builds/list.hbs b/assets/javascripts/app/templates/builds/list.hbs index 26219916..e9f46669 100644 --- a/assets/javascripts/app/templates/builds/list.hbs +++ b/assets/javascripts/app/templates/builds/list.hbs @@ -40,9 +40,7 @@

- + {{view view.ShowMoreButton}}

{{else}}
Loading
diff --git a/assets/javascripts/app/views/build.coffee b/assets/javascripts/app/views/build.coffee index c74f2bcf..be5764ff 100644 --- a/assets/javascripts/app/views/build.coffee +++ b/assets/javascripts/app/views/build.coffee @@ -1,12 +1,28 @@ @Travis.reopen BuildsView: Travis.View.extend templateName: 'builds/list' - buildsBinding: 'controller' + buildsBinding: 'controller.builds' showMore: -> id = @get('controller.repository.id') - number = @get('controller.builds.lastObject.number') - Travis.Build.olderThanNumber(id, number) + number = @get('builds.lastObject.number') + @get('builds').load Travis.Build.olderThanNumber(id, number) + + ShowMoreButton: Em.View.extend + tagName: 'button' + classNameBindings: ['isLoading'] + attributeBindings: ['disabled'] + isLoadingBinding: 'controller.builds.isLoading' + template: Em.Handlebars.compile('{{view.label}}') + + disabledBinding: 'isLoading' + + label: (-> + if @get('isLoading') then 'Loading' else 'Show more' + ).property('isLoading') + + click: -> + @get('parentView').showMore() BuildsItemView: Travis.View.extend tagName: 'tr' diff --git a/assets/javascripts/lib/travis/expandable_record_array.coffee b/assets/javascripts/lib/travis/expandable_record_array.coffee new file mode 100644 index 00000000..06ce4199 --- /dev/null +++ b/assets/javascripts/lib/travis/expandable_record_array.coffee @@ -0,0 +1,29 @@ +Travis.ExpandableRecordArray = DS.RecordArray.extend + isLoaded: false + isLoading: false + + load: (array) -> + @set 'isLoading', true + self = this + + observer = -> + if @get 'isLoaded' + content = self.get 'content' + + array.removeObserver 'isLoaded', observer + array.forEach (record) -> + self.pushObject record + + self.set 'isLoading', false + self.set 'isLoaded', true + + array.addObserver 'isLoaded', observer + + pushObject: (record) -> + ids = @get 'content' + id = record.get 'id' + clientId = record.get 'clientId' + + return if ids.contains clientId + + ids.pushObject clientId diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 4262d239..87aa0e20 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -30146,4 +30146,4 @@ var _require=function(){function c(a,c){document.addEventListener?a.addEventList ++g&&setTimeout(c,0)})}}(); (function(){!window.WebSocket&&window.MozWebSocket&&(window.WebSocket=window.MozWebSocket);if(window.WebSocket)Pusher.Transport=window.WebSocket,Pusher.TransportType="native";var c=(document.location.protocol=="http:"?Pusher.cdn_http:Pusher.cdn_https)+Pusher.VERSION,a=[];window.JSON||a.push(c+"/json2"+Pusher.dependency_suffix+".js");if(!window.WebSocket)window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION=!0,a.push(c+"/flashfallback"+Pusher.dependency_suffix+".js");var b=function(){return window.WebSocket?function(){Pusher.ready()}: function(){window.WebSocket?(Pusher.Transport=window.WebSocket,Pusher.TransportType="flash",window.WEB_SOCKET_SWF_LOCATION=c+"/WebSocketMain.swf",WebSocket.__addTask(function(){Pusher.ready()}),WebSocket.__initialize()):(Pusher.Transport=null,Pusher.TransportType="none",Pusher.ready())}}(),e=function(a){var b=function(){document.body?a():setTimeout(b,0)};b()},g=function(){e(b)};a.length>0?_require(a,g):g()})(); -minispade.register('app', "(function() {(function() {\nminispade.require('travis');\nminispade.require('auth');\nminispade.require('controllers');\nminispade.require('helpers');\nminispade.require('models');\nminispade.require('pusher');\nminispade.require('routes');\nminispade.require('slider');\nminispade.require('store');\nminispade.require('tailing');\nminispade.require('templates');\nminispade.require('views');\nminispade.require('config/locales');\nminispade.require('data/sponsors');\n\n Travis.reopen({\n App: Em.Application.extend({\n autoinit: false,\n currentUserBinding: 'auth.user',\n authStateBinding: 'auth.state',\n init: function() {\n this._super.apply(this, arguments);\n this.store = Travis.Store.create();\n this.store.loadMany(Travis.Sponsor, Travis.SPONSORS);\n this.set('auth', Travis.Auth.create({\n store: this.store,\n endpoint: Travis.config.api_endpoint\n }));\n this.slider = new Travis.Slider();\n this.pusher = new Travis.Pusher(Travis.config.pusher);\n return this.tailing = new Travis.Tailing();\n },\n signIn: function() {\n return this.get('auth').signIn();\n },\n signOut: function() {\n this.get('auth').signOut();\n return this.get('router').send('showAuthenticated');\n },\n receive: function() {\n return this.store.receive.apply(this.store, arguments);\n },\n toggleSidebar: function() {\n var element;\n $('body').toggleClass('maximized');\n element = $('');\n $('#top .profile').append(element);\n Em.run.later((function() {\n return element.remove();\n }), 10);\n element = $('');\n $('#repository').append(element);\n return Em.run.later((function() {\n return element.remove();\n }), 10);\n }\n })\n });\n\n}).call(this);\n\n})();\n//@ sourceURL=app");minispade.register('auth', "(function() {(function() {\n\n this.Travis.Auth = Ember.Object.extend({\n iframe: $('