travis-web/app/controllers/repos.coffee
Piotr Sarnacki 6ee956367c Observe repos.firstObject on reposController
Since we change repos property on reposController, we can't set observer
on repos, because as soon as it's changed, we loose the observer.
Instead, we should observe only on reposController, which is not going
to change.
2015-12-08 10:18:02 +01:00

137 lines
3.8 KiB
CoffeeScript

`import Ember from 'ember'`
`import limit from 'travis/utils/computed-limit'`
`import Repo from 'travis/models/repo'`
Controller = Ember.Controller.extend
actions:
activate: (name) ->
@activate(name)
showRunningJobs: ->
@activate('running')
showMyRepositories: ->
# this is a bit of a hack. I don't want to switch URL for 'running'
# so depending on current state I'm either just switching back or
# redirecting
if @get('tab') == 'running'
@activate('owned')
else
@transitionToRoute('main.repositories')
tabOrIsLoadedDidChange: (->
@possiblyRedirectToGettingStartedPage()
).observes('isLoaded', 'tab', 'repos.length')
possiblyRedirectToGettingStartedPage: ->
Ember.run.scheduleOnce 'routerTransitions', this, ->
if @get('tab') == 'owned' && @get('isLoaded') && @get('repos.length') == 0
@container.lookup('router:main').send('redirectToGettingStarted')
isLoaded: false
repoController: Ember.inject.controller('repo')
currentUserBinding: 'auth.currentUser'
selectedRepo: (->
# we need to observe also repo.content here, because we use
# ObjectProxy in repo controller
# TODO: get rid of ObjectProxy there
@get('repoController.repo.content') || @get('repoController.repo')
).property('repoController.repo', 'repoController.repo.content')
startedJobsCount: Ember.computed.alias('runningJobs.length')
allJobsCount: (->
@get('startedJobsCount') + @get('queuedJobs.length')
).property('startedJobsCount', 'queuedJobs.length')
init: ->
@_super.apply this, arguments
if !Ember.testing
Visibility.every @config.intervals.updateTimes, @updateTimes.bind(this)
runningJobs: (->
result = @store.filter('job', {}, (job) ->
['queued', 'started', 'received'].indexOf(job.get('state')) != -1
)
result.set('isLoaded', false)
result.then =>
result.set('isLoaded', true)
result
).property()
queuedJobs: (->
result = @get('store').filter('job', {}, (job) ->
['created'].indexOf(job.get('state')) != -1
)
result.set('isLoaded', false)
result.then =>
result.set('isLoaded', true)
result
).property()
recentRepos: (->
# I return an empty array here, because we're removing left sidebar, but
# I don't want to refactor too much code (it will be all changed anyway
# when we switch to new dashboard)
[]
).property()
updateTimes: ->
if repos = @get('repos')
repos.forEach (r) -> r.updateTimes()
activate: (tab, params) ->
@set('sortProperties', ['sortOrder'])
@set('tab', tab)
this["view_#{tab}".camelize()](params)
viewOwned: ->
@set('isLoaded', false);
if login = @get('currentUser.login')
repos = Repo.accessibleBy(@store, login).then( (reposRecordArray) =>
@set('isLoaded', true)
@set('repos', reposRecordArray)
)
# TODO: handle error
else
@set('repos', [])
viewRunning: ->
viewSearch: (phrase) ->
@set('search', phrase)
@set('isLoaded', false)
Repo.search(@store, phrase).then( (reposRecordArray) =>
@set('isLoaded', true)
@set('repos', reposRecordArray)
)
searchObserver: (->
search = @get('search')
if search
@searchFor search
).observes('search')
searchFor: (phrase) ->
Ember.run.cancel(@searchLater) if @searchLater
@searchLater = Ember.run.later(this, (->
@transitionTo('main.search', phrase.replace(/\//g, '%2F'))
), 500)
noReposMessage: (->
tab = @get('tab')
if tab == 'owned'
'You don\'t have any repos set up on Travis CI'
else if tab == 'recent'
'Repositories could not be loaded'
else
'Could not find any repos'
).property('tab')
showRunningJobs: (->
@get('tab') == 'running'
).property('tab')
`export default Controller`