refactor layouts and add profile/service_hooks
This commit is contained in:
parent
9a60e18a8a
commit
888c2719b8
|
@ -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'
|
||||
|
|
|
@ -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'
|
||||
|
|
27
assets/javascripts/app/controllers/sponsors.coffee
Normal file
27
assets/javascripts/app/controllers/sponsors.coffee
Normal 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')
|
10
assets/javascripts/app/controllers/workers.coffee
Normal file
10
assets/javascripts/app/controllers/workers.coffee
Normal 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')
|
||||
|
|
@ -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'
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
32
assets/javascripts/app/models/hook.coffee
Normal file
32
assets/javascripts/app/models/hook.coffee
Normal 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'
|
||||
|
||||
|
20
assets/javascripts/app/models/profile.coffee
Normal file
20
assets/javascripts/app/models/profile.coffee
Normal 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'
|
||||
|
|
@ -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'
|
||||
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -8,7 +8,6 @@ require 'models'
|
|||
builds: Travis.Build,
|
||||
commits: Travis.Commit,
|
||||
jobs: Travis.Job
|
||||
service_hooks: Travis.ServiceHook
|
||||
|
||||
plurals:
|
||||
repository: 'repositories',
|
||||
|
|
18
assets/javascripts/app/templates/hooks/list.hbs
Normal file
18
assets/javascripts/app/templates/hooks/list.hbs
Normal 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}}
|
||||
|
|
@ -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">
|
||||
|
|
46
assets/javascripts/app/templates/profile/show.hbs
Normal file
46
assets/javascripts/app/templates/profile/show.hbs
Normal 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}}
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue
Block a user