From 248e3ce16e1012e9bebc0b6cb21dae991ee0f341 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Fri, 29 Jun 2012 21:58:45 +0200 Subject: [PATCH] refactor towards layouts --- assets/javascripts/app/app.coffee | 39 +-------- assets/javascripts/app/layouts.coffee | 26 ++++++ assets/javascripts/app/layouts/default.coffee | 81 +++++++++++++++++++ assets/javascripts/app/layouts/profile.coffee | 3 + assets/javascripts/app/router.coffee | 80 ++++-------------- assets/javascripts/vendor/ember.js | 1 + public/javascripts/application.js | 2 +- public/javascripts/vendor.js | 1 + 8 files changed, 132 insertions(+), 101 deletions(-) create mode 100644 assets/javascripts/app/layouts.coffee create mode 100644 assets/javascripts/app/layouts/default.coffee create mode 100644 assets/javascripts/app/layouts/profile.coffee diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee index 38e1d932..3e5a6094 100644 --- a/assets/javascripts/app/app.coffee +++ b/assets/javascripts/app/app.coffee @@ -1,6 +1,7 @@ require 'hax0rs' # $.mockjaxSettings.log = false +# Ember.LOG_BINDINGS = true @Travis = Em.Namespace.create run: -> @@ -9,51 +10,15 @@ require 'hax0rs' App: Em.Application.extend initialize: (router) -> - # ember wants this dependencies setup for connectOutlet - $.extend this, Travis.Controllers - $.extend this, Travis.Views - for name, controller of Travis.Controllers - name = name.charAt(0).toLowerCase() + name.substr(1) - this[name] = controller.create(namespace: this, controllers: this) - @store = Travis.Store.create() @routes = Travis.Router.create(app: this) - @_super(Em.Object.create()) @routes.start() - connectLayout: -> - view = Travis.Views.ApplicationView.create() - view.set('controller', @applicationController) - view.appendTo(@get('rootElement') || 'body') - - connectLeft: (repositories) -> - @set('repositories', repositories) - @get('applicationController').connectOutlet(outletName: 'left', name: 'repositories', context: repositories) - - connectRepository: (repository) -> - @set('repository', repository) - @get('applicationController').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') - - connectBuilds: (builds) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'history', context: builds) - - connectBuild: (build) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'build', context: build) - - connectJob: (job) -> - @get('repositoryController').connectOutlet(outletName: 'tab', name: 'job', context: job) - - require 'ext/jquery' require 'controllers' require 'helpers' +require 'layouts' require 'models' require 'router' require 'store' diff --git a/assets/javascripts/app/layouts.coffee b/assets/javascripts/app/layouts.coffee new file mode 100644 index 00000000..a746a1f2 --- /dev/null +++ b/assets/javascripts/app/layouts.coffee @@ -0,0 +1,26 @@ +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' + diff --git a/assets/javascripts/app/layouts/default.coffee b/assets/javascripts/app/layouts/default.coffee new file mode 100644 index 00000000..e3e62c5a --- /dev/null +++ b/assets/javascripts/app/layouts/default.coffee @@ -0,0 +1,81 @@ +Travis.Layout.Default = Travis.Layout.extend + init: -> + @_super() + @connectLeft(Travis.Repository.find()) + + viewIndex: (params) -> + repositories = @get('repositories') + onceLoaded repositories, => + repository = repositories.get('firstObject') + @connectRepository(repository) + @connectTabs() + @connectBuild(repository.get('lastBuild')) + + viewCurrent: (params) -> + @viewRepository params, (repository) => + @connectTabs() + @connectBuild(repository.get('lastBuild')) + + viewBuilds: (params) -> + @viewRepository params, (repository) => + @connectTabs() + @connectBuilds(repository.get('builds')) + + viewBuild: (params) -> + @viewRepository params + @buildBy params.id, (build) => + @connectTabs(build) + @connectBuild(build) + + viewJob: (params) -> + @viewRepository params + @jobBy params.id, (job) => + @connectTabs(job.get('build'), job) + @connectJob(job) + + + viewRepository: (params, callback) -> + @repositoryBy params, (repository) => + @connectRepository(repository) + callback(repository) if callback + + repositoryBy: (params, callback) -> + repositories = Travis.Repository.bySlug("#{params.owner}/#{params.name}") + onceLoaded repositories, => + callback(repositories.get('firstObject')) + + buildBy: (id, callback) => + build = Travis.Build.find(id) + onceLoaded build, => + callback(build) + + jobBy: (id, callback) -> + job = Travis.Job.find(id) + onceLoaded job, => + callback(job) + + + connectLeft: (repositories) -> + @set('repositories', repositories) + @get('applicationController').connectOutlet(outletName: 'left', name: 'repositories', context: repositories) + + connectRepository: (repository) -> + @set('repository', repository) + @get('applicationController').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') + + connectBuilds: (builds) -> + @get('repositoryController').connectOutlet(outletName: 'tab', name: 'history', context: builds) + + connectBuild: (build) -> + @get('repositoryController').connectOutlet(outletName: 'tab', name: 'build', context: build) + + connectJob: (job) -> + @get('repositoryController').connectOutlet(outletName: 'tab', name: 'job', context: job) + + diff --git a/assets/javascripts/app/layouts/profile.coffee b/assets/javascripts/app/layouts/profile.coffee new file mode 100644 index 00000000..c3a5789a --- /dev/null +++ b/assets/javascripts/app/layouts/profile.coffee @@ -0,0 +1,3 @@ +Travis.Layout.Profile = Travis.Layout.extend + init: -> + diff --git a/assets/javascripts/app/router.coffee b/assets/javascripts/app/router.coffee index 8eb90b6f..0b7a1e95 100644 --- a/assets/javascripts/app/router.coffee +++ b/assets/javascripts/app/router.coffee @@ -1,71 +1,25 @@ Travis.Router = Em.Object.extend ROUTES: - '!/:owner/:name/jobs/:id/:line': 'job' - '!/:owner/:name/jobs/:id': 'job' - '!/:owner/:name/builds/:id': 'build' - '!/:owner/:name/builds': 'builds' - '!/:owner/:name/pull_requests': 'pullRequests' - '!/:owner/:name/branch_summary': 'branches' - '!/:owner/:name': 'current' - '': 'index' + '!/profile': ['Profile', 'show'] + '!/:owner/:name/jobs/:id/:line': ['Default', 'job'] + '!/:owner/:name/jobs/:id': ['Default', 'job'] + '!/:owner/:name/builds/:id': ['Default', 'build'] + '!/:owner/:name/builds': ['Default', 'builds'] + '!/:owner/:name/pull_requests': ['Default', 'pullRequests'] + '!/:owner/:name/branch_summary': ['Default', 'branches'] + '!/:owner/:name': ['Default', 'current'] + '': ['Default', 'index'] - init: () -> + init: -> @app = @get('app') start: -> - @app.connectLayout() - @app.connectLeft(Travis.Repository.find()) - @route(route, action) for route, action of @ROUTES + @route(route, target[0], target[1]) for route, target of @ROUTES - route: (route, tab) -> - Em.routes.add(route, (params) => this[tab](params)) + route: (route, layout, action) -> + Em.routes.add route, (params) => + @action(layout, action, params) - index: (params) -> - repositories = @app.get('repositories') - onceLoaded repositories, => - repository = repositories.get('firstObject') - @app.connectRepository(repository) - @app.connectTabs() - @app.connectBuild(repository.get('lastBuild')) - - current: (params) -> - @repository params, (repository) => - @app.connectTabs() - @app.connectBuild(repository.get('lastBuild')) - - builds: (params) -> - @repository params, (repository) => - @app.connectTabs() - @app.connectBuilds(repository.get('builds')) - - build: (params) -> - @repository params - @buildBy params.id, (build) => - @app.connectTabs(build) - @app.connectBuild(build) - - job: (params) -> - @repository params - @jobBy params.id, (job) => - @app.connectTabs(job.get('build'), job) - @app.connectJob(job) - - repository: (params, callback) -> - @repositoryBy params, (repository) => - @app.connectRepository(repository) - callback(repository) if callback - - repositoryBy: (params, callback) -> - repositories = Travis.Repository.bySlug("#{params.owner}/#{params.name}") - onceLoaded repositories, => - callback(repositories.get('firstObject')) - - buildBy: (id, callback) => - build = Travis.Build.find(id) - onceLoaded build, => - callback(build) - - jobBy: (id, callback) -> - job = Travis.Job.find(id) - onceLoaded job, => - callback(job) + action: (layout, action, params) -> + layout = Travis.Layout.instance(layout) + layout["view#{$.camelize(action)}"](params) diff --git a/assets/javascripts/vendor/ember.js b/assets/javascripts/vendor/ember.js index ab77748a..b5e9b414 100644 --- a/assets/javascripts/vendor/ember.js +++ b/assets/javascripts/vendor/ember.js @@ -11524,6 +11524,7 @@ Ember.ControllerMixin.reopen({ if (controller && context) { controller.set('content', context); } view = viewClass.create(); if (controller) { set(view, 'controller', controller); } + set(this, outletName, view); return view; diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 3a20e79c..f06f14f3 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1 +1 @@ -minispade.register('templates', "(function() {Ember.TEMPLATES['application']=Ember.Handlebars.compile(\"
\\n Travis CI\\n #\\n
\\n\\n
\\n {{outlet left}}\\n
\\n\\n
\\n {{outlet main}}\\n
\\n\");Ember.TEMPLATES['builds/list']=Ember.Handlebars.compile(\"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n \\n {{#each build in content}}\\n {{#view Travis.Views.BuildsItemView contextBinding=\\\"build\\\"}}\\n \\n \\n \\n \\n \\n \\n \\n {{/view}}\\n {{/each}}\\n \\n
{{t builds.name}}{{t builds.commit}}{{t builds.message}}{{t builds.duration}}{{t builds.finished_at}}
#{{number}}{{formatCommit commit}}{{{formatMessage commit.message short=\\\"true\\\"}}}{{formatDuration duration}}{{formatTime finished_at}}
\\n\\n

