travis-web/assets/scripts/app/routes.coffee

395 lines
11 KiB
CoffeeScript

require 'travis/location'
require 'travis/line_number_parser'
Ember.Router.reopen
location: (if testMode? then Ember.NoneLocation.create() else Travis.Location.create())
handleURL: (url) ->
url = url.replace(/#.*?$/, '')
try
@_super(url)
catch error
if error.message.match(/No route matched the URL/)
@_super('/not-found')
else
throw(error)
# TODO: don't reopen Ember.Route to add events, there should be
# a better way (like "parent" resource for everything inside map)
Ember.Route.reopen
_actions:
renderDefaultTemplate: ->
@renderDefaultTemplate() if @renderDefaultTemplate
error: (error) ->
if error == 'needs-auth'
authController = @container.lookup('controller:auth') || @generateController('auth')
authController.set('redirected', true)
@transitionTo('auth')
else
throw(error)
renderNoOwnedRepos: ->
@render('no_owned_repos', outlet: 'main')
renderFirstSync: ->
@renderFirstSync()
afterSignIn: (path) ->
@afterSignIn(path)
afterSignOut: ->
@afterSignOut()
afterSignIn: ->
if transition = Travis.auth.get('afterSignInTransition')
Travis.auth.set('afterSignInTransition', null)
transition.retry()
else
@transitionTo('index.current') if @constructor == Travis.AuthRoute || @constructor.superclass == Travis.AuthRoute
afterSignOut: ->
@transitionTo('index.current')
renderFirstSync: ->
@transitionTo 'first_sync'
beforeModel: (transition) ->
Travis.autoSignIn() unless @signedIn()
if !@signedIn() && @get('needsAuth')
Travis.auth.set('afterSignInTransition', transition)
transition.abort()
Ember.RSVP.reject("needs-auth")
else
@_super.apply(this, arguments)
signedIn: ->
@controllerFor('currentUser').get('content')
redirect: ->
Travis.autoSignIn() unless @signedIn()
if @get('needsAuth')
@authorize(@router.location.getURL())
else
@_super.apply this, arguments
authorize: (path) ->
if !@signedIn()
Travis.storeAfterSignInPath(path)
@transitionTo('auth')
Travis.Router.reopen
transitionTo: ->
this.container.lookup('controller:repo').set('lineNumber', null)
@_super.apply this, arguments
Travis.Router.map ->
@resource 'index', path: '/', ->
@route 'current', path: '/'
@resource 'repo', path: '/:owner/:name', ->
@route 'index', path: '/'
@resource 'build', path: '/builds/:build_id'
@resource 'job', path: '/jobs/:job_id'
@resource 'builds', path: '/builds'
@resource 'pullRequests', path: '/pull_requests'
@resource 'branches', path: '/branches'
@route 'getting_started'
@route 'first_sync'
@route 'stats', path: '/stats'
@route 'auth', path: '/auth'
@route 'notFound', path: '/not-found'
@resource 'profile', path: '/profile', ->
@route 'index', path: '/'
@resource 'account', path: '/:login', ->
@route 'index', path: '/'
@route 'profile', path: '/profile'
Travis.ApplicationRoute = Ember.Route.extend Travis.LineNumberParser,
setupController: ->
@_super.apply this, arguments
this.controllerFor('repo').set('lineNumber', @fetchLineNumber())
Travis.SetupLastBuild = Ember.Mixin.create
setupController: ->
@repoDidLoad()
@controllerFor('repo').addObserver('repo.isLoaded', this, 'repoDidLoad')
repoDidLoad: ->
# TODO: it would be nicer to do it with promises
repo = @controllerFor('repo').get('repo')
if repo && repo.get('isLoaded') && !repo.get('lastBuildId')
Ember.run.next =>
@render('builds/not_found', outlet: 'pane', into: 'repo')
Travis.GettingStartedRoute = Ember.Route.extend
setupController: ->
$('body').attr('id', 'home')
@container.lookup('controller:repos').activate()
@container.lookup('controller:application').connectLayout 'home'
@_super.apply(this, arguments)
renderTemplate: ->
@render 'top', outlet: 'top'
@render 'repos', outlet: 'left'
@_super.apply(this, arguments)
Travis.FirstSyncRoute = Ember.Route.extend
_actions:
renderNoOwnedRepos: (->)
# do nothing, we are showing first sync, so it's normal that there is
# no owned repos
setupController: ->
$('body').attr('id', 'home')
@container.lookup('controller:repos').activate()
@container.lookup('controller:application').connectLayout 'simple'
@_super.apply(this, arguments)
renderTemplate: ->
@render 'top', outlet: 'top'
@_super.apply(this, arguments)
Travis.IndexCurrentRoute = Ember.Route.extend Travis.SetupLastBuild,
renderTemplate: ->
@render 'repo'
@render 'build', outlet: 'pane', into: 'repo'
setupController: ->
@_super.apply this, arguments
@currentRepoDidChange()
@controllerFor('repo').activate('index')
@controllerFor('repos').addObserver('firstObject', this, 'currentRepoDidChange')
deactivate: ->
@controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange')
currentRepoDidChange: ->
@controllerFor('repo').set('repo', @controllerFor('repos').get('firstObject'))
Travis.AbstractBuildsRoute = Ember.Route.extend
renderTemplate: ->
@render 'builds', outlet: 'pane', into: 'repo'
setupController: ->
@controllerFor('repo').activate(@get('contentType'))
@contentDidChange()
@controllerFor('repo').addObserver(@get('path'), this, 'contentDidChange')
deactivate: ->
@controllerFor('repo').removeObserver(@get('path'), this, 'contentDidChange')
contentDidChange: ->
path = @get('path')
@controllerFor('builds').set('content', @controllerFor('repo').get(path))
path: (->
type = @get('contentType')
"repo.#{type.camelize()}"
).property('contentType')
Travis.BuildsRoute = Travis.AbstractBuildsRoute.extend(contentType: 'builds')
Travis.PullRequestsRoute = Travis.AbstractBuildsRoute.extend(contentType: 'pull_requests')
Travis.BranchesRoute = Travis.AbstractBuildsRoute.extend(contentType: 'branches')
Travis.BuildRoute = Ember.Route.extend
renderTemplate: ->
@render 'build', outlet: 'pane', into: 'repo'
serialize: (model, params) ->
id = if model.get then model.get('id') else model
{ build_id: id }
setupController: (controller, model) ->
model = Travis.Build.find(model) if model && !model.get
repo = @controllerFor('repo')
repo.set('build', model)
repo.activate('build')
@controllerFor('build').set('build', model)
repo.set('build', model)
model: (params) ->
Travis.Build.fetch(params.build_id)
Travis.JobRoute = Ember.Route.extend
renderTemplate: ->
@render 'job', outlet: 'pane', into: 'repo'
serialize: (model, params) ->
id = if model.get then model.get('id') else model
{ job_id: id }
setupController: (controller, model) ->
model = Travis.Job.find(model) if model && !model.get
repo = @controllerFor('repo')
repo.set('job', model)
repo.activate('job')
if build = model.get('build')
@controllerFor('build').set('build', build)
repo.set('build', build)
model: (params) ->
Travis.Job.fetch(params.job_id)
Travis.RepoIndexRoute = Ember.Route.extend Travis.SetupLastBuild,
setupController: (controller, model) ->
@_super.apply this, arguments
@controllerFor('repo').activate('current')
renderTemplate: ->
@render 'build', outlet: 'pane', into: 'repo'
Travis.RepoRoute = Ember.Route.extend
renderTemplate: ->
@render 'repo'
setupController: (controller, model) ->
# TODO: if repo is just a data hash with id and slug load it
# as incomplete record
model = Travis.Repo.find(model.id) if model && !model.get
controller.set('repo', model)
serialize: (repo) ->
slug = if repo.get then repo.get('slug') else repo.slug
[owner, name] = slug.split('/')
{ owner: owner, name: name }
model: (params) ->
slug = "#{params.owner}/#{params.name}"
Travis.Repo.fetchBySlug(slug)
actions:
error: ->
Ember.run.next this, ->
@render('repos/not_found', outlet: 'main')
Travis.IndexRoute = Ember.Route.extend
renderTemplate: ->
$('body').attr('id', 'home')
@render 'repos', outlet: 'left'
@render 'top', outlet: 'top'
@render 'flash', outlet: 'flash'
setupController: (controller)->
@container.lookup('controller:repos').activate()
@container.lookup('controller:application').connectLayout 'home'
Travis.IndexLoadingRoute = Ember.Route.extend
renderTemplate: ->
@render('index_loading')
Travis.StatsRoute = Ember.Route.extend
renderTemplate: ->
$('body').attr('id', 'stats')
@render 'top', outlet: 'top'
@render 'stats'
setupController: ->
@container.lookup('controller:application').connectLayout('simple')
Travis.NotFoundRoute = Ember.Route.extend
renderTemplate: ->
$('body').attr('id', 'not-found')
@render 'top', outlet: 'top'
@render 'not_found'
setupController: ->
@container.lookup('controller:application').connectLayout('simple')
Travis.ProfileRoute = Ember.Route.extend
needsAuth: true
setupController: ->
@container.lookup('controller:application').connectLayout('profile')
@container.lookup('controller:accounts').set('content', Travis.Account.find(all: true))
renderTemplate: ->
$('body').attr('id', 'profile')
@render 'top', outlet: 'top'
@render 'accounts', outlet: 'left'
@render 'flash', outlet: 'flash'
@render 'profile'
Travis.ProfileIndexRoute = Ember.Route.extend
setupController: ->
@container.lookup('controller:profile').activate 'hooks'
renderTemplate: ->
@render 'hooks', outlet: 'pane', into: 'profile', controller: 'profile'
Travis.AccountRoute = Ember.Route.extend
setupController: (controller, account) ->
profileController = @container.lookup('controller:profile')
profileController.activate 'hooks'
if account
params = { login: account.get('login') }
profileController.setParams(params)
model: (params) ->
controller = @container.lookup('controller:accounts')
account = controller.findByLogin(params.login)
if account
account
else
content = Ember.Object.create(login: params.login)
proxy = Ember.ObjectProxy.create(content: content)
observer = ->
if account = controller.findByLogin(params.login)
controller.removeObserver 'content.length', observer
proxy.set('content', account)
controller.addObserver 'content.length', observer
proxy
serialize: (account) ->
if account && account.get
{ login: account.get('login') }
else
{}
Travis.AccountIndexRoute = Ember.Route.extend
setupController: ->
@container.lookup('controller:profile').activate 'hooks'
renderTemplate: ->
@render 'hooks', outlet: 'pane', into: 'profile'
Travis.AccountProfileRoute = Ember.Route.extend
setupController: ->
@container.lookup('controller:profile').activate 'user'
renderTemplate: ->
@render 'user', outlet: 'pane', into: 'profile'
Travis.AuthRoute = Ember.Route.extend
renderTemplate: ->
$('body').attr('id', 'auth')
@render 'top', outlet: 'top'
@render 'auth.signin'
setupController: ->
@container.lookup('controller:application').connectLayout('simple')
deactivate: ->
@controllerFor('auth').set('redirected', false)