travis-web/assets/scripts/app/controllers/repos.coffee
Piotr Sarnacki 05859a5a3c Use visibility.js to run timer updates
Visibility.js provides a thin wrapper over page visibility API, which
allows to detect if page is currently visible by user. This allows us to
stop live updates when it's not needed. This is especially easy in case
of timers, because Visibility.js provides setInterval replacement, which
runs given code only when page is visible.

A lot of ❤️ for @tchack, who showed me visibility.js!
2013-05-29 13:42:51 +03:00

77 lines
2.0 KiB
CoffeeScript

require 'travis/limited_array'
Travis.ReposController = Ember.ArrayController.extend
defaultTab: ( ->
if @get('currentUser.id')
'owned'
else
'recent'
).property('currentUser')
currentUserIdDidChange: (->
if @get('currentUser.id')
@activate('owned')
else if @get('tab') == 'owned'
@activate('recent')
).observes('currentUser.id')
isLoadedBinding: 'content.isLoaded'
needs: ['currentUser', 'repo']
currentUserBinding: 'controllers.currentUser'
selectedRepo: (->
# we need to observe also repo.content here, because we use
# ObjectProxy in repo controller
# TODO: get rid of ObjectProxy there
@get('controllers.repo.repo.content') || @get('controllers.repo.repo')
).property('controllers.repo.repo', 'controllers.repo.repo.content')
init: ->
@_super.apply this, arguments
Visibility.every Travis.INTERVALS.updateTimes, @updateTimes.bind(this)
recentRepos: (->
Travis.Repo.find()
Travis.LimitedArray.create
content: Em.ArrayProxy.extend(Em.SortableMixin).create(
sortProperties: ['sortOrder']
content: Travis.Repo.withLastBuild()
isLoadedBinding: 'content.isLoaded'
)
limit: 30
).property()
updateTimes: ->
if content = @get('content')
content.forEach (r) -> r.updateTimes()
activate: (tab, params) ->
@set('sortProperties', null)
tab ||= @get('defaultTab')
@set('tab', tab)
this["view#{$.camelize(tab)}"](params)
viewRecent: ->
@set('content', @get('recentRepos'))
viewOwned: ->
@set('sortProperties', ['sortOrder'])
@set('content', Travis.Repo.accessibleBy(@get('currentUser.login')))
viewSearch: (params) ->
@set('content', Travis.Repo.search(params.search))
searchObserver: (->
search = @get('search')
if search
@searchFor search
else
@activate 'recent'
'recent'
).observes('search')
searchFor: (phrase) ->
Ember.run.cancel(@searchLater) if @searchLater
@searchLater = Ember.run.later(this, (->
@activate 'search', search: phrase
), 500)