refactor and add sidebar

This commit is contained in:
Sven Fuchs 2012-06-30 15:38:38 +02:00
parent ee0a489832
commit 0e361e9a25
24 changed files with 230 additions and 372 deletions

View File

@ -34,10 +34,6 @@ input 'assets/javascripts' do
concat 'app/templates.js'
end
match 'mocks.js' do
concat 'mocks.js'
end
match '{app,config,lib}/**/*.js' do
minispade(
string: true,

View File

@ -1,4 +1,5 @@
require 'hax0rs'
require 'ext/jquery'
# $.mockjaxSettings.log = false
# Ember.LOG_BINDINGS = true
@ -6,6 +7,19 @@ require 'hax0rs'
@Travis = Em.Namespace.create
CONFIG_KEYS: ['rvm', 'gemfile', 'env', 'otp_release', 'php', 'node_js', 'perl', 'python', 'scala']
# QUEUES: [
# { name: 'common', display: 'Common' },
# { name: 'php', display: 'PHP, Perl and Python' },
# { name: 'node_js', display: 'Node.js' },
# { name: 'jvmotp', display: 'JVM and Erlang' },
# { name: 'rails', display: 'Rails' },
# { name: 'spree', display: 'Spree' },
# ],
QUEUES: [
{ name: 'common', display: 'Common' },
{ name: 'jvmotp', display: 'JVM and Erlang' },
],
run: ->
@app = Travis.App.create(this)
@app.initialize()
@ -17,7 +31,6 @@ require 'hax0rs'
@_super(Em.Object.create())
@routes.start()
require 'ext/jquery'
require 'controllers'
require 'helpers'
require 'layout'

View File

@ -1,12 +1,24 @@
require 'helpers'
Travis.Controllers =
ApplicationController: Em.Controller.extend()
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()
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

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

View File

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

View File

@ -1,12 +1,14 @@
Travis.Layout.Default = Travis.Layout.extend
require 'layout/base'
Travis.Layout.Default = Travis.Layout.Base.extend
init: ->
@_super()
@_super('app', 'repositories', 'repository', 'tabs', 'build', 'job')
@connectLeft(Travis.Repository.find())
Travis.Layout.Sidebar.create(appController: @get('appController'))
viewIndex: (params) ->
repositories = @get('repositories')
onceLoaded repositories, =>
repository = repositories.get('firstObject')
onceLoaded @repositories, =>
repository = @repositories.get('firstObject')
@connectRepository(repository)
@connectTabs()
@connectBuild(repository.get('lastBuild'))
@ -56,26 +58,26 @@ Travis.Layout.Default = Travis.Layout.extend
connectLeft: (repositories) ->
@set('repositories', repositories)
@get('applicationController').connectOutlet(outletName: 'left', name: 'repositories', context: repositories)
@repositories = repositories
@appController.connectOutlet(outletName: 'left', name: 'repositories', context: repositories)
connectRepository: (repository) ->
@set('repository', repository)
@get('applicationController').connectOutlet(outletName: 'main', name: 'repository', context: repository)
@repository = repository
@appController.connectOutlet(outletName: 'main', name: 'repository', context: repository)
connectTabs: (build, job) ->
@setPath('tabsController.repository', @get('repository'))
@setPath('tabsController.build', build)
@setPath('tabsController.job', job)
@get('repositoryController').connectOutlet(outletName: 'tabs', name: 'tabs')
@tabsController.set('repository', @repository)
@tabsController.set('build', @build)
@tabsController.set('job', @job)
@repositoryController.connectOutlet(outletName: 'tabs', name: 'tabs')
connectBuilds: (builds) ->
@get('repositoryController').connectOutlet(outletName: 'tab', name: 'history', context: builds)
@repositoryController.connectOutlet(outletName: 'tab', name: 'builds', context: builds)
connectBuild: (build) ->
@get('repositoryController').connectOutlet(outletName: 'tab', name: 'build', context: build)
@repositoryController.connectOutlet(outletName: 'tab', name: 'build', context: build)
connectJob: (job) ->
@get('repositoryController').connectOutlet(outletName: 'tab', name: 'job', context: job)
@repositoryController.connectOutlet(outletName: 'tab', name: 'job', context: job)

View File

@ -0,0 +1,7 @@
require 'layout/base'
Travis.Layout.Profile = Travis.Layout.Base.extend
name: 'default'
init: ->

View File

@ -0,0 +1,24 @@
require 'layout/base'
Travis.Layout.Sidebar = Travis.Layout.Base.extend
init: ->
@_super('sidebar', 'workers', 'queues')
@appController = @get('appController')
@connectWorkers(Travis.Worker.find())
@connectQueues(Travis.QUEUES)
connect: ->
@appController.connectOutlet(outletName: 'right', name: 'sidebar')
connectWorkers: (workers) ->
@workersController.set('content', workers)
@appController.set('workers', @workersController)
connectQueues: (queues) ->
queues = for queue in queues
Em.ArrayController.create
content: Travis.Job.queued(queue.name)
name: queue.display
@queuesController.set('content', queues)
@appController.set('queues', @queuesController)

View File

@ -1,27 +0,0 @@
Travis.Layout = Em.Object.extend
init: ->
@setupControllers()
@setupViews()
@connectLeft(Travis.Repository.find())
setupControllers: ->
$.extend this, Travis.Controllers
for name, controller of Travis.Controllers
name = name.charAt(0).toLowerCase() + name.substr(1)
this[name] = controller.create(namespace: this, controllers: this)
setupViews: ->
$.extend this, Travis.Views
view = Travis.Views.ApplicationView.create()
view.set('controller', @applicationController)
view.appendTo(@get('rootElement') || 'body')
Travis.Layout.instance = (name) ->
if @layout && @layout.name == name
@layout
else
@layout = Travis.Layout[name].create(name: name)
require 'layouts/default'
require 'layouts/profile'

View File

@ -1,3 +0,0 @@
Travis.Layout.Profile = Travis.Layout.extend
init: ->

View File

@ -1,6 +1,7 @@
require 'models/artifact'
require 'models/build'
require 'models/repository'
require 'models/commit'
require 'models/job'
require 'models/artifact'
require 'models/repository'
require 'models/worker'

View File

@ -48,8 +48,9 @@ require 'travis/model'
@Travis.Job.reopenClass
queued: (queue) ->
@all()
@find()
Travis.app.store.filter this, (job) -> job.get('queue') == 'builds.' + queue
findMany: (ids) ->
Travis.app.store.findMany this, ids

View File

@ -1,13 +1,5 @@
require 'travis/model'
@Travis.WorkerGroup = Ember.ArrayProxy.extend
init: ->
@set('content', [])
host: (->
@getPath 'firstObject.host'
).property()
@Travis.Worker = Travis.Model.extend
state: DS.attr('string')
name: DS.attr('string')
@ -34,5 +26,5 @@ require 'travis/model'
).property('state')
urlJob: (->
'#!/%@/jobs/%@'.fmt @getPath('payload.repository.slug'), @getPath('payload.build.id')
).property('payload', 'state')
"#!/#{@getPath('payload.repository.slug')}/jobs/#{@getPath('payload.build.id')}"
).property('payload')

