refactor layouts and add profile/service_hooks

This commit is contained in:
Sven Fuchs 2012-07-01 01:08:35 +02:00
parent 9a60e18a8a
commit 888c2719b8
22 changed files with 255 additions and 99 deletions

View File

@ -22,18 +22,29 @@ require 'ext/jquery'
{ name: 'jvmotp', display: 'JVM and Erlang' },
],
currentUserId: 1
run: ->
@app = Travis.App.create(this)
@app.initialize()
App: Em.Application.extend
initialize: (router) ->
@connect()
@store = Travis.Store.create()
@store.loadMany(Travis.Sponsor, Travis.SPONSORS)
@routes = Travis.Router.create(app: this)
@_super(Em.Object.create())
@routes.start()
connect: ->
@controller = Em.Controller.create()
view = Em.View.create
template: Em.Handlebars.compile('{{outlet layout}}')
controller: @controller
view.appendTo(@get('rootElement') || 'body')
require 'controllers'
require 'helpers'
require 'layout'

View File

@ -2,54 +2,13 @@ require 'helpers'
require 'travis/ticker'
Travis.Controllers = Em.Namespace.create
AppController: Em.Controller.extend()
RepositoriesController: Em.ArrayController.extend()
RepositoryController: Em.ObjectController.extend(Travis.Urls.Repository)
TabsController: Em.Controller.extend()
BuildsController: Em.ArrayController.extend()
BuildController: Em.ObjectController.extend(Travis.Urls.Commit)
JobController: Em.ObjectController.extend(Travis.Urls.Commit)
SidebarController: Em.Controller.extend()
QueuesController: Em.ArrayController.extend()
HooksController: Em.ArrayController.extend()
SponsorsController: Em.ArrayController.extend
page: 0
arrangedContent: (->
@get('shuffled').slice(@start(), @end())
).property('shuffled.length', 'page')
shuffled: (->
if content = @get('content') then $.shuffle(content) else []
).property('content.length')
next: ->
@set('page', if @isLast() then 0 else @get('page') + 1)
pages: (->
length = @getPath('content.length')
if length then parseInt(length / @get('perPage') + 1) else 1
).property('length')
isLast: ->
@get('page') == @get('pages') - 1
start: ->
@get('page') * @get('perPage')
end: ->
@start() + @get('perPage')
WorkersController: Em.ArrayController.extend
groups: (->
groups = {}
for worker in @get('content').toArray()
host = worker.get('host')
groups[host] = Em.ArrayProxy.create(content: []) if !(host in groups)
groups[host].pushObject(worker)
$.values(groups)
).property('content.length')
require 'controllers/sponsors'
require 'controllers/workers'

View File

@ -0,0 +1,27 @@
Travis.Controllers.SponsorsController = Em.ArrayController.extend
page: 0
arrangedContent: (->
@get('shuffled').slice(@start(), @end())
).property('shuffled.length', 'page')
shuffled: (->
if content = @get('content') then $.shuffle(content) else []
).property('content.length')
next: ->
@set('page', if @isLast() then 0 else @get('page') + 1)
pages: (->
length = @getPath('content.length')
if length then parseInt(length / @get('perPage') + 1) else 1
).property('length')
isLast: ->
@get('page') == @get('pages') - 1
start: ->
@get('page') * @get('perPage')
end: ->
@start() + @get('perPage')

View File

@ -0,0 +1,10 @@
Travis.Controllers.WorkersController = Em.ArrayController.extend
groups: (->
groups = {}
for worker in @get('content').toArray()
host = worker.get('host')
groups[host] = Em.ArrayProxy.create(content: []) if !(host in groups)
groups[host].pushObject(worker)
$.values(groups)
).property('content.length')

View File

@ -1,9 +1,9 @@
Travis.Layout = Em.Namespace.create()
Travis.Layout.instance = (name) ->
Travis.Layout.instance = (name, parent) ->
if @layout && @layout.name == name
@layout
else
@layout = Travis.Layout[name].create(name: name)
@layout = Travis.Layout[name].create(parent: parent)
require 'layout/default'
require 'layout/sidebar'

