diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee index 13ff4dc6..b31884d6 100644 --- a/assets/javascripts/app/app.coffee +++ b/assets/javascripts/app/app.coffee @@ -26,8 +26,7 @@ Travis.reopen authStateBinding: 'auth.state' init: -> - @_super() - @connect() + @_super.apply this, arguments @store = Travis.Store.create() @store.loadMany(Travis.Sponsor, Travis.SPONSORS) @@ -35,7 +34,7 @@ Travis.reopen @set('auth', Travis.Auth.create(store: @store, endpoint: Travis.config.api_endpoint)) @slider = new Travis.Slider() - @routes = new Travis.Routes() + @pusher = new Travis.Pusher() @tailing = new Travis.Tailing() @@ -54,18 +53,13 @@ Travis.reopen receive: -> @store.receive.apply(@store, arguments) - connectLayout: (name) -> - unless @get('layout.name') == name - name = $.camelize(name) - viewClass = Travis["#{name}Layout"] - @layout = Travis["#{name}Controller"].create(parent: @controller) - @controller.connectOutlet(outletName: 'layout', controller: @layout, viewClass: viewClass) - @layout - - connect: -> - @controller = Em.Controller.create() - view = Em.View.create - template: Em.Handlebars.compile('{{outlet layout}}') - controller: @controller - view.appendTo(@get('rootElement') || 'body') + toggleSidebar: -> + $('body').toggleClass('maximized') + # TODO gotta force redraws here :/ + element = $('') + $('#top .profile').append(element) + Em.run.later (-> element.remove()), 10 + element = $('') + $('#repository').append(element) + Em.run.later (-> element.remove()), 10 diff --git a/assets/javascripts/app/controllers.coffee b/assets/javascripts/app/controllers.coffee index 52bf9244..82dfbda1 100644 --- a/assets/javascripts/app/controllers.coffee +++ b/assets/javascripts/app/controllers.coffee @@ -3,16 +3,6 @@ require 'travis/ticker' Travis.reopen Controller: Em.Controller.extend - init: -> - for name in Array.prototype.slice.apply(arguments) - name = "#{$.camelize(name, false)}Controller" - klass = Travis[$.camelize(name)] || Em.Controller - this[name] = klass.create(parent: this, namespace: Travis, controllers: this) - - connectTop: -> - @connectOutlet(outletName: 'top', controller: @topController, viewClass: Travis.TopView) - @topController.set('tab', @get('name')) - connectOutlet: -> view = @_super.apply(this, arguments) @@ -28,6 +18,7 @@ Travis.reopen TopController: Em.Controller.extend userBinding: 'Travis.app.currentUser' + ApplicationController: Em.Controller.extend() require 'controllers/accounts' require 'controllers/builds' diff --git a/assets/javascripts/app/controllers/home.coffee b/assets/javascripts/app/controllers/home.coffee index 62d30e91..f4255f5c 100644 --- a/assets/javascripts/app/controllers/home.coffee +++ b/assets/javascripts/app/controllers/home.coffee @@ -1,13 +1,5 @@ Travis.HomeController = Travis.Controller.extend name: 'home' - init: -> - @_super('top', 'repositories', 'repository', 'sidebar') - - @connectTop() - @connectOutlet outletName: 'left', controller: @repositoriesController, viewClass: Travis.RepositoriesView - @connectOutlet outletName: 'main', controller: @repositoryController, viewClass: Travis.RepositoryView - @connectOutlet outletName: 'right', controller: @sidebarController, viewClass: Travis.SidebarView - activate: (action, params) -> @repositoryController.activate(action, params) diff --git a/assets/javascripts/app/controllers/job.coffee b/assets/javascripts/app/controllers/job.coffee new file mode 100644 index 00000000..e69de29b diff --git a/assets/javascripts/app/controllers/profile.coffee b/assets/javascripts/app/controllers/profile.coffee index bdc6dd75..e9b4c59c 100644 --- a/assets/javascripts/app/controllers/profile.coffee +++ b/assets/javascripts/app/controllers/profile.coffee @@ -3,11 +3,12 @@ Travis.ProfileController = Travis.Controller.extend userBinding: 'Travis.app.currentUser' init: -> - @_super('top', 'accounts') - @connectTop() - @connectOutlet outletName: 'left', controller: @accountsController, viewClass: Travis.AccountsView - @connectOutlet(outletName: 'main', controller: this, viewClass: Travis.ProfileView) - @accounts = @accountsController.get('content') + @_super() + # @_super('top', 'accounts') + # @connectTop() + # @connectOutlet outletName: 'left', controller: @accountsController, viewClass: Travis.AccountsView + # @connectOutlet(outletName: 'main', controller: this, viewClass: Travis.ProfileView) + # @accounts = @accountsController.get('content') account: (-> login = @get('params.login') || Travis.app.get('currentUser.login') diff --git a/assets/javascripts/app/controllers/repository.coffee b/assets/javascripts/app/controllers/repository.coffee index 993c6c44..7d94f22e 100644 --- a/assets/javascripts/app/controllers/repository.coffee +++ b/assets/javascripts/app/controllers/repository.coffee @@ -3,7 +3,7 @@ Travis.RepositoryController = Travis.Controller.extend params: {} init: -> - @_super('builds', 'build', 'job') + @_super.apply this, arguments Ember.run.later(@updateTimes.bind(this), Travis.INTERVALS.updateTimes) updateTimes: -> diff --git a/assets/javascripts/app/controllers/stats.coffee b/assets/javascripts/app/controllers/stats.coffee index e721f882..b0b31704 100644 --- a/assets/javascripts/app/controllers/stats.coffee +++ b/assets/javascripts/app/controllers/stats.coffee @@ -3,8 +3,7 @@ Travis.StatsController = Travis.Controller.extend init: -> @_super('top') - @connectTop() - @connectOutlet(outletName: 'main', controller: this, viewClass: Travis.StatsView) + #@connectOutlet(outletName: 'main', controller: this, viewClass: Travis.StatsView) activate: (action, params) -> # noop diff --git a/assets/javascripts/app/models/worker.coffee b/assets/javascripts/app/models/worker.coffee index c722d08a..482a9a6f 100644 --- a/assets/javascripts/app/models/worker.coffee +++ b/assets/javascripts/app/models/worker.coffee @@ -18,10 +18,6 @@ require 'travis/model' @get('state') == 'working' ).property('state') - urlJob: (-> - "/#{@get('repository')}/jobs/#{@get('job_id')}" if @get('state') == 'working' - ).property('repository', 'job_id', 'state') - repository: (-> @get('payload.repository.slug') ).property('payload.repository.slug') @@ -29,3 +25,7 @@ require 'travis/model' job_id: (-> @get('payload.job.id') ).property('payload.job.id') + + job: (-> + Travis.Job.find @get('job_id') + ).property('job_id') diff --git a/assets/javascripts/app/routes.coffee b/assets/javascripts/app/routes.coffee index 14151207..35faa8bd 100644 --- a/assets/javascripts/app/routes.coffee +++ b/assets/javascripts/app/routes.coffee @@ -1,42 +1,171 @@ -Travis.Routes = -> - unless Travis.Routes.initialized - Ember.run.next => - Em.routes.set('usesHistory', true) - Em.routes.set('wantsHistory', true) - Em.routes.set('baseURI', @base_uri) +Travis.Router = Ember.Router.extend + location: 'hash' + enableLogging: true + initialState: 'loading' - @add(route, target[0], target[1]) for route, target of Travis.ROUTES - Travis.Routes.initialized = true - -$.extend Travis.Routes.prototype, - base_uri: "#{document.location.protocol}//#{document.location.host}" - - add: (route, layout, action) -> - Em.routes.add route, (params) => - @action(layout, action, params) - - route: (location) -> - location = $(event.target).closest('a')[0].href.replace("#{@base_uri}/", '') if typeof location != 'string' - Em.routes.set('location', location) - - action: (name, action, params) -> - # this needs to be a global reference because Em.routes is global - Travis.app.render(name, action, params) if @before(name, action, params) - - before: (name, action, params) -> - if @requiresAuth(name, action, params) - @requireAuth(name, action, params) - else - true + goToRoot: Ember.Route.transitionTo('root.home.show') + goToStats: Ember.Route.transitionTo('root.home.stats') + showRepository: Ember.Route.transitionTo('root.home.repository.show') + showBuilds: Ember.Route.transitionTo('root.home.repository.builds.index') + showBuild: Ember.Route.transitionTo('root.home.repository.builds.show') + showPullRequests: Ember.Route.transitionTo('root.home.repository.pullRequests') + showBranches: Ember.Route.transitionTo('root.home.repository.branches') + showJob: Ember.Route.transitionTo('root.home.repository.job') signedIn: -> !!Travis.app.get('currentUser') - requiresAuth: (name, action, params) -> - name == 'profile' and not @signedIn() + requiresAuth: (path) -> + # TODO: not sure what the path is at the moment + path == '/profile' && !@signedIn() - requireAuth: (name, action, params) -> - Travis.app.set('returnTo', [name, action, params]) - # Travis.app.render('auth', 'show') - @route('') - false + loading: Ember.Route.extend + routePath: (router, path) -> + router.set('lastAttemptedPath', path) + if router.requiresAuth(path) + router.send 'switchToUnauthenticated' + else + router.send 'switchToAuthenticated' + + switchToUnauthenticated: Ember.State.transitionTo('unauthenticated.index') + switchToAuthenticated: Ember.State.transitionTo('authenticated.index') + + unauthenticated: Ember.Route.extend + index: Ember.Route.extend + route: '/' + + connectOutlets: (router) -> + router.transitionTo('login') + + login: Ember.Route.extend + route: '/login' + + connectOutlets: (router) -> + router.get('applicationController').connectOutlet('login') + + authenticated: Ember.Route.extend + index: Ember.Route.extend + connectOutlets: (router) -> + router.transitionTo('root') + + path = router.get('lastAttemptedPath') + if path && path != '/' + router.route(path) + + root: Ember.Route.extend + initialState: 'home' + loading: Ember.State.extend() + + home: Ember.Route.extend + initialState: 'show' + route: '/' + connectOutlets: (router) -> + router.get('applicationController').connectOutlet 'left', 'repositories' + router.get('applicationController').connectOutlet 'right', 'sidebar' + router.get('applicationController').connectOutlet 'top', 'top' + router.get('applicationController').connectOutlet 'main', 'repository' + + show: Ember.Route.extend + route: '/' + connectOutlets: (router) -> + router.get('repositoryController').activate('index') + + stats: Ember.Route.extend + route: '/stats' + connectOutlets: (router) -> + router.get('applicationController').connectOutlet 'main', 'stats' + + repository: Ember.Route.extend + initialState: 'show' + route: '/:owner/:name' + + connectOutlets: (router, repository) -> + params = { owner: repository.get('owner'), name: repository.get('name') } + + # TODO: we can just pass objects instead of params now, I'm leaving this + # to not have to rewrite too much, but it would be nice to fix this + # later + router.get('repositoryController').setParams(params) + + deserialize: (router, params) -> + slug = "#{params.owner}/#{params.name}" + repos = Travis.Repository.bySlug(slug) + deferred = $.Deferred() + + observer = -> + if repos.get 'isLoaded' + repos.removeObserver 'isLoaded', observer + deferred.resolve repos.objectAt(0) + + repos.addObserver 'isLoaded', observer + + deferred.promise() + + serialize: (router, repository) -> + if repository + { owner: repository.get('owner'), name: repository.get('name') } + else + {} + + show: Ember.Route.extend + route: '/' + connectOutlets: (router) -> + router.get('repositoryController').activate('current') + + builds: Ember.Route.extend + route: '/builds' + initialState: 'index' + + index: Ember.Route.extend + route: '/' + connectOutlets: (router, repository) -> + router.get('repositoryController').activate 'builds' + + show: Ember.Route.extend + route: '/:build_id' + connectOutlets: (router, build) -> + router.get('repositoryController').activate 'build', id: build.get('id') + + deserialize: (router, params) -> + # Something is wrong here. If I don't use deferred, id is not + # initialized and url ends up being /jobs/null + # This should not be needed, as id should be immediately set on the + # record. + # TODO: find out why it happens + build = Travis.Build.find params.build_id + deferred = $.Deferred() + + observer = -> + if build.get 'id' + build.removeObserver 'id', observer + deferred.resolve build + + build.addObserver 'id', observer + + deferred.promise() + + pullRequests: Ember.Route.extend + route: '/pull_requests' + connectOutlets: (router, repository) -> + router.get('repositoryController').activate 'pull_requests' + + branches: Ember.Route.extend + route: '/branches' + connectOutlets: (router, repository) -> + router.get('repositoryController').activate 'branches' + + job: Ember.Route.extend + route: '/jobs/:job_id' + connectOutlets: (router, job) -> + router.get('repositoryController').activate 'job', id: job.get('id') + + deserialize: (router, params) -> + job = Travis.Job.find params.job_id + deferred = $.Deferred() + + observer = -> + if job.get 'id' + job.removeObserver 'id', observer + deferred.resolve job + job.addObserver 'id', observer + deferred.promise() diff --git a/assets/javascripts/app/templates/application.hbs b/assets/javascripts/app/templates/application.hbs new file mode 100644 index 00000000..a72508da --- /dev/null +++ b/assets/javascripts/app/templates/application.hbs @@ -0,0 +1 @@ +heyho diff --git a/assets/javascripts/app/templates/builds/list.hbs b/assets/javascripts/app/templates/builds/list.hbs index ec424f4c..c024f59a 100644 --- a/assets/javascripts/app/templates/builds/list.hbs +++ b/assets/javascripts/app/templates/builds/list.hbs @@ -16,9 +16,11 @@