View File

@ -10,3 +10,7 @@
<div id="main">
{{outlet main}}
</div>
<div id="right">
{{outlet right}}
</div>

View File

@ -0,0 +1,9 @@
<div id="head">
<a href="#">Travis CI</a>
<a href="#!/profile">Profile</a>
</div>
<div id="main">
{{outlet main}}
</div>

View File

@ -0,0 +1,40 @@
<div id="right" class="maximized">
<div class="slider"><div class='icon'></div>&nbsp;</div>
<div class="inner"><div class='wrapper'>
<!--
<h4>{{t layouts.application.sponsers}}</h4>
<div class="sponsors top"></div>
<p class="hint"><a href="https://love.travis-ci.org/sponsors">{{{t layouts.application.sponsors_link}}}</a></p>
-->
{{view Travis.Views.WorkersView groupsBinding="controller.workers" id="workers"}}
{{view Travis.Views.QueuesView queuesBinding="controller.queues" id="queues"}}
<!--
<div class="box">
<h4>{{t layouts.application.sponsers}}</h4>
<div class="sponsors bottom"></div>
</div>
<div id="alpha_warning" class="box">
<h4>{{t layouts.about.alpha}}</h4>
<p>{{{t layouts.about.messages.alpha}}}</p>
</div>
<div id="about" class="box">
<h4>{{t layouts.about.join}}</h4>
<ul>
<li>{{t layouts.about.repository}}: <a href="http://github.com/travis-ci">Github</a></li>
<li>{{t layouts.about.twitter}}: <a href="http://twitter.com/travisci">@travisci</a></li>
<li>{{t layouts.about.mailing_list}}: <a href="http://groups.google.com/group/travis-ci">travis-ci</a></li>
<li><a href="irc://irc.freenode.net#travis">irc.freenode.net#travis</a></li>
</ul>
</div>
-->
</div></div>
</div>
<!--
<div id="github">
<a href="https://github.com/travis-ci" title="Fork me on GitHub">{{t layouts.application.fork_me}}</a>
</div>
-->

