diff --git a/.travis.yml b/.travis.yml index 8f0481f8..0fa0207b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,8 @@ matrix: fast_finish: true -addons: - sauce_connect: true +#addons: +# sauce_connect: true sudo: false diff --git a/app/components/add-ssh-key.coffee b/app/components/add-ssh-key.coffee index 0a77c7b7..1f414097 100644 --- a/app/components/add-ssh-key.coffee +++ b/app/components/add-ssh-key.coffee @@ -38,7 +38,7 @@ AddSshKeyComponent = Ember.Component.extend ).observes('value') addErrorsFromResponse: (errArr) -> - error = errArr[0] + error = errArr[0].detail if error.code == 'not_a_private_key' this.set('valueError', 'This key is not a private key.') else if error.code == 'key_with_a_passphrase' diff --git a/app/components/flash-display.coffee b/app/components/flash-display.coffee index dcf379a0..bb21f6a0 100644 --- a/app/components/flash-display.coffee +++ b/app/components/flash-display.coffee @@ -1,58 +1,15 @@ `import Ember from 'ember'` -`import LimitedArray from 'travis/utils/limited-array'` FlashDisplayComponent = Ember.Component.extend - auth: Ember.inject.service() - store: Ember.inject.service() - currentUserBinding: 'auth.currentUser' + flashes: Ember.inject.service() classNames: ['flash'] tagName: 'ul' - init: -> - @_super.apply this, arguments - @set('flashes', LimitedArray.create(limit: 1, content: [])) - - messages: (-> - broadcasts = @get('unseenBroadcasts') - flashes = @get('flashes') - model = [] - model.pushObjects(broadcasts) if broadcasts - model.pushObjects(flashes.toArray().reverse()) if flashes - model.uniq() - ).property('unseenBroadcasts.[]', 'flashes.[]', 'unseenBroadcasts.length', 'flashes.length') - - unseenBroadcasts: (-> - @get('broadcasts').filter (broadcast) -> - !broadcast.get('isSeen') - ).property('broadcasts.[]', 'broadcasts.length') - - broadcasts: (-> - broadcasts = Ember.ArrayProxy.create(content: []) - - if @get('currentUser.id') - @get('store').find('broadcast').then (result) -> - broadcasts.pushObjects(result.toArray()) - - broadcasts - ).property('currentUser.id') - - loadFlashes: (msgs) -> - for msg in msgs - type = Object.keys(msg)[0] - msg = { type: type, message: msg[type] } - @get('flashes').unshiftObject(msg) - Ember.run.later(this, (-> @get('flashes.content').removeObject(msg)), 15000) - - close: (msg) -> - if msg.constructor.modelName == "broadcast" - msg.setSeen() - @notifyPropertyChange('unseenBroadcasts') - else - @get('flashes').removeObject(msg) + messagesBinding: 'flashes.messages' actions: closeMessage: (msg) -> - @close(msg) + @get('flashes').close(msg) `export default FlashDisplayComponent` diff --git a/app/controllers/error.coffee b/app/controllers/error.coffee new file mode 100644 index 00000000..90babea0 --- /dev/null +++ b/app/controllers/error.coffee @@ -0,0 +1,5 @@ +`import Ember from 'ember'` + +Controller = Ember.Controller.extend() + +`export default Controller` diff --git a/app/controllers/flash.js b/app/controllers/flash.js new file mode 100644 index 00000000..0b56c699 --- /dev/null +++ b/app/controllers/flash.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + flashes: Ember.inject.service(), + + loadFlashes() { + return this.get('flashes').loadFlashes(...arguments); + } +}); diff --git a/app/initializers/auth.coffee b/app/initializers/auth.coffee index d3706644..5f18a20f 100644 --- a/app/initializers/auth.coffee +++ b/app/initializers/auth.coffee @@ -8,6 +8,7 @@ initialize = (container, app) -> app.inject('controller', 'auth', 'auth:main') app.inject('application', 'auth', 'auth:main') app.inject('component', 'auth', 'auth:main') + app.inject('service:flashes', 'auth', 'auth:main') app.inject('auth', 'store', 'service:store') diff --git a/app/models/user.coffee b/app/models/user.coffee index 964098f1..a3524584 100644 --- a/app/models/user.coffee +++ b/app/models/user.coffee @@ -54,6 +54,12 @@ User = Model.extend permissions ).property() + # TODO: permissions are loading asynchronously at the moment, so this should + # be the way to return them for all types: + pushPermissionsPromise: (-> + @get('_rawPermissions').then (data) => data.pull + ).property() + hasAccessToRepo: (repo) -> id = if repo.get then repo.get('id') else repo diff --git a/app/routes/basic.coffee b/app/routes/basic.coffee index e6c5af54..3449337d 100644 --- a/app/routes/basic.coffee +++ b/app/routes/basic.coffee @@ -2,6 +2,11 @@ `import Ember from 'ember'` Route = Ember.Route.extend + activate: -> + if @routeName != 'error' + @controllerFor('error').set('layoutName', null) + return @_super.apply(this, arguments) + beforeModel: (transition) -> @auth.autoSignIn() unless @signedIn() diff --git a/app/routes/error.js b/app/routes/error.js new file mode 100644 index 00000000..5231b4cc --- /dev/null +++ b/app/routes/error.js @@ -0,0 +1,10 @@ +import TravisRoute from 'travis/routes/basic'; + +export default TravisRoute.extend({ + resetController(controller, isExiting, transition) { + if (isExiting) { + controller.set('message', null); + controller.set('layoutName', null); + } + } +}); diff --git a/app/routes/owner.coffee b/app/routes/owner.coffee index 2ae81837..8e134009 100644 --- a/app/routes/owner.coffee +++ b/app/routes/owner.coffee @@ -4,7 +4,6 @@ `import config from 'travis/config/environment'` Route = TravisRoute.extend - deactivate: -> @controllerFor('loading').set('layoutName', null) @@ -19,4 +18,17 @@ Route = TravisRoute.extend @_super.apply(this, arguments) + actions: + error: (error, transition, originRoute) -> + login = transition.params.owner.owner + message = if error.status == 404 + "Couldn't find an owner with login \"#{login}\"" + else + "There was an error while loading data, please try again." + + @controllerFor('error').set('layoutName', 'simple') + @controllerFor('error').set('message', message) + + return true + `export default Route` diff --git a/app/routes/settings.coffee b/app/routes/settings.coffee index 226f4de8..0945c35e 100644 --- a/app/routes/settings.coffee +++ b/app/routes/settings.coffee @@ -43,10 +43,11 @@ Route = TravisRoute.extend ); hasPushAccess: -> - repoId = parseInt @modelFor('repo').get('id') + repoId = parseInt(@modelFor('repo').get('id')) - @auth.get('currentUser').get('pushPermissions').filter (item) -> - item == repoId + @auth.get('currentUser').get('pushPermissionsPromise').then (permissions) -> + permissions.filter (item) -> + item == repoId model: () -> return Ember.RSVP.hash({ diff --git a/app/services/flashes.coffee b/app/services/flashes.coffee new file mode 100644 index 00000000..db3ad895 --- /dev/null +++ b/app/services/flashes.coffee @@ -0,0 +1,51 @@ +`import Ember from 'ember'` +`import LimitedArray from 'travis/utils/limited-array'` + +FlashesService = Ember.Service.extend + store: Ember.inject.service() + + currentUserBinding: 'auth.currentUser' + + init: -> + @_super.apply this, arguments + @set('flashes', LimitedArray.create(limit: 1, content: [])) + + messages: (-> + broadcasts = @get('unseenBroadcasts') + flashes = @get('flashes') + model = [] + model.pushObjects(broadcasts) if broadcasts + model.pushObjects(flashes.toArray().reverse()) if flashes + model.uniq() + ).property('unseenBroadcasts.[]', 'flashes.[]', 'unseenBroadcasts.length', 'flashes.length') + + unseenBroadcasts: (-> + @get('broadcasts').filter (broadcast) -> + !broadcast.get('isSeen') + ).property('broadcasts.[]', 'broadcasts.length') + + broadcasts: (-> + broadcasts = Ember.ArrayProxy.create(content: []) + + if @get('currentUser.id') + @get('store').find('broadcast').then (result) -> + broadcasts.pushObjects(result.toArray()) + + broadcasts + ).property('currentUser.id') + + loadFlashes: (msgs) -> + for msg in msgs + type = Object.keys(msg)[0] + msg = { type: type, message: msg[type] } + @get('flashes').unshiftObject(msg) + Ember.run.later(this, (-> @get('flashes.content').removeObject(msg)), 15000) + + close: (msg) -> + if msg.constructor.modelName == "broadcast" + msg.setSeen() + @notifyPropertyChange('unseenBroadcasts') + else + @get('flashes').removeObject(msg) + +`export default FlashesService` diff --git a/app/templates/error.hbs b/app/templates/error.hbs new file mode 100644 index 00000000..9653e44f --- /dev/null +++ b/app/templates/error.hbs @@ -0,0 +1,5 @@ +{{#if message}} + {{message}} +{{else}} + There was an error, please try again. +{{/if}} diff --git a/app/templates/layouts/flash.hbs b/app/templates/layouts/flash.hbs deleted file mode 100644 index 8b137891..00000000 --- a/app/templates/layouts/flash.hbs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/app/templates/owner/error.hbs b/app/templates/owner/error.hbs new file mode 100644 index 00000000..257cc564 --- /dev/null +++ b/app/templates/owner/error.hbs @@ -0,0 +1 @@ +foo diff --git a/app/views/error.coffee b/app/views/error.coffee new file mode 100644 index 00000000..fd4d7995 --- /dev/null +++ b/app/views/error.coffee @@ -0,0 +1,9 @@ +`import Ember from 'ember'` + +View = Ember.View.extend + layoutName: (-> + if name = @get('controller.layoutName') + 'layouts/' + name + ).property('controller.layoutName') + +`export default View` diff --git a/testem.json b/testem.json index 5f909db9..e5e2046a 100644 --- a/testem.json +++ b/testem.json @@ -2,8 +2,6 @@ "framework": "qunit", "test_page": "tests/index.html?hidepassed", "launch_in_ci": [ - "SL_chrome", - "SL_firefox", "PhantomJS" ], "launch_in_dev": [