\\n \\n

\\n\");Ember.TEMPLATES['builds/show']=Ember.Handlebars.compile(\"{{#unless isLoaded}}\\n Loading ...\\n{{else}}\\n
\\n
\\n
\\n
{{t builds.name}}
\\n
{{number}}
\\n
{{t builds.finished_at}}
\\n
{{formatTime finished_at}}
\\n
{{t builds.duration}}
\\n
{{formatDuration duration}}
\\n
\\n\\n
\\n
{{t builds.commit}}
\\n
{{formatCommit commit}}
\\n {{#if commit.compareUrl}}\\n
{{t builds.compare}}
\\n
{{pathFrom commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t builds.author}}
\\n
{{commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t builds.committer}}
\\n
{{commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t builds.message}}
\\n
{{{formatMessage commit.message}}}
\\n\\n {{#unless isMatrix}}\\n
{{t builds.config}}
\\n
{{formatConfig config}}
\\n {{/unless}}\\n
\\n\\n {{#if isMatrix}}\\n {{view Travis.Views.JobsView jobsBinding=\\\"view.requiredJobs\\\" required=\\\"true\\\"}}\\n {{view Travis.Views.JobsView jobsBinding=\\\"view.allowedFailureJobs\\\"}}\\n {{else}}\\n {{view Travis.Views.LogView contextBinding=\\\"jobs.firstObject\\\"}}\\n {{/if}}\\n
\\n{{/unless}}\\n\");Ember.TEMPLATES['jobs/list']=Ember.Handlebars.compile(\"{{#if view.jobs.length}}\\n \\n \\n \\n \\n {{#each configKeys}}\\n \\n {{/each}}\\n \\n \\n \\n {{#each job in view.jobs}}\\n {{#view Travis.Views.JobsItemView contextBinding=\\\"job\\\"}}\\n \\n \\n \\n \\n {{#each configValues}}\\n \\n {{/each}}\\n \\n {{/view}}\\n {{/each}}\\n \\n
\\n {{#if view.required}}\\n {{t jobs.build_matrix}}\\n {{else}}\\n {{t jobs.allowed_failures}}{{whats_this allow_failure_help}}\\n {{/if}}\\n
{{this}}
#{{number}}{{formatDuration duration}}{{formatTime finished_at}}{{this}}
\\n\\n {{#unless view.required}}\\n
\\n
{{t \\\"jobs.allowed_failures\\\"}}
\\n
\\n

\\n Allowed Failures are items in your build matrix that are allowed to\\n fail without causing the entire build to be shown as failed. This lets you add\\n in experimental and preparatory builds to test against versions or\\n configurations that you are not ready to officially support.\\n

\\n

\\n You can define allowed failures in the build matrix as follows:\\n

\\n
\\n      matrix:\\n        allow_failures:\\n          - rvm: ruby-head\\n        
\\n
\\n
\\n {{/unless}}\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/log']=Ember.Handlebars.compile(\"
{{{formatLog log.body}}}
\\n\\n{{#if sponsor.name}}\\n

\\n {{t builds.messages.sponsored_by}}\\n {{sponsor.name}}\\n

\\n{{/if}}\\n\");Ember.TEMPLATES['jobs/show']=Ember.Handlebars.compile(\"
\\n
\\n
\\n
Job
\\n
{{number}}
\\n
{{t jobs.finished_at}}
\\n
{{formatTime finished_at}}
\\n
{{t jobs.duration}}
\\n
{{formatDuration duration}}
\\n
\\n\\n
\\n
{{t jobs.commit}}
\\n
{{formatCommit commit}}
\\n {{#if commit.compareUrl}}\\n
{{t jobs.compare}}
\\n
{{pathFrom commit.compareUrl}}
\\n {{/if}}\\n {{#if commit.authorName}}\\n
{{t jobs.author}}
\\n
{{commit.authorName}}
\\n {{/if}}\\n {{#if commit.committerName}}\\n
{{t jobs.committer}}
\\n
{{commit.committerName}}
\\n {{/if}}\\n
\\n\\n
{{t jobs.message}}
\\n
{{formatMessage commit.message}}
\\n
{{t jobs.config}}
\\n
{{formatConfig config}}
\\n
\\n\\n {{view Travis.Views.LogView}}\\n
\\n\\n\");Ember.TEMPLATES['repositories/list']=Ember.Handlebars.compile(\"{{#unless content.lastObject.isLoaded}}\\n Loading ...\\n{{else}}\\n