View File

@ -1,20 +1,27 @@
Travis.Layout.Base = Em.Object.extend
init: ->
@setup(arguments)
@parent = @get('parent')
@setup(Array.prototype.slice.apply(arguments))
@connect()
setup: (controllers) ->
$.extend this, Travis.Controllers
$.extend this, Travis.Views
for name in controllers
for name in controllers.concat(@get('name'))
key = "#{$.camelize(name, false)}Controller"
name = $.camelize(key)
this[key] = Travis.Controllers[name].create(namespace: this, controllers: this)
klass = Travis.Controllers[name] || Em.Controller
this[key] = klass.create(namespace: this, controllers: this)
connect: ->
view = Em.View.create(templateName: "layouts/#{@get('name').toLowerCase()}")
view.set('controller', @appController)
view.appendTo(@get('rootElement') || 'body')
@parent.connectOutlet
outletName: 'layout'
controller: @controller()
viewClass: @viewClass()
controller: ->
this["#{$.camelize(@get('name'), false)}Controller"]
viewClass: ->
Travis.Views["#{$.camelize(@get('name'))}Layout"]

View File

@ -1,10 +1,12 @@
require 'layout/base'
Travis.Layout.Default = Travis.Layout.Base.extend
name: 'default'
init: ->
@_super('app', 'repositories', 'repository', 'tabs', 'build', 'job')
@_super('repositories', 'repository', 'tabs', 'build', 'job')
@connectLeft(Travis.Repository.find())
Travis.Layout.Sidebar.create(appController: @get('appController'))
Travis.Layout.Sidebar.create(defaultController: @get('defaultController'))
viewIndex: (params) ->
onceLoaded @repositories, =>
@ -59,11 +61,11 @@ Travis.Layout.Default = Travis.Layout.Base.extend
connectLeft: (repositories) ->
@repositories = repositories
@appController.connectOutlet(outletName: 'left', name: 'repositories', context: repositories)
@defaultController.connectOutlet(outletName: 'left', name: 'repositories', context: repositories)
connectRepository: (repository) ->
@repository = repository
@appController.connectOutlet(outletName: 'main', name: 'repository', context: repository)
@defaultController.connectOutlet(outletName: 'main', name: 'repository', context: repository)
connectTabs: (build, job) ->
@tabsController.set('repository', @repository)

View File

@ -1,7 +1,18 @@
require 'layout/base'
Travis.Layout.Profile = Travis.Layout.Base.extend
name: 'default'
name: 'profile'
init: ->
@_super('profile', 'hooks')
viewShow: (params) ->
@connectProfile(Travis.Profile.find())
@connectHooks(Travis.Hook.find())
connectProfile: (profile) ->
@profileController.connectOutlet(outletName: 'main', name: 'profile', context: profile)
connectHooks: (hooks) ->
@profileController.connectOutlet(outletName: 'hooks', name: 'hooks', context: hooks)

View File

@ -1,9 +1,11 @@
require 'layout/base'
Travis.Layout.Sidebar = Travis.Layout.Base.extend
name: 'sidebar'
init: ->
@_super('sidebar', 'sponsors', 'workers', 'queues')
@appController = @get('appController')
@_super('sponsors', 'workers', 'queues')
@defaultController = @get('defaultController')
@connectSponsors(Travis.Sponsor.decks(), Travis.Sponsor.links())
@connectWorkers(Travis.Worker.find())
@ -12,13 +14,13 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
Travis.Ticker.create(target: this, interval: Travis.INTERVALS.sponsors)
connect: ->
@appController.connectOutlet(outletName: 'right', name: 'sidebar')
@defaultController.connectOutlet(outletName: 'right', name: 'sidebar')
connectSponsors: (decks, links) ->
@sponsorsController = Em.Controller.create
decks: Travis.Controllers.SponsorsController.create(perPage: 1, content: decks)
links: Travis.Controllers.SponsorsController.create(perPage: 6, content: links)
@appController.set 'sponsors', @sponsorsController
@defaultController.set 'sponsors', @sponsorsController
tick: ->
@sponsorsController.get('decks').next()
@ -26,7 +28,7 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
connectWorkers: (workers) ->
@workersController.set('content', workers)
@appController.set('workers', @workersController)
@defaultController.set('workers', @workersController)
connectQueues: (queues) ->
queues = for queue in queues
@ -34,5 +36,5 @@ Travis.Layout.Sidebar = Travis.Layout.Base.extend
content: Travis.Job.queued(queue.name)
name: queue.display
@queuesController.set('content', queues)
@appController.set('queues', @queuesController)
@defaultController.set('queues', @queuesController)

