travis-web/assets/scripts/app/routes.coffee
Piotr Sarnacki cc90200d66 Instead of rendering getting started page, just redirect to it
It would be nice to allow to just render getting started page, but
because of the way we manage layouts, it's hard to get it running
without weird bugs popping up now and then. This should be easier to
achieve once the templates are cleaned up to use better laout
management.
2014-02-13 15:51:38 +01:00

408 lines
12 KiB
CoffeeScript

require 'travis/location'
Ember.Router.reopen
location: (if testMode? then Ember.NoneLocation.create() else Travis.Location.create())
handleURL: (url) ->
url = url.replace(/#.*?$/, '')
@_super(url)
Travis.Route = Ember.Route.extend
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)
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.ApplicationRoute = Travis.Route.extend
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
return true
renderNoOwnedRepos: ->
@transitionTo('getting_started')
renderFirstSync: ->
@renderFirstSync()
afterSignIn: (path) ->
@afterSignIn(path)
afterSignOut: ->
@afterSignOut()
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'
# this can't be nested in repo, because we want a set of different
# templates rendered for settings (for example no "current", "builds", ... tabs)
@resource 'repo.settings', path: '/:owner/:name/settings', ->
@route 'tab', path: ':tab'
@route 'getting_started'
@route 'first_sync'
@route 'stats', path: '/stats'
@route 'auth', path: '/auth'
@resource 'profile', path: '/profile', ->
@route 'index', path: '/'
@resource 'account', path: '/:login', ->
@route 'index', path: '/'
@route 'profile', path: '/profile'
@route 'notFound', path: "/*path"
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', into: 'repo', outlet: 'pane')
Travis.GettingStartedRoute = Travis.Route.extend
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.FirstSyncRoute = Travis.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 = Travis.Route.extend Travis.SetupLastBuild,
renderTemplate: ->
@render 'repo'
@render 'build', into: 'repo', outlet: 'pane'
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 = Travis.Route.extend
renderTemplate: ->
@render 'builds', into: 'repo', outlet: 'pane'
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 = Travis.Route.extend
renderTemplate: ->
@render 'build', into: 'repo', outlet: 'pane'
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 = Travis.Route.extend
renderTemplate: ->
@render 'job', into: 'repo', outlet: 'pane'
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 = Travis.Route.extend Travis.SetupLastBuild,
setupController: (controller, model) ->
@_super.apply this, arguments
@controllerFor('repo').activate('current')
renderTemplate: ->
@render 'build', into: 'repo', outlet: 'pane'
Travis.RepoRoute = Travis.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: (error) ->
# if error throwed has a slug (ie. it was probably repo not found)
# set the slug on index.error controller to allow to properly
# display the repo information
if error.slug
this.controllerFor('index.error').set('slug', error.slug)
# bubble to the top
return true
Travis.IndexRoute = Travis.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.StatsRoute = Travis.Route.extend
renderTemplate: ->
$('body').attr('id', 'stats')
@render 'top', outlet: 'top'
@render 'stats'
setupController: ->
@container.lookup('controller:application').connectLayout('simple')
Travis.NotFoundRoute = Travis.Route.extend
renderTemplate: ->
$('body').attr('id', 'not-found')
@render 'top', outlet: 'top'
@render 'not_found'
setupController: ->
@container.lookup('controller:application').connectLayout('simple')
Travis.ProfileRoute = Travis.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'
@_super.apply(this, arguments)
Travis.ProfileIndexRoute = Travis.Route.extend
setupController: ->
@container.lookup('controller:profile').activate 'hooks'
renderTemplate: ->
@render 'hooks', outlet: 'pane', into: 'profile', controller: 'profile'
Travis.AccountRoute = Travis.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 = Travis.Route.extend
setupController: ->
@container.lookup('controller:profile').activate 'hooks'
renderTemplate: ->
@render 'hooks', outlet: 'pane', into: 'profile'
Travis.AccountProfileRoute = Travis.Route.extend
setupController: ->
@container.lookup('controller:profile').activate 'user'
renderTemplate: ->
@render 'user', outlet: 'pane', into: 'profile'
Travis.AuthRoute = Travis.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)
Travis.RepoSettingsRoute = Travis.Route.extend
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
@_super(controller, 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)
afterModel: (repo) ->
# I'm using afterModel to fetch settings, because model is not always called.
# If link-to already provides a model, it will be just set as a route context.
repo.fetchSettings().then (settings) ->
repo.set('settings', settings)