
Layout handling in travis-web was implemented in a dynamic way, so we could change a main layout from any of the routes. This needed a `rerender` call which was making things harder and needed some hacks. It also broke a few transitions when upgrading to 1.8.1. After examining our usage of layouts I've noticed that we don't need to change the entire layout dynamically and instead we can set layout on root routes (like "index", "profile" and other root routes).
420 lines
12 KiB
CoffeeScript
420 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
|
|
beforeModel: (transition) ->
|
|
@auth.autoSignIn() unless @signedIn()
|
|
|
|
if !@signedIn() && @get('needsAuth')
|
|
@auth.set('afterSignInTransition', transition)
|
|
Ember.RSVP.reject("needs-auth")
|
|
else
|
|
@_super.apply(this, arguments)
|
|
|
|
signedIn: ->
|
|
@controllerFor('currentUser').get('content')
|
|
|
|
Travis.ApplicationRoute = Travis.Route.extend
|
|
actions:
|
|
redirectToGettingStarted: ->
|
|
# do nothing, we handle it only in index path
|
|
|
|
renderDefaultTemplate: ->
|
|
@renderDefaultTemplate() if @renderDefaultTemplate
|
|
|
|
error: (error) ->
|
|
if error == 'needs-auth'
|
|
authController = @container.lookup('controller:auth')
|
|
authController.set('redirected', true)
|
|
@transitionTo('auth')
|
|
else
|
|
return true
|
|
|
|
renderFirstSync: ->
|
|
@transitionTo 'first_sync'
|
|
|
|
afterSignIn: ->
|
|
if transition = @auth.get('afterSignInTransition')
|
|
@auth.set('afterSignInTransition', null)
|
|
transition.retry()
|
|
|
|
afterSignOut: ->
|
|
@transitionTo('index.current')
|
|
|
|
Travis.Router.map ->
|
|
@resource 'index', path: '/', ->
|
|
@resource 'getting_started'
|
|
@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'
|
|
@resource 'requests', path: '/requests'
|
|
@resource 'caches', path: '/caches' if Travis.config.caches_enabled
|
|
@resource 'request', path: '/requests/:request_id'
|
|
|
|
@resource 'settings', ->
|
|
@route 'index', path: '/'
|
|
@resource 'env_vars', ->
|
|
@route 'new'
|
|
@resource 'ssh_key' if Travis.config.ssh_key_enabled
|
|
|
|
@route 'first_sync'
|
|
@route 'insufficient_oauth_permissions'
|
|
@route 'stats', path: '/stats'
|
|
@route 'auth', path: '/auth'
|
|
|
|
@resource 'profile', path: '/profile', ->
|
|
@resource 'accounts', path: '/', ->
|
|
@resource 'account', path: '/:login'
|
|
@route 'info', path: '/info'
|
|
|
|
@route 'notFound', path: "/*path"
|
|
|
|
Travis.RequestsRoute = Travis.Route.extend
|
|
needsAuth: true
|
|
setupController: ->
|
|
@_super.apply this, arguments
|
|
@controllerFor('repo').activate('requests')
|
|
|
|
model: ->
|
|
Travis.Request.fetch repository_id: @modelFor('repo').get('id')
|
|
|
|
Travis.CachesRoute = Travis.Route.extend
|
|
needsAuth: true
|
|
setupController: ->
|
|
@_super.apply this, arguments
|
|
@controllerFor('repo').activate('caches')
|
|
|
|
model: ->
|
|
repo = @modelFor('repo')
|
|
Travis.ajax.get("/repos/#{repo.get('id')}/caches").then( (data) ->
|
|
groups = {}
|
|
data["caches"].forEach (cacheData) ->
|
|
branch = cacheData["branch"]
|
|
group = groups[branch]
|
|
unless group
|
|
group = groups[branch] = Ember.Object.create(branch: branch, caches: [])
|
|
cache = Ember.Object.create(cacheData)
|
|
cache.set('parent', group)
|
|
group.get('caches').pushObject(cache)
|
|
|
|
result = []
|
|
for branch, caches of groups
|
|
result.push caches
|
|
|
|
result
|
|
)
|
|
|
|
Travis.RequestRoute = Travis.Route.extend
|
|
setupController: ->
|
|
@_super.apply this, arguments
|
|
@controllerFor('repo').activate('request')
|
|
|
|
model: (params) ->
|
|
Travis.Request.fetch params.request_id
|
|
|
|
Travis.GettingStartedRoute = Travis.Route.extend
|
|
renderTemplate: ->
|
|
@render('no_owned_repos')
|
|
|
|
Travis.SimpleLayoutRoute = Travis.Route.extend
|
|
setupController: ->
|
|
$('body').attr('id', 'home')
|
|
@container.lookup('controller:repos').activate()
|
|
@_super.apply(this, arguments)
|
|
|
|
renderTemplate: ->
|
|
@_super.apply(this, arguments)
|
|
|
|
Travis.FirstSyncRoute = Travis.SimpleLayoutRoute.extend
|
|
actions:
|
|
redirectToGettingStarted: ->
|
|
# do nothing, we are showing first sync, so it's normal that there is
|
|
# no owned repos
|
|
|
|
Travis.InsufficientOauthPermissionsRoute = Travis.SimpleLayoutRoute.extend
|
|
setupController: (controller) ->
|
|
@_super.apply this, arguments
|
|
existingUser = document.location.hash.match(/#existing[_-]user/)
|
|
controller.set('existingUser', existingUser)
|
|
|
|
Travis.IndexCurrentRoute = Travis.Route.extend
|
|
renderTemplate: ->
|
|
@render 'repo'
|
|
@render 'build', into: 'repo'
|
|
|
|
setupController: ->
|
|
@_super.apply this, arguments
|
|
@currentRepoDidChange()
|
|
|
|
@controllerFor('repo').activate('index')
|
|
@controllerFor('repos').addObserver('firstObject', this, 'currentRepoDidChange')
|
|
|
|
afterModel: ->
|
|
@controllerFor('repos').possiblyRedirectToGettingStartedPage()
|
|
|
|
deactivate: ->
|
|
@controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange')
|
|
|
|
currentRepoDidChange: ->
|
|
@controllerFor('repo').set('repo', @controllerFor('repos').get('firstObject'))
|
|
|
|
actions:
|
|
redirectToGettingStarted: ->
|
|
@transitionTo('getting_started')
|
|
|
|
Travis.AbstractBuildsRoute = Travis.Route.extend
|
|
renderTemplate: ->
|
|
@render 'builds'
|
|
|
|
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
|
|
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)
|
|
|
|
deactivate: ->
|
|
repo = @controllerFor('repo')
|
|
repo.set('build', null)
|
|
repo.set('job', null)
|
|
|
|
Travis.JobRoute = Travis.Route.extend
|
|
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)
|
|
|
|
deactivate: ->
|
|
repo = @controllerFor('repo')
|
|
repo.set('job', null)
|
|
|
|
Travis.RepoIndexRoute = Travis.Route.extend
|
|
setupController: (controller, model) ->
|
|
@_super.apply this, arguments
|
|
@controllerFor('repo').activate('current')
|
|
|
|
renderTemplate: ->
|
|
if @modelFor('repo').get('lastBuildId')
|
|
@render 'build'
|
|
else
|
|
@render 'builds/not_found'
|
|
|
|
deactivate: ->
|
|
repo = @controllerFor('repo')
|
|
repo.set('build', null)
|
|
repo.set('job', null)
|
|
|
|
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')
|
|
|
|
@_super.apply this, arguments
|
|
|
|
@render 'repos', outlet: 'left', into: 'index'
|
|
|
|
setupController: (controller)->
|
|
@container.lookup('controller:repos').activate()
|
|
|
|
Travis.StatsRoute = Travis.Route.extend
|
|
renderTemplate: ->
|
|
$('body').attr('id', 'stats')
|
|
|
|
@render 'stats'
|
|
|
|
Travis.NotFoundRoute = Travis.Route.extend
|
|
renderTemplate: ->
|
|
$('body').attr('id', 'not-found')
|
|
|
|
@render 'not_found'
|
|
|
|
Travis.ProfileRoute = Travis.Route.extend
|
|
needsAuth: true
|
|
|
|
setupController: (controller, model) ->
|
|
@controllerFor('accounts').set('model', model)
|
|
|
|
renderTemplate: ->
|
|
$('body').attr('id', 'profile')
|
|
@_super.apply(this, arguments)
|
|
@render 'loading', outlet: 'left', into: 'profile'
|
|
|
|
Travis.AccountsRoute = Travis.Route.extend
|
|
model: ->
|
|
Travis.Account.fetch(all: true)
|
|
|
|
renderTemplate: ->
|
|
@_super.apply(this, arguments)
|
|
@render 'profile_accounts', outlet: 'left', into: 'profile'
|
|
|
|
Travis.AccountsIndexRoute = Travis.Route.extend
|
|
redirect: ->
|
|
# TODO: setting accounts model in ProfileRoute is wrong, but
|
|
# at this stage it's better than what we had before
|
|
accounts = @modelFor('accounts')
|
|
login = @controllerFor('currentUser').get('login')
|
|
account = accounts.find (account) -> account.get('login') == login
|
|
@replaceWith 'account', account
|
|
|
|
Travis.AccountRoute = Travis.Route.extend
|
|
setupController: (controller, account) ->
|
|
@_super.apply this, arguments
|
|
|
|
@controllerFor('profile').activate 'hooks'
|
|
|
|
model: (params) ->
|
|
@modelFor('accounts').find (account) -> account.get('login') == params.login
|
|
|
|
serialize: (account) ->
|
|
if account && account.get
|
|
{ login: account.get('login') }
|
|
else
|
|
{}
|
|
|
|
Travis.ProfileInfoRoute = Travis.Route.extend
|
|
setupController: ->
|
|
@container.lookup('controller:profile').activate 'user'
|
|
|
|
renderTemplate: ->
|
|
@render 'user'
|
|
|
|
Travis.AuthRoute = Travis.Route.extend
|
|
renderTemplate: ->
|
|
$('body').attr('id', 'auth')
|
|
|
|
@render 'auth.signin'
|
|
|
|
deactivate: ->
|
|
@controllerFor('auth').set('redirected', false)
|
|
|
|
actions:
|
|
afterSignIn: ->
|
|
@transitionTo('index.current')
|
|
return true
|
|
|
|
Travis.SettingsRoute = Travis.Route.extend
|
|
needsAuth: true
|
|
setupController: (controller, model) ->
|
|
@controllerFor('repo').activate('settings')
|
|
|
|
Travis.SettingsIndexRoute = Travis.Route.extend
|
|
model: ->
|
|
repo = @modelFor('repo')
|
|
repo.fetchSettings().then (settings) ->
|
|
repo.set('settings', settings)
|
|
|
|
Travis.EnvVarsRoute = Travis.Route.extend
|
|
model: (params) ->
|
|
repo = @modelFor('repo')
|
|
repo.get('envVars.promise')
|
|
|
|
Travis.SshKeyRoute = Travis.Route.extend
|
|
model: (params) ->
|
|
repo = @modelFor('repo')
|
|
self = this
|
|
Travis.SshKey.fetch(repo.get('id')).then ( (result) -> result ), (xhr) ->
|
|
if xhr.status == 404
|
|
# if there is no model, just return null. I'm not sure if this is the
|
|
# best answer, maybe we should just redirect to different route, like
|
|
# ssh_key.new or ssh_key.no_key
|
|
return null
|
|
|
|
afterModel: (model, transition) ->
|
|
repo = @modelFor('repo')
|
|
Travis.ajax.get "/repositories/#{repo.get('id')}/key", (data) =>
|
|
@defaultKey = Ember.Object.create(fingerprint: data.fingerprint)
|
|
|
|
setupController: (controller, model) ->
|
|
controller.reset()
|
|
@_super.apply this, arguments
|
|
|
|
if @defaultKey
|
|
controller.set('defaultKey', @defaultKey)
|
|
@defaultKey = null
|