View File

@ -1,7 +1,9 @@
require 'models/artifact'
require 'models/build'
require 'models/commit'
require 'models/hook'
require 'models/job'
require 'models/profile'
require 'models/repository'
require 'models/sponsor'
require 'models/worker'

View File

@ -0,0 +1,32 @@
require 'travis/model'
@Travis.Hook = Travis.Model.extend
primaryKey: 'slug'
slug: DS.attr('string')
description: DS.attr('string')
active: DS.attr('boolean')
owner: (->
@get('slug').split('/')[0]
).property('slug')
name: (->
@get('slug').split('/')[1]
).property('slug')
urlGithub: (->
"http://github.com/#{@get('slug')}"
).property()
urlGithubAdmin: (->
"http://github.com/#{@get('slug')}/admin/hooks#travis_minibucket"
).property()
toggle: ->
@set 'active', !@get('active')
Travis.app.store.commit()
@Travis.Hook.reopenClass
url: 'profile/hooks'

View File

@ -0,0 +1,20 @@
require 'travis/model'
@Travis.Profile = Travis.Model.extend
name: DS.attr('string')
email: DS.attr('string')
login: DS.attr('string')
token: DS.attr('string')
gravatarUrl: DS.attr('string')
urlGithub: (->
"http://github.com/#{@get('login')}"
).property()
@Travis.Profile.reopenClass
find: ->
@_super(Travis.currentUserId) if Travis.currentUserId
buildURL: ->
'profile'

View File

@ -1,20 +0,0 @@
require 'travis/model'
@Travis.ServiceHook = Travis.Model.extend
primaryKey: 'slug'
name: DS.attr('string')
owner_name: DS.attr('string')
active: DS.attr('boolean')
slug: (->
[@get('owner_name'), @get('name')].join('/')
).property()
toggle: ->
@set 'active', !@get('active')
Travis.app.store.commit()
@Travis.ServiceHook.reopenClass
url: 'profile/service_hooks'

View File

@ -21,5 +21,5 @@ Travis.Router = Em.Object.extend
@action(layout, action, params)
action: (layout, action, params) ->
layout = Travis.Layout.instance(layout)
layout = Travis.Layout.instance(layout, @app.controller)
layout["view#{$.camelize(action)}"](params)

View File

@ -8,7 +8,6 @@ require 'models'
builds: Travis.Build,
commits: Travis.Commit,
jobs: Travis.Job
service_hooks: Travis.ServiceHook
plurals:
repository: 'repositories',

View File