View File

@ -0,0 +1,15 @@
{{#each queue in queues}}
<h4>{{t queue}}: {{queue.name}}</h4>
<ul>
{{#each queue}}
<li>
{{repository.slug}}
{{#if number}}
#{{number}}
{{/if}}
</li>
{{else}}
{{t no_job}}
{{/each}}
</ul>
{{/each}}

View File

@ -0,0 +1,22 @@
<h4>{{t workers}}</h4>
<ul>
{{#each group in workers.groups}}
<li class="group">
<h5>{{group.firstObject.host}}</h5>
<ul>
{{#each group}}
<li class="worker">
{{#if isTesting}}
<a {{bindAttr href="urlJob"}} {{bindAttr title="lastSeenAt"}}>{{display}}</a>
{{else}}
<span {{bindAttr title="lastSeenAt"}}>{{display}}</span>
{{/if}}
</li>
{{/each}}
</ul>
</li>
{{else}}
No workers
{{/each}}
</ul>

View File

@ -1,9 +1,12 @@
require 'ext/ember/namespace'
@Travis.Views = Em.Namespace.create()
@Travis.Views = Em.Namespace.create
SidebarView: Em.View.extend(templateName: 'layouts/sidebar')
QueuesView: Em.View.extend(templateName: 'queues/list')
WorkersView: Em.View.extend(templateName: 'workers/list')
require 'views/app'
require 'views/build'
require 'views/job'
require 'views/repo'
require 'views/tabs'

View File

@ -1,3 +0,0 @@
Travis.Views.reopen
ApplicationView: Em.View.extend
templateName: 'application'

View File

@ -1,3 +1,5 @@
require 'ext/jquery'
responseTime = 0
repositories = [
@ -26,6 +28,8 @@ jobs = [
{ id: 3, repository_id: 1, build_id: 2, commit_id: 2, log_id: 3, number: '2.1', config: { rvm: 'rbx' } }
{ id: 4, repository_id: 2, build_id: 3, commit_id: 3, log_id: 4, number: '3.1', config: { rvm: 'rbx' }, finished_at: '2012-06-20T00:21:20Z', duration: 35, result: 0 }
{ id: 5, repository_id: 3, build_id: 4, commit_id: 4, log_id: 5, number: '4.1', config: { rvm: 'rbx' } }
{ id: 6, repository_id: 1, build_id: 5, commit_id: 5, log_id: 5, number: '5.1', config: { rvm: 'rbx' }, state: 'created', queue: 'builds.common' }
{ id: 7, repository_id: 1, build_id: 5, commit_id: 5, log_id: 5, number: '5.2', config: { rvm: 'rbx' }, state: 'created', queue: 'builds.common' }
]
artifacts = [
@ -36,6 +40,11 @@ artifacts = [
{ id: 5, body: 'log 4' }
]
workers = [
{ id: 1, name: 'ruby-1', host: 'worker.travis-ci.org', state: 'ready' }
{ id: 2, name: 'ruby-2', host: 'worker.travis-ci.org', state: 'ready' }
]
$.mockjax
url: '/repositories'
responseTime: responseTime
@ -80,4 +89,13 @@ for artifact in artifacts
responseText:
artifact: artifact
$.mockjax
url: '/workers'
responseTime: responseTime
responseText: { workers: workers }
$.mockjax
url: '/jobs'
responseTime: responseTime
responseText:
jobs: $.select(jobs, (job) -> job.state == 'created')

View File

@ -5,9 +5,9 @@
<title>Travis CI - Distributed Continuous Integration Platform for the Open Source Community</title>
<link rel="stylesheet" href="stylesheets/application.css">
<script src="javascripts/vendor.js"></script>
<script src="javascripts/mocks.js"></script>
<script src="javascripts/application.js"></script>
<script>
minispade.require('mocks')
minispade.require('app')
Travis.run()
</script>

File diff suppressed because one or more lines are too long

View File

@ -1,299 +0,0 @@
(function() {
var artifact, artifacts, build, builds, commits, id, job, jobs, repositories, repository, responseTime, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m;
responseTime = 0;
repositories = [
{
id: 1,
owner: 'travis-ci',
name: 'travis-core',
slug: 'travis-ci/travis-core',
build_ids: [1, 2],
last_build_id: 1,
last_build_number: 1,
last_build_result: 0
}, {
id: 2,
owner: 'travis-ci',
name: 'travis-assets',
slug: 'travis-ci/travis-assets',
build_ids: [3],
last_build_id: 3,
last_build_number: 3
}, {
id: 3,
owner: 'travis-ci',
name: 'travis-hub',
slug: 'travis-ci/travis-hub',
build_ids: [4],
last_build_id: 4,
last_build_number: 4
}
];
builds = [
{
id: 1,
repository_id: '1',
commit_id: 1,
job_ids: [1, 2],
number: 1,
event_type: 'push',
config: {
rvm: ['rbx', '1.9.3']
},
finished_at: '2012-06-20T00:21:20Z',
duration: 35,
result: 0
}, {
id: 2,
repository_id: '1',
commit_id: 2,
job_ids: [3],
number: 2,
event_type: 'push',
config: {
rvm: ['rbx']
}
}, {
id: 3,
repository_id: '2',
commit_id: 3,
job_ids: [4],
number: 3,
event_type: 'push',
config: {
rvm: ['rbx']
},
finished_at: '2012-06-20T00:21:20Z',
duration: 35,
result: 0
}, {
id: 4,
repository_id: '3',
commit_id: 4,
job_ids: [5],
number: 4,
event_type: 'push',
config: {
rvm: ['rbx']
}
}
];
commits = [
{
id: 1,
sha: '1234567',
branch: 'master',
message: 'commit message 1',
author_name: 'author name',
author_email: 'author@email.com',
compare_url: 'http://github.com/compare/0123456..1234567'
}, {
id: 2,
sha: '2345678',
branch: 'feature',
message: 'commit message 2',
author_name: 'author name',
author_email: 'author@email.com',
compare_url: 'http://github.com/compare/0123456..2345678'
}, {
id: 3,
sha: '3456789',
branch: 'master',
message: 'commit message 3',
author_name: 'author name',
author_email: 'author@email.com',
compare_url: 'http://github.com/compare/0123456..3456789'
}, {
id: 4,
sha: '4567890',
branch: 'master',
message: 'commit message 4',
author_name: 'author name',
author_email: 'author@email.com',
compare_url: 'http://github.com/compare/0123456..4567890'
}
];
jobs = [
{
id: 1,
repository_id: 1,
build_id: 1,
commit_id: 1,
log_id: 1,
number: '1.1',
config: {
rvm: 'rbx'
},
finished_at: '2012-06-20T00:21:20Z',
duration: 35,
result: 0
}, {
id: 2,
repository_id: 1,
build_id: 1,
commit_id: 1,
log_id: 2,
number: '1.2',
config: {
rvm: '1.9.3'
}
}, {
id: 3,
repository_id: 1,
build_id: 2,
commit_id: 2,
log_id: 3,
number: '2.1',
config: {
rvm: 'rbx'
}
}, {
id: 4,
repository_id: 2,
build_id: 3,
commit_id: 3,
log_id: 4,
number: '3.1',
config: {
rvm: 'rbx'
},
finished_at: '2012-06-20T00:21:20Z',
duration: 35,
result: 0
}, {
id: 5,
repository_id: 3,
build_id: 4,
commit_id: 4,
log_id: 5,
number: '4.1',
config: {
rvm: 'rbx'
}
}
];
artifacts = [
{
id: 1,
body: 'log 1'
}, {
id: 2,
body: 'log 2'
}, {
id: 3,
body: 'log 3'
}, {
id: 4,
body: 'log 4'
}, {
id: 5,
body: 'log 4'
}
];
$.mockjax({
url: '/repositories',
responseTime: responseTime,
responseText: {
repositories: repositories
}
});
for (_i = 0, _len = repositories.length; _i < _len; _i++) {
repository = repositories[_i];
$.mockjax({
url: '/' + repository.slug,
responseTime: responseTime,
responseText: {
repository: repository
}
});
}
for (_j = 0, _len1 = builds.length; _j < _len1; _j++) {
build = builds[_j];
$.mockjax({
url: '/builds/' + build.id,
responseTime: responseTime,
responseText: {
build: build,
commit: commits[build.commit_id - 1],
jobs: (function() {
var _k, _len2, _ref, _results;
_ref = build.job_ids;
_results = [];
for (_k = 0, _len2 = _ref.length; _k < _len2; _k++) {
id = _ref[_k];
_results.push(jobs[id - 1]);
}
return _results;
})()
}
});
}
for (_k = 0, _len2 = repositories.length; _k < _len2; _k++) {
repository = repositories[_k];
$.mockjax({
url: '/builds',
data: {
repository_id: repository.id,
event_type: 'push',
orderBy: 'number DESC'
},
responseTime: responseTime,
responseText: {
builds: (function() {
var _l, _len3, _ref, _results;
_ref = repository.build_ids;
_results = [];
for (_l = 0, _len3 = _ref.length; _l < _len3; _l++) {
id = _ref[_l];
_results.push(builds[id - 1]);
}
return _results;
})(),
commits: (function() {
var _l, _len3, _ref, _results;
_ref = repository.build_ids;
_results = [];
for (_l = 0, _len3 = _ref.length; _l < _len3; _l++) {
id = _ref[_l];
_results.push(commits[builds[id - 1].commit_id - 1]);
}
return _results;
})()
}
});
}
for (_l = 0, _len3 = jobs.length; _l < _len3; _l++) {
job = jobs[_l];
$.mockjax({
url: '/jobs/' + job.id,
responseTime: responseTime,
responseText: {
job: job,
commit: commits[job.commit_id - 1]
}
});
}
for (_m = 0, _len4 = artifacts.length; _m < _len4; _m++) {
artifact = artifacts[_m];
$.mockjax({
url: '/artifacts/' + artifact.id,
responseTime: responseTime,
responseText: {
artifact: artifact
}
});
}
}).call(this);