@ -0,0 +1,18 @@
{{#if content.length}}
<ul id="hooks">
{{#each content}}
<li {{bindAttr class="active"}}>
<a {{bindAttr href="urlGithub"}} rel="nofollow">{{owner}}/{{name}}</a>
<p class="description">{{description}}</p>
<div class="controls">
<a {{bindAttr href="urlGithubAdmin"}} class="github-admin tool-tip" title="Github service hooks admin page"></a>
<a {{action toggle}} class="switch">
</div>
</li>
{{/each}}
</ul>
{{else}}
<p class="sync">Please wait while we sync with GitHub</p>
{{/if}}

View File

@ -1,6 +1,6 @@
<div id="head">
<a href="/">Travis CI</a>
<a href="#">#</a>
<a href="#">Travis CI</a>
<a href="#!/profile">Profile</a>
</div>
<div id="left">

View File

@ -0,0 +1,46 @@
<h2>{{name}}</h2>
<img {{bindAttr src="gravatarUrl"}}>
<dl class="profile">
<dt>
{{t profiles.show.github}}:
</dt>
<dd>
<a {{bindAttr href="urlGithub"}}>{{login}}</a>
</dd>
<dt>
{{t profiles.show.email}}:
</dt>
<dd>
{{email}}
</dd>
<dt>
{{t profiles.show.token}}:
</dt>
<dd>
{{token}}
</dd>
</dl>
<p class="notice">
{{{t profiles.show.messages.notice}}}
</p>
<h4>{{t profiles.show.your_locale}}</h4>
<form>
<select name="user[locale]">
</select>
<button name="commit">
{{t profiles.show.update_locale}}
</button>
</form>
<h4>{{t profiles.show.your_repos}}</h4>
<p class="tip">
{{{t profiles.show.message.your_repos}}}
<a href="http://about.travis-ci.org/docs/user/build-configuration">
{{{t profiles.show.message.config}}}
</a>
</p>
{{outlet hooks}}

View File

@ -1,7 +1,12 @@
require 'ext/ember/namespace'
@Travis.Views = Em.Namespace.create
SidebarView: Em.View.extend(templateName: 'layouts/sidebar')
DefaultLayout: Em.View.extend(templateName: 'layouts/default')
ProfileLayout: Em.View.extend(templateName: 'layouts/profile')
SidebarView: Em.View.extend(templateName: 'layouts/sidebar')
ProfileView: Em.View.extend(templateName: 'profile/show')
HooksView: Em.View.extend(templateName: 'hooks/list')
require 'views/build'
require 'views/job'

View File

@ -40,29 +40,28 @@ $.fn.extend
$.extend
keys: (obj) ->
keys = []
$.each obj, (key) ->
keys.push key
$.each obj, (key) -> keys.push key
keys
values: (obj) ->
values = []
$.each obj, (key, value) ->
values.push value
$.each obj, (key, value) -> values.push value
values
underscore: (string) ->
string[0].toLowerCase() + string.substring(1).replace /([A-Z])?/g, (match, chr) ->
if chr then "_#{chr.toUpperCase()}" else ''
camelize: (string, uppercase) ->
string = $.capitalize(string) if uppercase or typeof uppercase is 'undefined'
string = if uppercase == false then $.underscore(string) else $.capitalize(string)
string.replace /_(.)?/g, (match, chr) ->
(if chr then chr.toUpperCase() else '')
if chr then chr.toUpperCase() else ''
capitalize: (string) ->
string[0].toUpperCase() + string.substring(1)
compact: (array) ->
$.grep array, (value) ->
!!value
$.grep array, (value) -> !!value
all: (array, callback) ->
args = Array::slice.apply(arguments)

View File

@ -45,6 +45,21 @@ workers = [
{ id: 2, name: 'ruby-2', host: 'worker.travis-ci.org', state: 'ready' }
]
profile =
id: 1
login: 'svenfuchs'
name: 'Sven Fuchs'
email: 'me@svenfuchs.com'
token: '1234567890'
gravatar_url: 'http://www.gravatar.com/avatar/402602a60e500e85f2f5dc1ff3648ecb?s=48&d=mm'
hooks = [
{ slug: 'travis-ci/travis-core', description: 'description of travis-core', active: true, private: false }
{ slug: 'travis-ci/travis-assets', description: 'description of travis-assets', active: false, private: false }
{ slug: 'svenfuchs/minimal', description: 'description of minimal', active: true, private: false }
]
$.mockjax
url: '/repositories'
responseTime: responseTime
@ -99,3 +114,14 @@ $.mockjax
responseTime: responseTime
responseText:
jobs: $.select(jobs, (job) -> job.state == 'created')
$.mockjax
url: '/profile'
responseTime: responseTime
responseText: { profile: profile }
$.mockjax
url: '/profile/hooks'
responseTime: responseTime
responseText: { hooks: hooks }

File diff suppressed because one or more lines are too long